diff options
-rw-r--r-- | daemon/file.c | 18 | ||||
-rw-r--r-- | daemon/parted.c | 3 |
2 files changed, 17 insertions, 4 deletions
diff --git a/daemon/file.c b/daemon/file.c index 91746e0d..057e15d1 100644 --- a/daemon/file.c +++ b/daemon/file.c @@ -525,7 +525,7 @@ do_pread_device (const char *device, int count, int64_t offset, size_t *size_r) static int pwrite_fd (int fd, const char *content, size_t size, int64_t offset, - const char *display_path) + const char *display_path, int settle) { ssize_t r; @@ -541,6 +541,18 @@ pwrite_fd (int fd, const char *content, size_t size, int64_t offset, return -1; } + /* When you call close on any block device, udev kicks off a rule + * which runs blkid to reexamine the device. We need to wait for + * this rule to finish running since it holds the device open and + * can cause other operations to fail, notably BLKRRPART. 'settle' + * flag is only set on block devices. + * + * XXX We should be smarter about when we do this or should get rid + * of the udev rules since we don't use blkid in cached mode. + */ + if (settle) + udev_settle (); + return r; } @@ -563,7 +575,7 @@ do_pwrite (const char *path, const char *content, size_t size, int64_t offset) return -1; } - return pwrite_fd (fd, content, size, offset, path); + return pwrite_fd (fd, content, size, offset, path, 0); } int @@ -581,7 +593,7 @@ do_pwrite_device (const char *device, const char *content, size_t size, return -1; } - return pwrite_fd (fd, content, size, offset, device); + return pwrite_fd (fd, content, size, offset, device, 1); } /* This runs the 'file' command. */ diff --git a/daemon/parted.c b/daemon/parted.c index 16f0843c..64a7d1d9 100644 --- a/daemon/parted.c +++ b/daemon/parted.c @@ -34,7 +34,8 @@ * COMMAND_FLAG_FOLD_STDOUT_ON_STDERR flag. * * parted occasionally fails to do ioctl(BLKRRPART) on the device, - * apparently because of some internal race in the code. We attempt + * probably because udev monitors all 'close' on block devices + * and runs 'blkid' which opens and examines the device. We attempt * to detect and recover from this error if we can. */ static int |