diff -urBN /usr/src.p203/sys/fs/unionfs/union_vnops.c /usr/src/sys/fs/unionfs/union_vnops.c --- /usr/src.p203/sys/fs/unionfs/union_vnops.c 2007-10-22 23:28:17.000000000 +0900 +++ /usr/src/sys/fs/unionfs/union_vnops.c 2007-11-12 21:23:23.000000000 +0900 @@ -1169,6 +1169,9 @@ } } + if (rfvp == rtvp) + goto unionfs_rename_abort; + if (needrelookup != 0) { if ((error = vn_lock(fdvp, LK_EXCLUSIVE, td)) != 0) goto unionfs_rename_abort; @@ -1196,10 +1199,6 @@ cache_purge(fdvp); } - if (fdvp != rfdvp) - vrele(fdvp); - if (fvp != rfvp) - vrele(fvp); if (ltdvp != NULLVP) VOP_UNLOCK(ltdvp, 0, td); if (tdvp != rtdvp) @@ -1212,27 +1211,31 @@ 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);