Lines Matching refs:md
20 static int dm_blk_do_report_zones(struct mapped_device *md, struct dm_table *t, in dm_blk_do_report_zones() argument
24 struct gendisk *disk = md->disk; in dm_blk_do_report_zones()
58 struct mapped_device *md = disk->private_data; in dm_blk_report_zones() local
62 if (dm_suspended_md(md)) in dm_blk_report_zones()
65 map = dm_get_live_table(md, &srcu_idx); in dm_blk_report_zones()
69 ret = dm_blk_do_report_zones(md, map, sector, nr_zones, cb, data); in dm_blk_report_zones()
71 dm_put_live_table(md, srcu_idx); in dm_blk_report_zones()
124 bool dm_is_zone_write(struct mapped_device *md, struct bio *bio) in dm_is_zone_write() argument
126 struct request_queue *q = md->queue; in dm_is_zone_write()
141 void dm_cleanup_zoned_dev(struct mapped_device *md) in dm_cleanup_zoned_dev() argument
143 struct request_queue *q = md->queue; in dm_cleanup_zoned_dev()
152 kvfree(md->zwp_offset); in dm_cleanup_zoned_dev()
153 md->zwp_offset = NULL; in dm_cleanup_zoned_dev()
154 md->nr_zones = 0; in dm_cleanup_zoned_dev()
182 struct mapped_device *md = data; in dm_zone_revalidate_cb() local
183 struct request_queue *q = md->queue; in dm_zone_revalidate_cb()
205 if (!md->zwp_offset) { in dm_zone_revalidate_cb()
206 md->zwp_offset = in dm_zone_revalidate_cb()
209 if (!md->zwp_offset) in dm_zone_revalidate_cb()
212 md->zwp_offset[idx] = dm_get_zone_wp_offset(zone); in dm_zone_revalidate_cb()
230 static int dm_revalidate_zones(struct mapped_device *md, struct dm_table *t) in dm_revalidate_zones() argument
232 struct request_queue *q = md->queue; in dm_revalidate_zones()
240 if (!q->nr_zones || q->nr_zones != md->nr_zones) in dm_revalidate_zones()
241 dm_cleanup_zoned_dev(md); in dm_revalidate_zones()
242 if (md->nr_zones) in dm_revalidate_zones()
250 ret = dm_blk_do_report_zones(md, t, 0, q->nr_zones, in dm_revalidate_zones()
251 dm_zone_revalidate_cb, md); in dm_revalidate_zones()
260 md->nr_zones = q->nr_zones; in dm_revalidate_zones()
266 dm_cleanup_zoned_dev(md); in dm_revalidate_zones()
298 struct mapped_device *md = t->md; in dm_set_zones_restrictions() local
305 q->nr_zones = blkdev_nr_zones(md->disk); in dm_set_zones_restrictions()
309 clear_bit(DMF_EMULATE_ZONE_APPEND, &md->flags); in dm_set_zones_restrictions()
310 dm_cleanup_zoned_dev(md); in dm_set_zones_restrictions()
318 set_bit(DMF_EMULATE_ZONE_APPEND, &md->flags); in dm_set_zones_restrictions()
319 if (!get_capacity(md->disk)) in dm_set_zones_restrictions()
322 return dm_revalidate_zones(md, t); in dm_set_zones_restrictions()
335 static int dm_update_zone_wp_offset(struct mapped_device *md, unsigned int zno, in dm_update_zone_wp_offset() argument
338 sector_t sector = zno * blk_queue_zone_sectors(md->queue); in dm_update_zone_wp_offset()
343 t = dm_get_live_table(md, &srcu_idx); in dm_update_zone_wp_offset()
352 ret = dm_blk_do_report_zones(md, t, sector, 1, in dm_update_zone_wp_offset()
356 dm_put_live_table(md, srcu_idx); in dm_update_zone_wp_offset()
369 static bool dm_zone_map_bio_begin(struct mapped_device *md, in dm_zone_map_bio_begin() argument
372 sector_t zsectors = blk_queue_zone_sectors(md->queue); in dm_zone_map_bio_begin()
374 unsigned int zwp_offset = READ_ONCE(md->zwp_offset[zno]); in dm_zone_map_bio_begin()
383 if (dm_update_zone_wp_offset(md, zno, &zwp_offset)) in dm_zone_map_bio_begin()
385 WRITE_ONCE(md->zwp_offset[zno], zwp_offset); in dm_zone_map_bio_begin()
396 if (bdev_offset_from_zone_start(md->disk->part0, in dm_zone_map_bio_begin()
429 static blk_status_t dm_zone_map_bio_end(struct mapped_device *md, in dm_zone_map_bio_end() argument
434 unsigned int zwp_offset = READ_ONCE(md->zwp_offset[zno]); in dm_zone_map_bio_end()
443 WRITE_ONCE(md->zwp_offset[zno], 0); in dm_zone_map_bio_end()
446 WRITE_ONCE(md->zwp_offset[zno], in dm_zone_map_bio_end()
447 blk_queue_zone_sectors(md->queue)); in dm_zone_map_bio_end()
452 WRITE_ONCE(md->zwp_offset[zno], zwp_offset + nr_sectors); in dm_zone_map_bio_end()
463 WRITE_ONCE(md->zwp_offset[zno], zwp_offset + nr_sectors); in dm_zone_map_bio_end()
525 struct mapped_device *md = io->md; in dm_zone_map_bio() local
526 struct request_queue *q = md->queue; in dm_zone_map_bio()
548 if (!dm_zone_map_bio_begin(md, orig_bio, clone)) { in dm_zone_map_bio()
568 sts = dm_zone_map_bio_end(md, orig_bio, *tio->len_ptr); in dm_zone_map_bio()
576 sts = dm_zone_map_bio_end(md, orig_bio, *tio->len_ptr); in dm_zone_map_bio()
602 struct mapped_device *md = io->md; in dm_zone_endio() local
603 struct request_queue *q = md->queue; in dm_zone_endio()
612 if (!dm_emulate_zone_append(md)) { in dm_zone_endio()
643 WRITE_ONCE(md->zwp_offset[zno], DM_ZONE_INVALID_WP_OFST); in dm_zone_endio()
649 zwp_offset = READ_ONCE(md->zwp_offset[zno]); in dm_zone_endio()
651 WRITE_ONCE(md->zwp_offset[zno], in dm_zone_endio()