[readdir] convert openpromfs
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 16 May 2013 05:52:12 +0000 (01:52 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 29 Jun 2013 08:56:32 +0000 (12:56 +0400)
what the hell is op_mutex for, BTW?

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/openpromfs/inode.c

index 75885ffde44e58a967799d3b461181e74bb8fd9c..8c0ceb8dd1f709a6b3b6427eabc28718f23f9a50 100644 (file)
@@ -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;
-               }
+               ctx->pos = 2;
+       }
+       i = ctx->pos - 2;
 
-               /* 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;
+       /* 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;
 
-                       filp->f_pos++;
-                       prop = prop->next;
-               }
+               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;