]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
Use f_bsize for ZFS afs_fsfragsize
authorAndrew Deason <adeason@sinenomine.net>
Thu, 24 Sep 2009 17:02:55 +0000 (12:02 -0500)
committerDerrick Brashear <shadow|account-1000005@unknown>
Wed, 14 Oct 2009 01:15:15 +0000 (18:15 -0700)
On ZFS, the disk space files can use up can be rounded up to the next
recordsize boundary if they've been truncated. This can cause the Unix CM
to mis-estimate cache usage, since it truncates files fairly often, and
assumes the disk space used is the file length rounded up to the next
f_frsize.

Since the ZFS recordsize is available via the statvfs f_bsize, just
round up to that instead. There is still some additional file metadata
that takes up some additional space on disk, but according to ZFS people
I've spoken to about this, it cannot be known in advance. In practice,
the additional metadata storage doesn't appear to exceed about 10% of
the data storage, which should be acceptable.

FIXES 125365

Reviewed-on: http://gerrit.openafs.org/650
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Andrew Deason <adeason@sinenomine.net>
(cherry picked from commit 78d8b8c5c19b8d6873b2d62beaa60cc7acba1840)
Reviewed-on: http://gerrit.openafs.org/655
Tested-by: Derrick Brashear <shadow@dementia.org>
src/afs/afs_init.c

index b225b2455ba07f8253b8824395ec16eec19bfeed..2397c7fc9e55ab6b381f38cc7811b804720edd84 100644 (file)
@@ -410,7 +410,17 @@ afs_InitCacheInfo(register char *afile)
        if (!VFS_STATFS(filevp->v_vfsp, &st))
 #endif /* SGI... */
 #if    defined(AFS_SUN5_ENV) || defined(AFS_HPUX100_ENV)
-           afs_fsfragsize = st.f_frsize - 1;
+           if (strcmp("zfs", st.f_basetype) == 0) {
+               /*
+                * Files in ZFS can take up to around the next
+                * recordsize boundary after being truncated. recordsize
+                * is reported in statvfs by f_bsize, so use that
+                * instead.
+                */
+               afs_fsfragsize = st.f_bsize - 1;
+           } else {
+               afs_fsfragsize = st.f_frsize - 1;
+           }
 #else
            afs_fsfragsize = st.f_bsize - 1;
 #endif