diff options
| author | Konstantin Belousov <kib@FreeBSD.org> | 2006-08-08 12:29:26 +0000 |
|---|---|---|
| committer | Konstantin Belousov <kib@FreeBSD.org> | 2006-08-08 12:29:26 +0000 |
| commit | 1565bf54af20e272c3c45a49e8c67348d32f2cf6 (patch) | |
| tree | 15d2fbed2dbc5571937620818025af1a243af9d6 /sys/compat/linprocfs | |
| parent | 7f557ac0a7e83a1e2d8e597e96a12418f1ebebc9 (diff) | |
Notes
Diffstat (limited to 'sys/compat/linprocfs')
| -rw-r--r-- | sys/compat/linprocfs/linprocfs.c | 21 |
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; |
