From 98ba50819024b908453b62fd095647442929a61f Mon Sep 17 00:00:00 2001 From: Alex Zhuravlev Date: Sun, 24 Apr 2022 14:27:18 +0300 Subject: [PATCH] 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. Signed-off-by: Alex Zhuravlev Change-Id: I131493abd90283e9ca897f904e00c25d26e3d8d3 Reviewed-on: https://review.whamcloud.com/47126 Reviewed-by: Hongchao Zhang Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Oleg Drokin --- lustre/ofd/ofd_io.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lustre/ofd/ofd_io.c b/lustre/ofd/ofd_io.c index 6e9a87b..e6c8991 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); -- 1.8.3.1