weird problem with statvfs() on a hammer filesystems

Johannes Hofmann johannes.hofmann at gmx.de
Thu Dec 3 10:03:53 PST 2009


Hi,

I'm seeing a weird problem with statvfs() on a hammer filesystems.
With this little test program:

#include <inttypes.h> 
#include <stdio.h> 
#include <sys/statvfs.h>

int main(int argc, char **argv) {
	struct statvfs  fsbuf;

	if (statvfs(argv[1], &fsbuf) < 0)
		err(1, "Can't statvfs() `%s'", argv[1]);

	fprintf(stderr, "statvfs %s, bavail %lld, frsize %lld\n",
		argv[1], fsbuf.f_bavail, fsbuf.f_frsize);
}

I get fsbuf.f_bavail == 0 on a freshly mounted hammer FS:

vkernel-leaf# dd if=/dev/zero of=hammer.img bs=1024 count=194000
vkernel-leaf# vnconfig vn0 hammer.img
vkernel-leaf# newfs_hammer -L foo -f /dev/vn0
vkernel-leaf# mount_hammer /dev/vn0 /mnt/
vkernel-leaf# ./statvfs	/mnt/
statvfs /mnt/, bavail 0, frsize 16384

After doing df -k, things are back to normal:

vkernel-leaf# df -k
Filesystem   1K-blocks   Used   Avail Capacity  Mounted on
/dev/vkd0s0a    516054 503790  -29020   106%    /
devfs                1      1       0   100%    /dev
foo              65536 210016 -144480   320%    /mnt
vkernel-leaf# ./statvfs /mnt/
statvfs /mnt/, bavail -9030, frsize 16384


I added some kprintf()s:

diff --git a/sys/vfs/hammer/hammer_vfsops.c b/sys/vfs/hammer/hammer_vfsops.c
index 0b6139e..f94bfed 100644
--- a/sys/vfs/hammer/hammer_vfsops.c
+++ b/sys/vfs/hammer/hammer_vfsops.c
@@ -921,10 +921,17 @@ hammer_vfs_statvfs(struct mount *mp, struct statvfs *sbp, struct ucred *cred)
 	hammer_rel_volume(volume, 0);
 
 	mp->mnt_vstat.f_bfree = (bfree - breserved) / HAMMER_BUFSIZE;
+
+kprintf("hammer_vfs_statvfs: mp->mnt_vstat.f_bfree %lld\n", mp->mnt_vstat.f_bfree);
+
 	mp->mnt_vstat.f_bavail = mp->mnt_stat.f_bfree;
+
+kprintf("hammer_vfs_statvfs: mp->mnt_vstat.f_bavail %lld\n", mp->mnt_vstat.f_bavail);
+
 	if (mp->mnt_vstat.f_files < 0)
 		mp->mnt_vstat.f_files = 0;
 	*sbp = mp->mnt_vstat;
+
 	return(0);
 }


With those I get:

hammer_vfs_statvfs: mp->mnt_vstat.f_bfree 9721495
hammer_vfs_statvfs: mp->mnt_vstat.f_bavail 0

What am I missing?

Cheers,
Johannes

PS: The original problem is that pkgin is reporting not enough space to
    install packages.





More information about the Bugs mailing list