View | Details | Raw Unified | Return to bug 268971 | Differences between
and this patch

Collapse All | Expand All

(-)sys/fs/nfsserver/nfs_nfsdserv.c (-5 / +5 lines)
Lines 3043-3049 nfsrvd_open(struct nfsrv_descript *nd, __unused int is Link Here
3043
		if (!nd->nd_repstat) {
3043
		if (!nd->nd_repstat) {
3044
			nd->nd_repstat = nfsvno_namei(nd, &named, dp, 0, exp,
3044
			nd->nd_repstat = nfsvno_namei(nd, &named, dp, 0, exp,
3045
			    &dirp);
3045
			    &dirp);
3046
			done_namei = true;
3047
		} else {
3046
		} else {
3048
			vrele(dp);
3047
			vrele(dp);
3049
			nfsvno_relpathbuf(&named);
3048
			nfsvno_relpathbuf(&named);
Lines 3051-3057 nfsrvd_open(struct nfsrv_descript *nd, __unused int is Link Here
3051
		if (create == NFSV4OPEN_CREATE) {
3050
		if (create == NFSV4OPEN_CREATE) {
3052
		    switch (how) {
3051
		    switch (how) {
3053
		    case NFSCREATE_UNCHECKED:
3052
		    case NFSCREATE_UNCHECKED:
3054
			if (done_namei && named.ni_vp != NULL) {
3053
			if (named.ni_vp) {
3055
				/*
3054
				/*
3056
				 * Clear the setable attribute bits, except
3055
				 * Clear the setable attribute bits, except
3057
				 * for Size, if it is being truncated.
3056
				 * for Size, if it is being truncated.
Lines 3063-3075 nfsrvd_open(struct nfsrv_descript *nd, __unused int is Link Here
3063
			}
3062
			}
3064
			break;
3063
			break;
3065
		    case NFSCREATE_GUARDED:
3064
		    case NFSCREATE_GUARDED:
3066
			if (done_namei && named.ni_vp != NULL &&
3065
			if (named.ni_vp && !nd->nd_repstat) {
3067
			    nd->nd_repstat == 0)
3068
				nd->nd_repstat = EEXIST;
3066
				nd->nd_repstat = EEXIST;
3067
				done_namei = true;
3068
			}
3069
			break;
3069
			break;
3070
		    case NFSCREATE_EXCLUSIVE:
3070
		    case NFSCREATE_EXCLUSIVE:
3071
			exclusive_flag = 1;
3071
			exclusive_flag = 1;
3072
			if (done_namei && named.ni_vp == NULL)
3072
			if (!named.ni_vp)
3073
				nva.na_mode = 0;
3073
				nva.na_mode = 0;
3074
			break;
3074
			break;
3075
		    case NFSCREATE_EXCLUSIVE41:
3075
		    case NFSCREATE_EXCLUSIVE41:
(-)sys/fs/nfsserver/nfs_nfsdport.c (-9 / +13 lines)
Lines 1931-1946 nfsvno_open(struct nfsrv_descript *nd, struct nameidat Link Here
1931
				    stateidp, stp, vp, nd, p, nd->nd_repstat);
1931
				    stateidp, stp, vp, nd, p, nd->nd_repstat);
1932
			}
1932
			}
1933
		}
1933
		}
1934
	} else {
1934
	} else if (done_namei) {
1935
		/*
1936
		 * done_namei is set when nfsvno_namei() has completed
1937
		 * successfully, but a subsequent error was set in
1938
		 * nd_repstat.  As such, cleanup of the nfsvno_namei()
1939
		 * results is required.
1940
		 */
1935
		nfsvno_relpathbuf(ndp);
1941
		nfsvno_relpathbuf(ndp);
1936
		if (done_namei && create == NFSV4OPEN_CREATE) {
1942
		if (ndp->ni_dvp == ndp->ni_vp)
1937
			if (ndp->ni_dvp == ndp->ni_vp)
1943
			vrele(ndp->ni_dvp);
1938
				vrele(ndp->ni_dvp);
1944
		else
1939
			else
1945
			vput(ndp->ni_dvp);
1940
				vput(ndp->ni_dvp);
1946
		if (ndp->ni_vp)
1941
			if (ndp->ni_vp)
1947
			vput(ndp->ni_vp);
1942
				vput(ndp->ni_vp);
1943
		}
1944
	}
1948
	}
1945
	*vpp = vp;
1949
	*vpp = vp;
1946
1950

Return to bug 268971