diff options
| author | Konstantin Belousov <kib@FreeBSD.org> | 2007-02-07 10:30:49 +0000 |
|---|---|---|
| committer | Konstantin Belousov <kib@FreeBSD.org> | 2007-02-07 10:30:49 +0000 |
| commit | a25733769887116a0bfc2958ab8fe913784fa4cd (patch) | |
| tree | 8ea493a77b12f3dc48651402856803c2d9de34b1 /sys/fs/procfs | |
| parent | e9f995d82479767d01dc846b3834dd6d11f2ce70 (diff) | |
Notes
Diffstat (limited to 'sys/fs/procfs')
| -rw-r--r-- | sys/fs/procfs/procfs.c | 14 |
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); |
