[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v5] tools/libxc: Implement writev_exact() in the same style as write_exact()
On 19/02/15 16:39, Ian Campbell wrote: > On Thu, 2015-02-19 at 11:45 +0000, Andrew Cooper wrote: > >> + while ( iov_idx < iovcnt ) >> + { >> + /* Skip over iov[] entries with 0 length. */ >> + while ( iov[iov_idx].iov_len == 0 ) >> + if ( ++iov_idx == iovcnt ) >> + goto out; > Is this required for some reason or just an optimisation? Experimentally, submitting a writev() with every iov of length 0 results in an EINVAL on CentOS 5.x This causes a failure if a partial write adjustment happens and only iov entries of length 0 remain in the set. > >> + >> + len = writev(fd, &iov[iov_idx], min(iovcnt - iov_idx, IOV_MAX)); >> + saved_errno = errno; >> + >> + if ( (len == -1) && (errno == EINTR) ) >> + continue; >> + if ( len <= 0 ) >> + { >> + rc = -1; >> + goto out; >> + } >> + >> + /* Check iov[] to see whether we had a partial or complete write. */ >> + while ( len > 0 && (iov_idx < iovcnt) ) >> + { >> + if ( len >= iov[iov_idx].iov_len ) >> + len -= iov[iov_idx++].iov_len; >> + else >> + { >> + /* Partial write of iov[iov_idx]. Copy iov so we can adjust >> + * element iov_idx and resubmit the rest. */ > I suppose we can't / don't want to just declare that the input is > non-const and potentially corrupted? That was the v1 implementation, and specifically objected to during review. > >> + if ( !local_iov ) >> + { >> + local_iov = malloc(iovcnt * sizeof(*iov)); >> + if ( !local_iov ) >> + { >> + saved_errno = ENOMEM; >> + goto out; > What is rc at this point? I think it is 0, but I think you want it to be > -1? > > It might be better to drop the inialiser of rc and set it in the one or > two places which would then need it (the goto out in the skip-0-length > loop and just before the out label AFAICT). > > Hmm yes - I shall do. For what it is worth, I can't find any way of provoking a partial write of an individual iov element, and I don't realistically expect this codepath to actually be used. POSIX however doesn't guarantee that it can't happen. ~Andrew _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |