Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 3 Feb 2009 13:45:56 +0000 (GMT)
From:      Robert Watson <rwatson@FreeBSD.org>
To:        Diomidis Spinellis <dds@FreeBSD.org>
Cc:        svn-src-stable@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org, svn-src-stable-7@freebsd.org
Subject:   Re: svn commit: r188069 - stable/7/bin/cp
Message-ID:  <alpine.BSF.2.00.0902031343150.62396@fledge.watson.org>
In-Reply-To: <200902031307.n13D7Y8l030992@svn.freebsd.org>
References:  <200902031307.n13D7Y8l030992@svn.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
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
>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?alpine.BSF.2.00.0902031343150.62396>