diff options
Diffstat (limited to 'sys/fs/nfs')
-rw-r--r-- | sys/fs/nfs/nfs.h | 1 | ||||
-rw-r--r-- | sys/fs/nfs/nfs_commonsubs.c | 94 | ||||
-rw-r--r-- | sys/fs/nfs/nfs_var.h | 4 |
3 files changed, 51 insertions, 48 deletions
diff --git a/sys/fs/nfs/nfs.h b/sys/fs/nfs/nfs.h index 0325d3d..656c6c2 100644 --- a/sys/fs/nfs/nfs.h +++ b/sys/fs/nfs/nfs.h @@ -568,6 +568,7 @@ struct nfsv4_opflag { int needscfh; int savereply; int modifyfs; + int lktype; }; /* diff --git a/sys/fs/nfs/nfs_commonsubs.c b/sys/fs/nfs/nfs_commonsubs.c index 6585fce..5f554d5 100644 --- a/sys/fs/nfs/nfs_commonsubs.c +++ b/sys/fs/nfs/nfs_commonsubs.c @@ -84,46 +84,46 @@ NFSSOCKMUTEX; * Define it here, since it is used by both the client and server. */ struct nfsv4_opflag nfsv4_opflag[NFSV4OP_NOPS] = { - { 0, 0, 0, 0 }, /* undef */ - { 0, 0, 0, 0 }, /* undef */ - { 0, 0, 0, 0 }, /* undef */ - { 0, 1, 0, 0 }, /* Access */ - { 0, 1, 0, 0 }, /* Close */ - { 0, 2, 0, 1 }, /* Commit */ - { 1, 2, 1, 1 }, /* Create */ - { 0, 0, 0, 0 }, /* Delegpurge */ - { 0, 1, 0, 0 }, /* Delegreturn */ - { 0, 1, 0, 0 }, /* Getattr */ - { 0, 1, 0, 0 }, /* GetFH */ - { 2, 1, 1, 1 }, /* Link */ - { 0, 1, 0, 0 }, /* Lock */ - { 0, 1, 0, 0 }, /* LockT */ - { 0, 1, 0, 0 }, /* LockU */ - { 1, 1, 0, 0 }, /* Lookup */ - { 1, 1, 0, 0 }, /* Lookupp */ - { 0, 1, 0, 0 }, /* NVerify */ - { 1, 1, 0, 1 }, /* Open */ - { 1, 1, 0, 0 }, /* OpenAttr */ - { 0, 1, 0, 0 }, /* OpenConfirm */ - { 0, 1, 0, 0 }, /* OpenDowngrade */ - { 1, 0, 0, 0 }, /* PutFH */ - { 1, 0, 0, 0 }, /* PutPubFH */ - { 1, 0, 0, 0 }, /* PutRootFH */ - { 0, 1, 0, 0 }, /* Read */ - { 0, 1, 0, 0 }, /* Readdir */ - { 0, 1, 0, 0 }, /* ReadLink */ - { 0, 2, 1, 1 }, /* Remove */ - { 2, 1, 1, 1 }, /* Rename */ - { 0, 0, 0, 0 }, /* Renew */ - { 0, 0, 0, 0 }, /* RestoreFH */ - { 0, 1, 0, 0 }, /* SaveFH */ - { 0, 1, 0, 0 }, /* SecInfo */ - { 0, 2, 1, 1 }, /* Setattr */ - { 0, 0, 0, 0 }, /* SetClientID */ - { 0, 0, 0, 0 }, /* SetClientIDConfirm */ - { 0, 1, 0, 0 }, /* Verify */ - { 0, 2, 1, 1 }, /* Write */ - { 0, 0, 0, 0 }, /* ReleaseLockOwner */ + { 0, 0, 0, 0, LK_EXCLUSIVE }, /* undef */ + { 0, 0, 0, 0, LK_EXCLUSIVE }, /* undef */ + { 0, 0, 0, 0, LK_EXCLUSIVE }, /* undef */ + { 0, 1, 0, 0, LK_SHARED }, /* Access */ + { 0, 1, 0, 0, LK_EXCLUSIVE }, /* Close */ + { 0, 2, 0, 1, LK_EXCLUSIVE }, /* Commit */ + { 1, 2, 1, 1, LK_EXCLUSIVE }, /* Create */ + { 0, 0, 0, 0, LK_EXCLUSIVE }, /* Delegpurge */ + { 0, 1, 0, 0, LK_EXCLUSIVE }, /* Delegreturn */ + { 0, 1, 0, 0, LK_SHARED }, /* Getattr */ + { 0, 1, 0, 0, LK_EXCLUSIVE }, /* GetFH */ + { 2, 1, 1, 1, LK_EXCLUSIVE }, /* Link */ + { 0, 1, 0, 0, LK_EXCLUSIVE }, /* Lock */ + { 0, 1, 0, 0, LK_EXCLUSIVE }, /* LockT */ + { 0, 1, 0, 0, LK_EXCLUSIVE }, /* LockU */ + { 1, 1, 0, 0, LK_EXCLUSIVE }, /* Lookup */ + { 1, 1, 0, 0, LK_EXCLUSIVE }, /* Lookupp */ + { 0, 1, 0, 0, LK_EXCLUSIVE }, /* NVerify */ + { 1, 1, 0, 1, LK_EXCLUSIVE }, /* Open */ + { 1, 1, 0, 0, LK_EXCLUSIVE }, /* OpenAttr */ + { 0, 1, 0, 0, LK_EXCLUSIVE }, /* OpenConfirm */ + { 0, 1, 0, 0, LK_EXCLUSIVE }, /* OpenDowngrade */ + { 1, 0, 0, 0, LK_EXCLUSIVE }, /* PutFH */ + { 1, 0, 0, 0, LK_EXCLUSIVE }, /* PutPubFH */ + { 1, 0, 0, 0, LK_EXCLUSIVE }, /* PutRootFH */ + { 0, 1, 0, 0, LK_EXCLUSIVE }, /* Read */ + { 0, 1, 0, 0, LK_SHARED }, /* Readdir */ + { 0, 1, 0, 0, LK_SHARED }, /* ReadLink */ + { 0, 2, 1, 1, LK_EXCLUSIVE }, /* Remove */ + { 2, 1, 1, 1, LK_EXCLUSIVE }, /* Rename */ + { 0, 0, 0, 0, LK_EXCLUSIVE }, /* Renew */ + { 0, 0, 0, 0, LK_EXCLUSIVE }, /* RestoreFH */ + { 0, 1, 0, 0, LK_EXCLUSIVE }, /* SaveFH */ + { 0, 1, 0, 0, LK_EXCLUSIVE }, /* SecInfo */ + { 0, 2, 1, 1, LK_EXCLUSIVE }, /* Setattr */ + { 0, 0, 0, 0, LK_EXCLUSIVE }, /* SetClientID */ + { 0, 0, 0, 0, LK_EXCLUSIVE }, /* SetClientIDConfirm */ + { 0, 1, 0, 0, LK_EXCLUSIVE }, /* Verify */ + { 0, 2, 1, 1, LK_EXCLUSIVE }, /* Write */ + { 0, 0, 0, 0, LK_EXCLUSIVE }, /* ReleaseLockOwner */ }; #endif /* !APPLEKEXT */ @@ -1982,12 +1982,14 @@ nfsv4_fillattr(struct nfsrv_descript *nd, vnode_t vp, NFSACL_T *saclp, !NFSHASNFS4ACL(vnode_mount(vp)))) { NFSCLRBIT_ATTRBIT(retbitp, NFSATTRBIT_ACL); } else if (naclp != NULL) { - NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY, p); - error = VOP_ACCESS(vp, VREAD_ACL, cred, p); - if (error == 0) - error = VOP_GETACL(vp, ACL_TYPE_NFS4, naclp, - cred, p); - NFSVOPUNLOCK(vp, 0, p); + if (vn_lock(vp, LK_SHARED) == 0) { + error = VOP_ACCESS(vp, VREAD_ACL, cred, p); + if (error == 0) + error = VOP_GETACL(vp, ACL_TYPE_NFS4, + naclp, cred, p); + VOP_UNLOCK(vp, 0); + } else + error = NFSERR_PERM; if (error != 0) { if (reterr) { nd->nd_repstat = NFSERR_ACCES; diff --git a/sys/fs/nfs/nfs_var.h b/sys/fs/nfs/nfs_var.h index 244daf3..6113fb5 100644 --- a/sys/fs/nfs/nfs_var.h +++ b/sys/fs/nfs/nfs_var.h @@ -279,7 +279,7 @@ int nfscl_request(struct nfsrv_descript *, vnode_t, void nfsm_stateidtom(struct nfsrv_descript *, nfsv4stateid_t *, int); /* nfs_nfsdsubs.c */ -void nfsd_fhtovp(struct nfsrv_descript *, struct nfsrvfh *, +void nfsd_fhtovp(struct nfsrv_descript *, struct nfsrvfh *, int, vnode_t *, struct nfsexstuff *, mount_t *, int, NFSPROC_T *); int nfsd_excred(struct nfsrv_descript *, struct nfsexstuff *, struct ucred *); @@ -564,7 +564,7 @@ int nfsv4_sattr(struct nfsrv_descript *, struct nfsvattr *, nfsattrbit_t *, NFSACL_T *, NFSPROC_T *); int nfsvno_checkexp(mount_t, NFSSOCKADDR_T, struct nfsexstuff *, struct ucred **); -int nfsvno_fhtovp(mount_t, fhandle_t *, NFSSOCKADDR_T, +int nfsvno_fhtovp(mount_t, fhandle_t *, NFSSOCKADDR_T, int, vnode_t *, struct nfsexstuff *, struct ucred **); int nfsvno_pathconf(vnode_t, int, register_t *, struct ucred *, NFSPROC_T *); |