diff options
author | daichi <daichi@FreeBSD.org> | 2008-04-25 09:44:47 +0000 |
---|---|---|
committer | daichi <daichi@FreeBSD.org> | 2008-04-25 09:44:47 +0000 |
commit | fcc7d019024c395659b7b36854f76a4ea079c815 (patch) | |
tree | 4d47bd25b3f575473cf154c944c39e9eb552dd6c /sys/fs | |
parent | 932f4f80a615f4e8f80304658c68158bd1e6b05a (diff) | |
download | FreeBSD-src-fcc7d019024c395659b7b36854f76a4ea079c815.zip FreeBSD-src-fcc7d019024c395659b7b36854f76a4ea079c815.tar.gz |
o Fixed rename panic issue
Submitted by: Masanori OZAWA (ozawa@ongs.co.jp)
MFC after: 1 week
Diffstat (limited to 'sys/fs')
-rw-r--r-- | sys/fs/unionfs/union_vnops.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/sys/fs/unionfs/union_vnops.c b/sys/fs/unionfs/union_vnops.c index d009150..73495f5 100644 --- a/sys/fs/unionfs/union_vnops.c +++ b/sys/fs/unionfs/union_vnops.c @@ -1165,6 +1165,9 @@ unionfs_rename(struct vop_rename_args *ap) } } + if (rfvp == rtvp) + goto unionfs_rename_abort; + if (needrelookup != 0) { if ((error = vn_lock(fdvp, LK_EXCLUSIVE)) != 0) goto unionfs_rename_abort; @@ -1192,10 +1195,6 @@ unionfs_rename(struct vop_rename_args *ap) cache_purge(fdvp); } - if (fdvp != rfdvp) - vrele(fdvp); - if (fvp != rfvp) - vrele(fvp); if (ltdvp != NULLVP) VOP_UNLOCK(ltdvp, 0); if (tdvp != rtdvp) @@ -1208,27 +1207,31 @@ unionfs_rename(struct vop_rename_args *ap) else vrele(tvp); } + if (fdvp != rfdvp) + vrele(fdvp); + if (fvp != rfvp) + vrele(fvp); UNIONFS_INTERNAL_DEBUG("unionfs_rename: leave (%d)\n", error); return (error); unionfs_rename_abort: - if (fdvp != rfdvp) - vrele(rfdvp); - if (fvp != rfvp) - vrele(rfvp); + vput(tdvp); if (tdvp != rtdvp) vrele(rtdvp); - vput(tdvp); - if (tvp != rtvp && rtvp != NULLVP) - vrele(rtvp); if (tvp != NULLVP) { if (tdvp != tvp) vput(tvp); else vrele(tvp); } + if (tvp != rtvp && rtvp != NULLVP) + vrele(rtvp); + if (fdvp != rfdvp) + vrele(rfdvp); + if (fvp != rfvp) + vrele(rfvp); vrele(fdvp); vrele(fvp); |