diff options
-rw-r--r-- | fs/direct-io.c | 7 | ||||
-rw-r--r-- | fs/ext4/inode.c | 5 | ||||
-rw-r--r-- | fs/ocfs2/aops.c | 1 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_aops.c | 3 |
4 files changed, 13 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 | ||
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 1f35573a34e1..678cde834f19 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -3573,6 +3573,7 @@ static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, | |||
3573 | ssize_t size, void *private, int ret, | 3573 | ssize_t size, void *private, int ret, |
3574 | bool is_async) | 3574 | bool is_async) |
3575 | { | 3575 | { |
3576 | struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode; | ||
3576 | ext4_io_end_t *io_end = iocb->private; | 3577 | ext4_io_end_t *io_end = iocb->private; |
3577 | struct workqueue_struct *wq; | 3578 | struct workqueue_struct *wq; |
3578 | unsigned long flags; | 3579 | unsigned long flags; |
@@ -3594,6 +3595,7 @@ static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, | |||
3594 | out: | 3595 | out: |
3595 | if (is_async) | 3596 | if (is_async) |
3596 | aio_complete(iocb, ret, 0); | 3597 | aio_complete(iocb, ret, 0); |
3598 | inode_dio_done(inode); | ||
3597 | return; | 3599 | return; |
3598 | } | 3600 | } |
3599 | 3601 | ||
@@ -3614,6 +3616,9 @@ out: | |||
3614 | /* queue the work to convert unwritten extents to written */ | 3616 | /* queue the work to convert unwritten extents to written */ |
3615 | queue_work(wq, &io_end->work); | 3617 | queue_work(wq, &io_end->work); |
3616 | iocb->private = NULL; | 3618 | iocb->private = NULL; |
3619 | |||
3620 | /* XXX: probably should move into the real I/O completion handler */ | ||
3621 | inode_dio_done(inode); | ||
3617 | } | 3622 | } |
3618 | 3623 | ||
3619 | static void ext4_end_io_buffer_write(struct buffer_head *bh, int uptodate) | 3624 | static void ext4_end_io_buffer_write(struct buffer_head *bh, int uptodate) |
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 524d6167fb63..c1efe939c774 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c | |||
@@ -577,6 +577,7 @@ static void ocfs2_dio_end_io(struct kiocb *iocb, | |||
577 | 577 | ||
578 | if (is_async) | 578 | if (is_async) |
579 | aio_complete(iocb, ret, 0); | 579 | aio_complete(iocb, ret, 0); |
580 | inode_dio_done(inode); | ||
580 | } | 581 | } |
581 | 582 | ||
582 | /* | 583 | /* |
diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index 79ce38be15a1..b3b418f519f3 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c | |||
@@ -1339,6 +1339,9 @@ xfs_end_io_direct_write( | |||
1339 | } else { | 1339 | } else { |
1340 | xfs_finish_ioend_sync(ioend); | 1340 | xfs_finish_ioend_sync(ioend); |
1341 | } | 1341 | } |
1342 | |||
1343 | /* XXX: probably should move into the real I/O completion handler */ | ||
1344 | inode_dio_done(ioend->io_inode); | ||
1342 | } | 1345 | } |
1343 | 1346 | ||
1344 | STATIC ssize_t | 1347 | STATIC ssize_t |