svn commit: r194289 - in stable/6/sys: kern sys
Ed Maste
emaste at FreeBSD.org
Tue Jun 16 13:05:35 UTC 2009
Author: emaste
Date: Tue Jun 16 13:05:34 2009
New Revision: 194289
URL: http://svn.freebsd.org/changeset/base/194289
Log:
MFC part of r166182 and 179670.
Provide the mutual exclusion between the nfs export list modifications
and nfs requests processing. Lockmgr lock provides the shared locking for
nfs requests, while exclusive mode is used for modifications. The writer
starvation is handled by lockmgr too.
Submitted by: kib
Modified:
stable/6/sys/kern/vfs_export.c
stable/6/sys/kern/vfs_mount.c
stable/6/sys/sys/mount.h
Modified: stable/6/sys/kern/vfs_export.c
==============================================================================
--- stable/6/sys/kern/vfs_export.c Tue Jun 16 12:33:38 2009 (r194288)
+++ stable/6/sys/kern/vfs_export.c Tue Jun 16 13:05:34 2009 (r194289)
@@ -179,6 +179,7 @@ vfs_hang_addrlist(mp, nep, argp)
sizeof(np->netc_anon.cr_groups));
refcount_init(&np->netc_anon.cr_ref, 1);
return (0);
+
out:
free(np, M_NETADDR);
return (error);
@@ -232,10 +233,14 @@ vfs_export(mp, argp)
struct netexport *nep;
int error;
+ error = 0;
+ lockmgr(&mp->mnt_explock, LK_EXCLUSIVE, NULL, curthread);
nep = mp->mnt_export;
if (argp->ex_flags & MNT_DELEXPORT) {
- if (nep == NULL)
- return (ENOENT);
+ if (nep == NULL) {
+ error = ENOENT;
+ goto out;
+ }
if (mp->mnt_flag & MNT_EXPUBLIC) {
vfs_setpublicfs(NULL, NULL, NULL);
MNT_ILOCK(mp);
@@ -257,18 +262,20 @@ vfs_export(mp, argp)
}
if (argp->ex_flags & MNT_EXPUBLIC) {
if ((error = vfs_setpublicfs(mp, nep, argp)) != 0)
- return (error);
+ goto out;
MNT_ILOCK(mp);
mp->mnt_flag |= MNT_EXPUBLIC;
MNT_IUNLOCK(mp);
}
if ((error = vfs_hang_addrlist(mp, nep, argp)))
- return (error);
+ goto out;
MNT_ILOCK(mp);
mp->mnt_flag |= MNT_EXPORTED;
MNT_IUNLOCK(mp);
}
- return (0);
+out:
+ lockmgr(&mp->mnt_explock, LK_RELEASE, NULL, curthread);
+ return (error);
}
/*
@@ -412,7 +419,9 @@ vfs_stdcheckexp(mp, nam, extflagsp, cred
{
struct netcred *np;
+ lockmgr(&mp->mnt_explock, LK_SHARED, NULL, curthread);
np = vfs_export_lookup(mp, nam);
+ lockmgr(&mp->mnt_explock, LK_RELEASE, NULL, curthread);
if (np == NULL)
return (EACCES);
*extflagsp = np->netc_exflags;
Modified: stable/6/sys/kern/vfs_mount.c
==============================================================================
--- stable/6/sys/kern/vfs_mount.c Tue Jun 16 12:33:38 2009 (r194288)
+++ stable/6/sys/kern/vfs_mount.c Tue Jun 16 13:05:34 2009 (r194289)
@@ -448,6 +448,7 @@ mount_init(void *mem, int size, int flag
mp = (struct mount *)mem;
mtx_init(&mp->mnt_mtx, "struct mount mtx", NULL, MTX_DEF);
lockinit(&mp->mnt_lock, PVFS, "vfslock", 0, 0);
+ lockinit(&mp->mnt_explock, PVFS, "explock", 0, 0);
return (0);
}
@@ -457,6 +458,7 @@ mount_fini(void *mem, int size)
struct mount *mp;
mp = (struct mount *)mem;
+ lockdestroy(&mp->mnt_explock);
lockdestroy(&mp->mnt_lock);
mtx_destroy(&mp->mnt_mtx);
}
Modified: stable/6/sys/sys/mount.h
==============================================================================
--- stable/6/sys/sys/mount.h Tue Jun 16 12:33:38 2009 (r194288)
+++ stable/6/sys/sys/mount.h Tue Jun 16 13:05:34 2009 (r194289)
@@ -178,6 +178,7 @@ struct mount {
int mnt_secondary_accwrites;/* (i) secondary wr. starts */
int mnt_ref; /* (i) Reference count */
int mnt_gen; /* struct mount generation */
+ struct lock mnt_explock; /* vfs_export walkers lock */
};
struct vnode *__mnt_vnode_next(struct vnode **mvp, struct mount *mp);
More information about the svn-src-stable-6
mailing list