Quoting [EMAIL PROTECTED] ([EMAIL PROTECTED]):
> 
> >From 8886ef518c1855890be7fbc6bea853ce7feb263e Mon Sep 17 00:00:00 2001
> From: Sukadev Bhattiprolu <[EMAIL PROTECTED]>
> 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 <[EMAIL PROTECTED]>
> ---
>  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
_______________________________________________
Containers mailing list
[EMAIL PROTECTED]
https://lists.linux-foundation.org/mailman/listinfo/containers

_______________________________________________
Devel mailing list
Devel@openvz.org
https://openvz.org/mailman/listinfo/devel

Reply via email to