summaryrefslogtreecommitdiffstats
path: root/sys/fs
diff options
context:
space:
mode:
authorsemenu <semenu@FreeBSD.org>2002-06-01 09:17:43 +0000
committersemenu <semenu@FreeBSD.org>2002-06-01 09:17:43 +0000
commitc7fb877f7f9b3d72c11f42d90a4990fd3750df7b (patch)
treecf3e7a0cfe35e93e054c7aed7b0f2bc49c1f0ae9 /sys/fs
parentd2b5d45e1ad2f5897e1134b8c1db8f05ae4a722f (diff)
downloadFreeBSD-src-c7fb877f7f9b3d72c11f42d90a4990fd3750df7b.zip
FreeBSD-src-c7fb877f7f9b3d72c11f42d90a4990fd3750df7b.tar.gz
Make devfs to give honour to PDIRUNLOCK flag.
Reviewed by: jeff MFC after: 1 week
Diffstat (limited to 'sys/fs')
-rw-r--r--sys/fs/devfs/devfs_vnops.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c
index 3ec9fb5..8779c96 100644
--- a/sys/fs/devfs/devfs_vnops.c
+++ b/sys/fs/devfs/devfs_vnops.c
@@ -275,6 +275,7 @@ devfs_lookupx(ap)
dd = dvp->v_data;
*vpp = NULLVP;
+ cnp->cn_flags &= ~PDIRUNLOCK;
if ((flags & ISLASTCN) && nameiop == RENAME)
return (EOPNOTSUPP);
@@ -301,18 +302,15 @@ devfs_lookupx(ap)
if ((flags & ISLASTCN) && nameiop != LOOKUP)
return (EINVAL);
VOP_UNLOCK(dvp, 0, td);
+ cnp->cn_flags |= PDIRUNLOCK;
de = TAILQ_FIRST(&dd->de_dlist); /* "." */
de = TAILQ_NEXT(de, de_list); /* ".." */
de = de->de_dir;
error = devfs_allocv(de, dvp->v_mount, vpp, td);
- if (error) {
+ if (error || ((flags & LOCKPARENT) && (flags & ISLASTCN))) {
vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY, td);
- return (error);
+ cnp->cn_flags &= ~PDIRUNLOCK;
}
- if ((flags & LOCKPARENT) && (flags & ISLASTCN))
- error = vn_lock(dvp, LK_EXCLUSIVE, td);
- if (error)
- vput(*vpp);
return (error);
}
@@ -360,8 +358,10 @@ notfound:
if ((nameiop == CREATE || nameiop == RENAME) &&
(flags & (LOCKPARENT | WANTPARENT)) && (flags & ISLASTCN)) {
cnp->cn_flags |= SAVENAME;
- if (!(flags & LOCKPARENT))
+ if (!(flags & LOCKPARENT)) {
VOP_UNLOCK(dvp, 0, td);
+ cnp->cn_flags |= PDIRUNLOCK;
+ }
return (EJUSTRETURN);
}
return (ENOENT);
@@ -381,15 +381,19 @@ found:
error = devfs_allocv(de, dvp->v_mount, vpp, td);
if (error)
return (error);
- if (!(flags & LOCKPARENT))
+ if (!(flags & LOCKPARENT)) {
VOP_UNLOCK(dvp, 0, td);
+ cnp->cn_flags |= PDIRUNLOCK;
+ }
return (0);
}
error = devfs_allocv(de, dvp->v_mount, vpp, td);
if (error)
return (error);
- if (!(flags & LOCKPARENT) || !(flags & ISLASTCN))
+ if (!(flags & LOCKPARENT) || !(flags & ISLASTCN)) {
VOP_UNLOCK(dvp, 0, td);
+ cnp->cn_flags |= PDIRUNLOCK;
+ }
return (0);
}
OpenPOWER on IntegriCloud