]> err.no Git - linux-2.6/blobdiff - arch/powerpc/platforms/cell/spufs/coredump.c
[POWERPC] spufs: fix incorrect file descriptors in SPU coredump note names
[linux-2.6] / arch / powerpc / platforms / cell / spufs / coredump.c
index 6b8aef6d7e688217a292cc3ee7c5d2d5d89b0e18..b962c3ab470cbe01f2f5a5d6e510866bd8a60e5a 100644 (file)
@@ -53,8 +53,12 @@ static ssize_t do_coredump_read(int num, struct spu_context *ctx, void *buffer,
  */
 static int spufs_dump_write(struct file *file, const void *addr, int nr, loff_t *foffset)
 {
+       unsigned long limit = current->signal->rlim[RLIMIT_CORE].rlim_cur;
        ssize_t written;
 
+       if (*foffset + nr > limit)
+               return -EIO;
+
        written = file->f_op->write(file, addr, nr, &file->f_pos);
        *foffset += written;
 
@@ -129,8 +133,6 @@ static struct spu_context *coredump_next_context(int *fd)
                if (ctx->flags & SPU_CREATE_NOSCHED)
                        continue;
 
-               /* start searching the next fd next time we're called */
-               (*fd)++;
                break;
        }
 
@@ -144,13 +146,18 @@ int spufs_coredump_extra_notes_size(void)
 
        fd = 0;
        while ((ctx = coredump_next_context(&fd)) != NULL) {
-               spu_acquire_saved(ctx);
+               rc = spu_acquire_saved(ctx);
+               if (rc)
+                       break;
                rc = spufs_ctx_note_size(ctx, fd);
                spu_release_saved(ctx);
                if (rc < 0)
                        break;
 
                size += rc;
+
+               /* start searching the next fd next time */
+               fd++;
        }
 
        return size;
@@ -220,7 +227,9 @@ int spufs_coredump_extra_notes_write(struct file *file, loff_t *foffset)
 
        fd = 0;
        while ((ctx = coredump_next_context(&fd)) != NULL) {
-               spu_acquire_saved(ctx);
+               rc = spu_acquire_saved(ctx);
+               if (rc)
+                       return rc;
 
                for (j = 0; spufs_coredump_read[j].name != NULL; j++) {
                        rc = spufs_arch_write_note(ctx, j, file, fd, foffset);
@@ -231,6 +240,9 @@ int spufs_coredump_extra_notes_write(struct file *file, loff_t *foffset)
                }
 
                spu_release_saved(ctx);
+
+               /* start searching the next fd next time */
+               fd++;
        }
 
        return 0;