Whamcloud - gitweb
b=23780 hold write reference on i_data_sem for walk_space
authorJohann Lombardi <johann@sun.com>
Wed, 6 Oct 2010 13:51:13 +0000 (15:51 +0200)
committerJohann Lombardi <johann.lombardi@oracle.com>
Wed, 6 Oct 2010 13:51:13 +0000 (15:51 +0200)
i=girish

Restore the old behavior and live with the fiemap locking issue for now.

ldiskfs/kernel_patches/patches/ext4-bug23780-remove-i_data_sem-from-walk_space.patch [new file with mode: 0644]
ldiskfs/kernel_patches/series/ldiskfs-2.6-sles11.series
lustre/lvfs/fsfilt_ext3.c

diff --git a/ldiskfs/kernel_patches/patches/ext4-bug23780-remove-i_data_sem-from-walk_space.patch b/ldiskfs/kernel_patches/patches/ext4-bug23780-remove-i_data_sem-from-walk_space.patch
new file mode 100644 (file)
index 0000000..752bcdb
--- /dev/null
@@ -0,0 +1,33 @@
+commit c1a9f672dd752df609a38126e33457c2064329e6
+Author: Johann Lombardi <johann@sun.com>
+Date:   Wed Oct 6 15:26:43 2010 +0200
+
+    Revert "ext4: Fix potential fiemap deadlock (mmap_sem vs. i_data_sem)"
+    
+    This reverts commit fab3a549e204172236779f502eccb4f9bf0dc87d.
+
+diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
+index 06328d3..51c9452 100644
+--- a/fs/ext4/extents.c
++++ b/fs/ext4/extents.c
+@@ -1862,9 +1862,7 @@ int ext4_ext_walk_space(struct inode *inode, ext4_lblk_t block,
+       while (block < last && block != EXT_MAX_BLOCK) {
+               num = last - block;
+               /* find extent for this block */
+-              down_read(&EXT4_I(inode)->i_data_sem);
+               path = ext4_ext_find_extent(inode, block, path);
+-              up_read(&EXT4_I(inode)->i_data_sem);
+               if (IS_ERR(path)) {
+                       err = PTR_ERR(path);
+                       path = NULL;
+@@ -3956,8 +3954,10 @@ int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
+                * Walk the extent tree gathering extent information.
+                * ext4_ext_fiemap_cb will push extents back to user.
+                */
++              down_read(&EXT4_I(inode)->i_data_sem);
+               error = ext4_ext_walk_space(inode, start_blk, len_blks,
+                                         ext4_ext_fiemap_cb, fieinfo);
++              up_read(&EXT4_I(inode)->i_data_sem);
+       }
+       return error;
index 7aad839..fb0030e 100644 (file)
@@ -28,3 +28,4 @@ ext4-disable-write-bar-by-default.patch
 ext4-mballoc-skip-grps.patch
 ext4-disable-mb-cache-sles11.patch
 ext4-consolidate-in_range-definitions.patch
+ext4-bug23780-remove-i_data_sem-from-walk_space.patch
index 3d23492..0643e0e 100644 (file)
@@ -857,15 +857,8 @@ static int fsfilt_ext3_sync(struct super_block *sb)
 # define fsfilt_down_truncate_sem(inode)  down(&LDISKFS_I(inode)->truncate_sem);
 #else
 # ifdef HAVE_EXT4_LDISKFS
-#  ifdef WALK_SPACE_HAS_DATA_SEM
-        /* Only used in fsfilt_map_nblocks() for now. 
-         * Please consider redefine it if using elsewhere. */
-#   define fsfilt_up_truncate_sem(inode) do{ }while(0)
-#   define fsfilt_down_truncate_sem(inode) do{ }while(0)
-#  else
 #   define fsfilt_up_truncate_sem(inode) up_write((&LDISKFS_I(inode)->i_data_sem));
 #   define fsfilt_down_truncate_sem(inode) down_write((&LDISKFS_I(inode)->i_data_sem));
-#  endif
 # else
 #  define fsfilt_up_truncate_sem(inode)  mutex_unlock(&LDISKFS_I(inode)->truncate_mutex);
 #  define fsfilt_down_truncate_sem(inode)  mutex_lock(&LDISKFS_I(inode)->truncate_mutex);