diff options
| -rw-r--r-- | sbin/mount/mount.c | 7 | ||||
| -rw-r--r-- | sys/kern/vfs_mount.c | 12 | ||||
| -rw-r--r-- | sys/sys/mount.h | 4 |
3 files changed, 22 insertions, 1 deletions
diff --git a/sbin/mount/mount.c b/sbin/mount/mount.c index 79d9d6cb0caf..bd3d0073c474 100644 --- a/sbin/mount/mount.c +++ b/sbin/mount/mount.c @@ -692,6 +692,13 @@ prmount(struct statfs *sfp) xo_emit("{D:, }{Lw:fsid}{:fsid}", fsidbuf); free(fsidbuf); } + if (sfp->f_nvnodelistsize != 0 || sfp->f_avnodecount != 0) { + xo_open_container("vnodes"); + xo_emit("{D:, }{Lwc:vnodes}{Lw:count}{w:count/%ju}{Lw:active}{:active/%ju}", + (uintmax_t)sfp->f_nvnodelistsize, + (uintmax_t)sfp->f_avnodecount); + xo_close_container("vnodes"); + } } xo_emit("{D:)}\n"); } diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c index 71a40fd97a9c..e3818b67e841 100644 --- a/sys/kern/vfs_mount.c +++ b/sys/kern/vfs_mount.c @@ -2610,6 +2610,8 @@ vfs_copyopt(struct vfsoptlist *opts, const char *name, void *dest, int len) int __vfs_statfs(struct mount *mp, struct statfs *sbp) { + struct vnode *vp; + uint32_t count; /* * Filesystems only fill in part of the structure for updates, we @@ -2624,6 +2626,16 @@ __vfs_statfs(struct mount *mp, struct statfs *sbp) sbp->f_version = STATFS_VERSION; sbp->f_namemax = NAME_MAX; sbp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK; + sbp->f_nvnodelistsize = mp->mnt_nvnodelistsize; + + count = 0; + MNT_ILOCK(mp); + TAILQ_FOREACH(vp, &mp->mnt_nvnodelist, v_nmntvnodes) { + if (vrefcnt(vp) > 0) /* racy but does not matter */ + count++; + } + MNT_IUNLOCK(mp); + sbp->f_avnodecount = count; return (mp->mnt_op->vfs_statfs(mp, sbp)); } diff --git a/sys/sys/mount.h b/sys/sys/mount.h index 3383bfe8f431..edac64171f9a 100644 --- a/sys/sys/mount.h +++ b/sys/sys/mount.h @@ -91,7 +91,9 @@ struct statfs { uint64_t f_asyncwrites; /* count of async writes since mount */ uint64_t f_syncreads; /* count of sync reads since mount */ uint64_t f_asyncreads; /* count of async reads since mount */ - uint64_t f_spare[10]; /* unused spare */ + uint32_t f_nvnodelistsize; /* # of vnodes */ + uint32_t f_avnodecount; /* # of active vnodes */ + uint64_t f_spare[9]; /* unused spare */ uint32_t f_namemax; /* maximum filename length */ uid_t f_owner; /* user that mounted the filesystem */ fsid_t f_fsid; /* filesystem id */ |
