make vfs_ioctl() static
[safe/jmp/linux-2.6] / fs / namespace.c
index cefa1d9..fe37680 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/smp_lock.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
-#include <linux/quotaops.h>
 #include <linux/acct.h>
 #include <linux/capability.h>
 #include <linux/cpumask.h>
@@ -724,20 +723,21 @@ void save_mount_options(struct super_block *sb, char *options)
 }
 EXPORT_SYMBOL(save_mount_options);
 
+#ifdef CONFIG_PROC_FS
 /* iterator */
 static void *m_start(struct seq_file *m, loff_t *pos)
 {
-       struct mnt_namespace *n = m->private;
+       struct proc_mounts *p = m->private;
 
        down_read(&namespace_sem);
-       return seq_list_start(&n->list, *pos);
+       return seq_list_start(&p->ns->list, *pos);
 }
 
 static void *m_next(struct seq_file *m, void *v, loff_t *pos)
 {
-       struct mnt_namespace *n = m->private;
+       struct proc_mounts *p = m->private;
 
-       return seq_list_next(v, &n->list, pos);
+       return seq_list_next(v, &p->ns->list, pos);
 }
 
 static void m_stop(struct seq_file *m, void *v)
@@ -745,20 +745,30 @@ static void m_stop(struct seq_file *m, void *v)
        up_read(&namespace_sem);
 }
 
-static int show_vfsmnt(struct seq_file *m, void *v)
+struct proc_fs_info {
+       int flag;
+       const char *str;
+};
+
+static void show_sb_opts(struct seq_file *m, struct super_block *sb)
 {
-       struct vfsmount *mnt = list_entry(v, struct vfsmount, mnt_list);
-       int err = 0;
-       static struct proc_fs_info {
-               int flag;
-               char *str;
-       } fs_info[] = {
+       static const struct proc_fs_info fs_info[] = {
                { MS_SYNCHRONOUS, ",sync" },
                { MS_DIRSYNC, ",dirsync" },
                { MS_MANDLOCK, ",mand" },
                { 0, NULL }
        };
-       static struct proc_fs_info mnt_info[] = {
+       const struct proc_fs_info *fs_infop;
+
+       for (fs_infop = fs_info; fs_infop->flag; fs_infop++) {
+               if (sb->s_flags & fs_infop->flag)
+                       seq_puts(m, fs_infop->str);
+       }
+}
+
+static void show_mnt_opts(struct seq_file *m, struct vfsmount *mnt)
+{
+       static const struct proc_fs_info mnt_info[] = {
                { MNT_NOSUID, ",nosuid" },
                { MNT_NODEV, ",nodev" },
                { MNT_NOEXEC, ",noexec" },
@@ -767,40 +777,108 @@ static int show_vfsmnt(struct seq_file *m, void *v)
                { MNT_RELATIME, ",relatime" },
                { 0, NULL }
        };
-       struct proc_fs_info *fs_infop;
+       const struct proc_fs_info *fs_infop;
+
+       for (fs_infop = mnt_info; fs_infop->flag; fs_infop++) {
+               if (mnt->mnt_flags & fs_infop->flag)
+                       seq_puts(m, fs_infop->str);
+       }
+}
+
+static void show_type(struct seq_file *m, struct super_block *sb)
+{
+       mangle(m, sb->s_type->name);
+       if (sb->s_subtype && sb->s_subtype[0]) {
+               seq_putc(m, '.');
+               mangle(m, sb->s_subtype);
+       }
+}
+
+static int show_vfsmnt(struct seq_file *m, void *v)
+{
+       struct vfsmount *mnt = list_entry(v, struct vfsmount, mnt_list);
+       int err = 0;
        struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt };
 
        mangle(m, mnt->mnt_devname ? mnt->mnt_devname : "none");
        seq_putc(m, ' ');
        seq_path(m, &mnt_path, " \t\n\\");
        seq_putc(m, ' ');
-       mangle(m, mnt->mnt_sb->s_type->name);
-       if (mnt->mnt_sb->s_subtype && mnt->mnt_sb->s_subtype[0]) {
-               seq_putc(m, '.');
-               mangle(m, mnt->mnt_sb->s_subtype);
-       }
+       show_type(m, mnt->mnt_sb);
        seq_puts(m, __mnt_is_readonly(mnt) ? " ro" : " rw");
-       for (fs_infop = fs_info; fs_infop->flag; fs_infop++) {
-               if (mnt->mnt_sb->s_flags & fs_infop->flag)
-                       seq_puts(m, fs_infop->str);
-       }
-       for (fs_infop = mnt_info; fs_infop->flag; fs_infop++) {
-               if (mnt->mnt_flags & fs_infop->flag)
-                       seq_puts(m, fs_infop->str);
-       }
+       show_sb_opts(m, mnt->mnt_sb);
+       show_mnt_opts(m, mnt);
        if (mnt->mnt_sb->s_op->show_options)
                err = mnt->mnt_sb->s_op->show_options(m, mnt);
        seq_puts(m, " 0 0\n");
        return err;
 }
 
-struct seq_operations mounts_op = {
+const struct seq_operations mounts_op = {
        .start  = m_start,
        .next   = m_next,
        .stop   = m_stop,
        .show   = show_vfsmnt
 };
 
+static int show_mountinfo(struct seq_file *m, void *v)
+{
+       struct proc_mounts *p = m->private;
+       struct vfsmount *mnt = list_entry(v, struct vfsmount, mnt_list);
+       struct super_block *sb = mnt->mnt_sb;
+       struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt };
+       struct path root = p->root;
+       int err = 0;
+
+       seq_printf(m, "%i %i %u:%u ", mnt->mnt_id, mnt->mnt_parent->mnt_id,
+                  MAJOR(sb->s_dev), MINOR(sb->s_dev));
+       seq_dentry(m, mnt->mnt_root, " \t\n\\");
+       seq_putc(m, ' ');
+       seq_path_root(m, &mnt_path, &root, " \t\n\\");
+       if (root.mnt != p->root.mnt || root.dentry != p->root.dentry) {
+               /*
+                * Mountpoint is outside root, discard that one.  Ugly,
+                * but less so than trying to do that in iterator in a
+                * race-free way (due to renames).
+                */
+               return SEQ_SKIP;
+       }
+       seq_puts(m, mnt->mnt_flags & MNT_READONLY ? " ro" : " rw");
+       show_mnt_opts(m, mnt);
+
+       /* Tagged fields ("foo:X" or "bar") */
+       if (IS_MNT_SHARED(mnt))
+               seq_printf(m, " shared:%i", mnt->mnt_group_id);
+       if (IS_MNT_SLAVE(mnt)) {
+               int master = mnt->mnt_master->mnt_group_id;
+               int dom = get_dominating_id(mnt, &p->root);
+               seq_printf(m, " master:%i", master);
+               if (dom && dom != master)
+                       seq_printf(m, " propagate_from:%i", dom);
+       }
+       if (IS_MNT_UNBINDABLE(mnt))
+               seq_puts(m, " unbindable");
+
+       /* Filesystem specific data */
+       seq_puts(m, " - ");
+       show_type(m, sb);
+       seq_putc(m, ' ');
+       mangle(m, mnt->mnt_devname ? mnt->mnt_devname : "none");
+       seq_puts(m, sb->s_flags & MS_RDONLY ? " ro" : " rw");
+       show_sb_opts(m, sb);
+       if (sb->s_op->show_options)
+               err = sb->s_op->show_options(m, mnt);
+       seq_putc(m, '\n');
+       return err;
+}
+
+const struct seq_operations mountinfo_op = {
+       .start  = m_start,
+       .next   = m_next,
+       .stop   = m_stop,
+       .show   = show_mountinfo,
+};
+
 static int show_vfsstat(struct seq_file *m, void *v)
 {
        struct vfsmount *mnt = list_entry(v, struct vfsmount, mnt_list);
@@ -821,7 +899,7 @@ static int show_vfsstat(struct seq_file *m, void *v)
 
        /* file system type */
        seq_puts(m, "with fstype ");
-       mangle(m, mnt->mnt_sb->s_type->name);
+       show_type(m, mnt->mnt_sb);
 
        /* optional statistics */
        if (mnt->mnt_sb->s_op->show_stats) {
@@ -833,12 +911,13 @@ static int show_vfsstat(struct seq_file *m, void *v)
        return err;
 }
 
-struct seq_operations mountstats_op = {
+const struct seq_operations mountstats_op = {
        .start  = m_start,
        .next   = m_next,
        .stop   = m_stop,
        .show   = show_vfsstat,
 };
+#endif  /* CONFIG_PROC_FS */
 
 /**
  * may_umount_tree - check if a mount tree is busy
@@ -981,10 +1060,11 @@ static int do_umount(struct vfsmount *mnt, int flags)
         * about for the moment.
         */
 
-       lock_kernel();
-       if (sb->s_op->umount_begin)
-               sb->s_op->umount_begin(mnt, flags);
-       unlock_kernel();
+       if (flags & MNT_FORCE && sb->s_op->umount_begin) {
+               lock_kernel();
+               sb->s_op->umount_begin(sb);
+               unlock_kernel();
+       }
 
        /*
         * No sense to grab the lock for this test, but test itself looks
@@ -1003,7 +1083,6 @@ static int do_umount(struct vfsmount *mnt, int flags)
                down_write(&sb->s_umount);
                if (!(sb->s_flags & MS_RDONLY)) {
                        lock_kernel();
-                       DQUOT_OFF(sb);
                        retval = do_remount_sb(sb, MS_RDONLY, NULL, 0);
                        unlock_kernel();
                }