[PATCH] erofs: remove erofs_dev_context->rwsem
Bingwu Zhang <[email protected]>
| Newsgroups | org.ozlabs.lists.linux-erofs,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
From: Bingwu Zhang <[email protected]> devs->tree is only modified in initialization and destruction code paths and will never be concurrent with data reading. Thus there is no need to guard idr_alloc/idr_find with a rwsem. Signed-off-by: Bingwu Zhang <[email protected]> --- fs/erofs/data.c | 9 +-------- fs/erofs/internal.h | 1 - fs/erofs/super.c | 5 ----- 3 files changed, 1 insertion(+), 14 deletions(-) diff --git a/fs/erofs/data.c b/fs/erofs/data.c index 9aa48c8d67d1..49d62eac6eb4 100644 --- a/fs/erofs/data.c +++ b/fs/erofs/data.c @@ -216,21 +216,15 @@ int erofs_map_dev(struct super_block *sb, struct erofs_map_dev *map) erofs_fill_from_devinfo(map, sb, &EROFS_SB(sb)->dif0); map->m_bdev = sb->s_bdev; /* use s_bdev for the primary device */ if (map->m_deviceid) { - down_read(&devs->rwsem); dif = idr_find(&devs->tree, map->m_deviceid - 1); - if (!dif) { - up_read(&devs->rwsem); + if (!dif) return -ENODEV; - } if (devs->flatdev) { map->m_pa += erofs_pos(sb, dif->uniaddr); - up_read(&devs->rwsem); return 0; } erofs_fill_from_devinfo(map, sb, dif); - up_read(&devs->rwsem); } else if (devs->extra_devices && !devs->flatdev) { - down_read(&devs->rwsem); idr_for_each_entry(&devs->tree, dif, id) { if (!dif->uniaddr) continue; @@ -243,7 +237,6 @@ int erofs_map_dev(struct super_block *sb, struct erofs_map_dev *map) break; } } - up_read(&devs->rwsem); } return 0; } diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h index 57bd21859c65..811c160035ce 100644 --- a/fs/erofs/internal.h +++ b/fs/erofs/internal.h @@ -65,7 +65,6 @@ struct erofs_mount_opts { struct erofs_dev_context { struct idr tree; - struct rw_semaphore rwsem; unsigned int extra_devices; bool flatdev; diff --git a/fs/erofs/super.c b/fs/erofs/super.c index 9d8f862f309f..12ecdd4b85ac 100644 --- a/fs/erofs/super.c +++ b/fs/erofs/super.c @@ -215,7 +215,6 @@ static int erofs_scan_devices(struct super_block *sb, sbi->device_id_mask = roundup_pow_of_two(ondisk_extradevs + 1) - 1; pos = le16_to_cpu(dsb->devt_slotoff) * EROFS_DEVT_SLOT_SIZE; - down_read(&sbi->devs->rwsem); if (sbi->devs->extra_devices) { idr_for_each_entry(&sbi->devs->tree, dif, id) { err = erofs_init_device(&buf, sb, dif, &pos); @@ -242,7 +241,6 @@ static int erofs_scan_devices(struct super_block *sb, break; } } - up_read(&sbi->devs->rwsem); erofs_put_metabuf(&buf); return err; } @@ -489,9 +487,7 @@ static int erofs_fc_parse_param(struct fs_context *fc, kfree(dif); return -ENOMEM; } - down_write(&sbi->devs->rwsem); ret = idr_alloc(&sbi->devs->tree, dif, 0, 0, GFP_KERNEL); - up_write(&sbi->devs->rwsem); if (ret < 0) { kfree(dif->path); kfree(dif); @@ -850,7 +846,6 @@ static int erofs_init_fs_context(struct fs_context *fc) fc->s_fs_info = sbi; idr_init(&sbi->devs->tree); - init_rwsem(&sbi->devs->rwsem); erofs_default_options(sbi); fc->ops = &erofs_context_ops; return 0; --- base-commit: 3eb40771c00a8488fa6ed2cc1fe203477908bf38 change-id: 20260814-erofs-remove-rwsem-5a0982d5da80 Best regards, -- Bingwu Zhang <[email protected]>