Lines 2830-2842
nfsrvd_open(struct nfsrv_descript *nd, __unused int is
Link Here
|
2830 |
u_long *hashp; |
2830 |
u_long *hashp; |
2831 |
NFSACL_T *aclp = NULL; |
2831 |
NFSACL_T *aclp = NULL; |
2832 |
struct thread *p = curthread; |
2832 |
struct thread *p = curthread; |
|
|
2833 |
bool done_namei; |
2833 |
|
2834 |
|
2834 |
#ifdef NFS4_ACL_EXTATTR_NAME |
2835 |
#ifdef NFS4_ACL_EXTATTR_NAME |
2835 |
aclp = acl_alloc(M_WAITOK); |
2836 |
aclp = acl_alloc(M_WAITOK); |
2836 |
aclp->acl_cnt = 0; |
2837 |
aclp->acl_cnt = 0; |
2837 |
#endif |
2838 |
#endif |
2838 |
NFSZERO_ATTRBIT(&attrbits); |
2839 |
NFSZERO_ATTRBIT(&attrbits); |
2839 |
named.ni_startdir = NULL; |
2840 |
done_namei = false; |
2840 |
named.ni_cnd.cn_nameiop = 0; |
2841 |
named.ni_cnd.cn_nameiop = 0; |
2841 |
NFSM_DISSECT(tl, u_int32_t *, 6 * NFSX_UNSIGNED); |
2842 |
NFSM_DISSECT(tl, u_int32_t *, 6 * NFSX_UNSIGNED); |
2842 |
i = fxdr_unsigned(int, *(tl + 5)); |
2843 |
i = fxdr_unsigned(int, *(tl + 5)); |
Lines 3042-3047
nfsrvd_open(struct nfsrv_descript *nd, __unused int is
Link Here
|
3042 |
if (!nd->nd_repstat) { |
3043 |
if (!nd->nd_repstat) { |
3043 |
nd->nd_repstat = nfsvno_namei(nd, &named, dp, 0, exp, |
3044 |
nd->nd_repstat = nfsvno_namei(nd, &named, dp, 0, exp, |
3044 |
&dirp); |
3045 |
&dirp); |
|
|
3046 |
done_namei = true; |
3045 |
} else { |
3047 |
} else { |
3046 |
vrele(dp); |
3048 |
vrele(dp); |
3047 |
nfsvno_relpathbuf(&named); |
3049 |
nfsvno_relpathbuf(&named); |
Lines 3049-3055
nfsrvd_open(struct nfsrv_descript *nd, __unused int is
Link Here
|
3049 |
if (create == NFSV4OPEN_CREATE) { |
3051 |
if (create == NFSV4OPEN_CREATE) { |
3050 |
switch (how) { |
3052 |
switch (how) { |
3051 |
case NFSCREATE_UNCHECKED: |
3053 |
case NFSCREATE_UNCHECKED: |
3052 |
if (named.ni_vp) { |
3054 |
if (done_namei && named.ni_vp != NULL) { |
3053 |
/* |
3055 |
/* |
3054 |
* Clear the setable attribute bits, except |
3056 |
* Clear the setable attribute bits, except |
3055 |
* for Size, if it is being truncated. |
3057 |
* for Size, if it is being truncated. |
Lines 3061-3072
nfsrvd_open(struct nfsrv_descript *nd, __unused int is
Link Here
|
3061 |
} |
3063 |
} |
3062 |
break; |
3064 |
break; |
3063 |
case NFSCREATE_GUARDED: |
3065 |
case NFSCREATE_GUARDED: |
3064 |
if (named.ni_vp && !nd->nd_repstat) |
3066 |
if (done_namei && named.ni_vp != NULL && |
|
|
3067 |
nd->nd_repstat == 0) |
3065 |
nd->nd_repstat = EEXIST; |
3068 |
nd->nd_repstat = EEXIST; |
3066 |
break; |
3069 |
break; |
3067 |
case NFSCREATE_EXCLUSIVE: |
3070 |
case NFSCREATE_EXCLUSIVE: |
3068 |
exclusive_flag = 1; |
3071 |
exclusive_flag = 1; |
3069 |
if (!named.ni_vp) |
3072 |
if (done_namei && named.ni_vp == NULL) |
3070 |
nva.na_mode = 0; |
3073 |
nva.na_mode = 0; |
3071 |
break; |
3074 |
break; |
3072 |
case NFSCREATE_EXCLUSIVE41: |
3075 |
case NFSCREATE_EXCLUSIVE41: |
Lines 3076-3082
nfsrvd_open(struct nfsrv_descript *nd, __unused int is
Link Here
|
3076 |
} |
3079 |
} |
3077 |
nfsvno_open(nd, &named, clientid, &stateid, stp, |
3080 |
nfsvno_open(nd, &named, clientid, &stateid, stp, |
3078 |
&exclusive_flag, &nva, cverf, create, aclp, &attrbits, |
3081 |
&exclusive_flag, &nva, cverf, create, aclp, &attrbits, |
3079 |
nd->nd_cred, exp, &vp); |
3082 |
nd->nd_cred, done_namei, exp, &vp); |
3080 |
} else if (claim == NFSV4OPEN_CLAIMPREVIOUS || claim == |
3083 |
} else if (claim == NFSV4OPEN_CLAIMPREVIOUS || claim == |
3081 |
NFSV4OPEN_CLAIMFH || claim == NFSV4OPEN_CLAIMDELEGATECURFH || |
3084 |
NFSV4OPEN_CLAIMFH || claim == NFSV4OPEN_CLAIMDELEGATECURFH || |
3082 |
claim == NFSV4OPEN_CLAIMDELEGATEPREVFH) { |
3085 |
claim == NFSV4OPEN_CLAIMDELEGATEPREVFH) { |