diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/compat.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/fs/compat.c b/fs/compat.c index 55efdfebdf5a..e99048c21c56 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
| @@ -1195,16 +1195,12 @@ out: | |||
| 1195 | return ret; | 1195 | return ret; |
| 1196 | } | 1196 | } |
| 1197 | 1197 | ||
| 1198 | asmlinkage ssize_t | 1198 | static size_t compat_readv(struct file *file, |
| 1199 | compat_sys_readv(unsigned long fd, const struct compat_iovec __user *vec, unsigned long vlen) | 1199 | const struct compat_iovec __user *vec, |
| 1200 | unsigned long vlen, loff_t *pos) | ||
| 1200 | { | 1201 | { |
| 1201 | struct file *file; | ||
| 1202 | ssize_t ret = -EBADF; | 1202 | ssize_t ret = -EBADF; |
| 1203 | 1203 | ||
| 1204 | file = fget(fd); | ||
| 1205 | if (!file) | ||
| 1206 | return -EBADF; | ||
| 1207 | |||
| 1208 | if (!(file->f_mode & FMODE_READ)) | 1204 | if (!(file->f_mode & FMODE_READ)) |
| 1209 | goto out; | 1205 | goto out; |
| 1210 | 1206 | ||
| @@ -1212,12 +1208,26 @@ compat_sys_readv(unsigned long fd, const struct compat_iovec __user *vec, unsign | |||
| 1212 | if (!file->f_op || (!file->f_op->aio_read && !file->f_op->read)) | 1208 | if (!file->f_op || (!file->f_op->aio_read && !file->f_op->read)) |
| 1213 | goto out; | 1209 | goto out; |
| 1214 | 1210 | ||
| 1215 | ret = compat_do_readv_writev(READ, file, vec, vlen, &file->f_pos); | 1211 | ret = compat_do_readv_writev(READ, file, vec, vlen, pos); |
| 1216 | 1212 | ||
| 1217 | out: | 1213 | out: |
| 1218 | if (ret > 0) | 1214 | if (ret > 0) |
| 1219 | add_rchar(current, ret); | 1215 | add_rchar(current, ret); |
| 1220 | inc_syscr(current); | 1216 | inc_syscr(current); |
| 1217 | return ret; | ||
| 1218 | } | ||
| 1219 | |||
| 1220 | asmlinkage ssize_t | ||
| 1221 | compat_sys_readv(unsigned long fd, const struct compat_iovec __user *vec, | ||
| 1222 | unsigned long vlen) | ||
| 1223 | { | ||
| 1224 | struct file *file; | ||
| 1225 | ssize_t ret; | ||
| 1226 | |||
| 1227 | file = fget(fd); | ||
| 1228 | if (!file) | ||
| 1229 | return -EBADF; | ||
| 1230 | ret = compat_readv(file, vec, vlen, &file->f_pos); | ||
| 1221 | fput(file); | 1231 | fput(file); |
| 1222 | return ret; | 1232 | return ret; |
| 1223 | } | 1233 | } |
