Now that device mapper can handle resetting all zones of a mapped zoned device using REQ_OP_ZONE_RESET_ALL, all zoned block device drivers support this operation. With this, the request queue feature BLK_FEAT_ZONE_RESETALL is not necessary and the emulation code in blk-zone.c can be removed.
Unified · Split
| @@ -830,11 +830,8 @@ void submit_bio_noacct(struct bio *bio) · 829 unmodified lines | ||
| 830 | 830 | case REQ_OP_ZONE_OPEN: |
| 831 | 831 | case REQ_OP_ZONE_CLOSE: |
| 832 | 832 | case REQ_OP_ZONE_FINISH: |
| 833 | − if (!bdev_is_zoned(bio->bi_bdev)) | |
| 834 | − goto not_supported; | |
| 835 | − break; | |
| 836 | 833 | case REQ_OP_ZONE_RESET_ALL: |
| 837 | − if (!bdev_is_zoned(bio->bi_bdev) || !blk_queue_zone_resetall(q)) | |
| 834 | + if (!bdev_is_zoned(bio->bi_bdev)) | |
| 838 | 835 | goto not_supported; |
| 839 | 836 | break; |
| 840 | 837 | case REQ_OP_DRV_IN: |
| @@ -157,70 +157,6 @@ static inline unsigned long *blk_alloc_zone_bitmap(int node, · 156 unmodified lines | ||
| 157 | 157 | GFP_NOIO, node); |
| 158 | 158 | } |
| 159 | 159 | |
| 160 | −static int blk_zone_need_reset_cb(struct blk_zone *zone, unsigned int idx, | |
| 161 | − void *data) | |
| 162 | −{ | |
| 163 | − /* | |
| 164 | − * For an all-zones reset, ignore conventional, empty, read-only | |
| 165 | − * and offline zones. | |
| 166 | − */ | |
| 167 | − switch (zone->cond) { | |
| 168 | − case BLK_ZONE_COND_NOT_WP: | |
| 169 | − case BLK_ZONE_COND_EMPTY: | |
| 170 | − case BLK_ZONE_COND_READONLY: | |
| 171 | − case BLK_ZONE_COND_OFFLINE: | |
| 172 | − return 0; | |
| 173 | − default: | |
| 174 | − set_bit(idx, (unsigned long *)data); | |
| 175 | − return 0; | |
| 176 | − } | |
| 177 | −} | |
| 178 | − | |
| 179 | −static int blkdev_zone_reset_all_emulated(struct block_device *bdev) | |
| 180 | −{ | |
| 181 | − struct gendisk *disk = bdev->bd_disk; | |
| 182 | − sector_t capacity = bdev_nr_sectors(bdev); | |
| 183 | − sector_t zone_sectors = bdev_zone_sectors(bdev); | |
| 184 | − unsigned long *need_reset; | |
| 185 | − struct bio *bio = NULL; | |
| 186 | − sector_t sector = 0; | |
| 187 | − int ret; | |
| 188 | − | |
| 189 | − need_reset = blk_alloc_zone_bitmap(disk->queue->node, disk->nr_zones); | |
| 190 | − if (!need_reset) | |
| 191 | − return -ENOMEM; | |
| 192 | − | |
| 193 | − ret = disk->fops->report_zones(disk, 0, disk->nr_zones, | |
| 194 | − blk_zone_need_reset_cb, need_reset); | |
| 195 | − if (ret < 0) | |
| 196 | − goto out_free_need_reset; | |
| 197 | − | |
| 198 | − ret = 0; | |
| 199 | − while (sector < capacity) { | |
| 200 | − if (!test_bit(disk_zone_no(disk, sector), need_reset)) { | |
| 201 | − sector += zone_sectors; | |
| 202 | − continue; | |
| 203 | − } | |
| 204 | − | |
| 205 | − bio = blk_next_bio(bio, bdev, 0, REQ_OP_ZONE_RESET | REQ_SYNC, | |
| 206 | − GFP_KERNEL); | |
| 207 | − bio->bi_iter.bi_sector = sector; | |
| 208 | − sector += zone_sectors; | |
| 209 | − | |
| 210 | − /* This may take a while, so be nice to others */ | |
| 211 | − cond_resched(); | |
| 212 | − } | |
| 213 | − | |
| 214 | − if (bio) { | |
| 215 | − ret = submit_bio_wait(bio); | |
| 216 | − bio_put(bio); | |
| 217 | − } | |
| 218 | − | |
| 219 | −out_free_need_reset: | |
| 220 | − kfree(need_reset); | |
| 221 | − return ret; | |
| 222 | −} | |
| 223 | − | |
| 224 | 160 | static int blkdev_zone_reset_all(struct block_device *bdev) |
| 225 | 161 | { |
| 226 | 162 | struct bio bio; |
| @@ -247,7 +183,6 @@ static int blkdev_zone_reset_all(struct block_device *bdev) · 20 unmodified lines | ||
| 247 | 183 | int blkdev_zone_mgmt(struct block_device *bdev, enum req_op op, |
| 248 | 184 | sector_t sector, sector_t nr_sectors) |
| 249 | 185 | { |
| 250 | − struct request_queue *q = bdev_get_queue(bdev); | |
| 251 | 186 | sector_t zone_sectors = bdev_zone_sectors(bdev); |
| 252 | 187 | sector_t capacity = bdev_nr_sectors(bdev); |
| 253 | 188 | sector_t end_sector = sector + nr_sectors; |
| @@ -275,16 +210,11 @@ int blkdev_zone_mgmt(struct block_device *bdev, enum req_op op, · 21 unmodified lines | ||
| 275 | 210 | return -EINVAL; |
| 276 | 211 | |
| 277 | 212 | /* |
| 278 | − * In the case of a zone reset operation over all zones, | |
| 279 | − * REQ_OP_ZONE_RESET_ALL can be used with devices supporting this | |
| 280 | − * command. For other devices, we emulate this command behavior by | |
| 281 | − * identifying the zones needing a reset. | |
| 213 | + * In the case of a zone reset operation over all zones, use | |
| 214 | + * REQ_OP_ZONE_RESET_ALL. | |
| 282 | 215 | */ |
| 283 | − if (op == REQ_OP_ZONE_RESET && sector == 0 && nr_sectors == capacity) { | |
| 284 | − if (!blk_queue_zone_resetall(q)) | |
| 285 | − return blkdev_zone_reset_all_emulated(bdev); | |
| 216 | + if (op == REQ_OP_ZONE_RESET && sector == 0 && nr_sectors == capacity) | |
| 286 | 217 | return blkdev_zone_reset_all(bdev); |
| 287 | − } | |
| 288 | 218 | |
| 289 | 219 | while (sector < end_sector) { |
| 290 | 220 | bio = blk_next_bio(bio, bdev, 0, op | REQ_SYNC, GFP_KERNEL); |
| @@ -164,7 +164,7 @@ int null_init_zoned_dev(struct nullb_device *dev, · 163 unmodified lines | ||
| 164 | 164 | sector += dev->zone_size_sects; |
| 165 | 165 | } |
| 166 | 166 | |
| 167 | − lim->features |= BLK_FEAT_ZONED | BLK_FEAT_ZONE_RESETALL; | |
| 167 | + lim->features |= BLK_FEAT_ZONED; | |
| 168 | 168 | lim->chunk_sectors = dev->zone_size_sects; |
| 169 | 169 | lim->max_zone_append_sectors = dev->zone_append_max_sectors; |
| 170 | 170 | lim->max_open_zones = dev->zone_max_open; |
| @@ -2194,7 +2194,7 @@ static int ublk_ctrl_start_dev(struct ublk_device *ub, struct io_uring_cmd *cmd) · 2193 unmodified lines | ||
| 2194 | 2194 | if (!IS_ENABLED(CONFIG_BLK_DEV_ZONED)) |
| 2195 | 2195 | return -EOPNOTSUPP; |
| 2196 | 2196 | |
| 2197 | − lim.features |= BLK_FEAT_ZONED | BLK_FEAT_ZONE_RESETALL; | |
| 2197 | + lim.features |= BLK_FEAT_ZONED; | |
| 2198 | 2198 | lim.max_active_zones = p->max_active_zones; |
| 2199 | 2199 | lim.max_open_zones = p->max_open_zones; |
| 2200 | 2200 | lim.max_zone_append_sectors = p->max_zone_append_sectors; |
| @@ -728,7 +728,7 @@ static int virtblk_read_zoned_limits(struct virtio_blk *vblk, · 727 unmodified lines | ||
| 728 | 728 | |
| 729 | 729 | dev_dbg(&vdev->dev, "probing host-managed zoned device\n"); |
| 730 | 730 | |
| 731 | − lim->features |= BLK_FEAT_ZONED | BLK_FEAT_ZONE_RESETALL; | |
| 731 | + lim->features |= BLK_FEAT_ZONED; | |
| 732 | 732 | |
| 733 | 733 | virtio_cread(vdev, struct virtio_blk_config, |
| 734 | 734 | zoned.max_open_zones, &v); |
| @@ -108,7 +108,7 @@ free_data: · 107 unmodified lines | ||
| 108 | 108 | void nvme_update_zone_info(struct nvme_ns *ns, struct queue_limits *lim, |
| 109 | 109 | struct nvme_zone_info *zi) |
| 110 | 110 | { |
| 111 | − lim->features |= BLK_FEAT_ZONED | BLK_FEAT_ZONE_RESETALL; | |
| 111 | + lim->features |= BLK_FEAT_ZONED; | |
| 112 | 112 | lim->max_open_zones = zi->max_open_zones; |
| 113 | 113 | lim->max_active_zones = zi->max_active_zones; |
| 114 | 114 | lim->max_zone_append_sectors = ns->ctrl->max_zone_append; |
| @@ -599,7 +599,7 @@ int sd_zbc_read_zones(struct scsi_disk *sdkp, struct queue_limits *lim, · 598 unmodified lines | ||
| 599 | 599 | if (sdkp->device->type != TYPE_ZBC) |
| 600 | 600 | return 0; |
| 601 | 601 | |
| 602 | − lim->features |= BLK_FEAT_ZONED | BLK_FEAT_ZONE_RESETALL; | |
| 602 | + lim->features |= BLK_FEAT_ZONED; | |
| 603 | 603 | |
| 604 | 604 | /* |
| 605 | 605 | * Per ZBC and ZAC specifications, writes in sequential write required |
| @@ -318,9 +318,6 @@ typedef unsigned int __bitwise blk_features_t; · 317 unmodified lines | ||
| 318 | 318 | /* is a zoned device */ |
| 319 | 319 | #define BLK_FEAT_ZONED ((__force blk_features_t)(1u << 10)) |
| 320 | 320 | |
| 321 | −/* supports Zone Reset All */ | |
| 322 | −#define BLK_FEAT_ZONE_RESETALL ((__force blk_features_t)(1u << 11)) | |
| 323 | − | |
| 324 | 321 | /* supports PCI(e) p2p requests */ |
| 325 | 322 | #define BLK_FEAT_PCI_P2PDMA ((__force blk_features_t)(1u << 12)) |
| 326 | 323 | |
| @@ -618,8 +615,6 @@ void blk_queue_flag_clear(unsigned int flag, struct request_queue *q); · 291 unmodified lines | ||
| 618 | 615 | test_bit(QUEUE_FLAG_NOXMERGES, &(q)->queue_flags) |
| 619 | 616 | #define blk_queue_nonrot(q) (!((q)->limits.features & BLK_FEAT_ROTATIONAL)) |
| 620 | 617 | #define blk_queue_io_stat(q) ((q)->limits.features & BLK_FEAT_IO_STAT) |
| 621 | −#define blk_queue_zone_resetall(q) \ | |
| 622 | − ((q)->limits.features & BLK_FEAT_ZONE_RESETALL) | |
| 623 | 618 | #define blk_queue_dax(q) ((q)->limits.features & BLK_FEAT_DAX) |
| 624 | 619 | #define blk_queue_pci_p2pdma(q) ((q)->limits.features & BLK_FEAT_PCI_P2PDMA) |
| 625 | 620 | #ifdef CONFIG_BLK_RQ_ALLOC_TIME |