Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 52018855 authored by Al Viro's avatar Al Viro
Browse files

[readdir] convert configfs



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 3903b38c
Loading
Loading
Loading
Loading
+52 −70
Original line number Diff line number Diff line
@@ -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);
@@ -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;

@@ -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;
}
@@ -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)