if int64(n) > remain {
n = int(remain)
}
+ m := n
pos1 := pos
n, err = syscall.Sendfile(dst, src, &pos1, n)
if n > 0 {
pos += int64(n)
written += int64(n)
remain -= int64(n)
- continue
+ // (n, nil) indicates that sendfile(2) has transferred
+ // the exact number of bytes we requested, or some unretryable
+ // error have occurred with partial bytes sent. Either way, we
+ // don't need to go through the following logic to check EINTR
+ // or fell into dstFD.pd.waitWrite, just continue to send the
+ // next chunk or break the loop.
+ if n == m {
+ continue
+ } else if err != syscall.EAGAIN &&
+ err != syscall.EINTR &&
+ err != syscall.EBUSY {
+ // Particularly, EPIPE. Errors like that would normally lead
+ // the subsequent sendfile(2) call to (-1, EBADF).
+ break
+ }
} else if err != syscall.EAGAIN && err != syscall.EINTR {
// This includes syscall.ENOSYS (no kernel
// support) and syscall.EINVAL (fd types which