diff options
author | Dmitry V. Levin <ldv@altlinux.org> | 2014-12-15 22:59:37 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2014-12-17 08:27:15 -0500 |
commit | 9d4d65748a5ca26ea8650e50ba521295549bf4e3 (patch) | |
tree | 6ab682d37fb472d76c8593f72168c5c58b1479a1 | |
parent | 9ad4dc4f7318080e2e4e0cd23623211a20d33861 (diff) |
vfs: make mounts and mountstats honor root dir like mountinfo does
As we already show mountpoints relative to the root directory, thanks
to the change made back in 2000, change show_vfsmnt() and show_vfsstat()
to skip out-of-root mountpoints the same way as show_mountinfo() does.
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | fs/proc_namespace.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/fs/proc_namespace.c b/fs/proc_namespace.c index 789e8d1e21db..0f96f71ab32b 100644 --- a/fs/proc_namespace.c +++ b/fs/proc_namespace.c | |||
@@ -91,6 +91,7 @@ static void show_type(struct seq_file *m, struct super_block *sb) | |||
91 | 91 | ||
92 | static int show_vfsmnt(struct seq_file *m, struct vfsmount *mnt) | 92 | static int show_vfsmnt(struct seq_file *m, struct vfsmount *mnt) |
93 | { | 93 | { |
94 | struct proc_mounts *p = proc_mounts(m); | ||
94 | struct mount *r = real_mount(mnt); | 95 | struct mount *r = real_mount(mnt); |
95 | int err = 0; | 96 | int err = 0; |
96 | struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt }; | 97 | struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt }; |
@@ -104,7 +105,10 @@ static int show_vfsmnt(struct seq_file *m, struct vfsmount *mnt) | |||
104 | mangle(m, r->mnt_devname ? r->mnt_devname : "none"); | 105 | mangle(m, r->mnt_devname ? r->mnt_devname : "none"); |
105 | } | 106 | } |
106 | seq_putc(m, ' '); | 107 | seq_putc(m, ' '); |
107 | seq_path(m, &mnt_path, " \t\n\\"); | 108 | /* mountpoints outside of chroot jail will give SEQ_SKIP on this */ |
109 | err = seq_path_root(m, &mnt_path, &p->root, " \t\n\\"); | ||
110 | if (err) | ||
111 | goto out; | ||
108 | seq_putc(m, ' '); | 112 | seq_putc(m, ' '); |
109 | show_type(m, sb); | 113 | show_type(m, sb); |
110 | seq_puts(m, __mnt_is_readonly(mnt) ? " ro" : " rw"); | 114 | seq_puts(m, __mnt_is_readonly(mnt) ? " ro" : " rw"); |
@@ -181,6 +185,7 @@ out: | |||
181 | 185 | ||
182 | static int show_vfsstat(struct seq_file *m, struct vfsmount *mnt) | 186 | static int show_vfsstat(struct seq_file *m, struct vfsmount *mnt) |
183 | { | 187 | { |
188 | struct proc_mounts *p = proc_mounts(m); | ||
184 | struct mount *r = real_mount(mnt); | 189 | struct mount *r = real_mount(mnt); |
185 | struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt }; | 190 | struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt }; |
186 | struct super_block *sb = mnt_path.dentry->d_sb; | 191 | struct super_block *sb = mnt_path.dentry->d_sb; |
@@ -200,7 +205,10 @@ static int show_vfsstat(struct seq_file *m, struct vfsmount *mnt) | |||
200 | 205 | ||
201 | /* mount point */ | 206 | /* mount point */ |
202 | seq_puts(m, " mounted on "); | 207 | seq_puts(m, " mounted on "); |
203 | seq_path(m, &mnt_path, " \t\n\\"); | 208 | /* mountpoints outside of chroot jail will give SEQ_SKIP on this */ |
209 | err = seq_path_root(m, &mnt_path, &p->root, " \t\n\\"); | ||
210 | if (err) | ||
211 | goto out; | ||
204 | seq_putc(m, ' '); | 212 | seq_putc(m, ' '); |
205 | 213 | ||
206 | /* file system type */ | 214 | /* file system type */ |
@@ -215,6 +223,7 @@ static int show_vfsstat(struct seq_file *m, struct vfsmount *mnt) | |||
215 | } | 223 | } |
216 | 224 | ||
217 | seq_putc(m, '\n'); | 225 | seq_putc(m, '\n'); |
226 | out: | ||
218 | return err; | 227 | return err; |
219 | } | 228 | } |
220 | 229 | ||