From: Timothy Day Date: Sun, 25 May 2025 02:47:12 +0000 (-0400) Subject: LU-18813 osd-wbcfs: use common rwsem for osd_object X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=refs%2Fchanges%2F17%2F59417%2F2;p=fs%2Flustre-release.git LU-18813 osd-wbcfs: use common rwsem for osd_object 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 Change-Id: I16678e57596365ce25d978e2b5a524fc4c21bf26 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/59417 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Lijing Chen Reviewed-by: Oleg Drokin --- diff --git a/lustre/osd-wbcfs/osd_handler.c b/lustre/osd-wbcfs/osd_handler.c index 0320d28..4d3b509 100644 --- a/lustre/osd-wbcfs/osd_handler.c +++ b/lustre/osd-wbcfs/osd_handler.c @@ -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; } diff --git a/lustre/osd-wbcfs/osd_index_hash.c b/lustre/osd-wbcfs/osd_index_hash.c index 886e9a2..4565fd9 100644 --- a/lustre/osd-wbcfs/osd_index_hash.c +++ b/lustre/osd-wbcfs/osd_index_hash.c @@ -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); } diff --git a/lustre/osd-wbcfs/osd_internal.h b/lustre/osd-wbcfs/osd_internal.h index 5a8cff7..4084c30 100644 --- a/lustre/osd-wbcfs/osd_internal.h +++ b/lustre/osd-wbcfs/osd_internal.h @@ -24,19 +24,19 @@ 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; }; diff --git a/lustre/osd-wbcfs/osd_object.c b/lustre/osd-wbcfs/osd_object.c index 4856f28..198e1f9 100644 --- a/lustre/osd-wbcfs/osd_object.c +++ b/lustre/osd-wbcfs/osd_object.c @@ -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; }