From a54c027b20ea388d8a10c2500b2659dc9d23d2d9 Mon Sep 17 00:00:00 2001 From: ivoras Date: Tue, 22 Nov 2011 16:18:12 +0000 Subject: [PATCH 04/65] Avoid panics from recursive rename operations. Not a perfect patch but good enough for now. PR: kern/159418 Submitted by: Gleb Kurtsou Reviewed by: kib MFC after: 1 month git-svn-id: http://svn.freebsd.org/base/head@227822 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f (cherry picked from commit 7a78e503d2a111c7100868825a88b4d8dc7e3355) Signed-off-by: Xin Li --- sys/fs/tmpfs/tmpfs_vnops.c | 9 +++------ 1 files changed, 3 insertions(+), 6 deletions(-) diff --git a/sys/fs/tmpfs/tmpfs_vnops.c b/sys/fs/tmpfs/tmpfs_vnops.c index 6f52491..dfe1183 100644 --- a/sys/fs/tmpfs/tmpfs_vnops.c +++ b/sys/fs/tmpfs/tmpfs_vnops.c @@ -965,11 +965,8 @@ tmpfs_rename(struct vop_rename_args *v) /* If we need to move the directory between entries, lock the * source so that we can safely operate on it. */ - if (tdvp != fdvp) { - error = vn_lock(fdvp, LK_EXCLUSIVE | LK_RETRY); - if (error != 0) - goto out; - } + if (fdvp != tdvp && fdvp != tvp) + vn_lock(fdvp, LK_EXCLUSIVE | LK_RETRY); fdnode = VP_TO_TMPFS_DIR(fdvp); fnode = VP_TO_TMPFS_NODE(fvp); de = tmpfs_dir_lookup(fdnode, fnode, fcnp); @@ -1143,7 +1140,7 @@ tmpfs_rename(struct vop_rename_args *v) error = 0; out_locked: - if (fdnode != tdnode) + if (fdvp != tdvp && fdvp != tvp) VOP_UNLOCK(fdvp, 0); out: -- 1.7.8.3