diff options
author | Ram Pai <linuxram@us.ibm.com> | 2008-03-27 08:06:25 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2008-04-23 00:05:03 -0400 |
commit | 2d4d4864ac08caff5c204a752bd004eed4f08760 (patch) | |
tree | a8907c33afae589146fdcd06eacd740aff48c6a1 /fs/proc/base.c | |
parent | a1a2c409b666befc58c2db9c7fbddf200f153470 (diff) |
[patch 6/7] vfs: mountinfo: add /proc/<pid>/mountinfo
[mszeredi@suse.cz] rewrite and split big patch into managable chunks
/proc/mounts in its current form lacks important information:
- propagation state
- root of mount for bind mounts
- the st_dev value used within the filesystem
- identifier for each mount and it's parent
It also suffers from the following problems:
- not easily extendable
- ambiguity of mountpoints within a chrooted environment
- doesn't distinguish between filesystem dependent and independent options
- doesn't distinguish between per mount and per super block options
This patch introduces /proc/<pid>/mountinfo which attempts to address
all these deficiencies.
Code shared between /proc/<pid>/mounts and /proc/<pid>/mountinfo is
extracted into separate functions.
Thanks to Al Viro for the help in getting the design right.
Signed-off-by: Ram Pai <linuxram@us.ibm.com>
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/proc/base.c')
-rw-r--r-- | fs/proc/base.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index a04b3db7a296..c5e412a00b17 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -604,6 +604,19 @@ static const struct file_operations proc_mounts_operations = { | |||
604 | .poll = mounts_poll, | 604 | .poll = mounts_poll, |
605 | }; | 605 | }; |
606 | 606 | ||
607 | static int mountinfo_open(struct inode *inode, struct file *file) | ||
608 | { | ||
609 | return mounts_open_common(inode, file, &mountinfo_op); | ||
610 | } | ||
611 | |||
612 | static const struct file_operations proc_mountinfo_operations = { | ||
613 | .open = mountinfo_open, | ||
614 | .read = seq_read, | ||
615 | .llseek = seq_lseek, | ||
616 | .release = mounts_release, | ||
617 | .poll = mounts_poll, | ||
618 | }; | ||
619 | |||
607 | static int mountstats_open(struct inode *inode, struct file *file) | 620 | static int mountstats_open(struct inode *inode, struct file *file) |
608 | { | 621 | { |
609 | return mounts_open_common(inode, file, &mountstats_op); | 622 | return mounts_open_common(inode, file, &mountstats_op); |
@@ -2303,6 +2316,7 @@ static const struct pid_entry tgid_base_stuff[] = { | |||
2303 | LNK("root", root), | 2316 | LNK("root", root), |
2304 | LNK("exe", exe), | 2317 | LNK("exe", exe), |
2305 | REG("mounts", S_IRUGO, mounts), | 2318 | REG("mounts", S_IRUGO, mounts), |
2319 | REG("mountinfo", S_IRUGO, mountinfo), | ||
2306 | REG("mountstats", S_IRUSR, mountstats), | 2320 | REG("mountstats", S_IRUSR, mountstats), |
2307 | #ifdef CONFIG_PROC_PAGE_MONITOR | 2321 | #ifdef CONFIG_PROC_PAGE_MONITOR |
2308 | REG("clear_refs", S_IWUSR, clear_refs), | 2322 | REG("clear_refs", S_IWUSR, clear_refs), |
@@ -2635,6 +2649,7 @@ static const struct pid_entry tid_base_stuff[] = { | |||
2635 | LNK("root", root), | 2649 | LNK("root", root), |
2636 | LNK("exe", exe), | 2650 | LNK("exe", exe), |
2637 | REG("mounts", S_IRUGO, mounts), | 2651 | REG("mounts", S_IRUGO, mounts), |
2652 | REG("mountinfo", S_IRUGO, mountinfo), | ||
2638 | #ifdef CONFIG_PROC_PAGE_MONITOR | 2653 | #ifdef CONFIG_PROC_PAGE_MONITOR |
2639 | REG("clear_refs", S_IWUSR, clear_refs), | 2654 | REG("clear_refs", S_IWUSR, clear_refs), |
2640 | REG("smaps", S_IRUGO, smaps), | 2655 | REG("smaps", S_IRUGO, smaps), |