[Libguestfs] [PATCH nbdkit 4/7] cache, cow: Use full pread/pwrite operations

Eric Blake eblake at redhat.com
Wed Aug 4 14:12:34 UTC 2021


On Wed, Aug 04, 2021 at 11:03:56AM +0100, Richard W.M. Jones wrote:
> On Wed, Aug 04, 2021 at 10:45:36AM +0200, Martin Kletzander wrote:
> > On Mon, Jul 26, 2021 at 06:28:57PM +0100, Richard W.M. Jones wrote:
> > >Although it probably cannot happen on Linux, POSIX allows pread/pwrite
> > >to return or write fewer bytes than requested.  The cache and cow
> > >filters didn't handle this situation.  Replace the raw
> > >pread(2)/pwrite(2) syscalls with alternate versions which can handle
> > >this.

> > >+ssize_t
> > >+full_pwrite (int fd, const void *buf, size_t count, off_t offset)
> > >+{
> > >+  ssize_t ret = 0, r;
> > >+
> > >+  while (count > 0) {
> > >+    r = pwrite (fd, buf, count, offset);
> > >+    if (r == -1) return -1;
> > >+    ret += r;
> > >+    offset += r;
> > >+    count -= r;
> > >+  }
> > >+
> > 
> > Shouldn't these continue on EINTR?
> 
> I'm not sure .. Eric?
> 
> The documentation for read(2) says this so it seems likely:
> 
>    EINTR  The call was interrupted by a signal before any data  was  read;
>           see signal(7).

Yes, that's typical for wrapper implementations.  I just checked that
gnulib's full_rw() resumes on EINTR by virtue of using its safe_rw()
wrapper (not that we can use gnulib's code in nbdkit, but rather to
confirm that handling EINTR is common practice).

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org




More information about the Libguestfs mailing list