[lustre-devel] [PATCH 23/24] lustre: osc: Always set aio in anchor

James Simmons jsimmons at infradead.org
Thu Jan 13 17:38:02 PST 2022

From: Patrick Farrell <pfarrell at whamcloud.com>

We currently do not set csi_aio for DIO and use this to
control when we free the aio struct.  (For AIO, we must
free it in cl_sync_io_note, but for other users, we have to
wait until after cl_sync_io_wait has been called.)

The lack of csi_aio causes trouble for the implementation
of the next patch, so instead we always set it and control
freeing by checking at that time if we are doing DIO.

WC-bug-id: https://jira.whamcloud.com/browse/LU-13799
Lustre-commit: eadccb33ac4bbe54a ("LU-13799 osc: Always set aio in anchor")
Signed-off-by: Patrick Farrell <pfarrell at whamcloud.com>
Reviewed-on: https://review.whamcloud.com/44153
Reviewed-by: Wang Shilong <wangshilong1991 at gmail.com>
Reviewed-by: Andreas Dilger <adilger at whamcloud.com>
Reviewed-by: Oleg Drokin <green at whamcloud.com>
Signed-off-by: James Simmons <jsimmons at infradead.org>
 fs/lustre/obdclass/cl_io.c | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/fs/lustre/obdclass/cl_io.c b/fs/lustre/obdclass/cl_io.c
index 675116d..b72f5db 100644
--- a/fs/lustre/obdclass/cl_io.c
+++ b/fs/lustre/obdclass/cl_io.c
@@ -1150,9 +1150,7 @@ struct cl_dio_aio *cl_aio_alloc(struct kiocb *iocb, struct cl_object *obj)
 		 * Hold one ref so that it won't be released until
 		 * every pages is added.
-		cl_sync_io_init_notify(&aio->cda_sync, 1,
-				       is_sync_kiocb(iocb) ? NULL : aio,
-				       cl_aio_end);
+		cl_sync_io_init_notify(&aio->cda_sync, 1, aio, cl_aio_end);
 		aio->cda_iocb = iocb;
 		if (is_sync_kiocb(iocb))
@@ -1203,16 +1201,20 @@ void cl_sync_io_note(const struct lu_env *env, struct cl_sync_io *anchor,
 		if (end_io)
 			end_io(env, anchor);
-		if (anchor->csi_aio)
-			aio = anchor->csi_aio;
+		aio = anchor->csi_aio;
-		 * If anchor->csi_aio is set, we are responsible for freeing
-		 * memory here rather than when cl_sync_io_wait() completes.
+		 * For AIO (!is_sync_kiocb), we are responsible for freeing
+		 * memory here.  This is because we are the last user of this
+		 * aio struct, whereas in other cases, we will call
+		 * cl_sync_io_wait to wait after this, and so the memory is
+		 * freed after that call.
-		cl_aio_free(env, aio);
+		if (aio && !is_sync_kiocb(aio->cda_iocb))
+			cl_aio_free(env, aio);

More information about the lustre-devel mailing list