From: Alex Zhuravlev Date: Tue, 28 Jun 2022 22:02:47 +0000 (-0700) Subject: LU-15779 ofd: don't hold read lock over bulk X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=1b0f3c63c7e33fe6074d39e747037a1dd350b42e;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/47824 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger --- diff --git a/lustre/ofd/ofd_io.c b/lustre/ofd/ofd_io.c index 04cd7fc..deb88c5 100644 --- a/lustre/ofd/ofd_io.c +++ b/lustre/ofd/ofd_io.c @@ -618,6 +618,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) { @@ -979,7 +980,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);