From c12c958febfd6f7667345baec164b617f44f8bb9 Mon Sep 17 00:00:00 2001 From: Marc Dionne Date: Thu, 9 Nov 2006 23:40:20 +0000 Subject: [PATCH] linux-statfs-dentry-20061109 FIXES 42788 statfs changed in recent linux kernels. cope. --- acinclude.m4 | 4 ++++ src/afs/LINUX/osi_vfsops.c | 11 ++++++++++- src/cf/linux-test4.m4 | 13 +++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/acinclude.m4 b/acinclude.m4 index 7f7fd6b..876348e 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -617,6 +617,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*) LINUX_SCHED_STRUCT_TASK_STRUCT_HAS_SIGNAL_RLIM LINUX_SCHED_STRUCT_TASK_STRUCT_HAS_EXIT_STATE LINUX_GET_SB_HAS_STRUCT_VFSMOUNT + LINUX_STATFS_TAKES_DENTRY LINUX_REFRIGERATOR LINUX_LINUX_KEYRING_SUPPORT LINUX_KEY_ALLOC_NEEDS_STRUCT_TASK @@ -788,6 +789,9 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*) if test "x$ac_cv_linux_get_sb_has_struct_vfsmount" = "xyes"; then AC_DEFINE(GET_SB_HAS_STRUCT_VFSMOUNT, 1, [define if your get_sb_nodev needs a struct vfsmount argument]) fi + if test "x$ac_cv_linux_statfs_takes_dentry" = "xyes"; then + AC_DEFINE(STATFS_TAKES_DENTRY, 1, [define if your statfs takes a dentry argument]) + fi if test "x$ac_cv_linux_func_a_writepage_takes_writeback_control" = "xyes" ; then AC_DEFINE(AOP_WRITEPAGE_TAKES_WRITEBACK_CONTROL, 1, [define if your aops.writepage takes a struct writeback_control argument]) fi diff --git a/src/afs/LINUX/osi_vfsops.c b/src/afs/LINUX/osi_vfsops.c index 71f01b8..1b90c28 100644 --- a/src/afs/LINUX/osi_vfsops.c +++ b/src/afs/LINUX/osi_vfsops.c @@ -67,11 +67,12 @@ int afs_fill_super(struct super_block *sb, void *data, int silent); * dev, covered, s_rd_only, s_dirt, and s_type will be set by read_super. */ #if defined(AFS_LINUX26_ENV) -static struct super_block * #ifdef GET_SB_HAS_STRUCT_VFSMOUNT +int afs_get_sb(struct file_system_type *fs_type, int flags, const char *dev_name, void *data, struct vfsmount *mnt) #else +static struct superblock * afs_get_sb(struct file_system_type *fs_type, int flags, const char *dev_name, void *data) #endif @@ -390,7 +391,11 @@ afs_put_super(struct super_block *sbp) */ #if defined(AFS_LINUX26_ENV) int +#if defined(STATFS_TAKES_DENTRY) +afs_statfs(struct dentry *dentry, struct kstatfs *statp) +#else afs_statfs(struct super_block *sbp, struct kstatfs *statp) +#endif #elif defined(AFS_LINUX24_ENV) int afs_statfs(struct super_block *sbp, struct statfs *statp) @@ -414,7 +419,11 @@ afs_statfs(struct super_block *sbp, struct statfs *__statp, int size) AFS_STATCNT(afs_statfs); statp->f_type = 0; /* Can we get a real type sometime? */ +#if defined(STATFS_TAKES_DENTRY) + statp->f_bsize = dentry->d_sb->s_blocksize; +#else statp->f_bsize = sbp->s_blocksize; +#endif statp->f_blocks = statp->f_bfree = statp->f_bavail = statp->f_files = statp->f_ffree = 9000000; statp->f_fsid.val[0] = AFS_VFSMAGIC; diff --git a/src/cf/linux-test4.m4 b/src/cf/linux-test4.m4 index 261c82d..e32c355 100644 --- a/src/cf/linux-test4.m4 +++ b/src/cf/linux-test4.m4 @@ -622,6 +622,19 @@ AC_DEFUN([LINUX_GET_SB_HAS_STRUCT_VFSMOUNT], [ ac_cv_linux_get_sb_has_struct_vfsmount=no)]) AC_MSG_RESULT($ac_cv_linux_get_sb_has_struct_vfsmount)]) +AC_DEFUN([LINUX_STATFS_TAKES_DENTRY], [ + AC_MSG_CHECKING([for dentry in statfs]) + AC_CACHE_VAL([ac_cv_linux_statfs_takes_dentry], [ + AC_TRY_KBUILD( +[#include +#include ], +[ +extern int vfs_statfs(struct dentry *, struct kstatfs *); +], + ac_cv_linux_statfs_takes_dentry=yes, + ac_cv_linux_statfs_takes_dentry=no)]) + AC_MSG_RESULT($ac_cv_linux_statfs_takes_dentry)]) + AC_DEFUN([LINUX_LINUX_KEYRING_SUPPORT], [ AC_MSG_CHECKING([for linux kernel keyring support]) AC_CACHE_VAL([ac_cv_linux_keyring_support], [ -- 1.9.4