From: Daan De Meyer Date: Wed, 3 Aug 2022 09:37:17 +0000 (+0200) Subject: repart: Only lock block device once X-Git-Tag: v252-rc1~520 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=25baae502a9faa1a50d490b42955019d660da374;p=thirdparty%2Fsystemd.git repart: Only lock block device once Let's lock the backing fd instead of locking/unlocking multiple times when doing multiple operations with repart. It doesn't make much sense for anything else to touch the block device while there are still repart operations pending on it. By keeping the lock over the full duration of repart, we avoid anything else from interfering with the block device inbetween operations. --- diff --git a/src/partition/repart.c b/src/partition/repart.c index f377908a338..5cbe59cdf72 100644 --- a/src/partition/repart.c +++ b/src/partition/repart.c @@ -1615,11 +1615,11 @@ static int context_load_partition_table( *backing_fd = fd_reopen(fdisk_get_devfd(c), O_RDONLY|O_CLOEXEC); if (*backing_fd < 0) return log_error_errno(*backing_fd, "Failed to duplicate fdisk fd: %m"); - } - /* Tell udev not to interfere while we are processing the device */ - if (flock(fdisk_get_devfd(c), arg_dry_run ? LOCK_SH : LOCK_EX) < 0) - return log_error_errno(errno, "Failed to lock block device: %m"); + /* Tell udev not to interfere while we are processing the device */ + if (flock(*backing_fd, arg_dry_run ? LOCK_SH : LOCK_EX) < 0) + return log_error_errno(errno, "Failed to lock block device: %m"); + } /* The offsets/sizes libfdisk returns to us will be in multiple of the sector size of the * device. This is typically 512, and sometimes 4096. Let's query libfdisk once for it, and then use