[Devel] Re: [PATCH 08/10] Define get_sb_ref()
sukadev at linux.vnet.ibm.com
sukadev at linux.vnet.ibm.com
Fri Oct 3 20:09:21 PDT 2008
sukadev at linux.vnet.ibm.com [sukadev at linux.vnet.ibm.com] wrote:
| Dave Hansen [dave at linux.vnet.ibm.com] wrote:
| | On Fri, 2008-09-26 at 14:21 -0700, sukadev at linux.vnet.ibm.com wrote:
| | > Dave Hansen [dave at linux.vnet.ibm.com] wrote:
| | > | On Fri, 2008-09-12 at 10:53 -0700, sukadev at us.ibm.com wrote:
| | > | > + * 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.
| | > |
| | > | Can't you just override the test() function to get what you want here?
| | >
| | > get_sb_single() does not take a test() parameter and so I would still
| | > need a get_sb_ref() or get_sb_special() interface right ?
| | >
| | > This special interface could call sget() with a custom-test function,
| | > to get the super-block. But in case of devpts, we already have the
| | > super-block. So we don't need to call sget(). We just need get a reference
| | > and remount.
| |
| | Well, you shouldn't be using get_sb_single() at all any more, right?
|
Since mqueue_ns is using a different approach, and devpts is the only one
needing this new interface, we can move this into fs/devpts/inode.c.
This patch again applies on current ptsns patchset.
---
>From fc983c743daad24c599215500a2e06e7eff82239 Mon Sep 17 00:00:00 2001
From: Sukadev Bhattiprolu <sukadev at linux.vnet.ibm.com>
Date: Fri, 3 Oct 2008 19:33:46 -0700
Subject: [PATCH] Define/use get_init_pts_sb()
get_init_pts_sb() is identical to get_sb_single() except that it
consistently picks up the super-block from initial kernel mount.
get_sb_single() fails to pick up the initial kernel mount if there
has been an 'newinstance' mount of devpts since the initial kernel
mount.
Touch-tested
TODO:
This patch leaves the 'get_sb_ref() function unused which can be
deleted.
If this makes sense, integrate this patch into ptsns patchset.
---
fs/devpts/inode.c | 53 +++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 41 insertions(+), 12 deletions(-)
diff --git a/fs/devpts/inode.c b/fs/devpts/inode.c
index 941a3ce..27aa6d3 100644
--- a/fs/devpts/inode.c
+++ b/fs/devpts/inode.c
@@ -408,6 +408,38 @@ static int is_new_instance_mount(void *data)
return rc;
}
+static int compare_init_pts_sb(struct super_block *s, void *p)
+{
+ if (devpts_mnt)
+ return devpts_mnt->mnt_sb == s;
+
+ return 0;
+}
+
+static int get_init_pts_sb(struct file_system_type *fs_type, int flags,
+ void *data, struct vfsmount *mnt)
+{
+ struct super_block *s;
+ int error;
+
+ s = sget(fs_type, compare_init_pts_sb, set_anon_super, NULL);
+ if (IS_ERR(s))
+ return PTR_ERR(s);
+
+ if (!s->s_root) {
+ s->s_flags = flags;
+ error = devpts_fill_super(s, data, flags & MS_SILENT ? 1 : 0);
+ if (error) {
+ up_write(&s->s_umount);
+ deactivate_super(s);
+ return error;
+ }
+ s->s_flags |= MS_ACTIVE;
+ }
+ do_remount_sb(s, flags, data, 0);
+ return simple_set_mnt(mnt, s);
+}
+
/*
* Mount or remount the initial kernel mount of devpts. This type of
* mount maintains the legacy, single-instance semantics, while the
@@ -418,21 +450,18 @@ static int init_pts_mount(struct file_system_type *fs_type, int flags,
{
int err;
- if (!devpts_mnt) {
- err = get_sb_single(fs_type, flags, data, devpts_fill_super,
- mnt);
-
- err = mknod_ptmx(mnt->mnt_sb);
- if (err) {
- dput(mnt->mnt_sb->s_root);
- deactivate_super(mnt->mnt_sb);
- } else
- devpts_mnt = mnt;
-
+ err = get_init_pts_sb(fs_type, flags, data, mnt);
+ if (err || devpts_mnt)
return err;
+
+ /* first mount of devpts - make ptmx node */
+ err = mknod_ptmx(mnt->mnt_sb);
+ if (err) {
+ dput(mnt->mnt_sb->s_root);
+ deactivate_super(mnt->mnt_sb);
}
- return get_sb_ref(devpts_mnt->mnt_sb, flags, data, mnt);
+ return err;
}
static int devpts_get_sb(struct file_system_type *fs_type,
--
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