Whamcloud - gitweb
LU-16796 lfsck: Change struct lfsck_tgt_desc to use kref 41/56141/4
authorArshad Hussain <arshad.hussain@aeoncomputing.com>
Fri, 23 Aug 2024 19:02:26 +0000 (15:02 -0400)
committerOleg Drokin <green@whamcloud.com>
Mon, 16 Dec 2024 08:10:18 +0000 (08:10 +0000)
This patch changes struct lfsck_tgt_desc to use
kref instead of atomic_t

Test-Parameters: trivial testlist=sanity-lfsck
Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com>
Change-Id: I1f9bf1889fcc6f0a4b4050c1a2be98476c5254dd
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/56141
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Timothy Day <timday@amazon.com>
Reviewed-by: Neil Brown <neilb@suse.de>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/lfsck/lfsck_engine.c
lustre/lfsck/lfsck_internal.h
lustre/lfsck/lfsck_layout.c
lustre/lfsck/lfsck_lib.c
lustre/lfsck/lfsck_striped_dir.c

index c754aaa..97ad327 100644 (file)
@@ -1213,7 +1213,7 @@ again:
 
                *gen = lad->lad_touch_gen;
                list_move_tail(phase_list, phase_head);
-               atomic_inc(&ltd->ltd_ref);
+               kref_get(&ltd->ltd_ref);
                laia->laia_ltd = ltd;
                spin_unlock(&ltds->ltd_lock);
                rc = lfsck_async_request(env, ltd->ltd_exp, lr, set,
@@ -1225,7 +1225,7 @@ again:
                               lfsck_lfsck2name(lfsck),
                               (lr->lr_flags & LEF_TO_OST) ? "OST" : "MDT",
                               ltd->ltd_index, lad->lad_name, rc);
-                       lfsck_tgt_put(ltd);
+                       kref_put(&ltd->ltd_ref, lfsck_tgt_free);
                        rc1 = rc;
                }
                spin_lock(&ltds->ltd_lock);
@@ -1322,7 +1322,7 @@ static int lfsck_assistant_notify_others(const struct lu_env *env,
                                       "%s: LFSCK assistant fail to notify OST %x for %s start: rc = %d\n",
                                       lfsck_lfsck2name(lfsck), idx,
                                       lad->lad_name, rc);
-                               lfsck_tgt_put(ltd);
+                               kref_put(&ltd->ltd_ref, lfsck_tgt_free);
                        }
                }
                up_read(&ltds->ltd_rw_sem);
@@ -1442,7 +1442,7 @@ again:
                                                &ltd->ltd_namespace_phase_list);
                                list_del_init(&ltd->ltd_namespace_list);
                        }
-                       atomic_inc(&ltd->ltd_ref);
+                       kref_get(&ltd->ltd_ref);
                        laia->laia_ltd = ltd;
                        spin_unlock(&ltds->ltd_lock);
                        rc = lfsck_async_request(env, ltd->ltd_exp, lr, set,
@@ -1455,7 +1455,7 @@ again:
                                       (lr->lr_flags & LEF_TO_OST) ?
                                       "OST" : "MDT", ltd->ltd_index,
                                       lad->lad_name, rc);
-                               lfsck_tgt_put(ltd);
+                               kref_put(&ltd->ltd_ref, lfsck_tgt_free);
                        }
                        spin_lock(&ltds->ltd_lock);
                }
@@ -1511,7 +1511,7 @@ again:
                        if (ltd->ltd_synced_failures)
                                continue;
 
-                       atomic_inc(&ltd->ltd_ref);
+                       kref_get(&ltd->ltd_ref);
                        laia->laia_ltd = ltd;
                        spin_unlock(&ltds->ltd_lock);
                        rc = lfsck_async_request(env, ltd->ltd_exp, lr, set,
@@ -1522,7 +1522,7 @@ again:
                                       "%s: LFSCK assistant fail to notify MDT %x for %s phase1 done: rc = %d\n",
                                       lfsck_lfsck2name(lfsck), ltd->ltd_index,
                                       lad->lad_name, rc);
-                               lfsck_tgt_put(ltd);
+                               kref_put(&ltd->ltd_ref, lfsck_tgt_free);
                        }
                        spin_lock(&ltds->ltd_lock);
                }
index c674d16..c3635e9 100644 (file)
@@ -452,7 +452,7 @@ struct lfsck_tgt_desc {
        __u32              ltd_namespace_status;
        __u64              ltd_layout_repaired;
        __u64              ltd_namespace_repaired;
-       atomic_t           ltd_ref;
+       struct kref        ltd_ref;
        __u32              ltd_index;
        __u32              ltd_layout_gen;
        __u32              ltd_namespace_gen;
@@ -988,6 +988,7 @@ int lfsck_load_sub_trace_files(const struct lu_env *env,
                               struct lfsck_component *com,
                               const struct dt_index_features *ft,
                               const char *prefix, bool reset);
+void lfsck_tgt_free(struct kref *kref);
 
 /* lfsck_engine.c */
 int lfsck_unpack_ent(struct lu_dirent *ent, __u64 *cookie, __u16 *type);
@@ -1350,17 +1351,11 @@ static inline struct lfsck_tgt_desc *lfsck_tgt_get(struct lfsck_tgt_descs *ltds,
 
        ltd = lfsck_ltd2tgt(ltds, index);
        if (ltd != NULL)
-               atomic_inc(&ltd->ltd_ref);
+               kref_get(&ltd->ltd_ref);
 
        return ltd;
 }
 
-static inline void lfsck_tgt_put(struct lfsck_tgt_desc *ltd)
-{
-       if (atomic_dec_and_test(&ltd->ltd_ref))
-               OBD_FREE_PTR(ltd);
-}
-
 static inline struct lfsck_component *
 lfsck_component_get(struct lfsck_component *com)
 {
index 72a6df0..2844b21 100644 (file)
@@ -2612,7 +2612,7 @@ static int lfsck_layout_master_conditional_destroy(const struct lu_env *env,
        GOTO(put, rc);
 
 put:
-       lfsck_tgt_put(ltd);
+       kref_put(&ltd->ltd_ref, lfsck_tgt_free);
 
        return rc;
 }
@@ -5680,7 +5680,7 @@ static int lfsck_layout_scan_stripes(const struct lu_env *env,
                cobj = lfsck_object_find_by_dev(env, tgt->ltd_tgt, fid);
                if (IS_ERR(cobj)) {
                        if (lfsck_is_dead_obj(parent)) {
-                               lfsck_tgt_put(tgt);
+                               kref_put(&tgt->ltd_ref, lfsck_tgt_free);
 
                                GOTO(out, rc = 0);
                        }
@@ -5727,7 +5727,7 @@ static int lfsck_layout_scan_stripes(const struct lu_env *env,
                if (lad->lad_assistant_status < 0) {
                        spin_unlock(&lad->lad_lock);
                        lfsck_layout_assistant_req_fini(env, &llr->llr_lar);
-                       lfsck_tgt_put(tgt);
+                       kref_put(&tgt->ltd_ref, lfsck_tgt_free);
                        RETURN(lad->lad_assistant_status);
                }
 
@@ -5751,7 +5751,7 @@ next:
                        lfsck_object_put(env, cobj);
 
                if (likely(tgt != NULL))
-                       lfsck_tgt_put(tgt);
+                       kref_put(&tgt->ltd_ref, lfsck_tgt_free);
 
                if (rc < 0 && bk->lb_param & LPF_FAILOUT)
                        GOTO(out, rc);
index 2148de0..2c84a68 100644 (file)
@@ -114,7 +114,7 @@ static void lfsck_tgt_descs_fini(struct lfsck_tgt_descs *ltds)
        list_for_each_entry_safe(ltd, next, &ltds->ltd_orphan,
                                 ltd_orphan_list) {
                list_del_init(&ltd->ltd_orphan_list);
-               lfsck_tgt_put(ltd);
+               kref_put(&ltd->ltd_ref, lfsck_tgt_free);
        }
 
        if (unlikely(!ltds->ltd_tgts_bitmap)) {
@@ -134,7 +134,7 @@ static void lfsck_tgt_descs_fini(struct lfsck_tgt_descs *ltds)
                        ltds->ltd_tgtnr--;
                        clear_bit(idx, ltds->ltd_tgts_bitmap);
                        lfsck_assign_tgt(ltds, NULL, idx);
-                       lfsck_tgt_put(ltd);
+                       kref_put(&ltd->ltd_ref, lfsck_tgt_free);
                }
        }
 
@@ -1435,7 +1435,7 @@ int lfsck_verify_lpf(const struct lu_env *env, struct lfsck_instance *lfsck)
 
                parent = lfsck_object_find_by_dev(env, ltd->ltd_tgt,
                                                  &LU_LPF_FID);
-               lfsck_tgt_put(ltd);
+               kref_put(&ltd->ltd_ref, lfsck_tgt_free);
        }
 
        if (IS_ERR(parent))
@@ -2252,7 +2252,7 @@ int lfsck_async_interpret_common(const struct lu_env *env,
        }
 
        if (!laia->laia_shared) {
-               lfsck_tgt_put(ltd);
+               kref_put(&ltd->ltd_ref, lfsck_tgt_free);
                lfsck_component_put(env, com);
        }
 
@@ -2350,7 +2350,7 @@ static int lfsck_stop_notify(const struct lu_env *env,
                memset(laia, 0, sizeof(*laia));
                laia->laia_com = com;
                laia->laia_ltds = ltds;
-               atomic_inc(&ltd->ltd_ref);
+               kref_get(&ltd->ltd_ref);
                laia->laia_ltd = ltd;
                laia->laia_lr = lr;
 
@@ -2363,7 +2363,7 @@ static int lfsck_stop_notify(const struct lu_env *env,
                               lfsck_lfsck2name(lfsck),
                               (lr->lr_flags & LEF_TO_OST) ? "OST" : "MDT",
                               ltd->ltd_index, lad->lad_name, rc);
-                       lfsck_tgt_put(ltd);
+                       kref_put(&ltd->ltd_ref, lfsck_tgt_free);
                } else {
                        rc = ptlrpc_set_wait(env, set);
                }
@@ -2385,7 +2385,7 @@ static int lfsck_async_interpret(const struct lu_env *env,
        lfsck = container_of(laia->laia_ltds, struct lfsck_instance,
                             li_mdt_descs);
        lfsck_interpret(env, lfsck, req, laia, rc);
-       lfsck_tgt_put(laia->laia_ltd);
+       kref_put(&laia->laia_ltd->ltd_ref, lfsck_tgt_free);
        if (rc != 0 && laia->laia_result != -EALREADY)
                laia->laia_result = rc;
 
@@ -2491,7 +2491,7 @@ again:
                               (lr->lr_flags & LEF_TO_OST) ? "OST" : "MDT",
                               ltd->ltd_index, lad->lad_name, rc);
                        lfsck_reset_ltd_status(ltd, com->lc_type);
-                       lfsck_tgt_put(ltd);
+                       kref_put(&ltd->ltd_ref, lfsck_tgt_free);
                }
                down_read(&ltds->ltd_rw_sem);
        }
@@ -2938,7 +2938,7 @@ static int lfsck_stop_all(const struct lu_env *env,
                                         LFSCK_NOTIFY);
                if (rc != 0) {
                        lfsck_interpret(env, lfsck, NULL, laia, rc);
-                       lfsck_tgt_put(ltd);
+                       kref_put(&ltd->ltd_ref, lfsck_tgt_free);
                        CERROR("%s: cannot notify MDT %x for LFSCK stop: rc = %d\n",
                               lfsck_lfsck2name(lfsck), idx, rc);
                        rc1 = rc;
@@ -3008,7 +3008,7 @@ again:
                LASSERT(ltd != NULL);
 
                if (retry && !ltd->ltd_retry_start) {
-                       lfsck_tgt_put(ltd);
+                       kref_put(&ltd->ltd_ref, lfsck_tgt_free);
                        continue;
                }
 
@@ -3022,7 +3022,7 @@ again:
                                         LFSCK_NOTIFY);
                if (rc != 0) {
                        lfsck_interpret(env, lfsck, NULL, laia, rc);
-                       lfsck_tgt_put(ltd);
+                       kref_put(&ltd->ltd_ref, lfsck_tgt_free);
                        CERROR("%s: cannot notify MDT %x for LFSCK start, failout: rc = %d\n",
                               lfsck_lfsck2name(lfsck), idx, rc);
                        break;
@@ -3840,7 +3840,7 @@ int lfsck_add_target(const struct lu_env *env, struct dt_device *key,
        INIT_LIST_HEAD(&ltd->ltd_layout_phase_list);
        INIT_LIST_HEAD(&ltd->ltd_namespace_list);
        INIT_LIST_HEAD(&ltd->ltd_namespace_phase_list);
-       atomic_set(&ltd->ltd_ref, 1);
+       kref_init(&ltd->ltd_ref);
        ltd->ltd_index = index;
 
        spin_lock(&lfsck_instance_lock);
@@ -3860,7 +3860,7 @@ int lfsck_add_target(const struct lu_env *env, struct dt_device *key,
 
        rc = __lfsck_add_target(env, lfsck, ltd, for_ost, false);
        if (rc != 0)
-               lfsck_tgt_put(ltd);
+               kref_put(&ltd->ltd_ref, lfsck_tgt_free);
 
        lfsck_instance_put(env, lfsck);
 
@@ -3886,7 +3886,7 @@ void lfsck_del_target(const struct lu_env *env, struct dt_device *key,
                if (ltd->ltd_tgt == tgt) {
                        list_del_init(&ltd->ltd_orphan_list);
                        spin_unlock(&lfsck_instance_lock);
-                       lfsck_tgt_put(ltd);
+                       kref_put(&ltd->ltd_ref, lfsck_tgt_free);
 
                        return;
                }
@@ -3941,7 +3941,7 @@ unlock:
                spin_unlock(&ltds->ltd_lock);
                lfsck_stop_notify(env, lfsck, ltds, ltd, LFSCK_TYPE_NAMESPACE);
                lfsck_stop_notify(env, lfsck, ltds, ltd, LFSCK_TYPE_LAYOUT);
-               lfsck_tgt_put(ltd);
+               kref_put(&ltd->ltd_ref, lfsck_tgt_free);
        }
 
        lfsck_instance_put(env, lfsck);
@@ -3977,18 +3977,26 @@ static void __exit lfsck_exit(void)
        list_for_each_entry_safe(ltd, next, &lfsck_ost_orphan_list,
                                 ltd_orphan_list) {
                list_del_init(&ltd->ltd_orphan_list);
-               lfsck_tgt_put(ltd);
+               kref_put(&ltd->ltd_ref, lfsck_tgt_free);
        }
 
        list_for_each_entry_safe(ltd, next, &lfsck_mdt_orphan_list,
                                 ltd_orphan_list) {
                list_del_init(&ltd->ltd_orphan_list);
-               lfsck_tgt_put(ltd);
+               kref_put(&ltd->ltd_ref, lfsck_tgt_free);
        }
 
        lu_context_key_degister(&lfsck_thread_key);
 }
 
+void lfsck_tgt_free(struct kref *kref)
+{
+       struct lfsck_tgt_desc *ltd = container_of(kref, struct lfsck_tgt_desc,
+                                                 ltd_ref);
+
+       OBD_FREE_PTR(ltd);
+}
+
 MODULE_AUTHOR("OpenSFS, Inc. <http://www.lustre.org/>");
 MODULE_DESCRIPTION("Lustre File System Checker");
 MODULE_VERSION(LUSTRE_VERSION_STRING);
index 40552c4..058df66 100644 (file)
@@ -1301,7 +1301,7 @@ out:
               lfsck_lfsck2name(lfsck), PFID(fid), index, event, flags, rc);
 
        if (ltd != NULL)
-               lfsck_tgt_put(ltd);
+               kref_put(&ltd->ltd_ref, lfsck_tgt_free);
 
        return rc;
 }