summaryrefslogtreecommitdiffstats
path: root/sys/fs/msdosfs/msdosfs_lookup.c
diff options
context:
space:
mode:
authorbp <bp@FreeBSD.org>2000-10-22 14:22:17 +0000
committerbp <bp@FreeBSD.org>2000-10-22 14:22:17 +0000
commit038c55d50ec75412437c3d89c72b8197e06b8adc (patch)
tree792289efa8b6b42e84294bf6936776045254916a /sys/fs/msdosfs/msdosfs_lookup.c
parentd294d0c2a8bee4da4509a0dc72cbda4188bbde4e (diff)
downloadFreeBSD-src-038c55d50ec75412437c3d89c72b8197e06b8adc.zip
FreeBSD-src-038c55d50ec75412437c3d89c72b8197e06b8adc.tar.gz
Remove de_lock field from denode structure and make msdosfs PDIRUNLOCK aware.
Diffstat (limited to 'sys/fs/msdosfs/msdosfs_lookup.c')
-rw-r--r--sys/fs/msdosfs/msdosfs_lookup.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/sys/fs/msdosfs/msdosfs_lookup.c b/sys/fs/msdosfs/msdosfs_lookup.c
index edb71a6..776559d 100644
--- a/sys/fs/msdosfs/msdosfs_lookup.c
+++ b/sys/fs/msdosfs/msdosfs_lookup.c
@@ -116,6 +116,7 @@ msdosfs_lookup(ap)
int wincnt = 1;
int chksum = -1;
int olddos = 1;
+ cnp->cn_flags &= ~PDIRUNLOCK;
#ifdef MSDOSFS_DEBUG
printf("msdosfs_lookup(): looking for %s\n", cnp->cn_nameptr);
@@ -363,8 +364,10 @@ notfound:
* information cannot be used.
*/
cnp->cn_flags |= SAVENAME;
- if (!lockparent)
+ if (!lockparent) {
VOP_UNLOCK(vdp, 0, p);
+ cnp->cn_flags |= PDIRUNLOCK;
+ }
return (EJUSTRETURN);
}
/*
@@ -452,8 +455,10 @@ foundroot:
if (error)
return (error);
*vpp = DETOV(tdp);
- if (!lockparent)
+ if (!lockparent) {
VOP_UNLOCK(vdp, 0, p);
+ cnp->cn_flags |= PDIRUNLOCK;
+ }
return (0);
}
@@ -483,8 +488,10 @@ foundroot:
return (error);
*vpp = DETOV(tdp);
cnp->cn_flags |= SAVENAME;
- if (!lockparent)
+ if (!lockparent) {
VOP_UNLOCK(vdp, 0, p);
+ cnp->cn_flags |= PDIRUNLOCK;
+ }
return (0);
}
@@ -510,15 +517,20 @@ foundroot:
pdp = vdp;
if (flags & ISDOTDOT) {
VOP_UNLOCK(pdp, 0, p);
+ cnp->cn_flags |= PDIRUNLOCK;
error = deget(pmp, cluster, blkoff, &tdp);
if (error) {
vn_lock(pdp, LK_EXCLUSIVE | LK_RETRY, p);
+ cnp->cn_flags &= ~PDIRUNLOCK;
return (error);
}
- if (lockparent && (flags & ISLASTCN) &&
- (error = vn_lock(pdp, LK_EXCLUSIVE, p))) {
- vput(DETOV(tdp));
- return (error);
+ if (lockparent && (flags & ISLASTCN)) {
+ error = vn_lock(pdp, LK_EXCLUSIVE, p);
+ if (error) {
+ vput(DETOV(tdp));
+ return (error);
+ }
+ cnp->cn_flags &= ~PDIRUNLOCK;
}
*vpp = DETOV(tdp);
} else if (dp->de_StartCluster == scn && isadir) {
@@ -527,8 +539,10 @@ foundroot:
} else {
if ((error = deget(pmp, cluster, blkoff, &tdp)) != 0)
return (error);
- if (!lockparent || !(flags & ISLASTCN))
+ if (!lockparent || !(flags & ISLASTCN)) {
VOP_UNLOCK(pdp, 0, p);
+ cnp->cn_flags |= PDIRUNLOCK;
+ }
*vpp = DETOV(tdp);
}
OpenPOWER on IntegriCloud