Loading fs/configfs/configfs_internal.h +1 −2 Original line number Diff line number Diff line Loading @@ -63,7 +63,7 @@ extern struct kmem_cache *configfs_dir_cachep; 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); Loading @@ -84,7 +84,6 @@ extern int configfs_pin_fs(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; Loading fs/configfs/dir.c +17 −12 Original line number Diff line number Diff line Loading @@ -1079,6 +1079,7 @@ int configfs_depend_item(struct configfs_subsystem *subsys, 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 Loading @@ -1093,9 +1094,10 @@ int configfs_depend_item(struct configfs_subsystem *subsys, * 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) { Loading Loading @@ -1129,7 +1131,7 @@ int configfs_depend_item(struct configfs_subsystem *subsys, 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, Loading Loading @@ -1543,6 +1545,7 @@ static inline unsigned char dt_type(struct configfs_dirent *sd) 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; Loading Loading @@ -1605,7 +1608,7 @@ static int configfs_readdir(struct file * filp, void * dirent, filldir_t filldir 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) Loading Loading @@ -1677,6 +1680,7 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys) struct config_group *group = &subsys->su_group; struct qstr name; struct dentry *dentry; struct dentry *root; struct configfs_dirent *sd; err = configfs_pin_fs(); Loading @@ -1686,18 +1690,18 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys) 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); Loading @@ -1714,7 +1718,7 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys) } } mutex_unlock(&configfs_sb->s_root->d_inode->i_mutex); mutex_unlock(&root->d_inode->i_mutex); if (err) { unlink_group(group); Loading @@ -1728,13 +1732,14 @@ void configfs_unregister_subsystem(struct configfs_subsystem *subsys) { 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); Loading @@ -1751,7 +1756,7 @@ void configfs_unregister_subsystem(struct configfs_subsystem *subsys) d_delete(dentry); mutex_unlock(&configfs_sb->s_root->d_inode->i_mutex); mutex_unlock(&root->d_inode->i_mutex); dput(dentry); Loading fs/configfs/inode.c +4 −5 Original line number Diff line number Diff line Loading @@ -44,8 +44,6 @@ 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, Loading Loading @@ -132,9 +130,10 @@ static inline void set_inode_attr(struct inode * inode, struct iattr * iattr) 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; Loading Loading @@ -192,7 +191,7 @@ int configfs_create(struct dentry * dentry, umode_t mode, int (*init)(struct ino 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; Loading fs/configfs/mount.c +1 −3 Original line number Diff line number Diff line Loading @@ -38,7 +38,6 @@ #define CONFIGFS_MAGIC 0x62656570 struct vfsmount * configfs_mount = NULL; struct super_block * configfs_sb = NULL; struct kmem_cache *configfs_dir_cachep; static int configfs_mnt_count = 0; Loading Loading @@ -77,10 +76,9 @@ static int configfs_fill_super(struct super_block *sb, void *data, int silent) sb->s_magic = CONFIGFS_MAGIC; sb->s_op = &configfs_ops; sb->s_time_gran = 1; configfs_sb = sb; inode = configfs_new_inode(S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO, &configfs_root); &configfs_root, sb); if (inode) { inode->i_op = &configfs_root_inode_operations; inode->i_fop = &configfs_dir_operations; Loading fs/configfs/symlink.c +3 −3 Original line number Diff line number Diff line Loading @@ -110,13 +110,13 @@ static int create_link(struct config_item *parent_item, 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; Loading Loading @@ -158,7 +158,7 @@ int configfs_symlink(struct inode *dir, struct dentry *dentry, const char *symna !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; Loading Loading
fs/configfs/configfs_internal.h +1 −2 Original line number Diff line number Diff line Loading @@ -63,7 +63,7 @@ extern struct kmem_cache *configfs_dir_cachep; 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); Loading @@ -84,7 +84,6 @@ extern int configfs_pin_fs(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; Loading
fs/configfs/dir.c +17 −12 Original line number Diff line number Diff line Loading @@ -1079,6 +1079,7 @@ int configfs_depend_item(struct configfs_subsystem *subsys, 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 Loading @@ -1093,9 +1094,10 @@ int configfs_depend_item(struct configfs_subsystem *subsys, * 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) { Loading Loading @@ -1129,7 +1131,7 @@ int configfs_depend_item(struct configfs_subsystem *subsys, 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, Loading Loading @@ -1543,6 +1545,7 @@ static inline unsigned char dt_type(struct configfs_dirent *sd) 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; Loading Loading @@ -1605,7 +1608,7 @@ static int configfs_readdir(struct file * filp, void * dirent, filldir_t filldir 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) Loading Loading @@ -1677,6 +1680,7 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys) struct config_group *group = &subsys->su_group; struct qstr name; struct dentry *dentry; struct dentry *root; struct configfs_dirent *sd; err = configfs_pin_fs(); Loading @@ -1686,18 +1690,18 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys) 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); Loading @@ -1714,7 +1718,7 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys) } } mutex_unlock(&configfs_sb->s_root->d_inode->i_mutex); mutex_unlock(&root->d_inode->i_mutex); if (err) { unlink_group(group); Loading @@ -1728,13 +1732,14 @@ void configfs_unregister_subsystem(struct configfs_subsystem *subsys) { 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); Loading @@ -1751,7 +1756,7 @@ void configfs_unregister_subsystem(struct configfs_subsystem *subsys) d_delete(dentry); mutex_unlock(&configfs_sb->s_root->d_inode->i_mutex); mutex_unlock(&root->d_inode->i_mutex); dput(dentry); Loading
fs/configfs/inode.c +4 −5 Original line number Diff line number Diff line Loading @@ -44,8 +44,6 @@ 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, Loading Loading @@ -132,9 +130,10 @@ static inline void set_inode_attr(struct inode * inode, struct iattr * iattr) 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; Loading Loading @@ -192,7 +191,7 @@ int configfs_create(struct dentry * dentry, umode_t mode, int (*init)(struct ino 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; Loading
fs/configfs/mount.c +1 −3 Original line number Diff line number Diff line Loading @@ -38,7 +38,6 @@ #define CONFIGFS_MAGIC 0x62656570 struct vfsmount * configfs_mount = NULL; struct super_block * configfs_sb = NULL; struct kmem_cache *configfs_dir_cachep; static int configfs_mnt_count = 0; Loading Loading @@ -77,10 +76,9 @@ static int configfs_fill_super(struct super_block *sb, void *data, int silent) sb->s_magic = CONFIGFS_MAGIC; sb->s_op = &configfs_ops; sb->s_time_gran = 1; configfs_sb = sb; inode = configfs_new_inode(S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO, &configfs_root); &configfs_root, sb); if (inode) { inode->i_op = &configfs_root_inode_operations; inode->i_fop = &configfs_dir_operations; Loading
fs/configfs/symlink.c +3 −3 Original line number Diff line number Diff line Loading @@ -110,13 +110,13 @@ static int create_link(struct config_item *parent_item, 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; Loading Loading @@ -158,7 +158,7 @@ int configfs_symlink(struct inode *dir, struct dentry *dentry, const char *symna !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; Loading