From: Arshad Hussain Date: Fri, 23 Aug 2024 14:09:41 +0000 (-0400) Subject: LU-16796 lov: Change struct lov_stripe_md to use kref X-Git-Tag: 2.16.51~73 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=c3fbc7d7212a300c41a5c879ff2837e05f7f064c;p=fs%2Flustre-release.git LU-16796 lov: Change struct lov_stripe_md to use kref This patch changes struct lov_stripe_md to use kref instead of atomic_t Signed-off-by: Arshad Hussain Change-Id: I8c743d630c268a70ecd0d5c9907e2ce456cd60cc Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/56104 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Timothy Day Reviewed-by: Neil Brown Reviewed-by: Oleg Drokin --- diff --git a/lustre/lov/lov_ea.c b/lustre/lov/lov_ea.c index 9eec5e0..8f55172 100644 --- a/lustre/lov/lov_ea.c +++ b/lustre/lov/lov_ea.c @@ -141,8 +141,10 @@ static void lsme_free(struct lov_stripe_md_entry *lsme) OBD_FREE_LARGE(lsme, lsme_size); } -void lsm_free(struct lov_stripe_md *lsm) +void lsm_free(struct kref *kref) { + struct lov_stripe_md *lsm = container_of(kref, struct lov_stripe_md, + lsm_refc); unsigned int entry_count = lsm->lsm_entry_count; unsigned int i; size_t lsm_size; @@ -373,7 +375,7 @@ lov_stripe_md *lsm_unpackmd_v1v3(struct lov_obd *lov, struct lov_mds_md *lmm, if (!lsm) GOTO(out_lsme, rc = -ENOMEM); - atomic_set(&lsm->lsm_refc, 1); + kref_init(&lsm->lsm_refc); spin_lock_init(&lsm->lsm_lock); lsm->lsm_maxbytes = maxbytes; lmm_oi_le_to_cpu(&lsm->lsm_oi, &lmm->lmm_oi); @@ -564,7 +566,7 @@ lsm_unpackmd_comp_md_v1(struct lov_obd *lov, void *buf, size_t buf_size) if (!lsm) return ERR_PTR(-ENOMEM); - atomic_set(&lsm->lsm_refc, 1); + kref_init(&lsm->lsm_refc); spin_lock_init(&lsm->lsm_lock); lsm->lsm_magic = le32_to_cpu(lcm->lcm_magic); lsm->lsm_layout_gen = le32_to_cpu(lcm->lcm_layout_gen); @@ -672,7 +674,7 @@ lov_stripe_md *lsm_unpackmd_foreign(struct lov_obd *lov, void *buf, if (lsm == NULL) RETURN(ERR_PTR(-ENOMEM)); - atomic_set(&lsm->lsm_refc, 1); + kref_init(&lsm->lsm_refc); spin_lock_init(&lsm->lsm_lock); lsm->lsm_magic = le32_to_cpu(lfm->lfm_magic); lsm->lsm_foreign_size = lov_foreign_size_le(lfm); @@ -720,7 +722,7 @@ void dump_lsm(unsigned int level, const struct lov_stripe_md *lsm) CDEBUG_LIMIT(level, "lsm %p, objid "DOSTID", maxbytes %#llx, magic 0x%08X, refc: %d, entry: %u, mirror: %u, flags: %u,layout_gen %u\n", lsm, POSTID(&lsm->lsm_oi), lsm->lsm_maxbytes, lsm->lsm_magic, - atomic_read(&lsm->lsm_refc), lsm->lsm_entry_count, + kref_read(&lsm->lsm_refc), lsm->lsm_entry_count, lsm->lsm_mirror_count, lsm->lsm_flags, lsm->lsm_layout_gen); if (lsm->lsm_magic == LOV_MAGIC_FOREIGN) { diff --git a/lustre/lov/lov_internal.h b/lustre/lov/lov_internal.h index a9dd33c..0de5e21 100644 --- a/lustre/lov/lov_internal.h +++ b/lustre/lov/lov_internal.h @@ -74,7 +74,7 @@ static inline void copy_lsm_entry(struct lov_stripe_md_entry *dst, } struct lov_stripe_md { - atomic_t lsm_refc; + struct kref lsm_refc; spinlock_t lsm_lock; pid_t lsm_lock_owner; /* debugging */ @@ -195,7 +195,7 @@ struct lsm_operations { }; const struct lsm_operations *lsm_op_find(int magic); -void lsm_free(struct lov_stripe_md *lsm); +void lsm_free(struct kref *kref); static inline bool lov_supported_comp_magic(unsigned int magic) { @@ -292,7 +292,7 @@ ssize_t lov_lsm_pack(const struct lov_stripe_md *lsm, void *buf, size_t buf_size); struct lov_stripe_md *lov_unpackmd(struct lov_obd *lov, void *buf, size_t buf_size); -int lov_free_memmd(struct lov_stripe_md **lsmp); +void lov_free_memmd(struct lov_stripe_md **lsmp); void lov_dump_lmm_v1(int level, struct lov_mds_md_v1 *lmm); void lov_dump_lmm_common(int level, void *lmmp); @@ -317,8 +317,7 @@ int lov_pool_remove(struct obd_device *obd, char *poolname, char *ostname); static inline struct lov_stripe_md *lsm_addref(struct lov_stripe_md *lsm) { - LASSERT(atomic_read(&lsm->lsm_refc) > 0); - atomic_inc(&lsm->lsm_refc); + kref_get(&lsm->lsm_refc); return lsm; } diff --git a/lustre/lov/lov_object.c b/lustre/lov/lov_object.c index ff12797..a9da801 100644 --- a/lustre/lov/lov_object.c +++ b/lustre/lov/lov_object.c @@ -946,7 +946,7 @@ static int lov_print_composite(const struct lu_env *env, void *cookie, (*p)(env, cookie, "entries: %d, %s, lsm{%p 0x%08X %d %u}:\n", lsm->lsm_entry_count, test_bit(LO_LAYOUT_INVALID, &lov->lo_obj_flags) ? "invalid" : - "valid", lsm, lsm->lsm_magic, atomic_read(&lsm->lsm_refc), + "valid", lsm, lsm->lsm_magic, kref_read(&lsm->lsm_refc), lsm->lsm_layout_gen); for (i = 0; i < lsm->lsm_entry_count; i++) { @@ -976,7 +976,7 @@ static int lov_print_released(const struct lu_env *env, void *cookie, (*p)(env, cookie, "released: %s, lsm{%p 0x%08X %d %u}:\n", test_bit(LO_LAYOUT_INVALID, &lov->lo_obj_flags) ? "invalid" : - "valid", lsm, lsm->lsm_magic, atomic_read(&lsm->lsm_refc), + "valid", lsm, lsm->lsm_magic, kref_read(&lsm->lsm_refc), lsm->lsm_layout_gen); return 0; } @@ -991,7 +991,7 @@ static int lov_print_foreign(const struct lu_env *env, void *cookie, "foreign: %s, lsm{%p 0x%08X %d %u}:\n", test_bit(LO_LAYOUT_INVALID, &lov->lo_obj_flags) ? "invalid" : "valid", lsm, - lsm->lsm_magic, atomic_read(&lsm->lsm_refc), + lsm->lsm_magic, kref_read(&lsm->lsm_refc), lsm->lsm_layout_gen); (*p)(env, cookie, "raw_ea_content '%.*s'\n", @@ -2362,7 +2362,7 @@ static struct lov_stripe_md *lov_lsm_addref(struct lov_object *lov) if (lov->lo_lsm != NULL) { lsm = lsm_addref(lov->lo_lsm); CDEBUG(D_INODE, "lsm %p addref %d/%d by %p.\n", - lsm, atomic_read(&lsm->lsm_refc), + lsm, kref_read(&lsm->lsm_refc), test_bit(LO_LAYOUT_INVALID, &lov->lo_obj_flags), current); } diff --git a/lustre/lov/lov_pack.c b/lustre/lov/lov_pack.c index ab2fb54..81c977b 100644 --- a/lustre/lov/lov_pack.c +++ b/lustre/lov/lov_pack.c @@ -310,18 +310,12 @@ __u16 lov_get_stripe_count(struct lov_obd *lov, __u32 magic, __u16 stripe_count) return stripe_count; } -int lov_free_memmd(struct lov_stripe_md **lsmp) +void lov_free_memmd(struct lov_stripe_md **lsmp) { struct lov_stripe_md *lsm = *lsmp; - int refc; *lsmp = NULL; - refc = atomic_dec_return(&lsm->lsm_refc); - LASSERT(refc >= 0); - if (refc == 0) - lsm_free(lsm); - - return refc; + kref_put(&lsm->lsm_refc, lsm_free); } /*