diff options
author | pjd <pjd@FreeBSD.org> | 2008-04-26 13:04:48 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2008-04-26 13:04:48 +0000 |
commit | cb7610bd5214be1b0977bd2b83d8e95686c8881b (patch) | |
tree | 1377a03f1710eda31a3481e43335f03806905d5f /sys/kern/vfs_subr.c | |
parent | b568c603bca1654ac7c49781b351b81b6c9414c5 (diff) | |
download | FreeBSD-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.c | 152 |
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 */ /* |