From d06d292abdd520709b28afbb746b9a6f9ba5321d Mon Sep 17 00:00:00 2001 From: Arshad Hussain Date: Fri, 23 Aug 2024 15:02:26 -0400 Subject: [PATCH] LU-16796 lfsck: Change struct lfsck_tgt_desc to use kref 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 Change-Id: I1f9bf1889fcc6f0a4b4050c1a2be98476c5254dd Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/56141 Tested-by: jenkins Tested-by: Maloo Reviewed-by: James Simmons Reviewed-by: Timothy Day Reviewed-by: Neil Brown Reviewed-by: Oleg Drokin --- lustre/lfsck/lfsck_engine.c | 14 +++++++------- lustre/lfsck/lfsck_internal.h | 11 +++-------- lustre/lfsck/lfsck_layout.c | 8 ++++---- lustre/lfsck/lfsck_lib.c | 42 ++++++++++++++++++++++++---------------- lustre/lfsck/lfsck_striped_dir.c | 2 +- 5 files changed, 40 insertions(+), 37 deletions(-) diff --git a/lustre/lfsck/lfsck_engine.c b/lustre/lfsck/lfsck_engine.c index c754aaa..97ad327 100644 --- a/lustre/lfsck/lfsck_engine.c +++ b/lustre/lfsck/lfsck_engine.c @@ -1213,7 +1213,7 @@ again: *gen = lad->lad_touch_gen; list_move_tail(phase_list, phase_head); - atomic_inc(<d->ltd_ref); + kref_get(<d->ltd_ref); laia->laia_ltd = ltd; spin_unlock(<ds->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(<d->ltd_ref, lfsck_tgt_free); rc1 = rc; } spin_lock(<ds->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(<d->ltd_ref, lfsck_tgt_free); } } up_read(<ds->ltd_rw_sem); @@ -1442,7 +1442,7 @@ again: <d->ltd_namespace_phase_list); list_del_init(<d->ltd_namespace_list); } - atomic_inc(<d->ltd_ref); + kref_get(<d->ltd_ref); laia->laia_ltd = ltd; spin_unlock(<ds->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(<d->ltd_ref, lfsck_tgt_free); } spin_lock(<ds->ltd_lock); } @@ -1511,7 +1511,7 @@ again: if (ltd->ltd_synced_failures) continue; - atomic_inc(<d->ltd_ref); + kref_get(<d->ltd_ref); laia->laia_ltd = ltd; spin_unlock(<ds->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(<d->ltd_ref, lfsck_tgt_free); } spin_lock(<ds->ltd_lock); } diff --git a/lustre/lfsck/lfsck_internal.h b/lustre/lfsck/lfsck_internal.h index c674d16..c3635e9 100644 --- a/lustre/lfsck/lfsck_internal.h +++ b/lustre/lfsck/lfsck_internal.h @@ -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(<d->ltd_ref); + kref_get(<d->ltd_ref); return ltd; } -static inline void lfsck_tgt_put(struct lfsck_tgt_desc *ltd) -{ - if (atomic_dec_and_test(<d->ltd_ref)) - OBD_FREE_PTR(ltd); -} - static inline struct lfsck_component * lfsck_component_get(struct lfsck_component *com) { diff --git a/lustre/lfsck/lfsck_layout.c b/lustre/lfsck/lfsck_layout.c index 72a6df0..2844b21 100644 --- a/lustre/lfsck/lfsck_layout.c +++ b/lustre/lfsck/lfsck_layout.c @@ -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(<d->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); diff --git a/lustre/lfsck/lfsck_lib.c b/lustre/lfsck/lfsck_lib.c index 2148de0..2c84a68 100644 --- a/lustre/lfsck/lfsck_lib.c +++ b/lustre/lfsck/lfsck_lib.c @@ -114,7 +114,7 @@ static void lfsck_tgt_descs_fini(struct lfsck_tgt_descs *ltds) list_for_each_entry_safe(ltd, next, <ds->ltd_orphan, ltd_orphan_list) { list_del_init(<d->ltd_orphan_list); - lfsck_tgt_put(ltd); + kref_put(<d->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(<d->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(<d->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(<d->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(<d->ltd_ref); + kref_get(<d->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(<d->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(<d->ltd_ref, lfsck_tgt_free); } down_read(<ds->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(<d->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(<d->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(<d->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(<d->ltd_layout_phase_list); INIT_LIST_HEAD(<d->ltd_namespace_list); INIT_LIST_HEAD(<d->ltd_namespace_phase_list); - atomic_set(<d->ltd_ref, 1); + kref_init(<d->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(<d->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(<d->ltd_orphan_list); spin_unlock(&lfsck_instance_lock); - lfsck_tgt_put(ltd); + kref_put(<d->ltd_ref, lfsck_tgt_free); return; } @@ -3941,7 +3941,7 @@ unlock: spin_unlock(<ds->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(<d->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(<d->ltd_orphan_list); - lfsck_tgt_put(ltd); + kref_put(<d->ltd_ref, lfsck_tgt_free); } list_for_each_entry_safe(ltd, next, &lfsck_mdt_orphan_list, ltd_orphan_list) { list_del_init(<d->ltd_orphan_list); - lfsck_tgt_put(ltd); + kref_put(<d->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. "); MODULE_DESCRIPTION("Lustre File System Checker"); MODULE_VERSION(LUSTRE_VERSION_STRING); diff --git a/lustre/lfsck/lfsck_striped_dir.c b/lustre/lfsck/lfsck_striped_dir.c index 40552c4..058df66 100644 --- a/lustre/lfsck/lfsck_striped_dir.c +++ b/lustre/lfsck/lfsck_striped_dir.c @@ -1301,7 +1301,7 @@ out: lfsck_lfsck2name(lfsck), PFID(fid), index, event, flags, rc); if (ltd != NULL) - lfsck_tgt_put(ltd); + kref_put(<d->ltd_ref, lfsck_tgt_free); return rc; } -- 1.8.3.1