diff options
| -rw-r--r-- | drivers/staging/android/logger.c | 2 | ||||
| -rw-r--r-- | drivers/usb/gadget/inode.c | 6 | ||||
| -rw-r--r-- | fs/aio.c | 91 | ||||
| -rw-r--r-- | fs/block_dev.c | 2 | ||||
| -rw-r--r-- | fs/nfs/direct.c | 1 | ||||
| -rw-r--r-- | fs/ocfs2/file.c | 6 | ||||
| -rw-r--r-- | fs/read_write.c | 3 | ||||
| -rw-r--r-- | fs/udf/file.c | 2 | ||||
| -rw-r--r-- | include/linux/aio.h | 2 | ||||
| -rw-r--r-- | mm/page_io.c | 1 | ||||
| -rw-r--r-- | net/socket.c | 2 |
11 files changed, 28 insertions, 90 deletions
diff --git a/drivers/staging/android/logger.c b/drivers/staging/android/logger.c index 080abf2faf97..d72b47195ecf 100644 --- a/drivers/staging/android/logger.c +++ b/drivers/staging/android/logger.c | |||
| @@ -481,7 +481,7 @@ static ssize_t logger_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 481 | header.sec = now.tv_sec; | 481 | header.sec = now.tv_sec; |
| 482 | header.nsec = now.tv_nsec; | 482 | header.nsec = now.tv_nsec; |
| 483 | header.euid = current_euid(); | 483 | header.euid = current_euid(); |
| 484 | header.len = min_t(size_t, iocb->ki_left, LOGGER_ENTRY_MAX_PAYLOAD); | 484 | header.len = min_t(size_t, iocb->ki_nbytes, LOGGER_ENTRY_MAX_PAYLOAD); |
| 485 | header.hdr_size = sizeof(struct logger_entry); | 485 | header.hdr_size = sizeof(struct logger_entry); |
| 486 | 486 | ||
| 487 | /* null writes succeed, return zero */ | 487 | /* null writes succeed, return zero */ |
diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c index e02c1e04529e..f255ad7f4c74 100644 --- a/drivers/usb/gadget/inode.c +++ b/drivers/usb/gadget/inode.c | |||
| @@ -708,11 +708,11 @@ ep_aio_read(struct kiocb *iocb, const struct iovec *iov, | |||
| 708 | if (unlikely(usb_endpoint_dir_in(&epdata->desc))) | 708 | if (unlikely(usb_endpoint_dir_in(&epdata->desc))) |
| 709 | return -EINVAL; | 709 | return -EINVAL; |
| 710 | 710 | ||
| 711 | buf = kmalloc(iocb->ki_left, GFP_KERNEL); | 711 | buf = kmalloc(iocb->ki_nbytes, GFP_KERNEL); |
| 712 | if (unlikely(!buf)) | 712 | if (unlikely(!buf)) |
| 713 | return -ENOMEM; | 713 | return -ENOMEM; |
| 714 | 714 | ||
| 715 | return ep_aio_rwtail(iocb, buf, iocb->ki_left, epdata, iov, nr_segs); | 715 | return ep_aio_rwtail(iocb, buf, iocb->ki_nbytes, epdata, iov, nr_segs); |
| 716 | } | 716 | } |
| 717 | 717 | ||
| 718 | static ssize_t | 718 | static ssize_t |
| @@ -727,7 +727,7 @@ ep_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 727 | if (unlikely(!usb_endpoint_dir_in(&epdata->desc))) | 727 | if (unlikely(!usb_endpoint_dir_in(&epdata->desc))) |
| 728 | return -EINVAL; | 728 | return -EINVAL; |
| 729 | 729 | ||
| 730 | buf = kmalloc(iocb->ki_left, GFP_KERNEL); | 730 | buf = kmalloc(iocb->ki_nbytes, GFP_KERNEL); |
| 731 | if (unlikely(!buf)) | 731 | if (unlikely(!buf)) |
| 732 | return -ENOMEM; | 732 | return -ENOMEM; |
| 733 | 733 | ||
| @@ -707,7 +707,7 @@ static inline struct kiocb *aio_get_req(struct kioctx *ctx) | |||
| 707 | if (unlikely(!req)) | 707 | if (unlikely(!req)) |
| 708 | goto out_put; | 708 | goto out_put; |
| 709 | 709 | ||
| 710 | atomic_set(&req->ki_users, 2); | 710 | atomic_set(&req->ki_users, 1); |
| 711 | req->ki_ctx = ctx; | 711 | req->ki_ctx = ctx; |
| 712 | return req; | 712 | return req; |
| 713 | out_put: | 713 | out_put: |
| @@ -1051,75 +1051,9 @@ SYSCALL_DEFINE1(io_destroy, aio_context_t, ctx) | |||
| 1051 | return -EINVAL; | 1051 | return -EINVAL; |
| 1052 | } | 1052 | } |
| 1053 | 1053 | ||
| 1054 | static void aio_advance_iovec(struct kiocb *iocb, ssize_t ret) | ||
| 1055 | { | ||
| 1056 | struct iovec *iov = &iocb->ki_iovec[iocb->ki_cur_seg]; | ||
| 1057 | |||
| 1058 | BUG_ON(ret <= 0); | ||
| 1059 | |||
| 1060 | while (iocb->ki_cur_seg < iocb->ki_nr_segs && ret > 0) { | ||
| 1061 | ssize_t this = min((ssize_t)iov->iov_len, ret); | ||
| 1062 | iov->iov_base += this; | ||
| 1063 | iov->iov_len -= this; | ||
| 1064 | iocb->ki_left -= this; | ||
| 1065 | ret -= this; | ||
| 1066 | if (iov->iov_len == 0) { | ||
| 1067 | iocb->ki_cur_seg++; | ||
| 1068 | iov++; | ||
| 1069 | } | ||
| 1070 | } | ||
| 1071 | |||
| 1072 | /* the caller should not have done more io than what fit in | ||
| 1073 | * the remaining iovecs */ | ||
| 1074 | BUG_ON(ret > 0 && iocb->ki_left == 0); | ||
| 1075 | } | ||
| 1076 | |||
| 1077 | typedef ssize_t (aio_rw_op)(struct kiocb *, const struct iovec *, | 1054 | typedef ssize_t (aio_rw_op)(struct kiocb *, const struct iovec *, |
| 1078 | unsigned long, loff_t); | 1055 | unsigned long, loff_t); |
| 1079 | 1056 | ||
| 1080 | static ssize_t aio_rw_vect_retry(struct kiocb *iocb, int rw, aio_rw_op *rw_op) | ||
| 1081 | { | ||
| 1082 | struct file *file = iocb->ki_filp; | ||
| 1083 | struct address_space *mapping = file->f_mapping; | ||
| 1084 | struct inode *inode = mapping->host; | ||
| 1085 | ssize_t ret = 0; | ||
| 1086 | |||
| 1087 | /* This matches the pread()/pwrite() logic */ | ||
| 1088 | if (iocb->ki_pos < 0) | ||
| 1089 | return -EINVAL; | ||
| 1090 | |||
| 1091 | if (rw == WRITE) | ||
| 1092 | file_start_write(file); | ||
| 1093 | do { | ||
| 1094 | ret = rw_op(iocb, &iocb->ki_iovec[iocb->ki_cur_seg], | ||
| 1095 | iocb->ki_nr_segs - iocb->ki_cur_seg, | ||
| 1096 | iocb->ki_pos); | ||
| 1097 | if (ret > 0) | ||
| 1098 | aio_advance_iovec(iocb, ret); | ||
| 1099 | |||
| 1100 | /* retry all partial writes. retry partial reads as long as its a | ||
| 1101 | * regular file. */ | ||
| 1102 | } while (ret > 0 && iocb->ki_left > 0 && | ||
| 1103 | (rw == WRITE || | ||
| 1104 | (!S_ISFIFO(inode->i_mode) && !S_ISSOCK(inode->i_mode)))); | ||
| 1105 | if (rw == WRITE) | ||
| 1106 | file_end_write(file); | ||
| 1107 | |||
| 1108 | /* This means we must have transferred all that we could */ | ||
| 1109 | /* No need to retry anymore */ | ||
| 1110 | if ((ret == 0) || (iocb->ki_left == 0)) | ||
| 1111 | ret = iocb->ki_nbytes - iocb->ki_left; | ||
| 1112 | |||
| 1113 | /* If we managed to write some out we return that, rather than | ||
| 1114 | * the eventual error. */ | ||
| 1115 | if (rw == WRITE | ||
| 1116 | && ret < 0 && ret != -EIOCBQUEUED | ||
| 1117 | && iocb->ki_nbytes - iocb->ki_left) | ||
| 1118 | ret = iocb->ki_nbytes - iocb->ki_left; | ||
| 1119 | |||
| 1120 | return ret; | ||
| 1121 | } | ||
| 1122 | |||
| 1123 | static ssize_t aio_setup_vectored_rw(int rw, struct kiocb *kiocb, bool compat) | 1057 | static ssize_t aio_setup_vectored_rw(int rw, struct kiocb *kiocb, bool compat) |
| 1124 | { | 1058 | { |
| 1125 | ssize_t ret; | 1059 | ssize_t ret; |
| @@ -1204,9 +1138,22 @@ rw_common: | |||
| 1204 | return ret; | 1138 | return ret; |
| 1205 | 1139 | ||
| 1206 | req->ki_nbytes = ret; | 1140 | req->ki_nbytes = ret; |
| 1207 | req->ki_left = ret; | ||
| 1208 | 1141 | ||
| 1209 | ret = aio_rw_vect_retry(req, rw, rw_op); | 1142 | /* XXX: move/kill - rw_verify_area()? */ |
| 1143 | /* This matches the pread()/pwrite() logic */ | ||
| 1144 | if (req->ki_pos < 0) { | ||
| 1145 | ret = -EINVAL; | ||
| 1146 | break; | ||
| 1147 | } | ||
| 1148 | |||
| 1149 | if (rw == WRITE) | ||
| 1150 | file_start_write(file); | ||
| 1151 | |||
| 1152 | ret = rw_op(req, req->ki_iovec, | ||
| 1153 | req->ki_nr_segs, req->ki_pos); | ||
| 1154 | |||
| 1155 | if (rw == WRITE) | ||
| 1156 | file_end_write(file); | ||
| 1210 | break; | 1157 | break; |
| 1211 | 1158 | ||
| 1212 | case IOCB_CMD_FDSYNC: | 1159 | case IOCB_CMD_FDSYNC: |
| @@ -1301,19 +1248,17 @@ static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb, | |||
| 1301 | req->ki_pos = iocb->aio_offset; | 1248 | req->ki_pos = iocb->aio_offset; |
| 1302 | 1249 | ||
| 1303 | req->ki_buf = (char __user *)(unsigned long)iocb->aio_buf; | 1250 | req->ki_buf = (char __user *)(unsigned long)iocb->aio_buf; |
| 1304 | req->ki_left = req->ki_nbytes = iocb->aio_nbytes; | 1251 | req->ki_nbytes = iocb->aio_nbytes; |
| 1305 | req->ki_opcode = iocb->aio_lio_opcode; | 1252 | req->ki_opcode = iocb->aio_lio_opcode; |
| 1306 | 1253 | ||
| 1307 | ret = aio_run_iocb(req, compat); | 1254 | ret = aio_run_iocb(req, compat); |
| 1308 | if (ret) | 1255 | if (ret) |
| 1309 | goto out_put_req; | 1256 | goto out_put_req; |
| 1310 | 1257 | ||
| 1311 | aio_put_req(req); /* drop extra ref to req */ | ||
| 1312 | return 0; | 1258 | return 0; |
| 1313 | out_put_req: | 1259 | out_put_req: |
| 1314 | put_reqs_available(ctx, 1); | 1260 | put_reqs_available(ctx, 1); |
| 1315 | aio_put_req(req); /* drop extra ref to req */ | 1261 | aio_put_req(req); |
| 1316 | aio_put_req(req); /* drop i/o ref to req */ | ||
| 1317 | return ret; | 1262 | return ret; |
| 1318 | } | 1263 | } |
| 1319 | 1264 | ||
diff --git a/fs/block_dev.c b/fs/block_dev.c index c7bda5cd3da7..8772b155cb30 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
| @@ -1542,7 +1542,7 @@ static ssize_t blkdev_aio_read(struct kiocb *iocb, const struct iovec *iov, | |||
| 1542 | return 0; | 1542 | return 0; |
| 1543 | 1543 | ||
| 1544 | size -= pos; | 1544 | size -= pos; |
| 1545 | if (size < iocb->ki_left) | 1545 | if (size < iocb->ki_nbytes) |
| 1546 | nr_segs = iov_shorten((struct iovec *)iov, nr_segs, size); | 1546 | nr_segs = iov_shorten((struct iovec *)iov, nr_segs, size); |
| 1547 | return generic_file_aio_read(iocb, iov, nr_segs, pos); | 1547 | return generic_file_aio_read(iocb, iov, nr_segs, pos); |
| 1548 | } | 1548 | } |
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index 0bd7a55a5f07..91ff089d3412 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c | |||
| @@ -130,7 +130,6 @@ ssize_t nfs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, loff_ | |||
| 130 | 130 | ||
| 131 | return -EINVAL; | 131 | return -EINVAL; |
| 132 | #else | 132 | #else |
| 133 | VM_BUG_ON(iocb->ki_left != PAGE_SIZE); | ||
| 134 | VM_BUG_ON(iocb->ki_nbytes != PAGE_SIZE); | 133 | VM_BUG_ON(iocb->ki_nbytes != PAGE_SIZE); |
| 135 | 134 | ||
| 136 | if (rw == READ || rw == KERNEL_READ) | 135 | if (rw == READ || rw == KERNEL_READ) |
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index 41000f223ca4..dd1a4901a54b 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c | |||
| @@ -2245,7 +2245,7 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb, | |||
| 2245 | file->f_path.dentry->d_name.name, | 2245 | file->f_path.dentry->d_name.name, |
| 2246 | (unsigned int)nr_segs); | 2246 | (unsigned int)nr_segs); |
| 2247 | 2247 | ||
| 2248 | if (iocb->ki_left == 0) | 2248 | if (iocb->ki_nbytes == 0) |
| 2249 | return 0; | 2249 | return 0; |
| 2250 | 2250 | ||
| 2251 | appending = file->f_flags & O_APPEND ? 1 : 0; | 2251 | appending = file->f_flags & O_APPEND ? 1 : 0; |
| @@ -2296,7 +2296,7 @@ relock: | |||
| 2296 | 2296 | ||
| 2297 | can_do_direct = direct_io; | 2297 | can_do_direct = direct_io; |
| 2298 | ret = ocfs2_prepare_inode_for_write(file, ppos, | 2298 | ret = ocfs2_prepare_inode_for_write(file, ppos, |
| 2299 | iocb->ki_left, appending, | 2299 | iocb->ki_nbytes, appending, |
| 2300 | &can_do_direct, &has_refcount); | 2300 | &can_do_direct, &has_refcount); |
| 2301 | if (ret < 0) { | 2301 | if (ret < 0) { |
| 2302 | mlog_errno(ret); | 2302 | mlog_errno(ret); |
| @@ -2304,7 +2304,7 @@ relock: | |||
| 2304 | } | 2304 | } |
| 2305 | 2305 | ||
| 2306 | if (direct_io && !is_sync_kiocb(iocb)) | 2306 | if (direct_io && !is_sync_kiocb(iocb)) |
| 2307 | unaligned_dio = ocfs2_is_io_unaligned(inode, iocb->ki_left, | 2307 | unaligned_dio = ocfs2_is_io_unaligned(inode, iocb->ki_nbytes, |
| 2308 | *ppos); | 2308 | *ppos); |
| 2309 | 2309 | ||
| 2310 | /* | 2310 | /* |
diff --git a/fs/read_write.c b/fs/read_write.c index 122a3846d9e1..e3cd280b158c 100644 --- a/fs/read_write.c +++ b/fs/read_write.c | |||
| @@ -367,7 +367,6 @@ ssize_t do_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *pp | |||
| 367 | 367 | ||
| 368 | init_sync_kiocb(&kiocb, filp); | 368 | init_sync_kiocb(&kiocb, filp); |
| 369 | kiocb.ki_pos = *ppos; | 369 | kiocb.ki_pos = *ppos; |
| 370 | kiocb.ki_left = len; | ||
| 371 | kiocb.ki_nbytes = len; | 370 | kiocb.ki_nbytes = len; |
| 372 | 371 | ||
| 373 | ret = filp->f_op->aio_read(&kiocb, &iov, 1, kiocb.ki_pos); | 372 | ret = filp->f_op->aio_read(&kiocb, &iov, 1, kiocb.ki_pos); |
| @@ -417,7 +416,6 @@ ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, lof | |||
| 417 | 416 | ||
| 418 | init_sync_kiocb(&kiocb, filp); | 417 | init_sync_kiocb(&kiocb, filp); |
| 419 | kiocb.ki_pos = *ppos; | 418 | kiocb.ki_pos = *ppos; |
| 420 | kiocb.ki_left = len; | ||
| 421 | kiocb.ki_nbytes = len; | 419 | kiocb.ki_nbytes = len; |
| 422 | 420 | ||
| 423 | ret = filp->f_op->aio_write(&kiocb, &iov, 1, kiocb.ki_pos); | 421 | ret = filp->f_op->aio_write(&kiocb, &iov, 1, kiocb.ki_pos); |
| @@ -599,7 +597,6 @@ static ssize_t do_sync_readv_writev(struct file *filp, const struct iovec *iov, | |||
| 599 | 597 | ||
| 600 | init_sync_kiocb(&kiocb, filp); | 598 | init_sync_kiocb(&kiocb, filp); |
| 601 | kiocb.ki_pos = *ppos; | 599 | kiocb.ki_pos = *ppos; |
| 602 | kiocb.ki_left = len; | ||
| 603 | kiocb.ki_nbytes = len; | 600 | kiocb.ki_nbytes = len; |
| 604 | 601 | ||
| 605 | ret = fn(&kiocb, iov, nr_segs, kiocb.ki_pos); | 602 | ret = fn(&kiocb, iov, nr_segs, kiocb.ki_pos); |
diff --git a/fs/udf/file.c b/fs/udf/file.c index 29569dd08168..c02a27a19c6d 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c | |||
| @@ -141,7 +141,7 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 141 | struct file *file = iocb->ki_filp; | 141 | struct file *file = iocb->ki_filp; |
| 142 | struct inode *inode = file_inode(file); | 142 | struct inode *inode = file_inode(file); |
| 143 | int err, pos; | 143 | int err, pos; |
| 144 | size_t count = iocb->ki_left; | 144 | size_t count = iocb->ki_nbytes; |
| 145 | struct udf_inode_info *iinfo = UDF_I(inode); | 145 | struct udf_inode_info *iinfo = UDF_I(inode); |
| 146 | 146 | ||
| 147 | down_write(&iinfo->i_data_sem); | 147 | down_write(&iinfo->i_data_sem); |
diff --git a/include/linux/aio.h b/include/linux/aio.h index 8c8dd1d84d2e..7bb766e73968 100644 --- a/include/linux/aio.h +++ b/include/linux/aio.h | |||
| @@ -50,11 +50,9 @@ struct kiocb { | |||
| 50 | unsigned short ki_opcode; | 50 | unsigned short ki_opcode; |
| 51 | size_t ki_nbytes; /* copy of iocb->aio_nbytes */ | 51 | size_t ki_nbytes; /* copy of iocb->aio_nbytes */ |
| 52 | char __user *ki_buf; /* remaining iocb->aio_buf */ | 52 | char __user *ki_buf; /* remaining iocb->aio_buf */ |
| 53 | size_t ki_left; /* remaining bytes */ | ||
| 54 | struct iovec ki_inline_vec; /* inline vector */ | 53 | struct iovec ki_inline_vec; /* inline vector */ |
| 55 | struct iovec *ki_iovec; | 54 | struct iovec *ki_iovec; |
| 56 | unsigned long ki_nr_segs; | 55 | unsigned long ki_nr_segs; |
| 57 | unsigned long ki_cur_seg; | ||
| 58 | 56 | ||
| 59 | struct list_head ki_list; /* the aio core uses this | 57 | struct list_head ki_list; /* the aio core uses this |
| 60 | * for cancellation */ | 58 | * for cancellation */ |
diff --git a/mm/page_io.c b/mm/page_io.c index ba05b64e5d8d..8c79a4764be0 100644 --- a/mm/page_io.c +++ b/mm/page_io.c | |||
| @@ -266,7 +266,6 @@ int __swap_writepage(struct page *page, struct writeback_control *wbc, | |||
| 266 | 266 | ||
| 267 | init_sync_kiocb(&kiocb, swap_file); | 267 | init_sync_kiocb(&kiocb, swap_file); |
| 268 | kiocb.ki_pos = page_file_offset(page); | 268 | kiocb.ki_pos = page_file_offset(page); |
| 269 | kiocb.ki_left = PAGE_SIZE; | ||
| 270 | kiocb.ki_nbytes = PAGE_SIZE; | 269 | kiocb.ki_nbytes = PAGE_SIZE; |
| 271 | 270 | ||
| 272 | set_page_writeback(page); | 271 | set_page_writeback(page); |
diff --git a/net/socket.c b/net/socket.c index 829b460acb87..fea902f2ba58 100644 --- a/net/socket.c +++ b/net/socket.c | |||
| @@ -931,7 +931,7 @@ static ssize_t sock_aio_read(struct kiocb *iocb, const struct iovec *iov, | |||
| 931 | if (pos != 0) | 931 | if (pos != 0) |
| 932 | return -ESPIPE; | 932 | return -ESPIPE; |
| 933 | 933 | ||
| 934 | if (iocb->ki_left == 0) /* Match SYS5 behaviour */ | 934 | if (iocb->ki_nbytes == 0) /* Match SYS5 behaviour */ |
| 935 | return 0; | 935 | return 0; |
| 936 | 936 | ||
| 937 | 937 | ||
