Lines Matching full:zone

17  * Zone BIO context.
21 struct dm_zone *zone; member
86 struct dm_zone *zone = bioctx->zone; in dmz_bio_endio() local
88 if (zone) { in dmz_bio_endio()
91 dmz_is_seq(zone)) in dmz_bio_endio()
92 set_bit(DMZ_SEQ_WRITE_ERR, &zone->flags); in dmz_bio_endio()
93 dmz_deactivate_zone(zone); in dmz_bio_endio()
116 static int dmz_submit_bio(struct dmz_target *dmz, struct dm_zone *zone, in dmz_submit_bio() argument
122 struct dmz_dev *dev = zone->dev; in dmz_submit_bio()
134 dmz_start_sect(dmz->metadata, zone) + dmz_blk2sect(chunk_block); in dmz_submit_bio()
144 if (bio_op(bio) == REQ_OP_WRITE && dmz_is_seq(zone)) in dmz_submit_bio()
145 zone->wp_block += nr_blocks; in dmz_submit_bio()
169 static int dmz_handle_read(struct dmz_target *dmz, struct dm_zone *zone, in dmz_handle_read() argument
180 if (!zone) { in dmz_handle_read()
185 DMDEBUG("(%s): READ chunk %llu -> %s zone %u, block %llu, %u blocks", in dmz_handle_read()
188 (dmz_is_rnd(zone) ? "RND" : in dmz_handle_read()
189 (dmz_is_cache(zone) ? "CACHE" : "SEQ")), in dmz_handle_read()
190 zone->id, in dmz_handle_read()
194 bzone = zone->bzone; in dmz_handle_read()
197 if (dmz_is_rnd(zone) || dmz_is_cache(zone) || in dmz_handle_read()
198 chunk_block < zone->wp_block) { in dmz_handle_read()
199 /* Test block validity in the data zone */ in dmz_handle_read()
200 ret = dmz_block_valid(zmd, zone, chunk_block); in dmz_handle_read()
204 /* Read data zone blocks */ in dmz_handle_read()
206 rzone = zone; in dmz_handle_read()
211 * No valid blocks found in the data zone. in dmz_handle_read()
212 * Check the buffer zone, if there is one. in dmz_handle_read()
219 /* Read buffer zone blocks */ in dmz_handle_read()
245 * Write blocks directly in a data zone, at the write pointer.
246 * If a buffer zone is assigned, invalidate the blocks written
250 struct dm_zone *zone, struct bio *bio, in dmz_handle_direct_write() argument
255 struct dm_zone *bzone = zone->bzone; in dmz_handle_direct_write()
258 if (dmz_is_readonly(zone)) in dmz_handle_direct_write()
262 ret = dmz_submit_bio(dmz, zone, bio, chunk_block, nr_blocks); in dmz_handle_direct_write()
267 * Validate the blocks in the data zone and invalidate in dmz_handle_direct_write()
268 * in the buffer zone, if there is one. in dmz_handle_direct_write()
270 ret = dmz_validate_blocks(zmd, zone, chunk_block, nr_blocks); in dmz_handle_direct_write()
278 * Write blocks in the buffer zone of @zone.
279 * If no buffer zone is assigned yet, get one.
280 * Called with @zone write locked.
283 struct dm_zone *zone, struct bio *bio, in dmz_handle_buffered_write() argument
291 /* Get the buffer zone. One will be allocated if needed */ in dmz_handle_buffered_write()
292 bzone = dmz_get_chunk_buffer(zmd, zone); in dmz_handle_buffered_write()
305 * Validate the blocks in the buffer zone in dmz_handle_buffered_write()
306 * and invalidate in the data zone. in dmz_handle_buffered_write()
309 if (ret == 0 && chunk_block < zone->wp_block) in dmz_handle_buffered_write()
310 ret = dmz_invalidate_blocks(zmd, zone, chunk_block, nr_blocks); in dmz_handle_buffered_write()
318 static int dmz_handle_write(struct dmz_target *dmz, struct dm_zone *zone, in dmz_handle_write() argument
325 if (!zone) in dmz_handle_write()
328 DMDEBUG("(%s): WRITE chunk %llu -> %s zone %u, block %llu, %u blocks", in dmz_handle_write()
331 (dmz_is_rnd(zone) ? "RND" : in dmz_handle_write()
332 (dmz_is_cache(zone) ? "CACHE" : "SEQ")), in dmz_handle_write()
333 zone->id, in dmz_handle_write()
336 if (dmz_is_rnd(zone) || dmz_is_cache(zone) || in dmz_handle_write()
337 chunk_block == zone->wp_block) { in dmz_handle_write()
339 * zone is a random zone or it is a sequential zone in dmz_handle_write()
340 * and the BIO is aligned to the zone write pointer: in dmz_handle_write()
341 * direct write the zone. in dmz_handle_write()
343 return dmz_handle_direct_write(dmz, zone, bio, in dmz_handle_write()
348 * This is an unaligned write in a sequential zone: in dmz_handle_write()
351 return dmz_handle_buffered_write(dmz, zone, bio, chunk_block, nr_blocks); in dmz_handle_write()
357 static int dmz_handle_discard(struct dmz_target *dmz, struct dm_zone *zone, in dmz_handle_discard() argument
367 if (!zone) in dmz_handle_discard()
370 if (dmz_is_readonly(zone)) in dmz_handle_discard()
373 DMDEBUG("(%s): DISCARD chunk %llu -> zone %u, block %llu, %u blocks", in dmz_handle_discard()
376 zone->id, in dmz_handle_discard()
380 * Invalidate blocks in the data zone and its in dmz_handle_discard()
381 * buffer zone if one is mapped. in dmz_handle_discard()
383 if (dmz_is_rnd(zone) || dmz_is_cache(zone) || in dmz_handle_discard()
384 chunk_block < zone->wp_block) in dmz_handle_discard()
385 ret = dmz_invalidate_blocks(zmd, zone, chunk_block, nr_blocks); in dmz_handle_discard()
386 if (ret == 0 && zone->bzone) in dmz_handle_discard()
387 ret = dmz_invalidate_blocks(zmd, zone->bzone, in dmz_handle_discard()
401 struct dm_zone *zone; in dmz_handle_bio() local
407 * Get the data zone mapping the chunk. There may be no in dmz_handle_bio()
409 + the zone returned will be set to active state. in dmz_handle_bio()
411 zone = dmz_get_chunk_mapping(zmd, dmz_bio_chunk(zmd, bio), in dmz_handle_bio()
413 if (IS_ERR(zone)) { in dmz_handle_bio()
414 ret = PTR_ERR(zone); in dmz_handle_bio()
419 if (zone) { in dmz_handle_bio()
420 dmz_activate_zone(zone); in dmz_handle_bio()
421 bioctx->zone = zone; in dmz_handle_bio()
422 dmz_reclaim_bio_acc(zone->dev->reclaim); in dmz_handle_bio()
427 ret = dmz_handle_read(dmz, zone, bio); in dmz_handle_bio()
430 ret = dmz_handle_write(dmz, zone, bio); in dmz_handle_bio()
434 ret = dmz_handle_discard(dmz, zone, bio); in dmz_handle_bio()
444 * is still valid, that is, that the zone used still has valid blocks. in dmz_handle_bio()
446 if (zone) in dmz_handle_bio()
447 dmz_put_chunk_mapping(zmd, zone); in dmz_handle_bio()
654 bioctx->zone = NULL; in dmz_map()
667 /* Split zone BIOs to fit entirely into a zone */ in dmz_map()
790 ti->error = "Zone nr sectors mismatch"; in dmz_fixup_devices()
893 /* Zone BIO */ in dmz_ctr()
929 ti->error = "Zone reclaim initialization failed"; in dmz_ctr()
1007 /* FS hint to try to align to the device zone size */ in dmz_io_hints()