what the hell is op_mutex for, BTW?

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2013-05-16 01:52:12 -04:00
Родитель 7aa123a0dc
Коммит 68c6147113
1 изменённых файлов: 46 добавлений и 53 удалений

Просмотреть файл

@ -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,71 +260,64 @@ found:
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;
/* 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;
}
ctx->pos = 2;
}
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:
mutex_unlock(&op_mutex);
return 0;