[PATCH 08/10] Define get_sb_ref()

Serge E. Hallyn serue at us.ibm.com
Wed Sep 24 12:20:16 PDT 2008


Quoting sukadev at us.ibm.com (sukadev at us.ibm.com):
> 
> >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 */

But you did increment sb->s_active, and you're not decrementing it?

> +                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