diff options
| -rw-r--r-- | arch/powerpc/platforms/cell/spufs/file.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/arch/powerpc/platforms/cell/spufs/file.c b/arch/powerpc/platforms/cell/spufs/file.c index b00653d69c01..505266a568d4 100644 --- a/arch/powerpc/platforms/cell/spufs/file.c +++ b/arch/powerpc/platforms/cell/spufs/file.c | |||
| @@ -63,8 +63,8 @@ static ssize_t | |||
| 63 | spufs_mem_read(struct file *file, char __user *buffer, | 63 | spufs_mem_read(struct file *file, char __user *buffer, |
| 64 | size_t size, loff_t *pos) | 64 | size_t size, loff_t *pos) |
| 65 | { | 65 | { |
| 66 | int ret; | ||
| 67 | struct spu_context *ctx = file->private_data; | 66 | struct spu_context *ctx = file->private_data; |
| 67 | ssize_t ret; | ||
| 68 | 68 | ||
| 69 | spu_acquire(ctx); | 69 | spu_acquire(ctx); |
| 70 | ret = __spufs_mem_read(ctx, buffer, size, pos); | 70 | ret = __spufs_mem_read(ctx, buffer, size, pos); |
| @@ -74,25 +74,29 @@ spufs_mem_read(struct file *file, char __user *buffer, | |||
| 74 | 74 | ||
| 75 | static ssize_t | 75 | static ssize_t |
| 76 | spufs_mem_write(struct file *file, const char __user *buffer, | 76 | spufs_mem_write(struct file *file, const char __user *buffer, |
| 77 | size_t size, loff_t *pos) | 77 | size_t size, loff_t *ppos) |
| 78 | { | 78 | { |
| 79 | struct spu_context *ctx = file->private_data; | 79 | struct spu_context *ctx = file->private_data; |
| 80 | char *local_store; | 80 | char *local_store; |
| 81 | loff_t pos = *ppos; | ||
| 81 | int ret; | 82 | int ret; |
| 82 | 83 | ||
| 83 | size = min_t(ssize_t, LS_SIZE - *pos, size); | 84 | if (pos < 0) |
| 84 | if (size <= 0) | 85 | return -EINVAL; |
| 86 | if (pos > LS_SIZE) | ||
| 85 | return -EFBIG; | 87 | return -EFBIG; |
| 86 | *pos += size; | 88 | if (size > LS_SIZE - pos) |
| 89 | size = LS_SIZE - pos; | ||
| 87 | 90 | ||
| 88 | spu_acquire(ctx); | 91 | spu_acquire(ctx); |
| 89 | |||
| 90 | local_store = ctx->ops->get_ls(ctx); | 92 | local_store = ctx->ops->get_ls(ctx); |
| 91 | ret = copy_from_user(local_store + *pos - size, | 93 | ret = copy_from_user(local_store + pos, buffer, size); |
| 92 | buffer, size) ? -EFAULT : size; | ||
| 93 | |||
| 94 | spu_release(ctx); | 94 | spu_release(ctx); |
| 95 | return ret; | 95 | |
| 96 | if (ret) | ||
| 97 | return -EFAULT; | ||
| 98 | *ppos = pos + size; | ||
| 99 | return size; | ||
| 96 | } | 100 | } |
| 97 | 101 | ||
| 98 | static unsigned long spufs_mem_mmap_nopfn(struct vm_area_struct *vma, | 102 | static unsigned long spufs_mem_mmap_nopfn(struct vm_area_struct *vma, |
