From: Jan Kara
Sent: 23 May 2023 14:14
Commit 0813299c586b ("ext4: Fix possible corruption when moving a directory") forgot that handling of RENAME_EXCHANGE renames needs the protection of inode lock when changing directory parents for moved directories. Add proper locking for that case as well.
CC: stable@vger.kernel.org Fixes: 0813299c586b ("ext4: Fix possible corruption when moving a directory") Reported-by: "Darrick J. Wong" djwong@kernel.org Signed-off-by: Jan Kara jack@suse.cz
fs/ext4/namei.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-)
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 45b579805c95..b91abea1c781 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c @@ -4083,10 +4083,25 @@ static int ext4_cross_rename(struct inode *old_dir, struct dentry *old_dentry, if (retval) return retval;
- /*
* We need to protect against old.inode and new.inode directory getting
* converted from inline directory format into a normal one. The lock
* ordering does not matter here as old and new are guaranteed to be
* incomparable in the directory hierarchy.
*/
- if (S_ISDIR(old.inode->i_mode))
inode_lock(old.inode);
- if (S_ISDIR(new.inode->i_mode))
inode_lock_nested(new.inode, I_MUTEX_NONDIR2);
What happens if there is another concurrent rename from new.inode to old.inode? That will try to acquire the locks in the other order.
David
- Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)