switch spufs/coredump to iterate_fd()
authorAl Viro <viro@zeniv.linux.org.uk>
Wed, 22 Aug 2012 02:50:49 +0000 (22:50 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 27 Sep 2012 01:10:00 +0000 (21:10 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/powerpc/platforms/cell/spufs/coredump.c

index c2c5b078ba80457dab11d485297ba04c1b5090ef..657e3f233a6405d14527821d998ba969418806ab 100644 (file)
@@ -106,6 +106,17 @@ static int spufs_ctx_note_size(struct spu_context *ctx, int dfd)
        return total;
 }
 
+static int match_context(const void *v, struct file *file, unsigned fd)
+{
+       struct spu_context *ctx;
+       if (file->f_op != &spufs_context_fops)
+               return 0;
+       ctx = SPUFS_I(file->f_dentry->d_inode)->i_ctx;
+       if (ctx->flags & SPU_CREATE_NOSCHED)
+               return 0;
+       return fd + 1;
+}
+
 /*
  * The additional architecture-specific notes for Cell are various
  * context files in the spu context.
@@ -115,29 +126,18 @@ static int spufs_ctx_note_size(struct spu_context *ctx, int dfd)
  * internal functionality to dump them without needing to actually
  * open the files.
  */
+/*
+ * descriptor table is not shared, so files can't change or go away.
+ */
 static struct spu_context *coredump_next_context(int *fd)
 {
-       struct fdtable *fdt = files_fdtable(current->files);
        struct file *file;
-       struct spu_context *ctx = NULL;
-
-       for (; *fd < fdt->max_fds; (*fd)++) {
-               if (!fd_is_open(*fd, fdt))
-                       continue;
-
-               file = fcheck(*fd);
-
-               if (!file || file->f_op != &spufs_context_fops)
-                       continue;
-
-               ctx = SPUFS_I(file->f_dentry->d_inode)->i_ctx;
-               if (ctx->flags & SPU_CREATE_NOSCHED)
-                       continue;
-
-               break;
-       }
-
-       return ctx;
+       int n = iterate_fd(current->files, *fd, match_context, NULL);
+       if (!n)
+               return NULL;
+       *fd = n - 1;
+       file = fcheck(*fd);
+       return SPUFS_I(file->f_dentry->d_inode)->i_ctx;
 }
 
 int spufs_coredump_extra_notes_size(void)