From 4a83eed80df5a898793c25b976c1703a19a32069 Mon Sep 17 00:00:00 2001 From: ru Date: Wed, 11 May 2011 07:33:06 +0000 Subject: [PATCH] MFC r221436: Implemented a mount option "nocto" that disables cache coherency checking at open time. It may improve performance for read-only NFS mounts. git-svn-id: svn://svn.freebsd.org/base/stable/8@221759 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- sbin/mount_nfs/mount_nfs.8 | 13 ++++++++++++- sys/fs/nfsclient/nfs_clvfsops.c | 4 +++- sys/fs/nfsclient/nfs_clvnops.c | 3 ++- sys/fs/nfsclient/nfsargs.h | 1 + sys/nfsclient/nfs_diskless.c | 2 ++ sys/nfsclient/nfs_vfsops.c | 4 +++- sys/nfsclient/nfs_vnops.c | 3 ++- sys/nfsclient/nfsargs.h | 1 + 8 files changed, 26 insertions(+), 5 deletions(-) diff --git a/sbin/mount_nfs/mount_nfs.8 b/sbin/mount_nfs/mount_nfs.8 index 393343061..c80d6cd69 100644 --- a/sbin/mount_nfs/mount_nfs.8 +++ b/sbin/mount_nfs/mount_nfs.8 @@ -28,7 +28,7 @@ .\" @(#)mount_nfs.8 8.3 (Berkeley) 3/29/95 .\" $FreeBSD$ .\" -.Dd July 28, 2009 +.Dd May 3, 2011 .Dt MOUNT_NFS 8 .Os .Sh NAME @@ -176,6 +176,17 @@ NFS port number 2049 or replies to requests using a different IP address 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 diff --git a/sys/fs/nfsclient/nfs_clvfsops.c b/sys/fs/nfsclient/nfs_clvfsops.c index 26d242122..93549e327 100644 --- a/sys/fs/nfsclient/nfs_clvfsops.c +++ b/sys/fs/nfsclient/nfs_clvfsops.c @@ -700,7 +700,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 }; /* @@ -799,6 +799,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"); diff --git a/sys/fs/nfsclient/nfs_clvnops.c b/sys/fs/nfsclient/nfs_clvnops.c index b395bcc82..f170a4001 100644 --- a/sys/fs/nfsclient/nfs_clvnops.c +++ b/sys/fs/nfsclient/nfs_clvnops.c @@ -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; diff --git a/sys/fs/nfsclient/nfsargs.h b/sys/fs/nfsclient/nfsargs.h index 4fce292d9..f111d364b 100644 --- a/sys/fs/nfsclient/nfsargs.h +++ b/sys/fs/nfsclient/nfsargs.h @@ -100,5 +100,6 @@ struct nfs_args { #define NFSMNT_HASSETFSID 0x02000000 /* Has set FSID */ #define NFSMNT_RESVPORT 0x04000000 /* Use a reserved port (Bunk!!) */ #define NFSMNT_AUTOM 0x08000000 /* Done by autofs */ +#define NFSMNT_NOCTO 0x20000000 /* Don't flush attrcache on open */ #endif /* _NFSCLIENT_NFSARGS_H_ */ diff --git a/sys/nfsclient/nfs_diskless.c b/sys/nfsclient/nfs_diskless.c index b574945e7..3f75b6101 100644 --- a/sys/nfsclient/nfs_diskless.c +++ b/sys/nfsclient/nfs_diskless.c @@ -103,6 +103,8 @@ nfs_parse_options(const char *envopts, struct nfs_args *nd) 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) { diff --git a/sys/nfsclient/nfs_vfsops.c b/sys/nfsclient/nfs_vfsops.c index 3700708a2..fd1904a96 100644 --- a/sys/nfsclient/nfs_vfsops.c +++ b/sys/nfsclient/nfs_vfsops.c @@ -781,7 +781,7 @@ static const char *nfs_opts[] = { "from", "nfs_args", "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 }; /* @@ -896,6 +896,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"); diff --git a/sys/nfsclient/nfs_vnops.c b/sys/nfsclient/nfs_vnops.c index cb2a126f0..33506a415 100644 --- a/sys/nfsclient/nfs_vnops.c +++ b/sys/nfsclient/nfs_vnops.c @@ -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; diff --git a/sys/nfsclient/nfsargs.h b/sys/nfsclient/nfsargs.h index 7ebf1a058..5e36f9435 100644 --- a/sys/nfsclient/nfsargs.h +++ b/sys/nfsclient/nfsargs.h @@ -93,5 +93,6 @@ struct nfs_args { #define NFSMNT_NOLOCKD 0x00400000 /* Locks are local */ #define NFSMNT_NFSV4 0x00800000 /* Use NFS Version 4 protocol */ #define NFSMNT_HASWRITEVERF 0x01000000 /* NFSv4 Write verifier */ +#define NFSMNT_NOCTO 0x20000000 /* Don't flush attrcache on open */ #endif -- 2.45.0