aboutsummaryrefslogtreecommitdiff
path: root/sys/compat/linprocfs
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2006-08-08 12:29:26 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2006-08-08 12:29:26 +0000
commit1565bf54af20e272c3c45a49e8c67348d32f2cf6 (patch)
tree15d2fbed2dbc5571937620818025af1a243af9d6 /sys/compat/linprocfs
parent7f557ac0a7e83a1e2d8e597e96a12418f1ebebc9 (diff)
Notes
Diffstat (limited to 'sys/compat/linprocfs')
-rw-r--r--sys/compat/linprocfs/linprocfs.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/sys/compat/linprocfs/linprocfs.c b/sys/compat/linprocfs/linprocfs.c
index 2508023b5b25..6f32aafa4e0b 100644
--- a/sys/compat/linprocfs/linprocfs.c
+++ b/sys/compat/linprocfs/linprocfs.c
@@ -803,6 +803,7 @@ linprocfs_doprocmaps(PFS_FILL_ARGS)
int error;
struct vnode *vp;
struct vattr vat;
+ int locked;
PROC_LOCK(p);
error = p_candebug(td, p);
@@ -831,18 +832,28 @@ linprocfs_doprocmaps(PFS_FILL_ARGS)
lobj = tobj;
ino = 0;
if (lobj) {
- vp = lobj->handle;
VM_OBJECT_LOCK(lobj);
off = IDX_TO_OFF(lobj->size);
- if (lobj->type == OBJT_VNODE && lobj->handle) {
- vn_fullpath(td, vp, &name, &freename);
- VOP_GETATTR(vp, &vat, td->td_ucred, td);
- ino = vat.va_fileid;
+ if (lobj->type == OBJT_VNODE) {
+ vp = lobj->handle;
+ if (vp)
+ vref(vp);
}
+ else
+ vp = NULL;
flags = obj->flags;
ref_count = obj->ref_count;
shadow_count = obj->shadow_count;
VM_OBJECT_UNLOCK(lobj);
+ if (vp) {
+ vn_fullpath(td, vp, &name, &freename);
+ locked = VFS_LOCK_GIANT(vp->v_mount);
+ vn_lock(vp, LK_SHARED | LK_RETRY, td);
+ VOP_GETATTR(vp, &vat, td->td_ucred, td);
+ ino = vat.va_fileid;
+ vput(vp);
+ VFS_UNLOCK_GIANT(locked);
+ }
} else {
flags = 0;
ref_count = 0;