Whamcloud - gitweb
b=23371 Aviod deadlock with i_data_sem.
authoryangsheng <Sheng.Yang@sun.com>
Thu, 29 Jul 2010 09:53:54 +0000 (17:53 +0800)
committerJohann Lombardi <johann.lombardi@oracle.com>
Fri, 30 Jul 2010 13:48:01 +0000 (15:48 +0200)
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
lustre/lvfs/fsfilt_ext3.c

index 7ac01bf..85a631f 100644 (file)
@@ -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
 ])
 
 #
index 85d5cd7..72b8bf7 100644 (file)
@@ -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;
 }