aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/direct-io.c90
-rw-r--r--fs/xfs/linux-2.6/xfs_aops.c2
2 files changed, 36 insertions, 56 deletions
diff --git a/fs/direct-io.c b/fs/direct-io.c
index f11f05dc9e61..71f4aeac7632 100644
--- a/fs/direct-io.c
+++ b/fs/direct-io.c
@@ -226,6 +226,15 @@ static int dio_complete(struct dio *dio, loff_t offset, int ret)
226{ 226{
227 ssize_t transferred = 0; 227 ssize_t transferred = 0;
228 228
229 /*
230 * AIO submission can race with bio completion to get here while
231 * expecting to have the last io completed by bio completion.
232 * In that case -EIOCBQUEUED is in fact not an error we want
233 * to preserve through this call.
234 */
235 if (ret == -EIOCBQUEUED)
236 ret = 0;
237
229 if (dio->result) { 238 if (dio->result) {
230 transferred = dio->result; 239 transferred = dio->result;
231 240
@@ -251,24 +260,6 @@ static int dio_complete(struct dio *dio, loff_t offset, int ret)
251 return ret; 260 return ret;
252} 261}
253 262
254/*
255 * Called when a BIO has been processed. If the count goes to zero then IO is
256 * complete and we can signal this to the AIO layer.
257 */
258static void dio_complete_aio(struct dio *dio)
259{
260 int ret;
261
262 ret = dio_complete(dio, dio->iocb->ki_pos, 0);
263
264 /* Complete AIO later if falling back to buffered i/o */
265 if (dio->result == dio->size ||
266 ((dio->rw == READ) && dio->result)) {
267 aio_complete(dio->iocb, ret, 0);
268 kfree(dio);
269 }
270}
271
272static int dio_bio_complete(struct dio *dio, struct bio *bio); 263static int dio_bio_complete(struct dio *dio, struct bio *bio);
273/* 264/*
274 * Asynchronous IO callback. 265 * Asynchronous IO callback.
@@ -290,8 +281,11 @@ static int dio_bio_end_aio(struct bio *bio, unsigned int bytes_done, int error)
290 if (remaining == 1 && waiter_holds_ref) 281 if (remaining == 1 && waiter_holds_ref)
291 wake_up_process(dio->waiter); 282 wake_up_process(dio->waiter);
292 283
293 if (remaining == 0) 284 if (remaining == 0) {
294 dio_complete_aio(dio); 285 int ret = dio_complete(dio, dio->iocb->ki_pos, 0);
286 aio_complete(dio->iocb, ret, 0);
287 kfree(dio);
288 }
295 289
296 return 0; 290 return 0;
297} 291}
@@ -1082,47 +1076,33 @@ direct_io_worker(int rw, struct kiocb *iocb, struct inode *inode,
1082 mutex_unlock(&dio->inode->i_mutex); 1076 mutex_unlock(&dio->inode->i_mutex);
1083 1077
1084 /* 1078 /*
1085 * OK, all BIOs are submitted, so we can decrement bio_count to truly 1079 * The only time we want to leave bios in flight is when a successful
1086 * reflect the number of to-be-processed BIOs. 1080 * partial aio read or full aio write have been setup. In that case
1081 * bio completion will call aio_complete. The only time it's safe to
1082 * call aio_complete is when we return -EIOCBQUEUED, so we key on that.
1083 * This had *better* be the only place that raises -EIOCBQUEUED.
1087 */ 1084 */
1088 if (dio->is_async) { 1085 BUG_ON(ret == -EIOCBQUEUED);
1089 int should_wait = 0; 1086 if (dio->is_async && ret == 0 && dio->result &&
1090 1087 ((rw & READ) || (dio->result == dio->size)))
1091 if (dio->result < dio->size && (rw & WRITE)) { 1088 ret = -EIOCBQUEUED;
1092 dio->waiter = current;
1093 should_wait = 1;
1094 }
1095 if (ret == 0)
1096 ret = dio->result;
1097
1098 if (should_wait)
1099 dio_await_completion(dio);
1100
1101 /* this can free the dio */
1102 if (atomic_dec_and_test(&dio->refcount))
1103 dio_complete_aio(dio);
1104 1089
1105 if (should_wait) 1090 if (ret != -EIOCBQUEUED)
1106 kfree(dio);
1107 } else {
1108 dio_await_completion(dio); 1091 dio_await_completion(dio);
1109 1092
1093 /*
1094 * Sync will always be dropping the final ref and completing the
1095 * operation. AIO can if it was a broken operation described above
1096 * or in fact if all the bios race to complete before we get here.
1097 * In that case dio_complete() translates the EIOCBQUEUED into
1098 * the proper return code that the caller will hand to aio_complete().
1099 */
1100 if (atomic_dec_and_test(&dio->refcount)) {
1110 ret = dio_complete(dio, offset, ret); 1101 ret = dio_complete(dio, offset, ret);
1102 kfree(dio);
1103 } else
1104 BUG_ON(ret != -EIOCBQUEUED);
1111 1105
1112 /* We could have also come here on an AIO file extend */
1113 if (!is_sync_kiocb(iocb) && (rw & WRITE) &&
1114 ret >= 0 && dio->result == dio->size)
1115 /*
1116 * For AIO writes where we have completed the
1117 * i/o, we have to mark the the aio complete.
1118 */
1119 aio_complete(iocb, ret, 0);
1120
1121 if (atomic_dec_and_test(&dio->refcount))
1122 kfree(dio);
1123 else
1124 BUG();
1125 }
1126 return ret; 1106 return ret;
1127} 1107}
1128 1108
diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c
index 8e6b56fc1cad..b56eb754e2d2 100644
--- a/fs/xfs/linux-2.6/xfs_aops.c
+++ b/fs/xfs/linux-2.6/xfs_aops.c
@@ -1406,7 +1406,7 @@ xfs_vm_direct_IO(
1406 xfs_end_io_direct); 1406 xfs_end_io_direct);
1407 } 1407 }
1408 1408
1409 if (unlikely(ret <= 0 && iocb->private)) 1409 if (unlikely(ret != -EIOCBQUEUED && iocb->private))
1410 xfs_destroy_ioend(iocb->private); 1410 xfs_destroy_ioend(iocb->private);
1411 return ret; 1411 return ret;
1412} 1412}