diff options
Diffstat (limited to 'arch')
-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, |