[POWERPC] spufs: Extract the file descriptor search logic in SPU coredump code

Extract the logic for searching through the file descriptors for spu contexts
into a separate routine, coredump_next_context(), so we can use it elsewhere
in future.  In the process we flatten the for loop, and move the NOSCHED test
into coredump_next_context().

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
Michael Ellerman 2007-09-19 14:38:12 +10:00 committed by Paul Mackerras
parent c70d4ca52b
commit a595ed662c
1 changed files with 36 additions and 18 deletions

View File

@ -109,16 +109,11 @@ static int spufs_ctx_note_size(struct spufs_ctx_info *ctx_info)
return total; return total;
} }
static int spufs_add_one_context(struct file *file, int dfd) static int spufs_add_one_context(struct spu_context *ctx, int dfd)
{ {
struct spu_context *ctx;
struct spufs_ctx_info *ctx_info; struct spufs_ctx_info *ctx_info;
int size; int size;
ctx = SPUFS_I(file->f_dentry->d_inode)->i_ctx;
if (ctx->flags & SPU_CREATE_NOSCHED)
return 0;
ctx_info = kzalloc(sizeof(*ctx_info), GFP_KERNEL); ctx_info = kzalloc(sizeof(*ctx_info), GFP_KERNEL);
if (unlikely(!ctx_info)) if (unlikely(!ctx_info))
return -ENOMEM; return -ENOMEM;
@ -142,22 +137,45 @@ static int spufs_add_one_context(struct file *file, int dfd)
* internal functionality to dump them without needing to actually * internal functionality to dump them without needing to actually
* open the files. * open the files.
*/ */
static int spufs_arch_notes_size(void) static struct spu_context *coredump_next_context(int *fd)
{ {
struct fdtable *fdt = files_fdtable(current->files); struct fdtable *fdt = files_fdtable(current->files);
int size = 0, fd; struct file *file;
struct spu_context *ctx = NULL;
for (fd = 0; fd < fdt->max_fds; fd++) { for (; *fd < fdt->max_fds; (*fd)++) {
if (FD_ISSET(fd, fdt->open_fds)) { if (!FD_ISSET(*fd, fdt->open_fds))
struct file *file = fcheck(fd); continue;
if (file && file->f_op == &spufs_context_fops) { file = fcheck(*fd);
int rval = spufs_add_one_context(file, fd);
if (rval < 0) if (!file || file->f_op != &spufs_context_fops)
break; continue;
size += rval;
} ctx = SPUFS_I(file->f_dentry->d_inode)->i_ctx;
} if (ctx->flags & SPU_CREATE_NOSCHED)
continue;
/* start searching the next fd next time we're called */
(*fd)++;
break;
}
return ctx;
}
static int spufs_arch_notes_size(void)
{
struct spu_context *ctx;
int size = 0, rc, fd;
fd = 0;
while ((ctx = coredump_next_context(&fd)) != NULL) {
rc = spufs_add_one_context(ctx, fd);
if (rc < 0)
break;
size += rc;
} }
return size; return size;