cp: use copy_file_range(2)

This has three advantages over write(2)/read(2):

* Fewer context switches and data copies
* Mostly preserves a file's sparseness
* On some file systems (currently NFS 4.2) the file system will perform the
  copy in an especially efficient way.

Reviewed by:	rmacklem
MFC after:	2 weeks
Sponsored by:	Axcient
Differential Revision:	https://reviews.freebsd.org/D26377
This commit is contained in:
Alan Somers 2020-09-10 02:48:55 +00:00
parent 5c74d551d2
commit c01816a97f

View File

@ -212,27 +212,16 @@ copy_file(const FTSENT *entp, int dne)
err(1, "Not enough memory"); err(1, "Not enough memory");
} }
wtotal = 0; wtotal = 0;
while ((rcount = read(from_fd, buf, bufsize)) > 0) { while ((rcount = copy_file_range(from_fd, NULL,
for (bufp = buf, wresid = rcount; ; to_fd, NULL, bufsize, 0)) > 0)
bufp += wcount, wresid -= wcount) { {
wcount = write(to_fd, bufp, wresid); wtotal += rcount;
if (wcount <= 0) if (info) {
break; info = 0;
wtotal += wcount; (void)fprintf(stderr,
if (info) { "%s -> %s %3d%%\n",
info = 0; entp->fts_path, to.p_path,
(void)fprintf(stderr, cp_pct(wtotal, fs->st_size));
"%s -> %s %3d%%\n",
entp->fts_path, to.p_path,
cp_pct(wtotal, fs->st_size));
}
if (wcount >= (ssize_t)wresid)
break;
}
if (wcount != (ssize_t)wresid) {
warn("%s", to.p_path);
rval = 1;
break;
} }
} }
if (rcount < 0) { if (rcount < 0) {