[readdir] convert openpromfs
what the hell is op_mutex for, BTW? Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
7aa123a0dc
commit
68c6147113
|
@ -162,11 +162,11 @@ static const struct file_operations openpromfs_prop_ops = {
|
||||||
.release = seq_release,
|
.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 = {
|
static const struct file_operations openprom_operations = {
|
||||||
.read = generic_read_dir,
|
.read = generic_read_dir,
|
||||||
.readdir = openpromfs_readdir,
|
.iterate = openpromfs_readdir,
|
||||||
.llseek = generic_file_llseek,
|
.llseek = generic_file_llseek,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -260,71 +260,64 @@ found:
|
||||||
return NULL;
|
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 op_inode_info *oi = OP_I(inode);
|
||||||
struct device_node *dp = oi->u.node;
|
struct device_node *dp = oi->u.node;
|
||||||
struct device_node *child;
|
struct device_node *child;
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
unsigned int ino;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
mutex_lock(&op_mutex);
|
mutex_lock(&op_mutex);
|
||||||
|
|
||||||
ino = inode->i_ino;
|
if (ctx->pos == 0) {
|
||||||
i = filp->f_pos;
|
if (!dir_emit(ctx, ".", 1, inode->i_ino, DT_DIR))
|
||||||
switch (i) {
|
|
||||||
case 0:
|
|
||||||
if (filldir(dirent, ".", 1, i, ino, DT_DIR) < 0)
|
|
||||||
goto out;
|
goto out;
|
||||||
i++;
|
ctx->pos = 1;
|
||||||
filp->f_pos++;
|
}
|
||||||
/* fall thru */
|
if (ctx->pos == 1) {
|
||||||
case 1:
|
if (!dir_emit(ctx, "..", 2,
|
||||||
if (filldir(dirent, "..", 2, i,
|
|
||||||
(dp->parent == NULL ?
|
(dp->parent == NULL ?
|
||||||
OPENPROM_ROOT_INO :
|
OPENPROM_ROOT_INO :
|
||||||
dp->parent->unique_id), DT_DIR) < 0)
|
dp->parent->unique_id), DT_DIR))
|
||||||
goto out;
|
goto out;
|
||||||
i++;
|
ctx->pos = 2;
|
||||||
filp->f_pos++;
|
|
||||||
/* fall thru */
|
|
||||||
default:
|
|
||||||
i -= 2;
|
|
||||||
|
|
||||||
/* First, the children nodes as directories. */
|
|
||||||
child = dp->child;
|
|
||||||
while (i && child) {
|
|
||||||
child = child->sibling;
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
while (child) {
|
|
||||||
if (filldir(dirent,
|
|
||||||
child->path_component_name,
|
|
||||||
strlen(child->path_component_name),
|
|
||||||
filp->f_pos, child->unique_id, DT_DIR) < 0)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
filp->f_pos++;
|
|
||||||
child = child->sibling;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Next, the properties as files. */
|
|
||||||
prop = dp->properties;
|
|
||||||
while (i && prop) {
|
|
||||||
prop = prop->next;
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
while (prop) {
|
|
||||||
if (filldir(dirent, prop->name, strlen(prop->name),
|
|
||||||
filp->f_pos, prop->unique_id, DT_REG) < 0)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
filp->f_pos++;
|
|
||||||
prop = prop->next;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
i = ctx->pos - 2;
|
||||||
|
|
||||||
|
/* First, the children nodes as directories. */
|
||||||
|
child = dp->child;
|
||||||
|
while (i && child) {
|
||||||
|
child = child->sibling;
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
while (child) {
|
||||||
|
if (!dir_emit(ctx,
|
||||||
|
child->path_component_name,
|
||||||
|
strlen(child->path_component_name),
|
||||||
|
child->unique_id, DT_DIR))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
ctx->pos++;
|
||||||
|
child = child->sibling;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Next, the properties as files. */
|
||||||
|
prop = dp->properties;
|
||||||
|
while (i && prop) {
|
||||||
|
prop = prop->next;
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
while (prop) {
|
||||||
|
if (!dir_emit(ctx, prop->name, strlen(prop->name),
|
||||||
|
prop->unique_id, DT_REG))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
ctx->pos++;
|
||||||
|
prop = prop->next;
|
||||||
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&op_mutex);
|
mutex_unlock(&op_mutex);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue