From owner-svn-src-all@FreeBSD.ORG Wed May 4 13:27:45 2011 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id DCCF91065678; Wed, 4 May 2011 13:27:45 +0000 (UTC) (envelope-from ru@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id CB2B78FC20; Wed, 4 May 2011 13:27:45 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p44DRjaf051440; Wed, 4 May 2011 13:27:45 GMT (envelope-from ru@svn.freebsd.org) Received: (from ru@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p44DRjfh051432; Wed, 4 May 2011 13:27:45 GMT (envelope-from ru@svn.freebsd.org) Message-Id: <201105041327.p44DRjfh051432@svn.freebsd.org> From: Ruslan Ermilov Date: Wed, 4 May 2011 13:27:45 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r221436 - in head: sbin/mount_nfs sys/fs/nfsclient sys/nfs sys/nfsclient X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 04 May 2011 13:27:46 -0000 Author: ru Date: Wed May 4 13:27:45 2011 New Revision: 221436 URL: http://svn.freebsd.org/changeset/base/221436 Log: Implemented a mount option "nocto" that disables cache coherency checking at open time. It may improve performance for read-only NFS mounts. Use deliberately. MFC after: 1 week Reviewed by: rmacklem, jhb (earlier version) Modified: head/sbin/mount_nfs/mount_nfs.8 head/sys/fs/nfsclient/nfs_clvfsops.c head/sys/fs/nfsclient/nfs_clvnops.c head/sys/nfs/nfs_diskless.c head/sys/nfsclient/nfs_vfsops.c head/sys/nfsclient/nfs_vnops.c head/sys/nfsclient/nfsargs.h Modified: head/sbin/mount_nfs/mount_nfs.8 ============================================================================== --- head/sbin/mount_nfs/mount_nfs.8 Wed May 4 13:20:44 2011 (r221435) +++ head/sbin/mount_nfs/mount_nfs.8 Wed May 4 13:27:45 2011 (r221436) @@ -28,7 +28,7 @@ .\" @(#)mount_nfs.8 8.3 (Berkeley) 3/29/95 .\" $FreeBSD$ .\" -.Dd April 27, 2011 +.Dd May 3, 2011 .Dt MOUNT_NFS 8 .Os .Sh NAME @@ -180,6 +180,17 @@ NFS port number 2049 or replies to reque Setting the .Va vfs.nfs.nfs_ip_paranoia sysctl to 0 will make this option the default. +.It Cm nocto +Normally, NFS clients maintain the close-to-open cache coherency. +This works by flushing at close time and checking at open time. +Checking at open time is implemented by getting attributes from +the server and purging the data cache if they do not match +attributes cached by the client. +.Pp +This option disables checking at open time. +It may improve performance for read-only mounts, +but should only be used if the data on the server changes rarely. +Be sure to understand the consequences before enabling this option. .It Cm noinet4 , noinet6 Disables .Dv AF_INET Modified: head/sys/fs/nfsclient/nfs_clvfsops.c ============================================================================== --- head/sys/fs/nfsclient/nfs_clvfsops.c Wed May 4 13:20:44 2011 (r221435) +++ head/sys/fs/nfsclient/nfs_clvfsops.c Wed May 4 13:27:45 2011 (r221436) @@ -716,7 +716,7 @@ static const char *nfs_opts[] = { "from" "retrans", "acregmin", "acregmax", "acdirmin", "acdirmax", "resvport", "readahead", "hostname", "timeout", "addr", "fh", "nfsv3", "sec", "principal", "nfsv4", "gssname", "allgssname", "dirpath", - "negnametimeo", + "negnametimeo", "nocto", NULL }; /* @@ -833,6 +833,8 @@ nfs_mount(struct mount *mp) } if (vfs_getopt(mp->mnt_optnew, "allgssname", NULL, NULL) == 0) args.flags |= NFSMNT_ALLGSSNAME; + if (vfs_getopt(mp->mnt_optnew, "nocto", NULL, NULL) == 0) + args.flags |= NFSMNT_NOCTO; if (vfs_getopt(mp->mnt_optnew, "readdirsize", (void **)&opt, NULL) == 0) { if (opt == NULL) { vfs_mount_error(mp, "illegal readdirsize"); Modified: head/sys/fs/nfsclient/nfs_clvnops.c ============================================================================== --- head/sys/fs/nfsclient/nfs_clvnops.c Wed May 4 13:20:44 2011 (r221435) +++ head/sys/fs/nfsclient/nfs_clvnops.c Wed May 4 13:27:45 2011 (r221436) @@ -1026,7 +1026,8 @@ nfs_lookup(struct vop_lookup_args *ap) */ newvp = *vpp; newnp = VTONFS(newvp); - if ((flags & (ISLASTCN | ISOPEN)) == (ISLASTCN | ISOPEN) && + if (!(nmp->nm_flag & NFSMNT_NOCTO) && + (flags & (ISLASTCN | ISOPEN)) == (ISLASTCN | ISOPEN) && !(newnp->n_flag & NMODIFIED)) { mtx_lock(&newnp->n_mtx); newnp->n_attrstamp = 0; Modified: head/sys/nfs/nfs_diskless.c ============================================================================== --- head/sys/nfs/nfs_diskless.c Wed May 4 13:20:44 2011 (r221435) +++ head/sys/nfs/nfs_diskless.c Wed May 4 13:27:45 2011 (r221436) @@ -112,6 +112,8 @@ nfs_parse_options(const char *envopts, s nd->flags |= NFSMNT_NOCONN; else if (strcmp(o, "nolockd") == 0) nd->flags |= NFSMNT_NOLOCKD; + else if (strcmp(o, "nocto") == 0) + nd->flags |= NFSMNT_NOCTO; else if (strcmp(o, "nfsv2") == 0) nd->flags &= ~(NFSMNT_NFSV3 | NFSMNT_NFSV4); else if (strcmp(o, "nfsv3") == 0) { Modified: head/sys/nfsclient/nfs_vfsops.c ============================================================================== --- head/sys/nfsclient/nfs_vfsops.c Wed May 4 13:20:44 2011 (r221435) +++ head/sys/nfsclient/nfs_vfsops.c Wed May 4 13:27:45 2011 (r221436) @@ -786,7 +786,7 @@ static const char *nfs_opts[] = { "from" "readahead", "readdirsize", "soft", "hard", "mntudp", "tcp", "udp", "wsize", "rsize", "retrans", "acregmin", "acregmax", "acdirmin", "acdirmax", "deadthresh", "hostname", "timeout", "addr", "fh", "nfsv3", - "sec", "maxgroups", "principal", "negnametimeo", + "sec", "maxgroups", "principal", "negnametimeo", "nocto", NULL }; /* @@ -901,6 +901,8 @@ nfs_mount(struct mount *mp) args.sotype = SOCK_STREAM; if (vfs_getopt(mp->mnt_optnew, "nfsv3", NULL, NULL) == 0) args.flags |= NFSMNT_NFSV3; + if (vfs_getopt(mp->mnt_optnew, "nocto", NULL, NULL) == 0) + args.flags |= NFSMNT_NOCTO; if (vfs_getopt(mp->mnt_optnew, "readdirsize", (void **)&opt, NULL) == 0) { if (opt == NULL) { vfs_mount_error(mp, "illegal readdirsize"); Modified: head/sys/nfsclient/nfs_vnops.c ============================================================================== --- head/sys/nfsclient/nfs_vnops.c Wed May 4 13:20:44 2011 (r221435) +++ head/sys/nfsclient/nfs_vnops.c Wed May 4 13:27:45 2011 (r221436) @@ -960,7 +960,8 @@ nfs_lookup(struct vop_lookup_args *ap) */ newvp = *vpp; newnp = VTONFS(newvp); - if ((flags & (ISLASTCN | ISOPEN)) == (ISLASTCN | ISOPEN) && + if (!(nmp->nm_flag & NFSMNT_NOCTO) && + (flags & (ISLASTCN | ISOPEN)) == (ISLASTCN | ISOPEN) && !(newnp->n_flag & NMODIFIED)) { mtx_lock(&newnp->n_mtx); newnp->n_attrstamp = 0; Modified: head/sys/nfsclient/nfsargs.h ============================================================================== --- head/sys/nfsclient/nfsargs.h Wed May 4 13:20:44 2011 (r221435) +++ head/sys/nfsclient/nfsargs.h Wed May 4 13:27:45 2011 (r221436) @@ -97,5 +97,6 @@ struct nfs_args { #define NFSMNT_PRIVACY 0x04000000 /* Use privacy with RPCSEC_GSS */ #define NFSMNT_ALLGSSNAME 0x08000000 /* Use principal for all accesses */ #define NFSMNT_STRICT3530 0x10000000 /* Adhere strictly to RFC3530 */ +#define NFSMNT_NOCTO 0x20000000 /* Don't flush attrcache on open */ #endif