diff options
Diffstat (limited to 'daemon/file.c')
-rw-r--r-- | daemon/file.c | 18 |
1 files changed, 15 insertions, 3 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. */ |