int hfs_statvfs(struct mount *mp, struct statvfs *sbp) { hfs_volume_header_t *vh; #ifdef HFS_DEBUG printf("vfsop = hfs_statvfs()\n"); #endif /* HFS_DEBUG */ vh = &VFSTOHFS(mp)->hm_vol.vh; sbp->f_bsize = vh->block_size; sbp->f_frsize = sbp->f_bsize; sbp->f_iosize = 4096;/* mac os x uses a 4 kb io size, so do the same */ sbp->f_blocks = vh->total_blocks; sbp->f_bfree = vh->free_blocks; /* total free blocks */ sbp->f_bavail = vh->free_blocks; /* blocks free for non superuser */ sbp->f_bresvd = 0; sbp->f_files = vh->file_count; /* total files */ sbp->f_ffree = (1<<31) - vh->file_count; /* free file nodes */ copy_statvfs_info(sbp, mp); return 0; }
/* * statvfs syscall vfsop. * * Returns 0 on success. */ static int efs_statvfs(struct mount *mp, struct statvfs *sbp) { struct efs_mount *emp; emp = VFSTOEFS(mp); sbp->f_bsize = EFS_BB_SIZE; sbp->f_frsize = EFS_BB_SIZE; sbp->f_iosize = EFS_BB_SIZE; sbp->f_blocks = be32toh(emp->em_sb.sb_size); sbp->f_bfree = be32toh(emp->em_sb.sb_tfree); sbp->f_bavail = sbp->f_bfree; // XXX same?? sbp->f_bresvd = 0; sbp->f_files = be32toh(emp->em_sb.sb_tinode); sbp->f_ffree = be16toh(emp->em_sb.sb_cgisize) * be16toh(emp->em_sb.sb_ncg) * EFS_DINODES_PER_BB; sbp->f_favail = sbp->f_ffree; // XXX same?? sbp->f_fresvd = 0; sbp->f_namemax = EFS_DIRENT_NAMELEN_MAX; copy_statvfs_info(sbp, mp); return (0); }
/* * nfs statvfs call */ int nfs_statvfs(struct mount *mp, struct statvfs *sbp) { struct lwp *l = curlwp; struct vnode *vp; struct nfs_statfs *sfp; char *cp; u_int32_t *tl; int32_t t1, t2; char *bpos, *dpos, *cp2; struct nfsmount *nmp = VFSTONFS(mp); int error = 0, retattr; #ifdef NFS_V2_ONLY const int v3 = 0; #else int v3 = (nmp->nm_flag & NFSMNT_NFSV3); #endif struct mbuf *mreq, *mrep = NULL, *md, *mb; kauth_cred_t cred; u_quad_t tquad; struct nfsnode *np; #ifndef nolint sfp = (struct nfs_statfs *)0; #endif vp = nmp->nm_vnode; np = VTONFS(vp); cred = kauth_cred_alloc(); #ifndef NFS_V2_ONLY if (v3 && (nmp->nm_iflag & NFSMNT_GOTFSINFO) == 0) (void)nfs_fsinfo(nmp, vp, cred, l); #endif nfsstats.rpccnt[NFSPROC_FSSTAT]++; nfsm_reqhead(np, NFSPROC_FSSTAT, NFSX_FH(v3)); nfsm_fhtom(np, v3); nfsm_request(np, NFSPROC_FSSTAT, l, cred); if (v3) nfsm_postop_attr(vp, retattr, 0); if (error) { if (mrep != NULL) { if (mrep->m_next != NULL) printf("nfs_vfsops: nfs_statvfs would lose buffers\n"); m_freem(mrep); } goto nfsmout; } nfsm_dissect(sfp, struct nfs_statfs *, NFSX_STATFS(v3)); sbp->f_flag = nmp->nm_flag; sbp->f_iosize = min(nmp->nm_rsize, nmp->nm_wsize); if (v3) { sbp->f_frsize = sbp->f_bsize = NFS_FABLKSIZE; tquad = fxdr_hyper(&sfp->sf_tbytes); sbp->f_blocks = ((quad_t)tquad / (quad_t)NFS_FABLKSIZE); tquad = fxdr_hyper(&sfp->sf_fbytes); sbp->f_bfree = ((quad_t)tquad / (quad_t)NFS_FABLKSIZE); tquad = fxdr_hyper(&sfp->sf_abytes); tquad = ((quad_t)tquad / (quad_t)NFS_FABLKSIZE); sbp->f_bresvd = sbp->f_bfree - tquad; sbp->f_bavail = tquad; /* Handle older NFS servers returning negative values */ if ((quad_t)sbp->f_bavail < 0) sbp->f_bavail = 0; tquad = fxdr_hyper(&sfp->sf_tfiles); sbp->f_files = tquad; tquad = fxdr_hyper(&sfp->sf_ffiles); sbp->f_ffree = tquad; sbp->f_favail = tquad; sbp->f_fresvd = 0; sbp->f_namemax = NFS_MAXNAMLEN; } else { sbp->f_bsize = NFS_FABLKSIZE; sbp->f_frsize = fxdr_unsigned(int32_t, sfp->sf_bsize); sbp->f_blocks = fxdr_unsigned(int32_t, sfp->sf_blocks); sbp->f_bfree = fxdr_unsigned(int32_t, sfp->sf_bfree); sbp->f_bavail = fxdr_unsigned(int32_t, sfp->sf_bavail); sbp->f_fresvd = 0; sbp->f_files = 0; sbp->f_ffree = 0; sbp->f_favail = 0; sbp->f_fresvd = 0; sbp->f_namemax = NFS_MAXNAMLEN; } copy_statvfs_info(sbp, mp); nfsm_reqdone; kauth_cred_free(cred); return (error); }