Ok, how about the patch below.

- get_sb now returns an int instead of a struct super_block * (this probably didn't cause any problems) - statfs is now passed a dentry structure instead of a super_block. We were getting the block size from the wrong structure - not surprising that we got unexpected values - a new configure test is introduced to check the statfs arguments. A regen is needed to rebuild the configure files - note: the diffs also include an unrelated configure test for linux/config.h which was needed to compile on FC6 (I see Chas has a patch for this in RT #42662)

With this patch, df output looks better :

Filesystem           1K-blocks      Used Available Use% Mounted on
AFS                    9000000         0   9000000   0% /afs

and stat -f /afs shows a block size of 1024 :

 File: "/afs"
    ID: 6300001234 Namelen: 256     Type: UNKNOWN (0x0)
Block size: 1024       Fundamental block size: 1024
Blocks: Total: 9000000    Free: 9000000    Available: 9000000
Inodes: Total: 9000000    Free: 9000000

Marc
*** openafs-1.4.2fc4-orig/acinclude.m4  2006-09-19 18:23:00.000000000 -0400
--- openafs/acinclude.m4        2006-10-14 20:18:28.000000000 -0400
***************
*** 565,571 ****
--- 565,573 ----
                   
[LINUX_BUILD_VNODE_FROM_INODE(${srcdir}/src/config,src/afs/LINUX,${srcdir}/src/afs/LINUX)]
                 )
  
+                LINUX_STATFS_HAS_DENTRY
                 LINUX_COMPLETION_H_EXISTS
+                LINUX_CONFIG_H_EXISTS
                 LINUX_DEFINES_FOR_EACH_PROCESS
                 LINUX_DEFINES_PREV_TASK
                 LINUX_FS_STRUCT_SUPER_HAS_ALLOC_INODE
***************
*** 678,683 ****
--- 680,688 ----
                 if test "x$ac_cv_linux_completion_h_exists" = "xyes" ; then
                  AC_DEFINE(COMPLETION_H_EXISTS, 1, [define if completion_h 
exists])
                 fi
+                if test "x$ac_cv_linux_config_h_exists" = "xyes" ; then
+                 AC_DEFINE(CONFIG_H_EXISTS, 1, [define if config_h exists])
+                fi
                 if test "x$ac_cv_linux_defines_for_each_process" = "xyes" ; 
then
                  AC_DEFINE(DEFINED_FOR_EACH_PROCESS, 1, [define if 
for_each_process defined])
                 fi
***************
*** 774,779 ****
--- 779,787 ----
                 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_has_dentry" = "xyes"; then
+                 AC_DEFINE(STATFS_HAS_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
*** openafs-1.4.2fc4-orig/src/cf/linux-test4.m4 2006-09-06 16:57:17.000000000 
-0400
--- openafs/src/cf/linux-test4.m4       2006-10-14 20:20:27.000000000 -0400
***************
*** 608,613 ****
--- 608,626 ----
        ac_cv_linux_get_sb_has_struct_vfsmount=no)])
    AC_MSG_RESULT($ac_cv_linux_get_sb_has_struct_vfsmount)])
  
+ AC_DEFUN([LINUX_STATFS_HAS_DENTRY], [
+   AC_MSG_CHECKING([for dentry in statfs])
+   AC_CACHE_VAL([ac_cv_linux_statfs_has_dentry], [
+     AC_TRY_KBUILD(
+ [#include <linux/fs.h>
+ #include <linux/statfs.h>],
+ [struct dentry _dentry;
+ struct kstatfs _kstatfs;
+ vfs_statfs(&_dentry, &_kstatfs);],
+       ac_cv_linux_statfs_has_dentry=yes,
+       ac_cv_linux_statfs_has_dentry=no)])
+   AC_MSG_RESULT($ac_cv_linux_statfs_has_dentry)])
+ 
  AC_DEFUN([LINUX_LINUX_KEYRING_SUPPORT], [
    AC_MSG_CHECKING([for linux kernel keyring support])
    AC_CACHE_VAL([ac_cv_linux_keyring_support], [
***************
*** 644,646 ****
--- 657,670 ----
    if test "x$ac_cv_key_alloc_needs_struct_task" = "xyes"; then
      AC_DEFINE([KEY_ALLOC_NEEDS_STRUCT_TASK], 1, [define if key_alloc takes a 
struct task *])
    fi])
+ 
+ AC_DEFUN([LINUX_CONFIG_H_EXISTS], [
+   AC_MSG_CHECKING([for linux/config.h existance])
+   AC_CACHE_VAL([ac_cv_linux_config_h_exists], [
+     AC_TRY_KBUILD(
+ [#include <linux/config.h>],
+ [],
+       ac_cv_linux_config_h_exists=yes,
+       ac_cv_linux_config_h_exists=no)])
+   AC_MSG_RESULT($ac_cv_linux_config_h_exists)])
+ 
*** openafs-1.4.2fc4-orig/src/afs/LINUX/osi_vfsops.c    2006-08-20 
01:34:18.000000000 -0400
--- openafs/src/afs/LINUX/osi_vfsops.c  2006-10-14 20:58:14.000000000 -0400
***************
*** 64,74 ****
   * 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
  afs_get_sb(struct file_system_type *fs_type, int flags,
           const char *dev_name, void *data, struct vfsmount *mnt)
  #else
  afs_get_sb(struct file_system_type *fs_type, int flags,
           const char *dev_name, void *data)
  #endif
--- 64,75 ----
   * dev, covered, s_rd_only, s_dirt, and s_type will be set by read_super.
   */
  #if defined(AFS_LINUX26_ENV)
  #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
***************
*** 386,392 ****
--- 387,397 ----
   */
  #if defined(AFS_LINUX26_ENV)
  int
+ #if defined(STATFS_HAS_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)
***************
*** 410,416 ****
--- 415,425 ----
      AFS_STATCNT(afs_statfs);
  
      statp->f_type = 0;                /* Can we get a real type sometime? */
+ #if defined(STATFS_HAS_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;

Reply via email to