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

Commit 68c61471 authored by Al Viro's avatar Al Viro
Browse files

[readdir] convert openpromfs



what the hell is op_mutex for, BTW?

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 7aa123a0
Loading
Loading
Loading
Loading
+44 −51
Original line number Diff line number Diff line
@@ -162,11 +162,11 @@ static const struct file_operations openpromfs_prop_ops = {
	.release	= seq_release,
};

static int openpromfs_readdir(struct file *, void *, filldir_t);
static int openpromfs_readdir(struct file *, struct dir_context *);

static const struct file_operations openprom_operations = {
	.read		= generic_read_dir,
	.readdir	= openpromfs_readdir,
	.iterate	= openpromfs_readdir,
	.llseek		= generic_file_llseek,
};

@@ -260,38 +260,31 @@ static struct dentry *openpromfs_lookup(struct inode *dir, struct dentry *dentry
	return NULL;
}

static int openpromfs_readdir(struct file * filp, void * dirent, filldir_t filldir)
static int openpromfs_readdir(struct file *file, struct dir_context *ctx)
{
	struct inode *inode = file_inode(filp);
	struct inode *inode = file_inode(file);
	struct op_inode_info *oi = OP_I(inode);
	struct device_node *dp = oi->u.node;
	struct device_node *child;
	struct property *prop;
	unsigned int ino;
	int i;

	mutex_lock(&op_mutex);
	
	ino = inode->i_ino;
	i = filp->f_pos;
	switch (i) {
	case 0:
		if (filldir(dirent, ".", 1, i, ino, DT_DIR) < 0)
	if (ctx->pos == 0) {
		if (!dir_emit(ctx, ".", 1, inode->i_ino, DT_DIR))
			goto out;
		i++;
		filp->f_pos++;
		/* fall thru */
	case 1:
		if (filldir(dirent, "..", 2, i,
		ctx->pos = 1;
	}
	if (ctx->pos == 1) {
		if (!dir_emit(ctx, "..", 2,
			    (dp->parent == NULL ?
			     OPENPROM_ROOT_INO :
			     dp->parent->unique_id), DT_DIR) < 0) 
			     dp->parent->unique_id), DT_DIR))
			goto out;
		i++;
		filp->f_pos++;
		/* fall thru */
	default:
		i -= 2;
		ctx->pos = 2;
	}
	i = ctx->pos - 2;

	/* First, the children nodes as directories.  */
	child = dp->child;
@@ -300,13 +293,13 @@ static int openpromfs_readdir(struct file * filp, void * dirent, filldir_t filld
		i--;
	}
	while (child) {
			if (filldir(dirent,
		if (!dir_emit(ctx,
			    child->path_component_name,
			    strlen(child->path_component_name),
				    filp->f_pos, child->unique_id, DT_DIR) < 0)
			    child->unique_id, DT_DIR))
			goto out;

			filp->f_pos++;
		ctx->pos++;
		child = child->sibling;
	}

@@ -317,14 +310,14 @@ static int openpromfs_readdir(struct file * filp, void * dirent, filldir_t filld
		i--;
	}
	while (prop) {
			if (filldir(dirent, prop->name, strlen(prop->name),
				    filp->f_pos, prop->unique_id, DT_REG) < 0)
		if (!dir_emit(ctx, prop->name, strlen(prop->name),
			    prop->unique_id, DT_REG))
			goto out;

			filp->f_pos++;
		ctx->pos++;
		prop = prop->next;
	}
	}

out:
	mutex_unlock(&op_mutex);
	return 0;