ceph: increment/decrement dio counter on async requests
diff mbox series

Message ID 20191113161848.91812-2-jlayton@kernel.org
State New
Headers show
  • ceph: increment/decrement dio counter on async requests
Related show

Commit Message

Jeff Layton Nov. 13, 2019, 4:18 p.m. UTC
Ceph can in some cases issue an async DIO request, in which case we can
end up calling ceph_end_io_direct before the I/O is actually complete.
That may allow buffered operations to proceed while DIO requests are
still in flight.

Fix this by incrementing the i_dio_count when issuing an async DIO
request, and decrement it when tearing down the aio_req.

Signed-off-by: Jeff Layton <jlayton@kernel.org>
 fs/ceph/file.c | 4 ++++
 1 file changed, 4 insertions(+)

diff mbox series

diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index 06efeaff3b57..8de633964dc3 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -753,6 +753,9 @@  static void ceph_aio_complete(struct inode *inode,
 	if (!atomic_dec_and_test(&aio_req->pending_reqs))
+	if (aio_req->iocb->ki_flags & IOCB_DIRECT)
+		inode_dio_end(inode);
 	ret = aio_req->error;
 	if (!ret)
 		ret = aio_req->total_len;
@@ -1091,6 +1094,7 @@  ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter,
 		list_splice(&aio_req->osd_reqs, &osd_reqs);
+		inode_dio_begin(inode);
 		while (!list_empty(&osd_reqs)) {
 			req = list_first_entry(&osd_reqs,
 					       struct ceph_osd_request,