From: Al Viro <viro@zeniv.linux.org.uk>
To: linux-fsdevel@vger.kernel.org
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
Mo Zou <lostzoumo@gmail.com>, Jan Kara <jack@suse.cz>,
linux-kernel@vger.kernel.org
Subject: [PATCH v2 3/9] udf_rename(): only access the child content on cross-directory rename
Date: Sat, 25 Nov 2023 20:11:41 +0000 [thread overview]
Message-ID: <20231125201147.753695-3-viro@zeniv.linux.org.uk> (raw)
In-Reply-To: <20231125201147.753695-1-viro@zeniv.linux.org.uk>
We can't really afford locking the source on same-directory rename;
currently vfs_rename() tries to do that, but it will have to be
changed. The logics in udf_rename() is lazy and goes looking for
".." in source even in same-directory case. It's not hard to get
rid of that, leaving that behaviour only for cross-directory case;
that VFS can get locks safely (and will keep doing that after the
coming changes).
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
---
fs/udf/namei.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/fs/udf/namei.c b/fs/udf/namei.c
index 3508ac484da3..fac806a7a8d4 100644
--- a/fs/udf/namei.c
+++ b/fs/udf/namei.c
@@ -766,7 +766,7 @@ static int udf_rename(struct mnt_idmap *idmap, struct inode *old_dir,
struct inode *old_inode = d_inode(old_dentry);
struct inode *new_inode = d_inode(new_dentry);
struct udf_fileident_iter oiter, niter, diriter;
- bool has_diriter = false;
+ bool has_diriter = false, is_dir = false;
int retval;
struct kernel_lb_addr tloc;
@@ -789,6 +789,9 @@ static int udf_rename(struct mnt_idmap *idmap, struct inode *old_dir,
if (!empty_dir(new_inode))
goto out_oiter;
}
+ is_dir = true;
+ }
+ if (is_dir && old_dir != new_dir) {
retval = udf_fiiter_find_entry(old_inode, &dotdot_name,
&diriter);
if (retval == -ENOENT) {
@@ -878,7 +881,9 @@ static int udf_rename(struct mnt_idmap *idmap, struct inode *old_dir,
udf_dir_entry_len(&diriter.fi));
udf_fiiter_write_fi(&diriter, NULL);
udf_fiiter_release(&diriter);
+ }
+ if (is_dir) {
inode_dec_link_count(old_dir);
if (new_inode)
inode_dec_link_count(new_inode);
--
2.39.2
next prev parent reply other threads:[~2023-11-25 20:12 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-22 19:30 [PATCHES][CFT] rename deadlock fixes Al Viro
2023-11-22 19:36 ` [PATCH 1/9] reiserfs: Avoid touching renamed directory if parent does not change Al Viro
2023-11-22 19:36 ` [PATCH 2/9] ocfs2: " Al Viro
2023-11-22 19:36 ` [PATCH 3/9] udf_rename(): only access the child content on cross-directory rename Al Viro
2023-11-23 9:22 ` Jan Kara
2023-11-22 19:36 ` [PATCH 4/9] ext2: Avoid reading renamed directory if parent does not change Al Viro
2023-11-22 19:36 ` [PATCH 5/9] ext4: don't access the source subdirectory content on same-directory rename Al Viro
2023-11-23 9:31 ` Jan Kara
2023-11-22 19:36 ` [PATCH 6/9] f2fs: Avoid reading renamed directory if parent does not change Al Viro
2023-11-22 19:36 ` [PATCH 7/9] rename(): fix the locking of subdirectories Al Viro
2023-11-23 9:50 ` Jan Kara
2023-11-22 19:36 ` [PATCH 8/9] kill lock_two_inodes() Al Viro
2023-11-23 9:53 ` Jan Kara
2023-11-22 19:36 ` [PATCH 9/9] rename(): avoid a deadlock in the case of parents having no common ancestor Al Viro
2023-11-23 10:36 ` Jan Kara
2023-11-24 6:15 ` Al Viro
2023-11-24 7:24 ` Amir Goldstein
2023-11-25 20:10 ` [PATCHES v2][CFT] rename deadlock fixes Al Viro
2023-11-25 20:11 ` [PATCH v2 1/9] reiserfs: Avoid touching renamed directory if parent does not change Al Viro
2023-11-25 20:11 ` [PATCH v2 2/9] ocfs2: " Al Viro
2023-11-25 20:11 ` Al Viro [this message]
2023-11-25 20:11 ` [PATCH v2 4/9] ext2: Avoid reading " Al Viro
2023-11-25 20:11 ` [PATCH v2 5/9] ext4: don't access the source subdirectory content on same-directory rename Al Viro
2023-11-25 20:11 ` [PATCH v2 6/9] f2fs: Avoid reading renamed directory if parent does not change Al Viro
2023-11-25 20:11 ` [PATCH v2 7/9] rename(): fix the locking of subdirectories Al Viro
2023-11-25 20:11 ` [PATCH v2 8/9] kill lock_two_inodes() Al Viro
2023-11-25 20:11 ` [PATCH v2 9/9] rename(): avoid a deadlock in the case of parents having no common ancestor Al Viro
2023-12-05 2:21 [RFC][PATCHES v2] checksum stuff Al Viro
2023-12-05 2:23 ` [PATCH v2 01/18] make net/checksum.h self-contained Al Viro
2023-12-05 2:23 ` [PATCH v2 3/9] udf_rename(): only access the child content on cross-directory rename Al Viro
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231125201147.753695-3-viro@zeniv.linux.org.uk \
--to=viro@zeniv.linux.org.uk \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lostzoumo@gmail.com \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®