summaryrefslogtreecommitdiffstats
path: root/daemon/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'daemon/file.c')
-rw-r--r--daemon/file.c18
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. */