From: Marc Dionne Date: Sat, 8 Nov 2008 16:13:59 +0000 (+0000) Subject: DEVEL15-linux-disable-readahad-20081108 X-Git-Tag: openafs-devel-1_5_55~3 X-Git-Url: http://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=856e99dcdfee3fac6d4ed8e001cd82d9d136bdea;hp=230c54bef4cdffa1b1412f9ae2758e992e10faea DEVEL15-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) --- diff --git a/acinclude.m4 b/acinclude.m4 index 325d3dc..4988cc4 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -829,6 +829,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*) LINUX_EXPORTS_FIND_TASK_BY_PID LINUX_EXPORTS_PROC_ROOT_FS LINUX_HAVE_CURRENT_KERNEL_TIME + LINUX_HAVE_BDI_INIT LINUX_KMEM_CACHE_INIT LINUX_HAVE_KMEM_CACHE_T LINUX_KMEM_CACHE_CREATE_TAKES_DTOR diff --git a/src/afs/LINUX/osi_vfsops.c b/src/afs/LINUX/osi_vfsops.c index b2d906c..92dc336 100644 --- a/src/afs/LINUX/osi_vfsops.c +++ b/src/afs/LINUX/osi_vfsops.c @@ -149,6 +149,9 @@ afs_read_super(struct super_block *sb, void *data, int silent) #if defined(AFS_LINUX26_ENV) && !defined(AFS_NONFSTRANS) sb->s_export_op = &afs_export_ops; #endif +#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) @@ -400,6 +403,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 5e7a62c..7a5a26e 100644 --- a/src/afs/LINUX/osi_vnodeops.c +++ b/src/afs/LINUX/osi_vnodeops.c @@ -53,6 +53,7 @@ RCSID #if defined(AFS_LINUX26_ENV) #define LockPage(pp) lock_page(pp) #define UnlockPage(pp) unlock_page(pp) +extern struct backing_dev_info afs_backing_dev_info; #endif extern struct vcache *afs_globalVp; @@ -2231,6 +2232,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 af278de..1d95461 100644 --- a/src/cf/linux-test4.m4 +++ b/src/cf/linux-test4.m4 @@ -1092,3 +1092,15 @@ 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])