From: James Simmons Date: Tue, 11 Aug 2015 15:33:17 +0000 (-0400) Subject: LU-6215 llite: handle backing_dev_info removal X-Git-Tag: 2.7.59~49 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=7e0e87e6f2dbd04e6fb94123f453ad8f2806dc8b;p=fs%2Flustre-release.git LU-6215 llite: handle backing_dev_info removal 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 Change-Id: Ic2cd9227c99e3f66001ea9470cdc6bfdbf4f1c2c Reviewed-on: http://review.whamcloud.com/15182 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Bob Glossman Reviewed-by: Dmitry Eremin Reviewed-by: Oleg Drokin --- diff --git a/lustre/autoconf/lustre-core.m4 b/lustre/autoconf/lustre-core.m4 index 0d83e19..96f4769 100644 --- a/lustre/autoconf/lustre-core.m4 +++ b/lustre/autoconf/lustre-core.m4 @@ -1786,6 +1786,45 @@ ki_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 +],[ + 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 +],[ + 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 @@ -1977,6 +2016,10 @@ AC_DEFUN([LC_PROG_LINUX], [ # 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 diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c index dbc4302..cb0718d 100644 --- a/lustre/llite/llite_lib.c +++ b/lustre/llite/llite_lib.c @@ -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; +#ifdef HAVE_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); @@ -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; +#ifdef HAVE_BACKING_DEV_INFO /* 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; @@ -1972,10 +1978,10 @@ int ll_read_inode2(struct inode *inode, void *opaque) /* 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;