Loading fs/debugfs/inode.c +20 −33 Original line number Original line Diff line number Diff line Loading @@ -293,13 +293,19 @@ static struct file_system_type debug_fs_type = { .kill_sb = kill_litter_super, .kill_sb = kill_litter_super, }; }; static int debugfs_create_by_name(const char *name, umode_t mode, struct dentry *__create_file(const char *name, umode_t mode, struct dentry *parent, struct dentry *parent, void *data, struct dentry **dentry, void *data, const struct file_operations *fops) const struct file_operations *fops) { { int error = 0; struct dentry *dentry = NULL; int error; pr_debug("debugfs: creating file '%s'\n",name); error = simple_pin_fs(&debug_fs_type, &debugfs_mount, &debugfs_mount_count); if (error) goto exit; /* If the parent is not specified, we create it in the root. /* If the parent is not specified, we create it in the root. * We need the root dentry to do this, which is in the super * We need the root dentry to do this, which is in the super Loading @@ -309,48 +315,29 @@ static int debugfs_create_by_name(const char *name, umode_t mode, if (!parent) if (!parent) parent = debugfs_mount->mnt_root; parent = debugfs_mount->mnt_root; *dentry = NULL; dentry = NULL; mutex_lock(&parent->d_inode->i_mutex); mutex_lock(&parent->d_inode->i_mutex); *dentry = lookup_one_len(name, parent, strlen(name)); dentry = lookup_one_len(name, parent, strlen(name)); if (!IS_ERR(*dentry)) { if (!IS_ERR(dentry)) { switch (mode & S_IFMT) { switch (mode & S_IFMT) { case S_IFDIR: case S_IFDIR: error = debugfs_mkdir(parent->d_inode, *dentry, mode, error = debugfs_mkdir(parent->d_inode, dentry, mode, data, fops); data, fops); break; break; case S_IFLNK: case S_IFLNK: error = debugfs_link(parent->d_inode, *dentry, mode, error = debugfs_link(parent->d_inode, dentry, mode, data, fops); data, fops); break; break; default: default: error = debugfs_create(parent->d_inode, *dentry, mode, error = debugfs_create(parent->d_inode, dentry, mode, data, fops); data, fops); break; break; } } dput(*dentry); dput(dentry); } else } else error = PTR_ERR(*dentry); error = PTR_ERR(dentry); mutex_unlock(&parent->d_inode->i_mutex); mutex_unlock(&parent->d_inode->i_mutex); return error; } struct dentry *__create_file(const char *name, umode_t mode, struct dentry *parent, void *data, const struct file_operations *fops) { struct dentry *dentry = NULL; int error; pr_debug("debugfs: creating file '%s'\n",name); error = simple_pin_fs(&debug_fs_type, &debugfs_mount, &debugfs_mount_count); if (error) goto exit; error = debugfs_create_by_name(name, mode, parent, &dentry, data, fops); if (error) { if (error) { dentry = NULL; dentry = NULL; simple_release_fs(&debugfs_mount, &debugfs_mount_count); simple_release_fs(&debugfs_mount, &debugfs_mount_count); Loading Loading
fs/debugfs/inode.c +20 −33 Original line number Original line Diff line number Diff line Loading @@ -293,13 +293,19 @@ static struct file_system_type debug_fs_type = { .kill_sb = kill_litter_super, .kill_sb = kill_litter_super, }; }; static int debugfs_create_by_name(const char *name, umode_t mode, struct dentry *__create_file(const char *name, umode_t mode, struct dentry *parent, struct dentry *parent, void *data, struct dentry **dentry, void *data, const struct file_operations *fops) const struct file_operations *fops) { { int error = 0; struct dentry *dentry = NULL; int error; pr_debug("debugfs: creating file '%s'\n",name); error = simple_pin_fs(&debug_fs_type, &debugfs_mount, &debugfs_mount_count); if (error) goto exit; /* If the parent is not specified, we create it in the root. /* If the parent is not specified, we create it in the root. * We need the root dentry to do this, which is in the super * We need the root dentry to do this, which is in the super Loading @@ -309,48 +315,29 @@ static int debugfs_create_by_name(const char *name, umode_t mode, if (!parent) if (!parent) parent = debugfs_mount->mnt_root; parent = debugfs_mount->mnt_root; *dentry = NULL; dentry = NULL; mutex_lock(&parent->d_inode->i_mutex); mutex_lock(&parent->d_inode->i_mutex); *dentry = lookup_one_len(name, parent, strlen(name)); dentry = lookup_one_len(name, parent, strlen(name)); if (!IS_ERR(*dentry)) { if (!IS_ERR(dentry)) { switch (mode & S_IFMT) { switch (mode & S_IFMT) { case S_IFDIR: case S_IFDIR: error = debugfs_mkdir(parent->d_inode, *dentry, mode, error = debugfs_mkdir(parent->d_inode, dentry, mode, data, fops); data, fops); break; break; case S_IFLNK: case S_IFLNK: error = debugfs_link(parent->d_inode, *dentry, mode, error = debugfs_link(parent->d_inode, dentry, mode, data, fops); data, fops); break; break; default: default: error = debugfs_create(parent->d_inode, *dentry, mode, error = debugfs_create(parent->d_inode, dentry, mode, data, fops); data, fops); break; break; } } dput(*dentry); dput(dentry); } else } else error = PTR_ERR(*dentry); error = PTR_ERR(dentry); mutex_unlock(&parent->d_inode->i_mutex); mutex_unlock(&parent->d_inode->i_mutex); return error; } struct dentry *__create_file(const char *name, umode_t mode, struct dentry *parent, void *data, const struct file_operations *fops) { struct dentry *dentry = NULL; int error; pr_debug("debugfs: creating file '%s'\n",name); error = simple_pin_fs(&debug_fs_type, &debugfs_mount, &debugfs_mount_count); if (error) goto exit; error = debugfs_create_by_name(name, mode, parent, &dentry, data, fops); if (error) { if (error) { dentry = NULL; dentry = NULL; simple_release_fs(&debugfs_mount, &debugfs_mount_count); simple_release_fs(&debugfs_mount, &debugfs_mount_count); Loading