diff options
author | rmacklem <rmacklem@FreeBSD.org> | 2010-12-25 21:56:25 +0000 |
---|---|---|
committer | rmacklem <rmacklem@FreeBSD.org> | 2010-12-25 21:56:25 +0000 |
commit | 6847bfd5821deedbb259c4e8efe6ae27e39c2659 (patch) | |
tree | 258688215a96daa778719687986303676b1d8f6a /sys/fs/nfsserver/nfs_nfsdserv.c | |
parent | 971b02b7bcce9c49f919797dcad7b646c206b7b6 (diff) | |
download | FreeBSD-src-6847bfd5821deedbb259c4e8efe6ae27e39c2659.zip FreeBSD-src-6847bfd5821deedbb259c4e8efe6ae27e39c2659.tar.gz |
Modify the experimental NFS server so that it uses LK_SHARED
for RPC operations when it can. Since VFS_FHTOVP() currently
always gets an exclusively locked vnode and is usually called
at the beginning of each RPC, the RPCs for a given vnode will
still be serialized. As such, passing a lock type argument to
VFS_FHTOVP() would be preferable to doing the vn_lock() with
LK_DOWNGRADE after the VFS_FHTOVP() call.
Reviewed by: kib
MFC after: 2 weeks
Diffstat (limited to 'sys/fs/nfsserver/nfs_nfsdserv.c')
-rw-r--r-- | sys/fs/nfsserver/nfs_nfsdserv.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/sys/fs/nfsserver/nfs_nfsdserv.c b/sys/fs/nfsserver/nfs_nfsdserv.c index e4976f5..b4a4126 100644 --- a/sys/fs/nfsserver/nfs_nfsdserv.c +++ b/sys/fs/nfsserver/nfs_nfsdserv.c @@ -1392,7 +1392,7 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram, nd->nd_cred->cr_uid = nd->nd_saveduid; /* Won't lock vfs if already locked, mp == NULL */ tnes.nes_vfslocked = exp->nes_vfslocked; - nfsd_fhtovp(nd, &tfh, &tdp, &tnes, &mp, 0, p); + nfsd_fhtovp(nd, &tfh, LK_EXCLUSIVE, &tdp, &tnes, &mp, 0, p); if (tdp) { tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd->nd_cred, p, 1); @@ -1546,7 +1546,8 @@ nfsrvd_link(struct nfsrv_descript *nd, int isdgram, } /* Won't lock vfs if already locked, mp == NULL */ tnes.nes_vfslocked = exp->nes_vfslocked; - nfsd_fhtovp(nd, &dfh, &dp, &tnes, &mp, 0, p); + nfsd_fhtovp(nd, &dfh, LK_EXCLUSIVE, &dp, &tnes, &mp, 0, + p); if (dp) NFSVOPUNLOCK(dp, 0, p); } @@ -3141,7 +3142,7 @@ nfsrvd_secinfo(struct nfsrv_descript *nd, int isdgram, vput(vp); savflag = nd->nd_flag; if (!nd->nd_repstat) { - nfsd_fhtovp(nd, &fh, &vp, &retnes, &mp, 0, p); + nfsd_fhtovp(nd, &fh, LK_SHARED, &vp, &retnes, &mp, 0, p); if (vp) vput(vp); } |