| From ab1fbc60d1f924d4ccbe645ce6e7e5df10d923e2 Mon Sep 17 00:00:00 2001 |
| From: Theodore Ts'o <tytso@mit.edu> |
| Date: Mon, 28 Sep 2009 15:58:29 -0400 |
| Subject: [PATCH 45/85] ext4: EXT4_IOC_MOVE_EXT: Check for different original and donor inodes first |
| |
| (cherry picked from commit f3ce8064b388ccf420012c5a4907aae4f13fe9d0) |
| |
| 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: "Theodore Ts'o" <tytso@mit.edu> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| --- |
| fs/ext4/move_extent.c | 16 ++++++++-------- |
| 1 file changed, 8 insertions(+), 8 deletions(-) |
| |
| --- a/fs/ext4/move_extent.c |
| +++ b/fs/ext4/move_extent.c |
| @@ -1001,14 +1001,6 @@ mext_check_arguments(struct inode *orig_ |
| 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, s |
| 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) |