From: Alex Zhuravlev Date: Tue, 28 Jun 2022 22:05:33 +0000 (-0700) Subject: LU-15779 ofd: don't hold read lock over bulk X-Git-Tag: 2.15.2-RC1~60 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=refs%2Fchanges%2F25%2F47825%2F3;p=fs%2Flustre-release.git LU-15779 ofd: don't hold read lock over bulk as this can block all operations on OST: 1) ofd_preprw_read() takes a shared object lock and initiates BULK 2) OUT needs an exclusive object lock on the same object 3) ofd_commitrw_write() starts transaction and now has to wait for OUT to get and release that exclusive object lock (step 2) 4) number of threads can get stuck waiting for ofd_commit_write() to stop it's transaction this patch drops a shared object lock before BULK transfer. at the moment it's not clear how such read would race with object removal on ZFS - this should be investigated. Lustre-change: https://review.whamcloud.com/47126 Lustre-commit: 98ba50819024b908453b62fd095647442929a61f Signed-off-by: Alex Zhuravlev Change-Id: I131493abd90283e9ca897f904e00c25d26e3d8d3 Reviewed-on: https://review.whamcloud.com/47825 Tested-by: jenkins Reviewed-by: Andreas Dilger Tested-by: Maloo Reviewed-by: Oleg Drokin --- diff --git a/lustre/ofd/ofd_io.c b/lustre/ofd/ofd_io.c index 3f1fd54..0cae180 100644 --- a/lustre/ofd/ofd_io.c +++ b/lustre/ofd/ofd_io.c @@ -631,6 +631,7 @@ static int ofd_preprw_read(const struct lu_env *env, struct obd_export *exp, rc = dt_read_prep(env, ofd_object_child(fo), lnb, *nr_local); if (unlikely(rc)) GOTO(buf_put, rc); + ofd_read_unlock(env, fo); ofd_access(env, ofd, &(struct lu_fid) { @@ -993,7 +994,6 @@ ofd_commitrw_read(const struct lu_env *env, struct ofd_device *ofd, LASSERT(ofd_object_exists(fo)); dt_bufs_put(env, ofd_object_child(fo), lnb, niocount); - ofd_read_unlock(env, fo); ofd_object_put(env, fo); RETURN(0);