summaryrefslogtreecommitdiffstats
path: root/sys/fs/nfs
diff options
context:
space:
mode:
Diffstat (limited to 'sys/fs/nfs')
-rw-r--r--sys/fs/nfs/nfs.h1
-rw-r--r--sys/fs/nfs/nfs_commonsubs.c94
-rw-r--r--sys/fs/nfs/nfs_var.h4
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 *);
OpenPOWER on IntegriCloud