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()
135 dmz_start_sect(dmz->metadata, zone) + dmz_blk2sect(chunk_block); in dmz_submit_bio()
145 if (bio_op(bio) == REQ_OP_WRITE && dmz_is_seq(zone)) in dmz_submit_bio()
146 zone->wp_block += nr_blocks; in dmz_submit_bio()
170 static int dmz_handle_read(struct dmz_target *dmz, struct dm_zone *zone, in dmz_handle_read() argument
181 if (!zone) { in dmz_handle_read()
186 DMDEBUG("(%s): READ chunk %llu -> %s zone %u, block %llu, %u blocks", in dmz_handle_read()
189 (dmz_is_rnd(zone) ? "RND" : in dmz_handle_read()
190 (dmz_is_cache(zone) ? "CACHE" : "SEQ")), in dmz_handle_read()
191 zone->id, in dmz_handle_read()
195 bzone = zone->bzone; in dmz_handle_read()
198 if (dmz_is_rnd(zone) || dmz_is_cache(zone) || in dmz_handle_read()
199 chunk_block < zone->wp_block) { in dmz_handle_read()
200 /* Test block validity in the data zone */ in dmz_handle_read()
201 ret = dmz_block_valid(zmd, zone, chunk_block); in dmz_handle_read()
205 /* Read data zone blocks */ in dmz_handle_read()
207 rzone = zone; in dmz_handle_read()
212 * No valid blocks found in the data zone. in dmz_handle_read()
213 * Check the buffer zone, if there is one. in dmz_handle_read()
220 /* Read buffer zone blocks */ in dmz_handle_read()
246 * Write blocks directly in a data zone, at the write pointer.
247 * If a buffer zone is assigned, invalidate the blocks written
251 struct dm_zone *zone, struct bio *bio, in dmz_handle_direct_write() argument
256 struct dm_zone *bzone = zone->bzone; in dmz_handle_direct_write()
259 if (dmz_is_readonly(zone)) in dmz_handle_direct_write()
263 ret = dmz_submit_bio(dmz, zone, bio, chunk_block, nr_blocks); in dmz_handle_direct_write()
268 * Validate the blocks in the data zone and invalidate in dmz_handle_direct_write()
269 * in the buffer zone, if there is one. in dmz_handle_direct_write()
271 ret = dmz_validate_blocks(zmd, zone, chunk_block, nr_blocks); in dmz_handle_direct_write()
279 * Write blocks in the buffer zone of @zone.
280 * If no buffer zone is assigned yet, get one.
281 * Called with @zone write locked.
284 struct dm_zone *zone, struct bio *bio, in dmz_handle_buffered_write() argument
292 /* Get the buffer zone. One will be allocated if needed */ in dmz_handle_buffered_write()
293 bzone = dmz_get_chunk_buffer(zmd, zone); in dmz_handle_buffered_write()
306 * Validate the blocks in the buffer zone in dmz_handle_buffered_write()
307 * and invalidate in the data zone. in dmz_handle_buffered_write()
310 if (ret == 0 && chunk_block < zone->wp_block) in dmz_handle_buffered_write()
311 ret = dmz_invalidate_blocks(zmd, zone, chunk_block, nr_blocks); in dmz_handle_buffered_write()
319 static int dmz_handle_write(struct dmz_target *dmz, struct dm_zone *zone, in dmz_handle_write() argument
326 if (!zone) in dmz_handle_write()
329 DMDEBUG("(%s): WRITE chunk %llu -> %s zone %u, block %llu, %u blocks", in dmz_handle_write()
332 (dmz_is_rnd(zone) ? "RND" : in dmz_handle_write()
333 (dmz_is_cache(zone) ? "CACHE" : "SEQ")), in dmz_handle_write()
334 zone->id, in dmz_handle_write()
337 if (dmz_is_rnd(zone) || dmz_is_cache(zone) || in dmz_handle_write()
338 chunk_block == zone->wp_block) { in dmz_handle_write()
340 * zone is a random zone or it is a sequential zone in dmz_handle_write()
341 * and the BIO is aligned to the zone write pointer: in dmz_handle_write()
342 * direct write the zone. in dmz_handle_write()
344 return dmz_handle_direct_write(dmz, zone, bio, in dmz_handle_write()
349 * This is an unaligned write in a sequential zone: in dmz_handle_write()
352 return dmz_handle_buffered_write(dmz, zone, bio, chunk_block, nr_blocks); in dmz_handle_write()
358 static int dmz_handle_discard(struct dmz_target *dmz, struct dm_zone *zone, in dmz_handle_discard() argument
368 if (!zone) in dmz_handle_discard()
371 if (dmz_is_readonly(zone)) in dmz_handle_discard()
374 DMDEBUG("(%s): DISCARD chunk %llu -> zone %u, block %llu, %u blocks", in dmz_handle_discard()
377 zone->id, in dmz_handle_discard()
381 * Invalidate blocks in the data zone and its in dmz_handle_discard()
382 * buffer zone if one is mapped. in dmz_handle_discard()
384 if (dmz_is_rnd(zone) || dmz_is_cache(zone) || in dmz_handle_discard()
385 chunk_block < zone->wp_block) in dmz_handle_discard()
386 ret = dmz_invalidate_blocks(zmd, zone, chunk_block, nr_blocks); in dmz_handle_discard()
387 if (ret == 0 && zone->bzone) in dmz_handle_discard()
388 ret = dmz_invalidate_blocks(zmd, zone->bzone, in dmz_handle_discard()
402 struct dm_zone *zone; in dmz_handle_bio() local
408 * Get the data zone mapping the chunk. There may be no in dmz_handle_bio()
410 + the zone returned will be set to active state. in dmz_handle_bio()
412 zone = dmz_get_chunk_mapping(zmd, dmz_bio_chunk(zmd, bio), in dmz_handle_bio()
414 if (IS_ERR(zone)) { in dmz_handle_bio()
415 ret = PTR_ERR(zone); in dmz_handle_bio()
420 if (zone) { in dmz_handle_bio()
421 dmz_activate_zone(zone); in dmz_handle_bio()
422 bioctx->zone = zone; in dmz_handle_bio()
423 dmz_reclaim_bio_acc(zone->dev->reclaim); in dmz_handle_bio()
428 ret = dmz_handle_read(dmz, zone, bio); in dmz_handle_bio()
431 ret = dmz_handle_write(dmz, zone, bio); in dmz_handle_bio()
435 ret = dmz_handle_discard(dmz, zone, bio); in dmz_handle_bio()
445 * is still valid, that is, that the zone used still has valid blocks. in dmz_handle_bio()
447 if (zone) in dmz_handle_bio()
448 dmz_put_chunk_mapping(zmd, zone); in dmz_handle_bio()
655 bioctx->zone = NULL; in dmz_map()
668 /* Split zone BIOs to fit entirely into a zone */ in dmz_map()
793 ti->error = "Zone nr sectors mismatch"; in dmz_fixup_devices()
897 /* Zone BIO */ in dmz_ctr()
933 ti->error = "Zone reclaim initialization failed"; in dmz_ctr()
1013 /* FS hint to try to align to the device zone size */ in dmz_io_hints()