diff options
author | kib <kib@FreeBSD.org> | 2008-12-18 11:58:12 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2008-12-18 11:58:12 +0000 |
commit | fe785ac856e74cb4f13d1a522b6c71392542707f (patch) | |
tree | 6bd835af5c354ba8631f52c148717192da68b66d /sys | |
parent | b08c9bbff44148be921e9b0cd73b6d0775b75c13 (diff) | |
download | FreeBSD-src-fe785ac856e74cb4f13d1a522b6c71392542707f.zip FreeBSD-src-fe785ac856e74cb4f13d1a522b6c71392542707f.tar.gz |
Do not return success and doomed vnode from lookup. LK_UPGRADE allows
the vnode to be reclaimed.
Tested by: pho
MFC after: 1 month
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/vfs_lookup.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/sys/kern/vfs_lookup.c b/sys/kern/vfs_lookup.c index 06682d5..c4840ce 100644 --- a/sys/kern/vfs_lookup.c +++ b/sys/kern/vfs_lookup.c @@ -814,6 +814,10 @@ success: if ((cnp->cn_flags & (ISLASTCN | LOCKSHARED | LOCKLEAF)) == (ISLASTCN | LOCKLEAF) && VOP_ISLOCKED(dp) != LK_EXCLUSIVE) { vn_lock(dp, LK_UPGRADE | LK_RETRY); + if (dp->v_iflag & VI_DOOMED) { + error = ENOENT; + goto bad2; + } } if (vfslocked && dvfslocked) VFS_UNLOCK_GIANT(dvfslocked); /* Only need one */ |