|
@@ -3573,6 +3573,7 @@ static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset,
|
|
ssize_t size, void *private, int ret,
|
|
ssize_t size, void *private, int ret,
|
|
bool is_async)
|
|
bool is_async)
|
|
{
|
|
{
|
|
|
|
+ struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode;
|
|
ext4_io_end_t *io_end = iocb->private;
|
|
ext4_io_end_t *io_end = iocb->private;
|
|
struct workqueue_struct *wq;
|
|
struct workqueue_struct *wq;
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
@@ -3594,6 +3595,7 @@ static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset,
|
|
out:
|
|
out:
|
|
if (is_async)
|
|
if (is_async)
|
|
aio_complete(iocb, ret, 0);
|
|
aio_complete(iocb, ret, 0);
|
|
|
|
+ inode_dio_done(inode);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3614,6 +3616,9 @@ out:
|
|
/* queue the work to convert unwritten extents to written */
|
|
/* queue the work to convert unwritten extents to written */
|
|
queue_work(wq, &io_end->work);
|
|
queue_work(wq, &io_end->work);
|
|
iocb->private = NULL;
|
|
iocb->private = NULL;
|
|
|
|
+
|
|
|
|
+ /* XXX: probably should move into the real I/O completion handler */
|
|
|
|
+ inode_dio_done(inode);
|
|
}
|
|
}
|
|
|
|
|
|
static void ext4_end_io_buffer_write(struct buffer_head *bh, int uptodate)
|
|
static void ext4_end_io_buffer_write(struct buffer_head *bh, int uptodate)
|