linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Alan Jenkins <alan.christopher.jenkins@gmail.com>
To: David Howells <dhowells@redhat.com>, viro@zeniv.linux.org.uk
Cc: raven@themaw.net, linux-api@vger.kernel.org,
	linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
	mszeredi@redhat.com
Subject: Re: [PATCH 10/25] vfs: fsinfo sample: Mount listing program [ver #13]
Date: Wed, 5 Jun 2019 13:22:12 +0100	[thread overview]
Message-ID: <9eeb6b39-c4a1-6e3d-246a-e1cf97d84b33@gmail.com> (raw)
In-Reply-To: <155905634517.1662.7843563955043166854.stgit@warthog.procyon.org.uk>

On 28/05/2019 16:12, David Howells wrote:
> Implement a program to demonstrate mount listing using the new fsinfo()
> syscall,

Great. I understand this is only for demonstration, but IMO the output 
would be clearer with a few tweaks:

> for example:
>
> # ./test-mntinfo

Can we have a header please?  E.g.

   MNT                                    ID       NOTIFS   TYPE DEVICE
   -------------------------------------- -------- -------- ---- ------


> ROOT                                          5d        c ext4 8:12
>   \_ sys                                       13        8 sysfs 0:13
>   |   \_ kernel/security                       16        0 securityfs 0:7

I assume ID is the same ID which is shown in /proc/mounts.  But it's 
shown as decimal there.  Can we match that?

And can we show NOTIFS in decimal as well? I find counters easier to 
read in decimal :-).

I.e. change "%8x" to "%10d" in both cases.

major:minor is also more often seen formatted as "%d:%d": in 
/proc/self/mountinfo, lsblk, and ls -l.  I don't feel as strongly about 
this one though.

Thanks
Alan

>   |   \_ fs/cgroup                             1a       10 tmpfs 0:17
>   |   |   \_ unified                           1b        0 cgroup2 0:18
>   |   |   \_ systemd                           1c        0 cgroup 0:19
>   |   |   \_ freezer                           20        0 cgroup 0:1d
>   |   |   \_ cpu,cpuacct                       21        0 cgroup 0:1e
>   |   |   \_ memory                            22        0 cgroup 0:1f
>   |   |   \_ cpuset                            23        0 cgroup 0:20
>   |   |   \_ hugetlb                           24        0 cgroup 0:21
>   |   |   \_ net_cls,net_prio                  25        0 cgroup 0:22
>   |   |   \_ blkio                             26        0 cgroup 0:23
>   |   |   \_ perf_event                        27        0 cgroup 0:24
>   |   |   \_ devices                           28        0 cgroup 0:25
>   |   |   \_ rdma                              29        0 cgroup 0:26
>   |   \_ fs/pstore                             1d        0 pstore 0:1a
>   |   \_ firmware/efi/efivars                  1e        0 efivarfs 0:1b
>   |   \_ fs/bpf                                1f        0 bpf 0:1c
>   |   \_ kernel/config                         5a        0 configfs 0:10
>   |   \_ fs/selinux                            2a        0 selinuxfs 0:12
>   |   \_ kernel/debug                          2e        0 debugfs 0:8
>   \_ dev                                       15        4 devtmpfs 0:6
>   |   \_ shm                                   17        0 tmpfs 0:14
>   |   \_ pts                                   18        0 devpts 0:15
>   |   \_ hugepages                             2b        0 hugetlbfs 0:27
>   |   \_ mqueue                                2c        0 mqueue 0:11
>   \_ run                                       19        1 tmpfs 0:16
>   |   \_ user/0                               1b4        0 tmpfs 0:2d
>   \_ proc                                      14        1 proc 0:4
>   |   \_ sys/fs/binfmt_misc                    2d        0 autofs 0:28
>   \_ tmp                                       2f      7d0 tmpfs 0:29
>   \_ var/cache/fscache                         71        0 tmpfs 0:2a
>   \_ boot                                      74        0 ext4 8:15
>   \_ home                                      74        0 ext4 8:15
>   \_ var/lib/nfs/rpc_pipefs                    bf        0 rpc_pipefs 0:2b
>   \_ mnt                                      15b        5 tmpfs 0:2c
>   |   \_ foo                                  164        0 tmpfs 0:2e
>   |   \_ foo1                                 16d        0 tmpfs 0:2f
>   |   \_ foo2                                 176        0 tmpfs 0:30
>   |   \_ foo3                                 17f        0 tmpfs 0:31
>   |   \_ foo4                                 188        1 tmpfs 0:32
>   |       \_ ""                               191        0 tmpfs 0:33
>   \_ afs                                      19a        2 afs 0:34
>       \_ procyon.org.uk                       1a3        0 afs 0:35
>       \_ grand.central.org                    1ac        0 afs 0:36
>
> Signed-off-by: David Howells<dhowells@redhat.com>
> ---
>
>   samples/vfs/Makefile       |    3 +
>   samples/vfs/test-mntinfo.c |  239 ++++++++++++++++++++++++++++++++++++++++++++
>   2 files changed, 242 insertions(+)
>   create mode 100644 samples/vfs/test-mntinfo.c

> diff --git a/samples/vfs/test-mntinfo.c b/samples/vfs/test-mntinfo.c
> new file mode 100644
> index 000000000000..00fbefae98fa
> --- /dev/null
> +++ b/samples/vfs/test-mntinfo.c

> +/*
> + * Display a mount and then recurse through its children.
> + */
> +static void display_mount(unsigned int mnt_id, unsigned int depth, char *path)
> +{
> +	struct fsinfo_mount_child *children;
> +	struct fsinfo_mount_info info;
> +	struct fsinfo_ids ids;
> +	unsigned int d;
> +	size_t ch_size, p_size;
> +	int i, n, s;
> +
> +	get_attr(mnt_id, FSINFO_ATTR_MOUNT_INFO, &info, sizeof(info));
> +	get_attr(mnt_id, FSINFO_ATTR_IDS, &ids, sizeof(ids));
> +	if (depth > 0)
> +		printf("%s", tree_buf);
> +
> +	s = strlen(path);
> +	printf("%s", !s ? "\"\"" : path);
> +	if (!s)
> +		s += 2;
> +	s += depth;
> +	if (s < 40)
> +		s = 40 - s;
> +	else
> +		s = 1;
> +	printf("%*.*s", s, s, "");
> +
> +	printf("%8x %8x %s %x:%x",
> +	       info.mnt_id, info.notify_counter,
> +	       ids.f_fs_name, ids.f_dev_major, ids.f_dev_minor);
> +	putchar('\n');
> +
> +	children = get_attr_alloc(mnt_id, FSINFO_ATTR_MOUNT_CHILDREN, 0, &ch_size);
> +	n = ch_size / sizeof(children[0]) - 1;
> +
> +	bar_buf[depth + 1] = '|';
> +	if (depth > 0) {
> +		tree_buf[depth - 4 + 1] = bar_buf[depth - 4 + 1];
> +		tree_buf[depth - 4 + 2] = ' ';
> +	}
> +
> +	tree_buf[depth + 0] = ' ';
> +	tree_buf[depth + 1] = '\\';
> +	tree_buf[depth + 2] = '_';
> +	tree_buf[depth + 3] = ' ';
> +	tree_buf[depth + 4] = 0;
> +	d = depth + 4;
> +
> +	for (i = 0; i < n; i++) {
> +		if (i == n - 1)
> +			bar_buf[depth + 1] = ' ';
> +		path = get_attr_alloc(mnt_id, FSINFO_ATTR_MOUNT_SUBMOUNT, i, &p_size);
> +		display_mount(children[i].mnt_id, d, path + 1);
> +		free(path);
> +	}
> +
> +	free(children);
> +	if (depth > 0) {
> +		tree_buf[depth - 4 + 1] = '\\';
> +		tree_buf[depth - 4 + 2] = '_';
> +	}
> +	tree_buf[depth] = 0;
> +}
> +
> +/*
> + * Find the ID of whatever is at the nominated path.
> + */
> +static unsigned int lookup_mnt_by_path(const char *path)
> +{
> +	struct fsinfo_mount_info mnt;
> +	struct fsinfo_params params = {
> +		.request = FSINFO_ATTR_MOUNT_INFO,
> +	};
> +
> +	if (fsinfo(AT_FDCWD, path, &params, &mnt, sizeof(mnt)) == -1) {
> +		perror(path);
> +		exit(1);
> +	}
> +
> +	return mnt.mnt_id;
> +}
> +
> +/*
> + *
> + */
> +int main(int argc, char **argv)
> +{
> +	unsigned int mnt_id;
> +	char *path;
> +	bool use_mnt_id = false;
> +	int opt;
> +
> +	while ((opt = getopt(argc, argv, "M"))) {
> +		switch (opt) {
> +		case 'M':
> +			use_mnt_id = true;
> +			continue;
> +		}
> +		break;
> +	}
> +
> +	argc -= optind;
> +	argv += optind;
> +
> +	switch (argc) {
> +	case 0:
> +		mnt_id = lookup_mnt_by_path("/");
> +		path = "ROOT";
> +		break;
> +	case 1:
> +		path = argv[0];
> +		if (use_mnt_id) {
> +			mnt_id = strtoul(argv[0], NULL, 0);
> +			break;
> +		}
> +
> +		mnt_id = lookup_mnt_by_path(argv[0]);
> +		break;
> +	default:
> +		printf("Format: test-mntinfo\n");
> +		printf("Format: test-mntinfo <path>\n");
> +		printf("Format: test-mntinfo -M <mnt_id>\n");
> +		exit(2);
> +	}
> +
> +	display_mount(mnt_id, 0, path);
> +	return 0;
> +}
>
>


  reply	other threads:[~2019-06-05 12:22 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-05-28 15:11 [PATCH 00/25] VFS: Introduce filesystem information query syscall [ver #13] David Howells
2019-05-28 15:11 ` [PATCH 01/25] vfs: syscall: Add fsinfo() to query filesystem information " David Howells
2019-05-29  7:42   ` Miklos Szeredi
2019-06-18 22:24   ` David Howells
2019-05-28 15:11 ` [PATCH 02/25] vfs: Allow fsinfo() to query what's in an fs_context " David Howells
2019-06-21  9:47   ` Christian Brauner
2019-06-21 13:12   ` David Howells
2019-06-21 13:16     ` Christian Brauner
2019-06-21 13:28       ` Christian Brauner
2019-06-21 14:50       ` David Howells
2019-05-28 15:11 ` [PATCH 03/25] vfs: Allow fsinfo() to be used to query an fs parameter description " David Howells
2019-05-28 15:11 ` [PATCH 04/25] vfs: Implement parameter value retrieval with fsinfo() " David Howells
2019-05-29  8:08   ` Miklos Szeredi
2019-06-18 22:34   ` David Howells
2019-06-19  6:33     ` Miklos Szeredi
2019-05-28 15:11 ` [PATCH 05/25] fsinfo: Implement retrieval of LSM parameters " David Howells
2019-05-28 15:11 ` [PATCH 06/25] vfs: Introduce a non-repeating system-unique superblock ID " David Howells
2019-05-28 15:12 ` [PATCH 07/25] vfs: Allow fsinfo() to look up a mount object by " David Howells
2019-05-28 15:12 ` [PATCH 08/25] vfs: Add mount notification count " David Howells
2019-05-28 15:12 ` [PATCH 09/25] vfs: Allow mount information to be queried by fsinfo() " David Howells
2019-06-01 16:08   ` Joel Fernandes
2019-06-05 12:21   ` Alan Jenkins
2019-06-18 14:00   ` David Howells
2019-05-28 15:12 ` [PATCH 10/25] vfs: fsinfo sample: Mount listing program " David Howells
2019-06-05 12:22   ` Alan Jenkins [this message]
2019-05-28 15:12 ` [PATCH 11/25] hugetlbfs: Add support for fsinfo() " David Howells
2019-05-28 15:12 ` [PATCH 12/25] kernfs, cgroup: Add fsinfo support " David Howells
2019-05-28 15:12 ` [PATCH 13/25] fsinfo: Support SELinux superblock parameter retrieval " David Howells
2019-05-28 15:13 ` [PATCH 14/25] fsinfo: Support Smack " David Howells
2019-05-28 15:13 ` [PATCH 15/25] afs: Support fsinfo() " David Howells
2019-05-28 15:13 ` [PATCH 16/25] nfs: " David Howells
2019-05-28 15:13 ` [PATCH 17/25] fsinfo: autofs - add sb operation " David Howells
2019-05-28 15:13 ` [PATCH 18/25] fsinfo: shmem - add tmpfs " David Howells
2019-05-28 15:13 ` [PATCH 19/25] fsinfo: proc - add " David Howells
2019-05-28 15:13 ` [PATCH 20/25] fsinfo: devpts " David Howells
2019-05-28 15:14 ` [PATCH 21/25] fsinfo: pstore " David Howells
2019-05-28 15:14 ` [PATCH 22/25] fsinfo: debugfs " David Howells
2019-05-28 15:14 ` [PATCH 23/25] fsinfo: bpf " David Howells
2019-05-28 15:14 ` [PATCH 24/25] fsinfo: ufs " David Howells
2019-05-28 15:14 ` [PATCH 25/25] fsinfo: Add API documentation " David Howells
2019-06-05 12:21   ` Alan Jenkins
2019-06-18 14:01   ` David Howells

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=9eeb6b39-c4a1-6e3d-246a-e1cf97d84b33@gmail.com \
    --to=alan.christopher.jenkins@gmail.com \
    --cc=dhowells@redhat.com \
    --cc=linux-api@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mszeredi@redhat.com \
    --cc=raven@themaw.net \
    --cc=viro@zeniv.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).