Lines Matching +full:add +full:- +full:disk
1 // SPDX-License-Identifier: GPL-2.0-only
12 #include "dm-core.h"
23 struct gendisk *disk = md->disk; in dm_blk_do_report_zones() local
35 if (WARN_ON_ONCE(!tgt->type->report_zones)) in dm_blk_do_report_zones()
36 return -EIO; in dm_blk_do_report_zones()
39 ret = tgt->type->report_zones(tgt, &args, in dm_blk_do_report_zones()
40 nr_zones - args.zone_idx); in dm_blk_do_report_zones()
44 args.next_sector < get_capacity(disk)); in dm_blk_do_report_zones()
54 int dm_blk_report_zones(struct gendisk *disk, sector_t sector, in dm_blk_report_zones() argument
57 struct mapped_device *md = disk->private_data; in dm_blk_report_zones()
61 if (!md->zone_revalidate_map) { in dm_blk_report_zones()
64 return -EAGAIN; in dm_blk_report_zones()
68 return -EIO; in dm_blk_report_zones()
71 map = md->zone_revalidate_map; in dm_blk_report_zones()
76 if (!md->zone_revalidate_map) in dm_blk_report_zones()
86 sector_t sector_diff = args->tgt->begin - args->start; in dm_report_zones_cb()
91 if (zone->start >= args->start + args->tgt->len) in dm_report_zones_cb()
98 zone->start += sector_diff; in dm_report_zones_cb()
99 if (zone->type != BLK_ZONE_TYPE_CONVENTIONAL) { in dm_report_zones_cb()
100 if (zone->cond == BLK_ZONE_COND_FULL) in dm_report_zones_cb()
101 zone->wp = zone->start + zone->len; in dm_report_zones_cb()
102 else if (zone->cond == BLK_ZONE_COND_EMPTY) in dm_report_zones_cb()
103 zone->wp = zone->start; in dm_report_zones_cb()
105 zone->wp += sector_diff; in dm_report_zones_cb()
108 args->next_sector = zone->start + zone->len; in dm_report_zones_cb()
109 return args->orig_cb(zone, args->zone_idx++, args->orig_data); in dm_report_zones_cb()
123 args->start = start; in dm_report_zones()
132 struct request_queue *q = md->queue; in dm_is_zone_write()
140 return !op_is_flush(bio->bi_opf) && bio_sectors(bio); in dm_is_zone_write()
154 struct mapped_device *md = t->md; in dm_revalidate_zones()
155 struct gendisk *disk = md->disk; in dm_revalidate_zones() local
158 if (!get_capacity(disk)) in dm_revalidate_zones()
162 if (!disk->nr_zones || disk->nr_zones != md->nr_zones) { in dm_revalidate_zones()
164 disk->disk_name, in dm_revalidate_zones()
166 md->nr_zones = 0; in dm_revalidate_zones()
169 if (md->nr_zones) in dm_revalidate_zones()
177 md->zone_revalidate_map = t; in dm_revalidate_zones()
178 ret = blk_revalidate_disk_zones(disk); in dm_revalidate_zones()
179 md->zone_revalidate_map = NULL; in dm_revalidate_zones()
186 md->nr_zones = disk->nr_zones; in dm_revalidate_zones()
195 return !bdev_is_zoned(dev->bdev); in device_not_zone_append_capable()
200 for (unsigned int i = 0; i < t->num_targets; i++) { in dm_table_supports_zone_append()
203 if (ti->emulate_zone_append) in dm_table_supports_zone_append()
206 if (!ti->type->iterate_devices || in dm_table_supports_zone_append()
207 ti->type->iterate_devices(ti, device_not_zone_append_capable, NULL)) in dm_table_supports_zone_append()
230 if (zone->type != BLK_ZONE_TYPE_CONVENTIONAL) { in dm_device_count_zones_cb()
231 zc->total_nr_seq_zones++; in dm_device_count_zones_cb()
232 if (zone->start >= zc->start && in dm_device_count_zones_cb()
233 zone->start < zc->start + zc->len) in dm_device_count_zones_cb()
234 zc->target_nr_seq_zones++; in dm_device_count_zones_cb()
245 ret = blkdev_report_zones(dev->bdev, 0, BLK_ALL_ZONES, in dm_device_count_zones()
250 return -EIO; in dm_device_count_zones()
265 struct gendisk *disk = dev->bdev->bd_disk; in device_get_zone_resource_limits() local
282 DMERR("Count %s zones failed %d", disk->disk_name, ret); in device_get_zone_resource_limits()
298 zlim->reliable_limits = false; in device_get_zone_resource_limits()
299 ti->zone_reset_all_supported = false; in device_get_zone_resource_limits()
306 max_active_zones = disk->queue->limits.max_active_zones; in device_get_zone_resource_limits()
309 zlim->lim->max_active_zones = in device_get_zone_resource_limits()
310 min_not_zero(max_active_zones, zlim->lim->max_active_zones); in device_get_zone_resource_limits()
312 max_open_zones = disk->queue->limits.max_open_zones; in device_get_zone_resource_limits()
315 zlim->lim->max_open_zones = in device_get_zone_resource_limits()
316 min_not_zero(max_open_zones, zlim->lim->max_open_zones); in device_get_zone_resource_limits()
323 zlim->mapped_nr_seq_zones += zc.target_nr_seq_zones; in device_get_zone_resource_limits()
331 struct mapped_device *md = t->md; in dm_set_zones_restrictions()
332 struct gendisk *disk = md->disk; in dm_set_zones_restrictions() local
344 clear_bit(DMF_EMULATE_ZONE_APPEND, &md->flags); in dm_set_zones_restrictions()
346 set_bit(DMF_EMULATE_ZONE_APPEND, &md->flags); in dm_set_zones_restrictions()
347 lim->max_hw_zone_append_sectors = 0; in dm_set_zones_restrictions()
355 for (unsigned int i = 0; i < t->num_targets; i++) { in dm_set_zones_restrictions()
364 ti->zone_reset_all_supported = true; in dm_set_zones_restrictions()
366 if (!ti->type->iterate_devices || in dm_set_zones_restrictions()
367 ti->type->iterate_devices(ti, in dm_set_zones_restrictions()
370 disk->disk_name); in dm_set_zones_restrictions()
371 return -ENODEV; in dm_set_zones_restrictions()
380 lim->max_open_zones = 0; in dm_set_zones_restrictions()
381 lim->max_active_zones = 0; in dm_set_zones_restrictions()
382 lim->max_hw_zone_append_sectors = 0; in dm_set_zones_restrictions()
383 lim->zone_write_granularity = 0; in dm_set_zones_restrictions()
384 lim->chunk_sectors = 0; in dm_set_zones_restrictions()
385 lim->features &= ~BLK_FEAT_ZONED; in dm_set_zones_restrictions()
386 clear_bit(DMF_EMULATE_ZONE_APPEND, &md->flags); in dm_set_zones_restrictions()
387 md->nr_zones = 0; in dm_set_zones_restrictions()
388 disk->nr_zones = 0; in dm_set_zones_restrictions()
401 if (!get_capacity(disk) && !zlim.reliable_limits) in dm_set_zones_restrictions()
403 disk->disk_name); in dm_set_zones_restrictions()
405 if (lim->features & BLK_FEAT_ZONED && in dm_set_zones_restrictions()
416 struct mapped_device *md = io->md; in dm_zone_endio()
417 struct gendisk *disk = md->disk; in dm_zone_endio() local
418 struct bio *orig_bio = io->orig_bio; in dm_zone_endio()
422 * and add that to the original bio sector position. in dm_zone_endio()
424 if (clone->bi_status == BLK_STS_OK && in dm_zone_endio()
426 sector_t mask = bdev_zone_sectors(disk->part0) - 1; in dm_zone_endio()
428 orig_bio->bi_iter.bi_sector += clone->bi_iter.bi_sector & mask; in dm_zone_endio()
438 * For an all-zones reset, ignore conventional, empty, read-only in dm_zone_need_reset_cb()
441 switch (zone->cond) { in dm_zone_need_reset_cb()
463 md->disk->disk_name); in dm_zone_get_reset_bitmap()
464 return -EIO; in dm_zone_get_reset_bitmap()