diff options
author | ivoras <ivoras@FreeBSD.org> | 2011-11-22 16:18:12 +0000 |
---|---|---|
committer | ivoras <ivoras@FreeBSD.org> | 2011-11-22 16:18:12 +0000 |
commit | 6123cbfb2edc5d69a7cd104442dd30ccfc45be48 (patch) | |
tree | 94d01f928c24c7a512c313304c6a95fa30c2de77 /sys/fs | |
parent | da7efa5819516076c7872ef1ed39b29bdf2643af (diff) | |
download | FreeBSD-src-6123cbfb2edc5d69a7cd104442dd30ccfc45be48.zip FreeBSD-src-6123cbfb2edc5d69a7cd104442dd30ccfc45be48.tar.gz |
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
Diffstat (limited to 'sys/fs')
-rw-r--r-- | 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: |