On Sun, May 14, 2017 at 6:31 AM, Brian Dolbec <dol...@gentoo.org> wrote:
> On Tue, 9 May 2017 23:59:34 -0700 > Zac Medico <zmed...@gentoo.org> wrote: > > > Fix the lseek offset for the plain read/write loop to account > > for buffered data that has not been written to to the output > > file yet (due to previous interruption by EINTR). This code > > only affects Linux 2.6.32 and earlier (newer kernels use > > copy_file_range or sendfile). > > > > X-Gentoo-bug: 618086 > > X-Gentoo-bug-url: https://bugs.gentoo.org/show_bug.cgi?id=618086 > > --- > > src/portage_util_file_copy_reflink_linux.c | 13 ++++++++----- > > 1 file changed, 8 insertions(+), 5 deletions(-) > > > > diff --git a/src/portage_util_file_copy_reflink_linux.c > > b/src/portage_util_file_copy_reflink_linux.c index 2fb17a0..4be9e05 > > 100644 --- a/src/portage_util_file_copy_reflink_linux.c > > +++ b/src/portage_util_file_copy_reflink_linux.c > > @@ -323,12 +323,14 @@ _reflink_linux_file_copy(PyObject *self, > > PyObject *args) if (buf == NULL) { > > error = errno; > > > > - /* For the read call, the fd_in file offset must be > > - * exactly equal to offset_out. Use lseek to ensure > > - * correct state, in case an EINTR retry caused it to > > - * get out of sync somewhow. > > + /* For the read call, the fd_in file offset must be > > exactly > > + * equal to offset_out + buf_bytes, where buf_bytes > > is the > > + * amount of buffered data that has not been written > > to > > + * to the output file yet. Use lseek to ensure > > correct state, > > + * in case an EINTR retry caused it to get out of > > sync > > + * somewhow. > > */ > > - } else if (lseek(fd_in, offset_out, SEEK_SET) < 0) { > > + } else if (lseek(fd_in, offset_out + buf_bytes, > > SEEK_SET) < 0) { error = errno; > > } else { > > while (1) { > > @@ -345,6 +347,7 @@ _reflink_linux_file_copy(PyObject *self, PyObject > > *args) > > } else if (buf_bytes < 0) { > > error = errno; > > + buf_bytes = 0; > > break; > > } > > } > > looks fine :) > Thanks, merged: https://gitweb.gentoo.org/proj/portage.git/commit/?id=a3c87da25dc1944e6b7720e304318ae5474dff95 -- Thanks, Zac