Loading fs/configfs/dir.c +52 −70 Original line number Diff line number Diff line Loading @@ -1532,33 +1532,18 @@ static inline unsigned char dt_type(struct configfs_dirent *sd) return (sd->s_mode >> 12) & 15; } static int configfs_readdir(struct file * filp, void * dirent, filldir_t filldir) static int configfs_readdir(struct file *file, struct dir_context *ctx) { struct dentry *dentry = filp->f_path.dentry; struct dentry *dentry = file->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 configfs_dirent *cursor = file->private_data; struct list_head *p, *q = &cursor->s_sibling; ino_t ino = 0; int i = filp->f_pos; switch (i) { case 0: ino = dentry->d_inode->i_ino; if (filldir(dirent, ".", 1, i, ino, DT_DIR) < 0) break; filp->f_pos++; i++; /* fallthrough */ case 1: ino = parent_ino(dentry); if (filldir(dirent, "..", 2, i, ino, DT_DIR) < 0) break; filp->f_pos++; i++; /* fallthrough */ default: if (filp->f_pos == 2) { if (!dir_emit_dots(file, ctx)) return 0; if (ctx->pos == 2) { spin_lock(&configfs_dirent_lock); list_move(q, &parent_sd->s_children); spin_unlock(&configfs_dirent_lock); Loading @@ -1569,8 +1554,7 @@ static int configfs_readdir(struct file * filp, void * dirent, filldir_t filldir int len; struct inode *inode = NULL; next = list_entry(p, struct configfs_dirent, s_sibling); next = list_entry(p, struct configfs_dirent, s_sibling); if (!next->s_element) continue; Loading Loading @@ -1600,16 +1584,14 @@ static int configfs_readdir(struct file * filp, void * dirent, filldir_t filldir if (!inode) ino = iunique(sb, 2); if (filldir(dirent, name, len, filp->f_pos, ino, dt_type(next)) < 0) if (!dir_emit(ctx, name, len, ino, dt_type(next))) return 0; spin_lock(&configfs_dirent_lock); list_move(q, p); spin_unlock(&configfs_dirent_lock); p = q; filp->f_pos++; } ctx->pos++; } return 0; } Loading Loading @@ -1661,7 +1643,7 @@ const struct file_operations configfs_dir_operations = { .release = configfs_dir_close, .llseek = configfs_dir_lseek, .read = generic_read_dir, .readdir = configfs_readdir, .iterate = configfs_readdir, }; int configfs_register_subsystem(struct configfs_subsystem *subsys) Loading Loading
fs/configfs/dir.c +52 −70 Original line number Diff line number Diff line Loading @@ -1532,33 +1532,18 @@ static inline unsigned char dt_type(struct configfs_dirent *sd) return (sd->s_mode >> 12) & 15; } static int configfs_readdir(struct file * filp, void * dirent, filldir_t filldir) static int configfs_readdir(struct file *file, struct dir_context *ctx) { struct dentry *dentry = filp->f_path.dentry; struct dentry *dentry = file->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 configfs_dirent *cursor = file->private_data; struct list_head *p, *q = &cursor->s_sibling; ino_t ino = 0; int i = filp->f_pos; switch (i) { case 0: ino = dentry->d_inode->i_ino; if (filldir(dirent, ".", 1, i, ino, DT_DIR) < 0) break; filp->f_pos++; i++; /* fallthrough */ case 1: ino = parent_ino(dentry); if (filldir(dirent, "..", 2, i, ino, DT_DIR) < 0) break; filp->f_pos++; i++; /* fallthrough */ default: if (filp->f_pos == 2) { if (!dir_emit_dots(file, ctx)) return 0; if (ctx->pos == 2) { spin_lock(&configfs_dirent_lock); list_move(q, &parent_sd->s_children); spin_unlock(&configfs_dirent_lock); Loading @@ -1569,8 +1554,7 @@ static int configfs_readdir(struct file * filp, void * dirent, filldir_t filldir int len; struct inode *inode = NULL; next = list_entry(p, struct configfs_dirent, s_sibling); next = list_entry(p, struct configfs_dirent, s_sibling); if (!next->s_element) continue; Loading Loading @@ -1600,16 +1584,14 @@ static int configfs_readdir(struct file * filp, void * dirent, filldir_t filldir if (!inode) ino = iunique(sb, 2); if (filldir(dirent, name, len, filp->f_pos, ino, dt_type(next)) < 0) if (!dir_emit(ctx, name, len, ino, dt_type(next))) return 0; spin_lock(&configfs_dirent_lock); list_move(q, p); spin_unlock(&configfs_dirent_lock); p = q; filp->f_pos++; } ctx->pos++; } return 0; } Loading Loading @@ -1661,7 +1643,7 @@ const struct file_operations configfs_dir_operations = { .release = configfs_dir_close, .llseek = configfs_dir_lseek, .read = generic_read_dir, .readdir = configfs_readdir, .iterate = configfs_readdir, }; int configfs_register_subsystem(struct configfs_subsystem *subsys) Loading