Whamcloud - gitweb
LU-18813 osd-wbcfs: use common rwsem for osd_object 17/59417/2
authorTimothy Day <timday@amazon.com>
Sun, 25 May 2025 02:47:12 +0000 (22:47 -0400)
committerOleg Drokin <green@whamcloud.com>
Thu, 12 Jun 2025 06:36:35 +0000 (06:36 +0000)
Use a common read/write semaphore for all osd_object
attributes.

Test-Parameters: trivial
Test-Parameters: testlist=sanity fstype=wbcfs mdscount=4 mdtcount=1 osscount=4 ostcount=1
Test-Parameters: testlist=sanity fstype=wbcfs combinedmdsmgs=false standalonemgs=true mdscount=1 mdtcount=1 osscount=4 ostcount=1
Signed-off-by: Timothy Day <timday@amazon.com>
Change-Id: I16678e57596365ce25d978e2b5a524fc4c21bf26
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/59417
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Lijing Chen <lijinc@amazon.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/osd-wbcfs/osd_handler.c
lustre/osd-wbcfs/osd_index_hash.c
lustre/osd-wbcfs/osd_internal.h
lustre/osd-wbcfs/osd_object.c

index 0320d28..4d3b509 100644 (file)
@@ -73,12 +73,11 @@ static struct lu_object *osd_object_alloc(const struct lu_env *env,
 
        l = &obj->oo_dt.do_lu;
        dt_object_init(&obj->oo_dt, NULL, d);
-       obj->oo_header = NULL;
        obj->oo_dt.do_ops = &osd_obj_ops;
        l->lo_ops = &osd_lu_obj_ops;
-       spin_lock_init(&obj->oo_guard);
        init_rwsem(&obj->oo_dt.dd_sem);
-       init_rwsem(&obj->oo_sem);
+       init_rwsem(&obj->oo_guard);
+
        return l;
 }
 
index 886e9a2..4565fd9 100644 (file)
@@ -33,9 +33,9 @@ static int osd_hash_index_lookup(const struct lu_env *env, struct dt_object *dt,
 
        ENTRY;
 
-       down_read(&obj->oo_sem);
+       down_read(&obj->oo_guard);
        rc = hash_index_lookup(hind, (void *)key, rec);
-       up_read(&obj->oo_sem);
+       up_read(&obj->oo_guard);
 
        RETURN(rc);
 }
@@ -51,9 +51,9 @@ osd_hash_index_insert(const struct lu_env *env, struct dt_object *dt,
 
        ENTRY;
 
-       down_write(&obj->oo_sem);
+       down_write(&obj->oo_guard);
        rc = hash_index_insert(hind, (void *)key, 0, (void *)rec, 0);
-       up_write(&obj->oo_sem);
+       up_write(&obj->oo_guard);
        RETURN(rc);
 }
 
@@ -65,9 +65,9 @@ static int osd_hash_index_delete(const struct lu_env *env, struct dt_object *dt,
 
        ENTRY;
 
-       down_write(&obj->oo_sem);
+       down_write(&obj->oo_guard);
        hash_index_remove(hind, (void *)key);
-       up_write(&obj->oo_sem);
+       up_write(&obj->oo_guard);
 
        RETURN(0);
 }
@@ -123,7 +123,7 @@ static int osd_hash_index_it_get(const struct lu_env *env, struct dt_it *di,
        hind = &MEMFS_I(obj->oo_inode)->mei_hash_index;
        keylen = hind->hi_htbl_params.key_len;
 
-       down_read(&obj->oo_sem);
+       down_read(&obj->oo_guard);
        list_for_each_entry(entry, &hind->hi_list, he_list_item) {
                if (memcmp(key, entry->he_buf, keylen) == 0) {
                        it->hit_cursor = &entry->he_list_item;
@@ -131,7 +131,7 @@ static int osd_hash_index_it_get(const struct lu_env *env, struct dt_it *di,
                        break;
                }
        }
-       up_read(&obj->oo_sem);
+       up_read(&obj->oo_guard);
 
        RETURN(rc);
 }
@@ -154,11 +154,11 @@ static int osd_hash_index_it_next(const struct lu_env *env, struct dt_it *di)
                RETURN(-ENOENT);
 
        hind = &MEMFS_I(obj->oo_inode)->mei_hash_index;
-       down_read(&obj->oo_sem);
+       down_read(&obj->oo_guard);
        it->hit_cursor = it->hit_cursor->next;
        if (it->hit_cursor == &hind->hi_list)
                rc = 1;
-       up_read(&obj->oo_sem);
+       up_read(&obj->oo_guard);
        RETURN(rc);
 }
 
index 5a8cff7..4084c30 100644 (file)
 
 struct osd_object {
        struct dt_object         oo_dt;
+
        /*
         * Inode in the memory FS for file system object represented by this
         * osd_object. This inode is pinned for the whole duration of the file
         * life.
         */
        struct inode            *oo_inode;
-       /* Used to implement osd_{read|write}_{lock|unlock}. */
-       struct rw_semaphore      oo_sem;
-       /* protects inode attributes. */
-       spinlock_t               oo_guard;
+       struct rw_semaphore      oo_guard;
+
        /* the i_flags in LMA */
        __u32                    oo_lma_flags;
        __u32                    oo_destroyed:1;
+
        struct lu_object_header *oo_header;
 };
 
index 4856f28..198e1f9 100644 (file)
@@ -211,7 +211,7 @@ static int osd_attr_get(const struct lu_env *env, struct dt_object *dt,
 
        LASSERT(!dt_object_remote(dt));
 
-       spin_lock(&obj->oo_guard);
+       down_read(&obj->oo_guard);
        osd_inode_getattr(env, obj->oo_inode, attr);
        if (obj->oo_lma_flags & LUSTRE_ORPHAN_FL) {
                attr->la_valid |= LA_FLAGS;
@@ -221,10 +221,12 @@ static int osd_attr_get(const struct lu_env *env, struct dt_object *dt,
                attr->la_valid |= LA_FLAGS;
                attr->la_flags |= LUSTRE_ENCRYPT_FL;
        }
-       spin_unlock(&obj->oo_guard);
+       up_read(&obj->oo_guard);
+
        CDEBUG(D_INFO, "%s: getattr "DFID" inode@%pK nlink=%d\n",
               osd_name(osd_obj2dev(obj)), PFID(lu_object_fid(&dt->do_lu)),
               obj->oo_inode, obj->oo_inode->i_nlink);
+
        return 0;
 }
 
@@ -309,9 +311,9 @@ static int osd_attr_set(const struct lu_env *env, struct dt_object *dt,
 
        LASSERT(!dt_object_remote(dt));
        inode = obj->oo_inode;
-       spin_lock(&obj->oo_guard);
+       down_write(&obj->oo_guard);
        rc = osd_inode_setattr(env, inode, attr);
-       spin_unlock(&obj->oo_guard);
+       up_write(&obj->oo_guard);
        if (rc)
                RETURN(rc);
 
@@ -654,9 +656,9 @@ static int osd_destroy(const struct lu_env *env, struct dt_object *dt,
                               osd_name(osd), PFID(fid), inode->i_ino,
                               inode->i_nlink);
 
-               spin_lock(&obj->oo_guard);
+               down_write(&obj->oo_guard);
                clear_nlink(inode);
-               spin_unlock(&obj->oo_guard);
+               up_write(&obj->oo_guard);
        }
 
        set_bit(LU_OBJECT_HEARD_BANSHEE, &dt->do_lu.lo_header->loh_flags);
@@ -699,13 +701,13 @@ static int osd_ref_add(const struct lu_env *env, struct dt_object *dt,
         * This also has to properly handle the case of inodes with nlink == 0
         * in case they are being linked into the PENDING directory
         */
-       spin_lock(&obj->oo_guard);
+       down_write(&obj->oo_guard);
        if (unlikely(inode->i_nlink == 0))
                /* inc_nlink from 0 may cause WARN_ON */
                set_nlink(inode, 1);
        else
                inc_nlink(inode);
-       spin_unlock(&obj->oo_guard);
+       up_write(&obj->oo_guard);
 
        return rc;
 }
@@ -729,12 +731,12 @@ static int osd_ref_del(const struct lu_env *env, struct dt_object *dt,
        if (CFS_FAIL_CHECK(OBD_FAIL_OSD_REF_DEL))
                return -EIO;
 
-       spin_lock(&obj->oo_guard);
+       down_write(&obj->oo_guard);
        if (inode->i_nlink == 0) {
                CDEBUG_LIMIT(fid_is_norm(lu_object_fid(&dt->do_lu)) ?
                             D_ERROR : D_INODE, "%s: nlink == 0 on "DFID".\n",
                             osd_name(osd), PFID(lu_object_fid(&dt->do_lu)));
-               spin_unlock(&obj->oo_guard);
+               up_write(&obj->oo_guard);
                return 0;
        }
 
@@ -743,7 +745,7 @@ static int osd_ref_del(const struct lu_env *env, struct dt_object *dt,
 
        if (!S_ISDIR(inode->i_mode) || inode->i_nlink > 2)
                drop_nlink(inode);
-       spin_unlock(&obj->oo_guard);
+       up_write(&obj->oo_guard);
 
        return 0;
 }