/* * Get file system statistics. */ int ffs_statfs(struct mount *mp, struct statfs *sbp, struct proc *p) { struct ufsmount *ump; struct fs *fs; ump = VFSTOUFS(mp); fs = ump->um_fs; #ifdef FFS2 if (fs->fs_magic != FS_MAGIC && fs->fs_magic != FS_UFS2_MAGIC) panic("ffs_statfs"); #else if (fs->fs_magic != FS_MAGIC) panic("ffs_statfs"); #endif /* FFS2 */ sbp->f_bsize = fs->fs_fsize; sbp->f_iosize = fs->fs_bsize; sbp->f_blocks = fs->fs_dsize; sbp->f_bfree = fs->fs_cstotal.cs_nbfree * fs->fs_frag + fs->fs_cstotal.cs_nffree; sbp->f_bavail = sbp->f_bfree - ((int64_t)fs->fs_dsize * fs->fs_minfree / 100); sbp->f_files = fs->fs_ncg * fs->fs_ipg - ROOTINO; sbp->f_ffree = fs->fs_cstotal.cs_nifree; sbp->f_favail = sbp->f_ffree; copy_statfs_info(sbp, mp); return (0); }
/* * Get file system statistics. */ int ext2fs_statfs(struct mount *mp, struct statfs *sbp, struct proc *p) { struct ufsmount *ump; struct m_ext2fs *fs; u_int32_t overhead, overhead_per_group; int i, ngroups; ump = VFSTOUFS(mp); fs = ump->um_e2fs; if (fs->e2fs.e2fs_magic != E2FS_MAGIC) panic("ext2fs_statfs"); /* * Compute the overhead (FS structures) */ overhead_per_group = 1 /* block bitmap */ + 1 /* inode bitmap */ + fs->e2fs_itpg; overhead = fs->e2fs.e2fs_first_dblock + fs->e2fs_ncg * overhead_per_group; if (fs->e2fs.e2fs_rev > E2FS_REV0 && fs->e2fs.e2fs_features_rocompat & EXT2F_ROCOMPAT_SPARSESUPER) { for (i = 0, ngroups = 0; i < fs->e2fs_ncg; i++) { if (cg_has_sb(i)) ngroups++; } } else { ngroups = fs->e2fs_ncg; } overhead += ngroups * (1 + fs->e2fs_ngdb); sbp->f_bsize = fs->e2fs_bsize; sbp->f_iosize = fs->e2fs_bsize; sbp->f_blocks = fs->e2fs.e2fs_bcount - overhead; sbp->f_bfree = fs->e2fs.e2fs_fbcount; sbp->f_bavail = sbp->f_bfree - fs->e2fs.e2fs_rbcount; sbp->f_files = fs->e2fs.e2fs_icount; sbp->f_favail = sbp->f_ffree = fs->e2fs.e2fs_ficount; copy_statfs_info(sbp, mp); return (0); }