summaryrefslogtreecommitdiffstats
path: root/sys/fs
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2009-05-31 15:01:50 +0000
committerkib <kib@FreeBSD.org>2009-05-31 15:01:50 +0000
commit7d4b798303a46daf4f017355ba3aeedf0b0b4e3b (patch)
tree611d116cd3fdf4ae9d1cf763e0a43684504530f3 /sys/fs
parent99131254df449aa0d20af219f3f71fcaac626b99 (diff)
downloadFreeBSD-src-7d4b798303a46daf4f017355ba3aeedf0b0b4e3b.zip
FreeBSD-src-7d4b798303a46daf4f017355ba3aeedf0b0b4e3b.tar.gz
Unlock the pseudofs vnode before calling fill method for pfs_readlink().
The fill code may need to lock another vnode, e.g. procfs file implementation. Reviewed by: des Tested by: pho MFC after: 2 weeks
Diffstat (limited to 'sys/fs')
-rw-r--r--sys/fs/pseudofs/pseudofs_vnops.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/sys/fs/pseudofs/pseudofs_vnops.c b/sys/fs/pseudofs/pseudofs_vnops.c
index 3f1be4c..7cd9ca4 100644
--- a/sys/fs/pseudofs/pseudofs_vnops.c
+++ b/sys/fs/pseudofs/pseudofs_vnops.c
@@ -827,7 +827,7 @@ pfs_readlink(struct vop_readlink_args *va)
struct proc *proc = NULL;
char buf[PATH_MAX];
struct sbuf sb;
- int error;
+ int error, locked;
PFS_TRACE(("%s", pn->pn_name));
pfs_assert_not_owned(pn);
@@ -849,6 +849,9 @@ pfs_readlink(struct vop_readlink_args *va)
_PHOLD(proc);
PROC_UNLOCK(proc);
}
+ vhold(vn);
+ locked = VOP_ISLOCKED(vn);
+ VOP_UNLOCK(vn, 0);
/* sbuf_new() can't fail with a static buffer */
sbuf_new(&sb, buf, sizeof buf, 0);
@@ -857,6 +860,8 @@ pfs_readlink(struct vop_readlink_args *va)
if (proc != NULL)
PRELE(proc);
+ vn_lock(vn, locked | LK_RETRY);
+ vdrop(vn);
if (error) {
sbuf_delete(&sb);
OpenPOWER on IntegriCloud