summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_subr.c
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2008-04-26 13:04:48 +0000
committerpjd <pjd@FreeBSD.org>2008-04-26 13:04:48 +0000
commitcb7610bd5214be1b0977bd2b83d8e95686c8881b (patch)
tree1377a03f1710eda31a3481e43335f03806905d5f /sys/kern/vfs_subr.c
parentb568c603bca1654ac7c49781b351b81b6c9414c5 (diff)
downloadFreeBSD-src-cb7610bd5214be1b0977bd2b83d8e95686c8881b.zip
FreeBSD-src-cb7610bd5214be1b0977bd2b83d8e95686c8881b.tar.gz
Implement 'show mount' command in DDB. Without argument, it prints short
info about all currently mounted file systems. When an address is given as an argument, prints detailed info about the given mount point. MFC after: 2 weeks
Diffstat (limited to 'sys/kern/vfs_subr.c')
-rw-r--r--sys/kern/vfs_subr.c152
1 files changed, 152 insertions, 0 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index 9316dcf..3116ca9 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -2698,6 +2698,158 @@ DB_SHOW_COMMAND(vnode, db_show_vnode)
vp = (struct vnode *)addr;
vn_printf(vp, "vnode ");
}
+
+/*
+ * Show details about the given mount point.
+ */
+DB_SHOW_COMMAND(mount, db_show_mount)
+{
+ struct mount *mp;
+ struct statfs *sp;
+ struct vnode *vp;
+ char buf[512];
+ u_int flags;
+
+ if (!have_addr) {
+ /* No address given, print short info about all mount points. */
+ TAILQ_FOREACH(mp, &mountlist, mnt_list) {
+ db_printf("%p %s on %s (%s)\n", mp,
+ mp->mnt_stat.f_mntfromname,
+ mp->mnt_stat.f_mntonname,
+ mp->mnt_stat.f_fstypename);
+ }
+ db_printf("\nMore info: show mount <addr>\n");
+ return;
+ }
+
+ mp = (struct mount *)addr;
+ db_printf("%p %s on %s (%s)\n", mp, mp->mnt_stat.f_mntfromname,
+ mp->mnt_stat.f_mntonname, mp->mnt_stat.f_fstypename);
+
+ buf[0] = '\0';
+ flags = mp->mnt_flag;
+#define MNT_FLAG(flag) do { \
+ if (flags & (flag)) { \
+ if (buf[0] != '\0') \
+ strlcat(buf, ", ", sizeof(buf)); \
+ strlcat(buf, (#flag) + 4, sizeof(buf)); \
+ flags &= ~(flag); \
+ } \
+} while (0)
+ MNT_FLAG(MNT_RDONLY);
+ MNT_FLAG(MNT_SYNCHRONOUS);
+ MNT_FLAG(MNT_NOEXEC);
+ MNT_FLAG(MNT_NOSUID);
+ MNT_FLAG(MNT_UNION);
+ MNT_FLAG(MNT_ASYNC);
+ MNT_FLAG(MNT_SUIDDIR);
+ MNT_FLAG(MNT_SOFTDEP);
+ MNT_FLAG(MNT_NOSYMFOLLOW);
+ MNT_FLAG(MNT_GJOURNAL);
+ MNT_FLAG(MNT_MULTILABEL);
+ MNT_FLAG(MNT_ACLS);
+ MNT_FLAG(MNT_NOATIME);
+ MNT_FLAG(MNT_NOCLUSTERR);
+ MNT_FLAG(MNT_NOCLUSTERW);
+ MNT_FLAG(MNT_EXRDONLY);
+ MNT_FLAG(MNT_EXPORTED);
+ MNT_FLAG(MNT_DEFEXPORTED);
+ MNT_FLAG(MNT_EXPORTANON);
+ MNT_FLAG(MNT_EXKERB);
+ MNT_FLAG(MNT_EXPUBLIC);
+ MNT_FLAG(MNT_LOCAL);
+ MNT_FLAG(MNT_QUOTA);
+ MNT_FLAG(MNT_ROOTFS);
+ MNT_FLAG(MNT_USER);
+ MNT_FLAG(MNT_IGNORE);
+ MNT_FLAG(MNT_UPDATE);
+ MNT_FLAG(MNT_DELEXPORT);
+ MNT_FLAG(MNT_RELOAD);
+ MNT_FLAG(MNT_FORCE);
+ MNT_FLAG(MNT_SNAPSHOT);
+ MNT_FLAG(MNT_BYFSID);
+#undef MNT_FLAG
+ if (flags != 0) {
+ if (buf[0] != '\0')
+ strlcat(buf, ", ", sizeof(buf));
+ snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
+ "0x%08x", flags);
+ }
+ db_printf(" mnt_flag = %s\n", buf);
+
+ buf[0] = '\0';
+ flags = mp->mnt_kern_flag;
+#define MNT_KERN_FLAG(flag) do { \
+ if (flags & (flag)) { \
+ if (buf[0] != '\0') \
+ strlcat(buf, ", ", sizeof(buf)); \
+ strlcat(buf, (#flag) + 5, sizeof(buf)); \
+ flags &= ~(flag); \
+ } \
+} while (0)
+ MNT_KERN_FLAG(MNTK_UNMOUNTF);
+ MNT_KERN_FLAG(MNTK_ASYNC);
+ MNT_KERN_FLAG(MNTK_SOFTDEP);
+ MNT_KERN_FLAG(MNTK_NOINSMNTQ);
+ MNT_KERN_FLAG(MNTK_UNMOUNT);
+ MNT_KERN_FLAG(MNTK_MWAIT);
+ MNT_KERN_FLAG(MNTK_SUSPEND);
+ MNT_KERN_FLAG(MNTK_SUSPEND2);
+ MNT_KERN_FLAG(MNTK_SUSPENDED);
+ MNT_KERN_FLAG(MNTK_MPSAFE);
+ MNT_KERN_FLAG(MNTK_NOKNOTE);
+ MNT_KERN_FLAG(MNTK_LOOKUP_SHARED);
+#undef MNT_KERN_FLAG
+ if (flags != 0) {
+ if (buf[0] != '\0')
+ strlcat(buf, ", ", sizeof(buf));
+ snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
+ "0x%08x", flags);
+ }
+ db_printf(" mnt_kern_flag = %s\n", buf);
+
+ sp = &mp->mnt_stat;
+ db_printf(" mnt_stat = { version=%u type=%u flags=0x%016jx "
+ "bsize=%ju iosize=%ju blocks=%ju bfree=%ju bavail=%jd files=%ju "
+ "ffree=%jd syncwrites=%ju asyncwrites=%ju syncreads=%ju "
+ "asyncreads=%ju namemax=%u owner=%u fsid=[%d, %d] }\n",
+ (u_int)sp->f_version, (u_int)sp->f_type, (uintmax_t)sp->f_flags,
+ (uintmax_t)sp->f_bsize, (uintmax_t)sp->f_iosize,
+ (uintmax_t)sp->f_blocks, (uintmax_t)sp->f_bfree,
+ (intmax_t)sp->f_bavail, (uintmax_t)sp->f_files,
+ (intmax_t)sp->f_ffree, (uintmax_t)sp->f_syncwrites,
+ (uintmax_t)sp->f_asyncwrites, (uintmax_t)sp->f_syncreads,
+ (uintmax_t)sp->f_asyncreads, (u_int)sp->f_namemax,
+ (u_int)sp->f_owner, (int)sp->f_fsid.val[0], (int)sp->f_fsid.val[1]);
+
+ db_printf(" mnt_cred = { uid=%u ruid=%u",
+ (u_int)mp->mnt_cred->cr_uid, (u_int)mp->mnt_cred->cr_ruid);
+ if (mp->mnt_cred->cr_prison != NULL)
+ db_printf(", jail=%d", mp->mnt_cred->cr_prison->pr_id);
+ db_printf(" }\n");
+ db_printf(" mnt_ref = %d\n", mp->mnt_ref);
+ db_printf(" mnt_gen = %d\n", mp->mnt_gen);
+ db_printf(" mnt_nvnodelistsize = %d\n", mp->mnt_nvnodelistsize);
+ db_printf(" mnt_writeopcount = %d\n", mp->mnt_writeopcount);
+ db_printf(" mnt_noasync = %u\n", mp->mnt_noasync);
+ db_printf(" mnt_maxsymlinklen = %d\n", mp->mnt_maxsymlinklen);
+ db_printf(" mnt_iosize_max = %d\n", mp->mnt_iosize_max);
+ db_printf(" mnt_hashseed = %u\n", mp->mnt_hashseed);
+ db_printf(" mnt_markercnt = %d\n", mp->mnt_markercnt);
+ db_printf(" mnt_holdcnt = %d\n", mp->mnt_holdcnt);
+ db_printf(" mnt_holdcntwaiters = %d\n", mp->mnt_holdcntwaiters);
+ db_printf(" mnt_secondary_writes = %d\n", mp->mnt_secondary_writes);
+ db_printf(" mnt_secondary_accwrites = %d\n",
+ mp->mnt_secondary_accwrites);
+ db_printf(" mnt_gjprovider = %s\n",
+ mp->mnt_gjprovider != NULL ? mp->mnt_gjprovider : "NULL");
+ db_printf("\n");
+
+ TAILQ_FOREACH(vp, &mp->mnt_nvnodelist, v_nmntvnodes) {
+ if (vp->v_type != VMARKER)
+ vn_printf(vp, "vnode ");
+ }
+}
#endif /* DDB */
/*
OpenPOWER on IntegriCloud