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:
parent
5c74d551d2
commit
c01816a97f
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user