[Devel] [PATCH 08/10] Define get_sb_ref()
sukadev at us.ibm.com
sukadev at us.ibm.com
Fri Sep 12 10:53:08 PDT 2008
>From 8886ef518c1855890be7fbc6bea853ce7feb263e Mon Sep 17 00:00:00 2001
From: Sukadev Bhattiprolu <sukadev at linux.vnet.ibm.com>
Date: Tue, 9 Sep 2008 18:42:44 -0700
Subject: [PATCH 08/10] Define get_sb_ref()
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
_______________________________________________
Containers mailing list
Containers at lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers
More information about the Devel
mailing list