extern int configfs_is_root(struct config_item *item);
 
-extern struct inode * configfs_new_inode(umode_t mode, struct configfs_dirent *);
+extern struct inode * configfs_new_inode(umode_t mode, struct configfs_dirent *, struct super_block *);
 extern int configfs_create(struct dentry *, umode_t mode, int (*init)(struct inode *));
 extern int configfs_inode_init(void);
 extern void configfs_inode_exit(void);
 extern void configfs_release_fs(void);
 
 extern struct rw_semaphore configfs_rename_sem;
-extern struct super_block * configfs_sb;
 extern const struct file_operations configfs_dir_operations;
 extern const struct file_operations configfs_file_operations;
 extern const struct file_operations bin_fops;
 
        int ret;
        struct configfs_dirent *p, *root_sd, *subsys_sd = NULL;
        struct config_item *s_item = &subsys->su_group.cg_item;
+       struct dentry *root;
 
        /*
         * Pin the configfs filesystem.  This means we can safely access
         * subsystem is really registered, and so we need to lock out
         * configfs_[un]register_subsystem().
         */
-       mutex_lock(&configfs_sb->s_root->d_inode->i_mutex);
+       root = configfs_mount->mnt_root;
+       mutex_lock(&root->d_inode->i_mutex);
 
-       root_sd = configfs_sb->s_root->d_fsdata;
+       root_sd = root->d_fsdata;
 
        list_for_each_entry(p, &root_sd->s_children, s_sibling) {
                if (p->s_type & CONFIGFS_DIR) {
 out_unlock_dirent_lock:
        spin_unlock(&configfs_dirent_lock);
 out_unlock_fs:
-       mutex_unlock(&configfs_sb->s_root->d_inode->i_mutex);
+       mutex_unlock(&root->d_inode->i_mutex);
 
        /*
         * If we succeeded, the fs is pinned via other methods.  If not,
 static int configfs_readdir(struct file * filp, void * dirent, filldir_t filldir)
 {
        struct dentry *dentry = filp->f_path.dentry;
+       struct super_block *sb = dentry->d_sb;
        struct configfs_dirent * parent_sd = dentry->d_fsdata;
        struct configfs_dirent *cursor = filp->private_data;
        struct list_head *p, *q = &cursor->s_sibling;
                                        ino = inode->i_ino;
                                spin_unlock(&configfs_dirent_lock);
                                if (!inode)
-                                       ino = iunique(configfs_sb, 2);
+                                       ino = iunique(sb, 2);
 
                                if (filldir(dirent, name, len, filp->f_pos, ino,
                                                 dt_type(next)) < 0)
        struct config_group *group = &subsys->su_group;
        struct qstr name;
        struct dentry *dentry;
+       struct dentry *root;
        struct configfs_dirent *sd;
 
        err = configfs_pin_fs();
        if (!group->cg_item.ci_name)
                group->cg_item.ci_name = group->cg_item.ci_namebuf;
 
-       sd = configfs_sb->s_root->d_fsdata;
+       root = configfs_mount->mnt_root;
+       sd = root->d_fsdata;
        link_group(to_config_group(sd->s_element), group);
 
-       mutex_lock_nested(&configfs_sb->s_root->d_inode->i_mutex,
-                       I_MUTEX_PARENT);
+       mutex_lock_nested(&root->d_inode->i_mutex, I_MUTEX_PARENT);
 
        name.name = group->cg_item.ci_name;
        name.len = strlen(name.name);
        name.hash = full_name_hash(name.name, name.len);
 
        err = -ENOMEM;
-       dentry = d_alloc(configfs_sb->s_root, &name);
+       dentry = d_alloc(root, &name);
        if (dentry) {
                d_add(dentry, NULL);
 
                }
        }
 
-       mutex_unlock(&configfs_sb->s_root->d_inode->i_mutex);
+       mutex_unlock(&root->d_inode->i_mutex);
 
        if (err) {
                unlink_group(group);
 {
        struct config_group *group = &subsys->su_group;
        struct dentry *dentry = group->cg_item.ci_dentry;
+       struct dentry *root = dentry->d_sb->s_root;
 
-       if (dentry->d_parent != configfs_sb->s_root) {
+       if (dentry->d_parent != root) {
                printk(KERN_ERR "configfs: Tried to unregister non-subsystem!\n");
                return;
        }
 
-       mutex_lock_nested(&configfs_sb->s_root->d_inode->i_mutex,
+       mutex_lock_nested(&root->d_inode->i_mutex,
                          I_MUTEX_PARENT);
        mutex_lock_nested(&dentry->d_inode->i_mutex, I_MUTEX_CHILD);
        mutex_lock(&configfs_symlink_mutex);
 
        d_delete(dentry);
 
-       mutex_unlock(&configfs_sb->s_root->d_inode->i_mutex);
+       mutex_unlock(&root->d_inode->i_mutex);
 
        dput(dentry);
 
 
 static struct lock_class_key default_group_class[MAX_LOCK_DEPTH];
 #endif
 
-extern struct super_block * configfs_sb;
-
 static const struct address_space_operations configfs_aops = {
        .readpage       = simple_readpage,
        .write_begin    = simple_write_begin,
        inode->i_ctime = iattr->ia_ctime;
 }
 
-struct inode *configfs_new_inode(umode_t mode, struct configfs_dirent * sd)
+struct inode *configfs_new_inode(umode_t mode, struct configfs_dirent *sd,
+                                struct super_block *s)
 {
-       struct inode * inode = new_inode(configfs_sb);
+       struct inode * inode = new_inode(s);
        if (inode) {
                inode->i_ino = get_next_ino();
                inode->i_mapping->a_ops = &configfs_aops;
        if (dentry) {
                if (!dentry->d_inode) {
                        struct configfs_dirent *sd = dentry->d_fsdata;
-                       if ((inode = configfs_new_inode(mode, sd))) {
+                       if ((inode = configfs_new_inode(mode, sd, dentry->d_sb))) {
                                if (dentry->d_parent && dentry->d_parent->d_inode) {
                                        struct inode *p_inode = dentry->d_parent->d_inode;
                                        p_inode->i_mtime = p_inode->i_ctime = CURRENT_TIME;
 
 
 
 static int get_target(const char *symname, struct path *path,
-                     struct config_item **target)
+                     struct config_item **target, struct super_block *sb)
 {
        int ret;
 
        ret = kern_path(symname, LOOKUP_FOLLOW|LOOKUP_DIRECTORY, path);
        if (!ret) {
-               if (path->dentry->d_sb == configfs_sb) {
+               if (path->dentry->d_sb == sb) {
                        *target = configfs_get_config_item(path->dentry);
                        if (!*target) {
                                ret = -ENOENT;
            !type->ct_item_ops->allow_link)
                goto out_put;
 
-       ret = get_target(symname, &path, &target_item);
+       ret = get_target(symname, &path, &target_item, dentry->d_sb);
        if (ret)
                goto out_put;