Whamcloud - gitweb
LU-16796 lov: Change struct lov_stripe_md to use kref 04/56104/9
authorArshad Hussain <arshad.hussain@aeoncomputing.com>
Fri, 23 Aug 2024 14:09:41 +0000 (10:09 -0400)
committerOleg Drokin <green@whamcloud.com>
Mon, 16 Dec 2024 08:09:56 +0000 (08:09 +0000)
This patch changes struct lov_stripe_md to use
kref instead of atomic_t

Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com>
Change-Id: I8c743d630c268a70ecd0d5c9907e2ce456cd60cc
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/56104
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Timothy Day <timday@amazon.com>
Reviewed-by: Neil Brown <neilb@suse.de>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/lov/lov_ea.c
lustre/lov/lov_internal.h
lustre/lov/lov_object.c
lustre/lov/lov_pack.c

index 9eec5e0..8f55172 100644 (file)
@@ -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) {
index a9dd33c..0de5e21 100644 (file)
@@ -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;
 }
 
index ff12797..a9da801 100644 (file)
@@ -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);
        }
index ab2fb54..81c977b 100644 (file)
@@ -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);
 }
 
 /*