From 06c955a634408178b6279254a60cd93764aebb8a Mon Sep 17 00:00:00 2001 From: "Serge E. Hallyn" Date: Mon, 6 Apr 2009 19:01:07 -0700 Subject: [PATCH] --- yaml --- r: 142581 b: refs/heads/master c: 909e6d94795654040ed416ac69858d5d2ce66dd3 h: refs/heads/master i: 142579: 28ba27e1651521b03546f14d2e8f497d0cb7d49c v: v3 --- [refs] | 2 +- trunk/fs/super.c | 40 ++++++++++++++++++++++++++++++++++++++++ trunk/include/linux/fs.h | 3 +++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index a8c3d6a384f4..a7987b9b67ca 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 7ce5ba3c7ef26284f60babbe4465259d1f9968f3 +refs/heads/master: 909e6d94795654040ed416ac69858d5d2ce66dd3 diff --git a/trunk/fs/super.c b/trunk/fs/super.c index 77cb4ec919b9..786fe7d72790 100644 --- a/trunk/fs/super.c +++ b/trunk/fs/super.c @@ -771,6 +771,46 @@ void kill_litter_super(struct super_block *sb) EXPORT_SYMBOL(kill_litter_super); +static int ns_test_super(struct super_block *sb, void *data) +{ + return sb->s_fs_info == data; +} + +static int ns_set_super(struct super_block *sb, void *data) +{ + sb->s_fs_info = data; + return set_anon_super(sb, NULL); +} + +int get_sb_ns(struct file_system_type *fs_type, int flags, void *data, + int (*fill_super)(struct super_block *, void *, int), + struct vfsmount *mnt) +{ + struct super_block *sb; + + sb = sget(fs_type, ns_test_super, ns_set_super, data); + if (IS_ERR(sb)) + return PTR_ERR(sb); + + if (!sb->s_root) { + int err; + sb->s_flags = flags; + err = fill_super(sb, data, flags & MS_SILENT ? 1 : 0); + if (err) { + up_write(&sb->s_umount); + deactivate_super(sb); + return err; + } + + sb->s_flags |= MS_ACTIVE; + } + + simple_set_mnt(mnt, sb); + return 0; +} + +EXPORT_SYMBOL(get_sb_ns); + #ifdef CONFIG_BLOCK static int set_bdev_super(struct super_block *s, void *data) { diff --git a/trunk/include/linux/fs.h b/trunk/include/linux/fs.h index bce40a2207ee..562d2855cf30 100644 --- a/trunk/include/linux/fs.h +++ b/trunk/include/linux/fs.h @@ -1699,6 +1699,9 @@ struct file_system_type { struct lock_class_key i_alloc_sem_key; }; +extern int get_sb_ns(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_bdev(struct file_system_type *fs_type, int flags, const char *dev_name, void *data, int (*fill_super)(struct super_block *, void *, int),