From eadccb33ac4bbe54a01da5168f6170702f9b2629 Mon Sep 17 00:00:00 2001 From: Patrick Farrell Date: Fri, 30 Jul 2021 12:11:37 -0400 Subject: [PATCH] LU-13799 osc: Always set aio in anchor 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. Signed-off-by: Patrick Farrell Change-Id: I2122a6a2dad33179e9114494b53c09d0b64f0fa6 Reviewed-on: https://review.whamcloud.com/44153 Reviewed-by: Wang Shilong Reviewed-by: Andreas Dilger Tested-by: jenkins Tested-by: Maloo Reviewed-by: Oleg Drokin --- lustre/obdclass/cl_io.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lustre/obdclass/cl_io.c b/lustre/obdclass/cl_io.c index 504bc8c..29db2c6 100644 --- a/lustre/obdclass/cl_io.c +++ b/lustre/obdclass/cl_io.c @@ -1247,8 +1247,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); cl_page_list_init(&aio->cda_pages); aio->cda_iocb = iocb; if (is_sync_kiocb(iocb)) @@ -1304,16 +1303,20 @@ void cl_sync_io_note(const struct lu_env *env, struct cl_sync_io *anchor, wake_up_locked(&anchor->csi_waitq); if (end_io) end_io(env, anchor); - if (anchor->csi_aio) - aio = anchor->csi_aio; + + aio = anchor->csi_aio; spin_unlock(&anchor->csi_waitq.lock); /** - * 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); } EXIT; } -- 1.8.3.1