linux-statfs-dentry-20061109
authorMarc Dionne <dionne@cs.wisc.edu>
Thu, 9 Nov 2006 23:40:20 +0000 (23:40 +0000)
committerDerrick Brashear <shadow@dementia.org>
Thu, 9 Nov 2006 23:40:20 +0000 (23:40 +0000)
FIXES 42788

statfs changed in recent linux kernels. cope.

acinclude.m4
src/afs/LINUX/osi_vfsops.c
src/cf/linux-test4.m4

index 7f7fd6b..876348e 100644 (file)
@@ -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
index 71f01b8..1b90c28 100644 (file)
@@ -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;
index 261c82d..e32c355 100644 (file)
@@ -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 <linux/fs.h>
+#include <linux/statfs.h>],
+[
+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], [