From: Patrick Farrell Date: Fri, 30 Jul 2021 16:11:37 +0000 (-0400) Subject: LU-13799 osc: Always set aio in anchor X-Git-Tag: 2.14.57~30 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=eadccb33ac4bbe54a01da5168f6170702f9b2629;p=fs%2Flustre-release.git 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 --- 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; }