From e33ec76611c3baa4bc0a250c82690451af2b330b Mon Sep 17 00:00:00 2001 From: Johann Lombardi Date: Wed, 6 Oct 2010 15:51:13 +0200 Subject: [PATCH] b=23780 hold write reference on i_data_sem for walk_space i=girish Restore the old behavior and live with the fiemap locking issue for now. --- ...ug23780-remove-i_data_sem-from-walk_space.patch | 33 ++++++++++++++++++++++ .../series/ldiskfs-2.6-sles11.series | 1 + lustre/lvfs/fsfilt_ext3.c | 7 ----- 3 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 ldiskfs/kernel_patches/patches/ext4-bug23780-remove-i_data_sem-from-walk_space.patch 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 index 0000000..752bcdb --- /dev/null +++ b/ldiskfs/kernel_patches/patches/ext4-bug23780-remove-i_data_sem-from-walk_space.patch @@ -0,0 +1,33 @@ +commit c1a9f672dd752df609a38126e33457c2064329e6 +Author: Johann Lombardi +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; diff --git a/ldiskfs/kernel_patches/series/ldiskfs-2.6-sles11.series b/ldiskfs/kernel_patches/series/ldiskfs-2.6-sles11.series index 7aad839..fb0030e 100644 --- a/ldiskfs/kernel_patches/series/ldiskfs-2.6-sles11.series +++ b/ldiskfs/kernel_patches/series/ldiskfs-2.6-sles11.series @@ -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 diff --git a/lustre/lvfs/fsfilt_ext3.c b/lustre/lvfs/fsfilt_ext3.c index 3d23492..0643e0e 100644 --- a/lustre/lvfs/fsfilt_ext3.c +++ b/lustre/lvfs/fsfilt_ext3.c @@ -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); -- 1.8.3.1