svn commit: r188069 - stable/7/bin/cp
Robert Watson
rwatson at FreeBSD.org
Tue Feb 3 05:45:58 PST 2009
On Tue, 3 Feb 2009, Diomidis Spinellis wrote:
> Author: dds
> Date: Tue Feb 3 13:07:34 2009
> New Revision: 188069
> URL: http://svn.freebsd.org/changeset/base/188069
>
> Log:
> MFC r184342 from head to stable/7
>
> Add fallback when mmap fails on regular files. Some filesystems,
> like smbnetfs, do not support mmap.
You mean smbfs?
Robert N M Watson
Computer Laboratory
University of Cambridge
>
> Reported by: Harti Brandt
>
> _M cp
> M cp/utils.c
>
> Modified:
> stable/7/bin/cp/ (props changed)
> stable/7/bin/cp/utils.c
>
> Modified: stable/7/bin/cp/utils.c
> ==============================================================================
> --- stable/7/bin/cp/utils.c Tue Feb 3 12:56:05 2009 (r188068)
> +++ stable/7/bin/cp/utils.c Tue Feb 3 13:07:34 2009 (r188069)
> @@ -137,41 +137,39 @@ copy_file(const FTSENT *entp, int dne)
> * Mmap and write if less than 8M (the limit is so we don't totally
> * trash memory on big files. This is really a minor hack, but it
> * wins some CPU back.
> + * Some filesystems, such as smbnetfs, don't support mmap,
> + * so this is a best-effort attempt.
> */
> #ifdef VM_AND_BUFFER_CACHE_SYNCHRONIZED
> if (S_ISREG(fs->st_mode) && fs->st_size > 0 &&
> - fs->st_size <= 8 * 1048576) {
> - if ((p = mmap(NULL, (size_t)fs->st_size, PROT_READ,
> - MAP_SHARED, from_fd, (off_t)0)) == MAP_FAILED) {
> + fs->st_size <= 8 * 1024 * 1024 &&
> + (p = mmap(NULL, (size_t)fs->st_size, PROT_READ,
> + MAP_SHARED, from_fd, (off_t)0)) != MAP_FAILED) {
> + wtotal = 0;
> + for (bufp = p, wresid = fs->st_size; ;
> + bufp += wcount, wresid -= (size_t)wcount) {
> + wcount = write(to_fd, bufp, wresid);
> + if (wcount <= 0)
> + break;
> + wtotal += wcount;
> + if (info) {
> + info = 0;
> + (void)fprintf(stderr,
> + "%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;
> + }
> + /* Some systems don't unmap on close(2). */
> + if (munmap(p, fs->st_size) < 0) {
> warn("%s", entp->fts_path);
> rval = 1;
> - } else {
> - wtotal = 0;
> - for (bufp = p, wresid = fs->st_size; ;
> - bufp += wcount, wresid -= (size_t)wcount) {
> - wcount = write(to_fd, bufp, wresid);
> - if (wcount <= 0)
> - break;
> - wtotal += wcount;
> - if (info) {
> - info = 0;
> - (void)fprintf(stderr,
> - "%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;
> - }
> - /* Some systems don't unmap on close(2). */
> - if (munmap(p, fs->st_size) < 0) {
> - warn("%s", entp->fts_path);
> - rval = 1;
> - }
> }
> } else
> #endif
>
More information about the svn-src-stable-7
mailing list