Richard W.M. Jones wrote: > From: "Richard W.M. Jones" <rjo...@redhat.com> > > 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. > --- > daemon/file.c | 17 ++++++++++++++--- > daemon/parted.c | 3 ++- > 2 files changed, 16 insertions(+), 4 deletions(-) > > diff --git a/daemon/file.c b/daemon/file.c > index 91746e0..3e42c1e 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,17 @@ 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. > + * > + * 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.
This series looks fine. Only question is what about non-block devices? How about honoring "settle" only when fd is open on a block device? if (fstat (fd, &st) == 0 && S_ISBLK (st.st_mode) && settle) udev_settle (); > + if (settle) > + udev_settle (); > + > return r; > } > > @@ -563,7 +574,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 +592,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); > } ... _______________________________________________ Libguestfs mailing list Libguestfs@redhat.com https://www.redhat.com/mailman/listinfo/libguestfs