Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f3ce8064 authored by Theodore Ts'o's avatar Theodore Ts'o
Browse files

ext4: EXT4_IOC_MOVE_EXT: Check for different original and donor inodes first



Move the check to make sure the original and donor inodes are
different earlier, to avoid a potential deadlock by trying to lock the
same inode twice.

Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
parent 8d5d02e6
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -1001,14 +1001,6 @@ mext_check_arguments(struct inode *orig_inode,
		return -EINVAL;
	}

	/* orig and donor should be different file */
	if (orig_inode->i_ino == donor_inode->i_ino) {
		ext4_debug("ext4 move extent: The argument files should not "
			"be same file [ino:orig %lu, donor %lu]\n",
			orig_inode->i_ino, donor_inode->i_ino);
		return -EINVAL;
	}

	/* Ext4 move extent supports only extent based file */
	if (!(EXT4_I(orig_inode)->i_flags & EXT4_EXTENTS_FL)) {
		ext4_debug("ext4 move extent: orig file is not extents "
@@ -1232,6 +1224,14 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp,
	int block_len_in_page;
	int uninit;

	/* orig and donor should be different file */
	if (orig_inode->i_ino == donor_inode->i_ino) {
		ext4_debug("ext4 move extent: The argument files should not "
			"be same file [ino:orig %lu, donor %lu]\n",
			orig_inode->i_ino, donor_inode->i_ino);
		return -EINVAL;
	}

	/* protect orig and donor against a truncate */
	ret1 = mext_inode_double_lock(orig_inode, donor_inode);
	if (ret1 < 0)