From 26d88932984b50774aa42b00ecb7a6dec09a1df0 Mon Sep 17 00:00:00 2001 From: yangsheng Date: Thu, 29 Jul 2010 17:53:54 +0800 Subject: [PATCH] b=23371 Aviod deadlock with i_data_sem. i=adilger i=andrew ext4_ext_walk_space() take i_data_sem at present. So we have to detect this case to avoid deadlock. --- lustre/autoconf/lustre-core.m4 | 19 +++++++++++++++++++ lustre/lvfs/fsfilt_ext3.c | 4 ++++ 2 files changed, 23 insertions(+) diff --git a/lustre/autoconf/lustre-core.m4 b/lustre/autoconf/lustre-core.m4 index 7ac01bf..85a631f 100644 --- a/lustre/autoconf/lustre-core.m4 +++ b/lustre/autoconf/lustre-core.m4 @@ -1765,6 +1765,24 @@ LB_LINUX_TRY_COMPILE([ ]) ]) +# LC_WALK_SPACE_HAS_DATA_SEM +# +# 2.6.33 ext4_ext_walk_space() takes i_data_sem internally. +# Not a very robust check, but it will hopefully last long +# enough until it can avoid being conditional. +# +AC_DEFUN([LC_WALK_SPACE_HAS_DATA_SEM], +[AC_MSG_CHECKING([if ext4_ext_walk_space() takes i_data_sem]) +WALK_SPACE_DATA_SEM="$(awk '/ext4_ext_walk_space/,/ext4_ext_find_extent/' $LINUX/fs/ext4/extents.c | grep -c 'down_read.*i_data_sem')" +if test "$WALK_SPACE_DATA_SEM" != 0 ; then + AC_DEFINE(WALK_SPACE_HAS_DATA_SEM, 1, + [ext4_ext_walk_space takes i_data_sem]) + AC_MSG_RESULT([yes]) +else + AC_MSG_RESULT([no]) +fi +]) + # # LC_PROG_LINUX # @@ -1923,6 +1941,7 @@ AC_DEFUN([LC_PROG_LINUX], # 2.6.32 LC_NEW_BACKING_DEV_INFO + LC_WALK_SPACE_HAS_DATA_SEM ]) # diff --git a/lustre/lvfs/fsfilt_ext3.c b/lustre/lvfs/fsfilt_ext3.c index 85d5cd7..72b8bf7 100644 --- a/lustre/lvfs/fsfilt_ext3.c +++ b/lustre/lvfs/fsfilt_ext3.c @@ -1146,10 +1146,14 @@ int fsfilt_map_nblocks(struct inode *inode, unsigned long block, bp.init_num = bp.num = num; bp.create = create; +#if !defined(WALK_SPACE_HAS_DATA_SEM) || !defined(HAVE_EXT4_LDISKFS) fsfilt_down_truncate_sem(inode); +#endif err = fsfilt_ext3_ext_walk_space(base, block, num, ext3_ext_new_extent_cb, &bp); ext3_ext_invalidate_cache(base); +#if !defined(WALK_SPACE_HAS_DATA_SEM) || !defined(HAVE_EXT4_LDISKFS) fsfilt_up_truncate_sem(inode); +#endif return err; } -- 1.8.3.1