Skip to content

Commit 7307b73

Browse files
jankaraAl Viro
authored andcommitted
ext2: Avoid reading renamed directory if parent does not change
The VFS will not be locking moved directory if its parent does not change. Change ext2 rename code to avoid reading renamed directory if its parent does not change. Although it is currently harmless it is a bad practice to read directory contents without inode->i_rwsem. Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
1 parent 9d35ceb commit 7307b73

File tree

1 file changed

+6
-5
lines changed

1 file changed

+6
-5
lines changed

fs/ext2/namei.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@ static int ext2_rename (struct mnt_idmap * idmap,
325325
struct ext2_dir_entry_2 * dir_de = NULL;
326326
struct folio * old_folio;
327327
struct ext2_dir_entry_2 * old_de;
328+
bool old_is_dir = S_ISDIR(old_inode->i_mode);
328329
int err;
329330

330331
if (flags & ~RENAME_NOREPLACE)
@@ -342,7 +343,7 @@ static int ext2_rename (struct mnt_idmap * idmap,
342343
if (IS_ERR(old_de))
343344
return PTR_ERR(old_de);
344345

345-
if (S_ISDIR(old_inode->i_mode)) {
346+
if (old_is_dir && old_dir != new_dir) {
346347
err = -EIO;
347348
dir_de = ext2_dotdot(old_inode, &dir_folio);
348349
if (!dir_de)
@@ -354,7 +355,7 @@ static int ext2_rename (struct mnt_idmap * idmap,
354355
struct ext2_dir_entry_2 *new_de;
355356

356357
err = -ENOTEMPTY;
357-
if (dir_de && !ext2_empty_dir (new_inode))
358+
if (old_is_dir && !ext2_empty_dir(new_inode))
358359
goto out_dir;
359360

360361
new_de = ext2_find_entry(new_dir, &new_dentry->d_name,
@@ -368,14 +369,14 @@ static int ext2_rename (struct mnt_idmap * idmap,
368369
if (err)
369370
goto out_dir;
370371
inode_set_ctime_current(new_inode);
371-
if (dir_de)
372+
if (old_is_dir)
372373
drop_nlink(new_inode);
373374
inode_dec_link_count(new_inode);
374375
} else {
375376
err = ext2_add_link(new_dentry, old_inode);
376377
if (err)
377378
goto out_dir;
378-
if (dir_de)
379+
if (old_is_dir)
379380
inode_inc_link_count(new_dir);
380381
}
381382

@@ -387,7 +388,7 @@ static int ext2_rename (struct mnt_idmap * idmap,
387388
mark_inode_dirty(old_inode);
388389

389390
err = ext2_delete_entry(old_de, old_folio);
390-
if (!err && dir_de) {
391+
if (!err && old_is_dir) {
391392
if (old_dir != new_dir)
392393
err = ext2_set_link(old_inode, dir_de, dir_folio,
393394
new_dir, false);

0 commit comments

Comments
 (0)