|
@@ -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)
|