Whamcloud - gitweb
LU-9839 clio: lov active ios accounting fix
authorAlexander Zarochentsev <alexander.zarochentsev@hpe.com>
Tue, 21 Nov 2023 14:46:44 +0000 (09:46 -0500)
committerAndreas Dilger <adilger@whamcloud.com>
Sat, 27 Apr 2024 22:30:49 +0000 (22:30 +0000)
ASSERT(atomic_read(&lov->lo_active_ios)==0) is triggered due to a
bug in active_ios accounting. For some cl_io_init(,CIT_MISC,,)
calls increment the lov_active_ios counter is not protected by the
layout lock. So the checks for active_ios != 0 are racy and not
preventing another thread from starting new cl_io and incrementing
the active_ios counter after any check but before the assertion.

The lov_active_ios counter increment should be done under the
same condition as taking the layout type lock.
The ci_type=CIT_MISC and ci_ignore_layout=1 should not be used
in ll_dom_finish_open() as the I/O doesn't come
"from the osc layer" and may race with a layout change.

Lustre-change: https://review.whamcloud.com/51638
Lustre-commit: 5bc1dd825b700677b002a43463a463c3ccb665ec

HPE-bug-id: LUS-11628
Signed-off-by: Alexander Zarochentsev <alexander.zarochentsev@hpe.com>
Change-Id: I35fda85b968b847a87e73dd36bbb1648c744d62c
Reviewed-by: Mikhail Pershin <mpershin@whamcloud.com>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com>
Reviewed-by: Vitaly Fertman <vitaly.fertman@hpe.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/c/ex/lustre-release/+/54863
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
lustre/llite/file.c
lustre/lov/lov_io.c

index c6d7a36..a2b1ee6 100644 (file)
@@ -569,7 +569,6 @@ void ll_dom_finish_open(struct inode *inode, struct ptlrpc_request *req)
                RETURN_EXIT;
        io = vvp_env_thread_io(env);
        io->ci_obj = obj;
-       io->ci_ignore_layout = 1;
        rc = cl_io_init(env, io, CIT_MISC, obj);
        if (rc)
                GOTO(out_io, rc);
index 97437f1..79f4225 100644 (file)
@@ -774,6 +774,7 @@ static void lov_io_fini(const struct lu_env *env, const struct cl_io_slice *ios)
 {
        struct lov_io *lio = cl2lov_io(env, ios);
        struct lov_object *lov = cl2lov(ios->cis_obj);
+       struct cl_io *io = lio->lis_cl.cis_io;
 
        ENTRY;
 
@@ -792,9 +793,11 @@ static void lov_io_fini(const struct lu_env *env, const struct cl_io_slice *ios)
        }
        LASSERT(lio->lis_nr_subios == 0);
 
-       LASSERT(atomic_read(&lov->lo_active_ios) > 0);
-       if (atomic_dec_and_test(&lov->lo_active_ios))
-               wake_up_all(&lov->lo_waitq);
+       if (!(io->ci_ignore_layout && io->ci_type == CIT_MISC)) {
+               LASSERT(atomic_read(&lov->lo_active_ios) > 0);
+               if (atomic_dec_and_test(&lov->lo_active_ios))
+                       wake_up_all(&lov->lo_waitq);
+       }
        EXIT;
 }
 
@@ -2008,9 +2011,12 @@ static void lov_empty_io_fini(const struct lu_env *env,
                               const struct cl_io_slice *ios)
 {
        struct lov_object *lov = cl2lov(ios->cis_obj);
+       struct lov_io *lio = cl2lov_io(env, ios);
+       struct cl_io *io = lio->lis_cl.cis_io;
        ENTRY;
 
-       if (atomic_dec_and_test(&lov->lo_active_ios))
+       if (!(io->ci_type == CIT_MISC && io->ci_ignore_layout) &&
+           atomic_dec_and_test(&lov->lo_active_ios))
                wake_up_all(&lov->lo_waitq);
        EXIT;
 }
@@ -2099,7 +2105,8 @@ int lov_io_init_composite(const struct lu_env *env, struct cl_object *obj,
        result = lov_io_subio_init(env, lio, io);
        if (!result) {
                cl_io_slice_add(io, &lio->lis_cl, obj, &lov_io_ops);
-               atomic_inc(&lov->lo_active_ios);
+               if (!(io->ci_ignore_layout && io->ci_type == CIT_MISC))
+                       atomic_inc(&lov->lo_active_ios);
        }
        EXIT;
 out:
@@ -2142,7 +2149,8 @@ int lov_io_init_empty(const struct lu_env *env, struct cl_object *obj,
        }
        if (result == 0) {
                cl_io_slice_add(io, &lio->lis_cl, obj, &lov_empty_io_ops);
-               atomic_inc(&lov->lo_active_ios);
+               if (!(io->ci_ignore_layout && io->ci_type == CIT_MISC))
+                       atomic_inc(&lov->lo_active_ios);
        }
 
        io->ci_result = result < 0 ? result : 0;
@@ -2199,7 +2207,8 @@ int lov_io_init_released(const struct lu_env *env, struct cl_object *obj,
 
        if (result == 0) {
                cl_io_slice_add(io, &lio->lis_cl, obj, &lov_empty_io_ops);
-               atomic_inc(&lov->lo_active_ios);
+               if (!(io->ci_ignore_layout && io->ci_type == CIT_MISC))
+                       atomic_inc(&lov->lo_active_ios);
        }
 
        io->ci_result = result < 0 ? result : 0;