Lines Matching full:zone

27 		pr_err("Zone size larger than device capacity\n");  in null_init_zoned_dev()
35 pr_err("null_blk: zone capacity (%lu MB) larger than zone size (%lu MB)\n", in null_init_zoned_dev()
54 * released to avoid scheduling in atomic context. To guarantee zone in null_init_zoned_dev()
77 pr_info("zone_max_active limit disabled, limit >= zone count\n"); in null_init_zoned_dev()
87 pr_info("zone_max_open limit disabled, limit >= zone count\n"); in null_init_zoned_dev()
91 struct blk_zone *zone = &dev->zones[i]; in null_init_zoned_dev() local
93 zone->start = sector; in null_init_zoned_dev()
94 zone->len = dev->zone_size_sects; in null_init_zoned_dev()
95 zone->capacity = zone->len; in null_init_zoned_dev()
96 zone->wp = zone->start + zone->len; in null_init_zoned_dev()
97 zone->type = BLK_ZONE_TYPE_CONVENTIONAL; in null_init_zoned_dev()
98 zone->cond = BLK_ZONE_COND_NOT_WP; in null_init_zoned_dev()
104 struct blk_zone *zone = &dev->zones[i]; in null_init_zoned_dev() local
106 zone->start = zone->wp = sector; in null_init_zoned_dev()
107 if (zone->start + dev->zone_size_sects > dev_capacity_sects) in null_init_zoned_dev()
108 zone->len = dev_capacity_sects - zone->start; in null_init_zoned_dev()
110 zone->len = dev->zone_size_sects; in null_init_zoned_dev()
111 zone->capacity = in null_init_zoned_dev()
112 min_t(sector_t, zone->len, zone_capacity_sects); in null_init_zoned_dev()
113 zone->type = BLK_ZONE_TYPE_SEQWRITE_REQ; in null_init_zoned_dev()
114 zone->cond = BLK_ZONE_COND_EMPTY; in null_init_zoned_dev()
176 struct blk_zone zone; in null_report_zones() local
189 * Stacked DM target drivers will remap the zone information by in null_report_zones()
190 * modifying the zone information passed to the report callback. in null_report_zones()
191 * So use a local copy to avoid corruption of the device zone in null_report_zones()
195 memcpy(&zone, &dev->zones[zno], sizeof(struct blk_zone)); in null_report_zones()
198 error = cb(&zone, i, data); in null_report_zones()
208 * with the target zone already locked.
214 struct blk_zone *zone = &dev->zones[null_zone_no(dev, sector)]; in null_zone_valid_read_len() local
218 if (zone->type == BLK_ZONE_TYPE_CONVENTIONAL || in null_zone_valid_read_len()
219 sector + nr_sectors <= zone->wp) in null_zone_valid_read_len()
222 if (sector > zone->wp) in null_zone_valid_read_len()
225 return (zone->wp - sector) << SECTOR_SHIFT; in null_zone_valid_read_len()
228 static blk_status_t null_close_zone(struct nullb_device *dev, struct blk_zone *zone) in null_close_zone() argument
230 if (zone->type == BLK_ZONE_TYPE_CONVENTIONAL) in null_close_zone()
233 switch (zone->cond) { in null_close_zone()
249 if (zone->wp == zone->start) { in null_close_zone()
250 zone->cond = BLK_ZONE_COND_EMPTY; in null_close_zone()
252 zone->cond = BLK_ZONE_COND_CLOSED; in null_close_zone()
302 * This function matches the manage open zone resources function in the ZBC standard,
305 * The function determines if a zone can transition to implicit open or explicit open,
306 * while maintaining the max open zone (and max active zone) limit(s). It may close an
307 * implicit open zone in order to make additional zone resources available.
309 * ZBC states that an implicit open zone shall be closed only if there is not
311 * it is not certain that closing an implicit open zone will allow a new zone
314 static blk_status_t null_check_zone_resources(struct nullb_device *dev, struct blk_zone *zone) in null_check_zone_resources() argument
318 switch (zone->cond) { in null_check_zone_resources()
338 struct blk_zone *zone = &dev->zones[zno]; in null_zone_write() local
341 trace_nullb_zone_op(cmd, zno, zone->cond); in null_zone_write()
343 if (zone->type == BLK_ZONE_TYPE_CONVENTIONAL) { in null_zone_write()
351 switch (zone->cond) { in null_zone_write()
353 /* Cannot write to a full zone */ in null_zone_write()
358 ret = null_check_zone_resources(dev, zone); in null_zone_write()
366 /* Invalid zone condition */ in null_zone_write()
373 * Zone append writes are automatically issued at the write in null_zone_write()
378 sector = zone->wp; in null_zone_write()
383 } else if (sector != zone->wp) { in null_zone_write()
388 if (zone->wp + nr_sectors > zone->start + zone->capacity) { in null_zone_write()
393 if (zone->cond == BLK_ZONE_COND_CLOSED) { in null_zone_write()
396 } else if (zone->cond == BLK_ZONE_COND_EMPTY) { in null_zone_write()
399 if (zone->cond != BLK_ZONE_COND_EXP_OPEN) in null_zone_write()
400 zone->cond = BLK_ZONE_COND_IMP_OPEN; in null_zone_write()
404 * to avoid scheduling in atomic context. Zone operation atomicity is in null_zone_write()
416 zone->wp += nr_sectors; in null_zone_write()
417 if (zone->wp == zone->start + zone->capacity) { in null_zone_write()
418 if (zone->cond == BLK_ZONE_COND_EXP_OPEN) in null_zone_write()
420 else if (zone->cond == BLK_ZONE_COND_IMP_OPEN) in null_zone_write()
422 zone->cond = BLK_ZONE_COND_FULL; in null_zone_write()
432 static blk_status_t null_open_zone(struct nullb_device *dev, struct blk_zone *zone) in null_open_zone() argument
436 if (zone->type == BLK_ZONE_TYPE_CONVENTIONAL) in null_open_zone()
439 switch (zone->cond) { in null_open_zone()
444 ret = null_check_zone_resources(dev, zone); in null_open_zone()
452 ret = null_check_zone_resources(dev, zone); in null_open_zone()
462 zone->cond = BLK_ZONE_COND_EXP_OPEN; in null_open_zone()
468 static blk_status_t null_finish_zone(struct nullb_device *dev, struct blk_zone *zone) in null_finish_zone() argument
472 if (zone->type == BLK_ZONE_TYPE_CONVENTIONAL) in null_finish_zone()
475 switch (zone->cond) { in null_finish_zone()
480 ret = null_check_zone_resources(dev, zone); in null_finish_zone()
491 ret = null_check_zone_resources(dev, zone); in null_finish_zone()
500 zone->cond = BLK_ZONE_COND_FULL; in null_finish_zone()
501 zone->wp = zone->start + zone->len; in null_finish_zone()
506 static blk_status_t null_reset_zone(struct nullb_device *dev, struct blk_zone *zone) in null_reset_zone() argument
508 if (zone->type == BLK_ZONE_TYPE_CONVENTIONAL) in null_reset_zone()
511 switch (zone->cond) { in null_reset_zone()
530 zone->cond = BLK_ZONE_COND_EMPTY; in null_reset_zone()
531 zone->wp = zone->start; in null_reset_zone()
541 struct blk_zone *zone; in null_zone_mgmt() local
548 zone = &dev->zones[i]; in null_zone_mgmt()
549 if (zone->cond != BLK_ZONE_COND_EMPTY) { in null_zone_mgmt()
550 null_reset_zone(dev, zone); in null_zone_mgmt()
551 trace_nullb_zone_op(cmd, i, zone->cond); in null_zone_mgmt()
559 zone = &dev->zones[zone_no]; in null_zone_mgmt()
565 ret = null_reset_zone(dev, zone); in null_zone_mgmt()
568 ret = null_open_zone(dev, zone); in null_zone_mgmt()
571 ret = null_close_zone(dev, zone); in null_zone_mgmt()
574 ret = null_finish_zone(dev, zone); in null_zone_mgmt()
582 trace_nullb_zone_op(cmd, zone_no, zone->cond); in null_zone_mgmt()