aboutsummaryrefslogtreecommitdiffstats
path: root/fs/direct-io.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2011-06-24 14:29:48 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2011-07-20 20:47:50 -0400
commit72c5052ddc3956d847f21c2b8d55c93664a51b2c (patch)
tree47b381f3f746cdc1612f432bd902278f8901f84a /fs/direct-io.c
parentaacfc19c626ebd3daa675652457d71019a1f583f (diff)
fs: move inode_dio_done to the end_io handler
For filesystems that delay their end_io processing we should keep our i_dio_count until the the processing is done. Enable this by moving the inode_dio_done call to the end_io handler if one exist. Note that the actual move to the workqueue for ext4 and XFS is not done in this patch yet, but left to the filesystem maintainers. At least for XFS it's not needed yet either as XFS has an internal equivalent to i_dio_count. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/direct-io.c')
-rw-r--r--fs/direct-io.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/fs/direct-io.c b/fs/direct-io.c
index 0a073c7125a6..01d2d9ef609c 100644
--- a/fs/direct-io.c
+++ b/fs/direct-io.c
@@ -293,11 +293,12 @@ static ssize_t dio_complete(struct dio *dio, loff_t offset, ssize_t ret, bool is
293 if (dio->end_io && dio->result) { 293 if (dio->end_io && dio->result) {
294 dio->end_io(dio->iocb, offset, transferred, 294 dio->end_io(dio->iocb, offset, transferred,
295 dio->map_bh.b_private, ret, is_async); 295 dio->map_bh.b_private, ret, is_async);
296 } else if (is_async) { 296 } else {
297 aio_complete(dio->iocb, ret, 0); 297 if (is_async)
298 aio_complete(dio->iocb, ret, 0);
299 inode_dio_done(dio->inode);
298 } 300 }
299 301
300 inode_dio_done(dio->inode);
301 return ret; 302 return ret;
302} 303}
303 304