[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:
parent
c70d4ca52b
commit
a595ed662c
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue