[PATCH 08/10] Define get_sb_ref()

Sukadev Bhattiprolu sukadev at linux.vnet.ibm.com
Tue Sep 9 18:42:44 PDT 2008


See comments in fs/super.c (in patch below) for need for this interface.
This interface will be used in follow-on patch to enable multiple
instances of devpts.

Signed-off-by: Sukadev Bhattiprolu <sukadev at us.ibm.com>
---
 fs/super.c         |   37 +++++++++++++++++++++++++++++++++++++
 include/linux/fs.h |    2 ++
 2 files changed, 39 insertions(+), 0 deletions(-)

diff --git a/fs/super.c b/fs/super.c
index e931ae9..ba7059c 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -882,6 +882,43 @@ int get_sb_single(struct file_system_type *fs_type,
 }
 
 EXPORT_SYMBOL(get_sb_single);
+/*
+ * int get_sb_ref(struct super_block *sb, int flags, void *data,
+                struct vfsmount *mnt)
+ *
+ * 	This interface is needed to support multiple mounts in devpts while
+ * 	preserving backward compatibility of the current 'single-mount'
+ * 	semantics i.e all mounts of devpts without the 'newinstance' mount
+ * 	option should bind to the initial kernel mount, like get_sb_single().
+ * 	Mounts with 'newinstance' option create a new private namespace.
+ *
+ * 	But for single-mount semantics, devpts cannot use get_sb_single(),
+ * 	because get_sb_single()/sget() find and use the super-block from
+ * 	the most recent mount of devpts. But that recent mount may be a
+ * 	'newinstance' mount and get_sb_single() would pick the newinstance
+ * 	super-block instead of the initial super-block.
+ *
+ * 	This is a simplified version of get_sb_single() and assumes that
+ * 	caller has a properly initialized @sb.
+ */
+int get_sb_ref(struct super_block *sb, int flags, void *data,
+                struct vfsmount *mnt)
+{
+        int err;
+
+        spin_lock(&sb_lock);
+
+        if (!grab_super(sb))
+                return -EAGAIN;
+
+        err = do_remount_sb(sb, flags, data, 0);
+        if (err) {
+                /* Don't deactivate_super() - its from initial pts mount */
+                up_write(&sb->s_umount);
+                return err;
+        }
+        return simple_set_mnt(mnt, sb);
+}
 
 struct vfsmount *
 vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void *data)
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 580b513..3bda46d 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1512,6 +1512,8 @@ extern int get_sb_single(struct file_system_type *fs_type,
 	int flags, void *data,
 	int (*fill_super)(struct super_block *, void *, int),
 	struct vfsmount *mnt);
+extern int get_sb_ref(struct super_block *sb, int flags, void *data,
+	struct vfsmount *mnt);
 extern int get_sb_nodev(struct file_system_type *fs_type,
 	int flags, void *data,
 	int (*fill_super)(struct super_block *, void *, int),
-- 
1.5.2.5



More information about the Containers mailing list