From 0dc296c6c31e1f1fa4875a0e5c0f37f3c86b9999 Mon Sep 17 00:00:00 2001 From: Marc Dionne Date: Wed, 18 Mar 2009 12:57:09 +0000 Subject: [PATCH] STABLE14-linux-disable-readahad-20081108 LICENSE IPL10 FIXES 123604 The code has long contained a backing_dev_info structure, but it was never attached to anything. Initialize its use properly with bdi_init, and attach it to i_mapping for every newly filled inode. bdi_init and bdi_destroy are needed for proper initialization of some percpu counters, otherwise we get some oopses. (cherry picked from commit 18e78d91e78e541fce6c9295919946af0744aa7e) --- acinclude.m4 | 1 + src/afs/LINUX/osi_vfsops.c | 6 ++++++ src/afs/LINUX/osi_vnodeops.c | 2 ++ src/cf/linux-test4.m4 | 13 +++++++++++++ 4 files changed, 22 insertions(+) diff --git a/acinclude.m4 b/acinclude.m4 index 2a972a16d..ded36539c 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -716,6 +716,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*) LINUX_HAVE_GRAB_CACHE_PAGE_WRITE_BEGIN LINUX_STRUCT_TASK_HAS_CRED LINUX_KMEM_CACHE_INIT + LINUX_HAVE_BDI_INIT LINUX_HAVE_KMEM_CACHE_T LINUX_KMEM_CACHE_CREATE_TAKES_DTOR LINUX_CONFIG_H_EXISTS diff --git a/src/afs/LINUX/osi_vfsops.c b/src/afs/LINUX/osi_vfsops.c index c3e8d5455..e8e8986e8 100644 --- a/src/afs/LINUX/osi_vfsops.c +++ b/src/afs/LINUX/osi_vfsops.c @@ -143,6 +143,9 @@ afs_read_super(struct super_block *sb, void *data, int silent) sb->s_blocksize_bits = 10; sb->s_magic = AFS_VFSMAGIC; sb->s_op = &afs_sops; /* Super block (vfs) ops */ +#if defined(HAVE_BDI_INIT) + bdi_init(&afs_backing_dev_info); +#endif #if defined(MAX_NON_LFS) #ifdef AFS_64BIT_CLIENT #if !defined(MAX_LFS_FILESIZE) @@ -394,6 +397,9 @@ afs_put_super(struct super_block *sbp) #endif osi_linux_verify_alloced_memory(); +#if defined(HAVE_BDI_INIT) + bdi_destroy(&afs_backing_dev_info); +#endif AFS_GUNLOCK(); sbp->s_dev = 0; diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c index b599fa94c..42f9a9f32 100644 --- a/src/afs/LINUX/osi_vnodeops.c +++ b/src/afs/LINUX/osi_vnodeops.c @@ -47,6 +47,7 @@ RCSID #if defined(AFS_LINUX26_ENV) #define UnlockPage(pp) unlock_page(pp) +extern struct backing_dev_info afs_backing_dev_info; #endif extern struct vcache *afs_globalVp; @@ -1929,6 +1930,7 @@ afs_fill_inode(struct inode *ip, struct vattr *vattr) if (vattr) vattr2inode(ip, vattr); + ip->i_mapping->backing_dev_info = &afs_backing_dev_info; /* Reset ops if symlink or directory. */ if (S_ISREG(ip->i_mode)) { ip->i_op = &afs_file_iops; diff --git a/src/cf/linux-test4.m4 b/src/cf/linux-test4.m4 index 5fc4c2bd8..144eb5040 100644 --- a/src/cf/linux-test4.m4 +++ b/src/cf/linux-test4.m4 @@ -1061,6 +1061,19 @@ AC_DEFUN([LINUX_SEMAPHORE_H_EXISTS], [ AC_DEFINE([LINUX_SEMAPHORE_H], 1, [define if linux/semaphore.h exists]) fi]) +AC_DEFUN([LINUX_HAVE_BDI_INIT], [ + AC_MSG_CHECKING([for linux bdi_init()]) + AC_CACHE_VAL([ac_cv_linux_bdi_init], [ + AC_TRY_KBUILD( +[#include ], +[bdi_init(NULL);], + ac_cv_linux_bdi_init=yes, + ac_cv_linux_bdi_init=no)]) + AC_MSG_RESULT($ac_cv_linux_bdi_init) + if test "x$ac_cv_linux_bdi_init" = "xyes"; then + AC_DEFINE([HAVE_BDI_INIT], 1, [define if your kernel has a bdi_init()]) + fi]) + AC_DEFUN([LINUX_HAVE_WRITE_BEGIN_AOP], [ AC_MSG_CHECKING([for linux write_begin() address space op]) AC_CACHE_VAL([ac_cv_linux_write_begin], [ -- 2.39.5