|  | // Copyright 2020 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | package os | 
|  |  | 
|  | import ( | 
|  | "internal/poll" | 
|  | "io" | 
|  | ) | 
|  |  | 
|  | var pollCopyFileRange = poll.CopyFileRange | 
|  |  | 
|  | func (f *File) readFrom(r io.Reader) (written int64, handled bool, err error) { | 
|  | // copy_file_range(2) does not support destinations opened with | 
|  | // O_APPEND, so don't even try. | 
|  | if f.appendMode { | 
|  | return 0, false, nil | 
|  | } | 
|  |  | 
|  | remain := int64(1 << 62) | 
|  |  | 
|  | lr, ok := r.(*io.LimitedReader) | 
|  | if ok { | 
|  | remain, r = lr.N, lr.R | 
|  | if remain <= 0 { | 
|  | return 0, true, nil | 
|  | } | 
|  | } | 
|  |  | 
|  | src, ok := r.(*File) | 
|  | if !ok { | 
|  | return 0, false, nil | 
|  | } | 
|  | if src.checkValid("ReadFrom") != nil { | 
|  | // Avoid returning the error as we report handled as false, | 
|  | // leave further error handling as the responsibility of the caller. | 
|  | return 0, false, nil | 
|  | } | 
|  |  | 
|  | written, handled, err = pollCopyFileRange(&f.pfd, &src.pfd, remain) | 
|  | if lr != nil { | 
|  | lr.N -= written | 
|  | } | 
|  | return written, handled, NewSyscallError("copy_file_range", err) | 
|  | } |