aboutsummaryrefslogtreecommitdiff
path: root/sys/fs/procfs
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2007-02-07 10:30:49 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2007-02-07 10:30:49 +0000
commita25733769887116a0bfc2958ab8fe913784fa4cd (patch)
tree8ea493a77b12f3dc48651402856803c2d9de34b1 /sys/fs/procfs
parente9f995d82479767d01dc846b3834dd6d11f2ce70 (diff)
Notes
Diffstat (limited to 'sys/fs/procfs')
-rw-r--r--sys/fs/procfs/procfs.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/sys/fs/procfs/procfs.c b/sys/fs/procfs/procfs.c
index 90d8975a23ba2..d311a98a527ef 100644
--- a/sys/fs/procfs/procfs.c
+++ b/sys/fs/procfs/procfs.c
@@ -69,10 +69,18 @@ procfs_doprocfile(PFS_FILL_ARGS)
{
char *fullpath = "unknown";
char *freepath = NULL;
+ struct vnode *textvp;
+ int err;
- vn_lock(p->p_textvp, LK_EXCLUSIVE | LK_RETRY, td);
- vn_fullpath(td, p->p_textvp, &fullpath, &freepath);
- VOP_UNLOCK(p->p_textvp, 0, td);
+ textvp = p->p_textvp;
+ VI_LOCK(textvp);
+ vholdl(textvp);
+ err = vn_lock(textvp, LK_EXCLUSIVE | LK_INTERLOCK, td);
+ vdrop(textvp);
+ if (err)
+ return (err);
+ vn_fullpath(td, textvp, &fullpath, &freepath);
+ VOP_UNLOCK(textvp, 0, td);
sbuf_printf(sb, "%s", fullpath);
if (freepath)
free(freepath, M_TEMP);