On 11/7/24 14:40, Christoph Hellwig wrote: > As sparse rcu warnings got in my radar for something else, I did > run sparse over this and it complains. It will need the little > gem below to fix (and a rebase of the second patch). Otherwise the > series looks great and way better than my initial hack, thanks! OK. I will integrate this and send v2. > > diff --git a/block/blk-zoned.c b/block/blk-zoned.c > index 7a7855555d6d..bf4458b11720 100644 > --- a/block/blk-zoned.c > +++ b/block/blk-zoned.c > @@ -350,11 +350,12 @@ int blkdev_zone_mgmt_ioctl(struct block_device *bdev, blk_mode_t mode, > > static inline bool disk_zone_is_conv(struct gendisk *disk, sector_t sector) > { > + unsigned long *bitmap; > bool is_conv; > > rcu_read_lock(); > - is_conv = disk->conv_zones_bitmap && > - test_bit(disk_zone_no(disk, sector), disk->conv_zones_bitmap); > + bitmap = rcu_dereference(disk->conv_zones_bitmap); > + is_conv = bitmap && test_bit(disk_zone_no(disk, sector), bitmap); > rcu_read_unlock(); > > return is_conv; > @@ -1467,11 +1468,10 @@ static unsigned int disk_set_conv_zones_bitmap(struct gendisk *disk, > unsigned long flags; > > spin_lock_irqsave(&disk->zone_wplugs_lock, flags); > + if (bitmap) > + nr_conv_zones = bitmap_weight(bitmap, disk->nr_zones); > bitmap = rcu_replace_pointer(disk->conv_zones_bitmap, bitmap, > lockdep_is_held(&disk->zone_wplugs_lock)); > - if (disk->conv_zones_bitmap) > - nr_conv_zones = bitmap_weight(disk->conv_zones_bitmap, > - disk->nr_zones); > spin_unlock_irqrestore(&disk->zone_wplugs_lock, flags); > > kfree_rcu_mightsleep(bitmap); -- Damien Le Moal Western Digital Research