Whamcloud - gitweb
LU-6215 llite: handle backing_dev_info removal 82/15182/4
authorJames Simmons <uja.ornl@yahoo.com>
Tue, 11 Aug 2015 15:33:17 +0000 (11:33 -0400)
committerOleg Drokin <oleg.drokin@intel.com>
Wed, 19 Aug 2015 15:59:10 +0000 (15:59 +0000)
For kernels before 3.20 the struct address_space contained
a pointer to a struct backing_dev_info. This backing_dev_info
had to setup with the backing_dev_info that was contained
in the super block. Now in newer kernels that backing_dev_info
pointer has been removed from the address_space. If you want
to use the backing_dev_info you need to access it from the
super block data structure directly. Lustre upstream removed
all the backing_dev_info setup for the inode i_mapping which
is no longer needed. This patch makes Lustre handle the bdi
inode backing_dev_info only for per 3.20 kernels now. This
change was due to:

Linux-commit: 6bec0035286119eefc32a5b1102127e6a4032cb2

Another change in the 3.20 kernels is the removal of the mmap
functionaly for the backing device. This was removed in with

Linux-commit: b4caecd48005fbed3949dde6c1cb233142fd69e9

With this change the flag BDI_CAP_MAP_COPY was removed.

Signed-off-by: James Simmons <uja.ornl@yahoo.com>
Change-Id: Ic2cd9227c99e3f66001ea9470cdc6bfdbf4f1c2c
Reviewed-on: http://review.whamcloud.com/15182
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Bob Glossman <bob.glossman@intel.com>
Reviewed-by: Dmitry Eremin <dmitry.eremin@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/autoconf/lustre-core.m4
lustre/llite/llite_lib.c

index 0d83e19..96f4769 100644 (file)
@@ -1786,6 +1786,45 @@ ki_nbytes, [
 ]) # LC_KIOCB_HAS_NBYTES
 
 #
 ]) # LC_KIOCB_HAS_NBYTES
 
 #
+# LC_BACKING_DEV_INFO_REMOVAL
+#
+# 3.20 kernel removed backing_dev_info from address_space
+#
+AC_DEFUN([LC_BACKING_DEV_INFO_REMOVAL], [
+LB_CHECK_COMPILE([if struct address_space has backing_dev_info],
+backing_dev_info, [
+       #include <linux/fs.h>
+],[
+       struct address_space mapping;
+
+       mapping.backing_dev_info = NULL;
+],[
+       AC_DEFINE(HAVE_BACKING_DEV_INFO, 1, [backing_dev_info exist])
+])
+]) # LC_BACKING_DEV_INFO_REMOVAL
+
+#
+# LC_HAVE_BDI_CAP_MAP_COPY
+#
+# 3.20  removed mmap handling for backing devices since
+#      it breaks on non-MMU systems. See kernel commit
+#      b4caecd48005fbed3949dde6c1cb233142fd69e9
+#
+AC_DEFUN([LC_HAVE_BDI_CAP_MAP_COPY], [
+LB_CHECK_COMPILE([if have 'BDI_CAP_MAP_COPY'],
+bdi_cap_map_copy, [
+       #include <linux/backing-dev.h>
+],[
+       struct backing_dev_info info;
+
+       info.capabilities = BDI_CAP_MAP_COPY;
+],[
+       AC_DEFINE(HAVE_BDI_CAP_MAP_COPY, 1,
+               [BDI_CAP_MAP_COPY exist])
+])
+]) # LC_HAVE_BDI_CAP_MAP_COPY
+
+#
 # LC_CANCEL_DIRTY_PAGE
 #
 # 4.0.0 kernel removed cancle_dirty_page
 # LC_CANCEL_DIRTY_PAGE
 #
 # 4.0.0 kernel removed cancle_dirty_page
@@ -1977,6 +2016,10 @@ AC_DEFUN([LC_PROG_LINUX], [
        # 3.19
        LC_KIOCB_HAS_NBYTES
 
        # 3.19
        LC_KIOCB_HAS_NBYTES
 
+       # 3.20
+       LC_BACKING_DEV_INFO_REMOVAL
+       LC_HAVE_BDI_CAP_MAP_COPY
+
        # 4.0.0
        LC_CANCEL_DIRTY_PAGE
 
        # 4.0.0
        LC_CANCEL_DIRTY_PAGE
 
index dbc4302..cb0718d 100644 (file)
@@ -999,7 +999,11 @@ int ll_fill_super(struct super_block *sb, struct vfsmount *mnt)
        if (err)
                GOTO(out_free, err);
        lsi->lsi_flags |= LSI_BDI_INITIALIZED;
        if (err)
                GOTO(out_free, err);
        lsi->lsi_flags |= LSI_BDI_INITIALIZED;
+#ifdef HAVE_BDI_CAP_MAP_COPY
        lsi->lsi_bdi.capabilities = BDI_CAP_MAP_COPY;
        lsi->lsi_bdi.capabilities = BDI_CAP_MAP_COPY;
+#else
+       lsi->lsi_bdi.capabilities = 0;
+#endif
        err = ll_bdi_register(&lsi->lsi_bdi);
        if (err)
                GOTO(out_free, err);
        err = ll_bdi_register(&lsi->lsi_bdi);
        if (err)
                GOTO(out_free, err);
@@ -1213,9 +1217,11 @@ static struct inode *ll_iget_anon_dir(struct super_block *sb,
                LTIME_S(inode->i_ctime) = 0;
                inode->i_rdev = 0;
 
                LTIME_S(inode->i_ctime) = 0;
                inode->i_rdev = 0;
 
+#ifdef HAVE_BACKING_DEV_INFO
                /* initializing backing dev info. */
                inode->i_mapping->backing_dev_info =
                                                &s2lsi(inode->i_sb)->lsi_bdi;
                /* initializing backing dev info. */
                inode->i_mapping->backing_dev_info =
                                                &s2lsi(inode->i_sb)->lsi_bdi;
+#endif
                inode->i_op = &ll_dir_inode_operations;
                inode->i_fop = &ll_dir_operations;
                lli->lli_fid = *fid;
                inode->i_op = &ll_dir_inode_operations;
                inode->i_fop = &ll_dir_operations;
                lli->lli_fid = *fid;
@@ -1972,10 +1978,10 @@ int ll_read_inode2(struct inode *inode, void *opaque)
 
         /* OIDEBUG(inode); */
 
 
         /* OIDEBUG(inode); */
 
-        /* initializing backing dev info. */
-        inode->i_mapping->backing_dev_info = &s2lsi(inode->i_sb)->lsi_bdi;
-
-
+#ifdef HAVE_BACKING_DEV_INFO
+       /* initializing backing dev info. */
+       inode->i_mapping->backing_dev_info = &s2lsi(inode->i_sb)->lsi_bdi;
+#endif
         if (S_ISREG(inode->i_mode)) {
                 struct ll_sb_info *sbi = ll_i2sbi(inode);
                 inode->i_op = &ll_file_inode_operations;
         if (S_ISREG(inode->i_mode)) {
                 struct ll_sb_info *sbi = ll_i2sbi(inode);
                 inode->i_op = &ll_file_inode_operations;