Lines Matching refs:data_vio
178 struct data_vio data_vios[];
242 static void initialize_lbn_lock(struct data_vio *data_vio, logical_block_number_t lbn) in initialize_lbn_lock() argument
244 struct vdo *vdo = vdo_from_data_vio(data_vio); in initialize_lbn_lock()
246 struct lbn_lock *lock = &data_vio->logical; in initialize_lbn_lock()
251 zone_number = vdo_compute_logical_zone(data_vio); in initialize_lbn_lock()
255 static void launch_locked_request(struct data_vio *data_vio) in launch_locked_request() argument
257 data_vio->logical.locked = true; in launch_locked_request()
258 if (data_vio->write) { in launch_locked_request()
259 struct vdo *vdo = vdo_from_data_vio(data_vio); in launch_locked_request()
262 continue_data_vio_with_error(data_vio, VDO_READ_ONLY); in launch_locked_request()
267 data_vio->last_async_operation = VIO_ASYNC_OP_FIND_BLOCK_MAP_SLOT; in launch_locked_request()
268 vdo_find_block_map_slot(data_vio); in launch_locked_request()
271 static void acknowledge_data_vio(struct data_vio *data_vio) in acknowledge_data_vio() argument
273 struct vdo *vdo = vdo_from_data_vio(data_vio); in acknowledge_data_vio()
274 struct bio *bio = data_vio->user_bio; in acknowledge_data_vio()
275 int error = vdo_status_to_errno(data_vio->vio.completion.result); in acknowledge_data_vio()
280 VDO_ASSERT_LOG_ONLY((data_vio->remaining_discard <= in acknowledge_data_vio()
281 (u32) (VDO_BLOCK_SIZE - data_vio->offset)), in acknowledge_data_vio()
284 data_vio->user_bio = NULL; in acknowledge_data_vio()
286 if (data_vio->is_partial) in acknowledge_data_vio()
304 struct data_vio_compression_status get_data_vio_compression_status(struct data_vio *data_vio) in get_data_vio_compression_status() argument
306 u32 packed = atomic_read(&data_vio->compression.status); in get_data_vio_compression_status()
338 set_data_vio_compression_status(struct data_vio *data_vio, in set_data_vio_compression_status() argument
351 actual = atomic_cmpxchg(&data_vio->compression.status, expected, replacement); in set_data_vio_compression_status()
357 struct data_vio_compression_status advance_data_vio_compression_stage(struct data_vio *data_vio) in advance_data_vio_compression_stage() argument
361 get_data_vio_compression_status(data_vio); in advance_data_vio_compression_stage()
380 if (set_data_vio_compression_status(data_vio, status, new_status)) in advance_data_vio_compression_stage()
392 bool cancel_data_vio_compression(struct data_vio *data_vio) in cancel_data_vio_compression() argument
397 status = get_data_vio_compression_status(data_vio); in cancel_data_vio_compression()
406 if (set_data_vio_compression_status(data_vio, status, new_status)) in cancel_data_vio_compression()
421 struct data_vio *data_vio = as_data_vio(completion); in attempt_logical_block_lock() local
422 struct lbn_lock *lock = &data_vio->logical; in attempt_logical_block_lock()
423 struct vdo *vdo = vdo_from_data_vio(data_vio); in attempt_logical_block_lock()
424 struct data_vio *lock_holder; in attempt_logical_block_lock()
427 assert_data_vio_in_logical_zone(data_vio); in attempt_logical_block_lock()
429 if (data_vio->logical.lbn >= vdo->states.vdo.config.logical_blocks) { in attempt_logical_block_lock()
430 continue_data_vio_with_error(data_vio, VDO_OUT_OF_RANGE); in attempt_logical_block_lock()
435 data_vio, false, (void **) &lock_holder); in attempt_logical_block_lock()
437 continue_data_vio_with_error(data_vio, result); in attempt_logical_block_lock()
443 launch_locked_request(data_vio); in attempt_logical_block_lock()
449 continue_data_vio_with_error(data_vio, result); in attempt_logical_block_lock()
461 if (!data_vio->write && READ_ONCE(lock_holder->allocation_succeeded)) { in attempt_logical_block_lock()
462 copy_to_bio(data_vio->user_bio, lock_holder->vio.data + data_vio->offset); in attempt_logical_block_lock()
463 acknowledge_data_vio(data_vio); in attempt_logical_block_lock()
468 data_vio->last_async_operation = VIO_ASYNC_OP_ATTEMPT_LOGICAL_BLOCK_LOCK; in attempt_logical_block_lock()
469 vdo_waitq_enqueue_waiter(&lock_holder->logical.waiters, &data_vio->waiter); in attempt_logical_block_lock()
476 data_vio->compression.lock_holder = lock_holder; in attempt_logical_block_lock()
477 launch_data_vio_packer_callback(data_vio, in attempt_logical_block_lock()
486 static void launch_data_vio(struct data_vio *data_vio, logical_block_number_t lbn) in launch_data_vio() argument
488 struct vdo_completion *completion = &data_vio->vio.completion; in launch_data_vio()
494 memset(&data_vio->tree_lock, 0, sizeof(data_vio->tree_lock)); in launch_data_vio()
495 initialize_lbn_lock(data_vio, lbn); in launch_data_vio()
496 INIT_LIST_HEAD(&data_vio->hash_lock_entry); in launch_data_vio()
497 INIT_LIST_HEAD(&data_vio->write_entry); in launch_data_vio()
499 memset(&data_vio->allocation, 0, sizeof(data_vio->allocation)); in launch_data_vio()
501 data_vio->is_duplicate = false; in launch_data_vio()
503 memset(&data_vio->record_name, 0, sizeof(data_vio->record_name)); in launch_data_vio()
504 memset(&data_vio->duplicate, 0, sizeof(data_vio->duplicate)); in launch_data_vio()
505 vdo_reset_completion(&data_vio->decrement_completion); in launch_data_vio()
508 set_data_vio_logical_callback(data_vio, attempt_logical_block_lock); in launch_data_vio()
535 static void launch_bio(struct vdo *vdo, struct data_vio *data_vio, struct bio *bio) in launch_bio() argument
542 memset(data_vio, 0, offsetof(struct data_vio, vio)); in launch_bio()
543 memset(&data_vio->compression, 0, offsetof(struct compression_state, block)); in launch_bio()
545 data_vio->user_bio = bio; in launch_bio()
546 data_vio->offset = to_bytes(bio->bi_iter.bi_sector & VDO_SECTORS_PER_BLOCK_MASK); in launch_bio()
547 data_vio->is_partial = (bio->bi_iter.bi_size < VDO_BLOCK_SIZE) || (data_vio->offset != 0); in launch_bio()
555 data_vio->remaining_discard = bio->bi_iter.bi_size; in launch_bio()
556 data_vio->write = true; in launch_bio()
557 data_vio->is_discard = true; in launch_bio()
558 if (data_vio->is_partial) { in launch_bio()
560 data_vio->read = true; in launch_bio()
562 } else if (data_vio->is_partial) { in launch_bio()
564 data_vio->read = true; in launch_bio()
566 data_vio->write = true; in launch_bio()
568 data_vio->read = true; in launch_bio()
574 copy_from_bio(bio, data_vio->vio.data); in launch_bio()
575 data_vio->is_zero = is_zero_block(data_vio->vio.data); in launch_bio()
576 data_vio->write = true; in launch_bio()
579 if (data_vio->user_bio->bi_opf & REQ_FUA) in launch_bio()
580 data_vio->fua = true; in launch_bio()
583 launch_data_vio(data_vio, lbn); in launch_bio()
586 static void assign_data_vio(struct limiter *limiter, struct data_vio *data_vio) in assign_data_vio() argument
590 launch_bio(limiter->pool->completion.vdo, data_vio, bio); in assign_data_vio()
612 static inline struct data_vio *get_available_data_vio(struct data_vio_pool *pool) in get_available_data_vio()
614 struct data_vio *data_vio = in get_available_data_vio() local
615 list_first_entry(&pool->available, struct data_vio, pool_entry); in get_available_data_vio()
617 list_del_init(&data_vio->pool_entry); in get_available_data_vio()
618 return data_vio; in get_available_data_vio()
672 struct data_vio *data_vio, in reuse_or_release_resources() argument
675 if (data_vio->remaining_discard > 0) { in reuse_or_release_resources()
685 assign_data_vio(&pool->limiter, data_vio); in reuse_or_release_resources()
687 assign_data_vio(&pool->discard_limiter, data_vio); in reuse_or_release_resources()
689 list_add(&data_vio->pool_entry, returned); in reuse_or_release_resources()
721 struct data_vio *data_vio; in process_release_callback() local
727 data_vio = as_data_vio(container_of(entry, struct vdo_completion, in process_release_callback()
729 acknowledge_data_vio(data_vio); in process_release_callback()
730 reuse_or_release_resources(pool, data_vio, &returned); in process_release_callback()
787 static int initialize_data_vio(struct data_vio *data_vio, struct vdo *vdo) in initialize_data_vio() argument
794 &data_vio->vio.data); in initialize_data_vio()
800 &data_vio->compression.block); in initialize_data_vio()
807 &data_vio->scratch_block); in initialize_data_vio()
817 vdo_initialize_completion(&data_vio->decrement_completion, vdo, in initialize_data_vio()
819 initialize_vio(&data_vio->vio, bio, 1, VIO_TYPE_DATA, VIO_PRIORITY_DATA, vdo); in initialize_data_vio()
824 static void destroy_data_vio(struct data_vio *data_vio) in destroy_data_vio() argument
826 if (data_vio == NULL) in destroy_data_vio()
829 vdo_free_bio(vdo_forget(data_vio->vio.bio)); in destroy_data_vio()
830 vdo_free(vdo_forget(data_vio->vio.data)); in destroy_data_vio()
831 vdo_free(vdo_forget(data_vio->compression.block)); in destroy_data_vio()
832 vdo_free(vdo_forget(data_vio->scratch_block)); in destroy_data_vio()
849 result = vdo_allocate_extended(struct data_vio_pool, pool_size, struct data_vio, in make_data_vio_pool()
876 struct data_vio *data_vio = &pool->data_vios[i]; in make_data_vio_pool() local
878 result = initialize_data_vio(data_vio, vdo); in make_data_vio_pool()
880 destroy_data_vio(data_vio); in make_data_vio_pool()
885 list_add(&data_vio->pool_entry, &pool->available); in make_data_vio_pool()
899 struct data_vio *data_vio, *tmp; in free_data_vio_pool() local
923 list_for_each_entry_safe(data_vio, tmp, &pool->available, pool_entry) { in free_data_vio_pool()
924 list_del_init(&data_vio->pool_entry); in free_data_vio_pool()
925 destroy_data_vio(data_vio); in free_data_vio_pool()
963 struct data_vio *data_vio; in vdo_launch_bio() local
981 data_vio = get_available_data_vio(pool); in vdo_launch_bio()
983 launch_bio(pool->completion.vdo, data_vio, bio); in vdo_launch_bio()
1060 struct data_vio *data_vio = &pool->data_vios[i]; in dump_data_vio_pool() local
1062 if (!list_empty(&data_vio->pool_entry)) in dump_data_vio_pool()
1065 dump_data_vio(data_vio); in dump_data_vio_pool()
1093 static void update_data_vio_error_stats(struct data_vio *data_vio) in update_data_vio_error_stats() argument
1106 if (data_vio->read) in update_data_vio_error_stats()
1109 if (data_vio->write) in update_data_vio_error_stats()
1112 if (data_vio->fua) in update_data_vio_error_stats()
1115 update_vio_error_stats(&data_vio->vio, in update_data_vio_error_stats()
1118 (unsigned long long) data_vio->logical.lbn, in update_data_vio_error_stats()
1119 get_data_vio_operation_name(data_vio)); in update_data_vio_error_stats()
1122 static void perform_cleanup_stage(struct data_vio *data_vio,
1131 struct data_vio *data_vio = as_data_vio(completion); in release_allocated_lock() local
1133 assert_data_vio_in_allocated_zone(data_vio); in release_allocated_lock()
1134 release_data_vio_allocation_lock(data_vio, false); in release_allocated_lock()
1135 perform_cleanup_stage(data_vio, VIO_RELEASE_RECOVERY_LOCKS); in release_allocated_lock()
1139 static void release_lock(struct data_vio *data_vio, struct lbn_lock *lock) in release_lock() argument
1142 struct data_vio *lock_holder; in release_lock()
1146 struct data_vio *lock_holder = vdo_int_map_get(lock_map, lock->lbn); in release_lock()
1148 VDO_ASSERT_LOG_ONLY((data_vio != lock_holder), in release_lock()
1156 VDO_ASSERT_LOG_ONLY((data_vio == lock_holder), in release_lock()
1163 static void transfer_lock(struct data_vio *data_vio, struct lbn_lock *lock) in transfer_lock() argument
1165 struct data_vio *lock_holder, *next_lock_holder; in transfer_lock()
1185 VDO_ASSERT_LOG_ONLY((lock_holder == data_vio), in transfer_lock()
1211 struct data_vio *data_vio = as_data_vio(completion); in release_logical_lock() local
1212 struct lbn_lock *lock = &data_vio->logical; in release_logical_lock()
1214 assert_data_vio_in_logical_zone(data_vio); in release_logical_lock()
1217 transfer_lock(data_vio, lock); in release_logical_lock()
1219 release_lock(data_vio, lock); in release_logical_lock()
1221 vdo_release_flush_generation_lock(data_vio); in release_logical_lock()
1222 perform_cleanup_stage(data_vio, VIO_CLEANUP_DONE); in release_logical_lock()
1228 struct data_vio *data_vio = as_data_vio(completion); in clean_hash_lock() local
1230 assert_data_vio_in_hash_zone(data_vio); in clean_hash_lock()
1232 vdo_clean_failed_hash_lock(data_vio); in clean_hash_lock()
1236 vdo_release_hash_lock(data_vio); in clean_hash_lock()
1237 perform_cleanup_stage(data_vio, VIO_RELEASE_LOGICAL); in clean_hash_lock()
1246 static void finish_cleanup(struct data_vio *data_vio) in finish_cleanup() argument
1248 struct vdo_completion *completion = &data_vio->vio.completion; in finish_cleanup()
1249 u32 discard_size = min_t(u32, data_vio->remaining_discard, in finish_cleanup()
1250 VDO_BLOCK_SIZE - data_vio->offset); in finish_cleanup()
1252 VDO_ASSERT_LOG_ONLY(data_vio->allocation.lock == NULL, in finish_cleanup()
1254 VDO_ASSERT_LOG_ONLY(data_vio->hash_lock == NULL, in finish_cleanup()
1256 if ((data_vio->remaining_discard <= discard_size) || in finish_cleanup()
1265 data_vio->remaining_discard -= discard_size; in finish_cleanup()
1266 data_vio->is_partial = (data_vio->remaining_discard < VDO_BLOCK_SIZE); in finish_cleanup()
1267 data_vio->read = data_vio->is_partial; in finish_cleanup()
1268 data_vio->offset = 0; in finish_cleanup()
1270 data_vio->first_reference_operation_complete = false; in finish_cleanup()
1271 launch_data_vio(data_vio, data_vio->logical.lbn + 1); in finish_cleanup()
1275 static void perform_cleanup_stage(struct data_vio *data_vio, in perform_cleanup_stage() argument
1278 struct vdo *vdo = vdo_from_data_vio(data_vio); in perform_cleanup_stage()
1282 if (data_vio->hash_lock != NULL) { in perform_cleanup_stage()
1283 launch_data_vio_hash_zone_callback(data_vio, clean_hash_lock); in perform_cleanup_stage()
1289 if (data_vio_has_allocation(data_vio)) { in perform_cleanup_stage()
1290 launch_data_vio_allocated_zone_callback(data_vio, in perform_cleanup_stage()
1297 if ((data_vio->recovery_sequence_number > 0) && in perform_cleanup_stage()
1299 (data_vio->vio.completion.result != VDO_READ_ONLY)) in perform_cleanup_stage()
1304 launch_data_vio_logical_callback(data_vio, release_logical_lock); in perform_cleanup_stage()
1308 finish_cleanup(data_vio); in perform_cleanup_stage()
1314 struct data_vio *data_vio = as_data_vio(completion); in complete_data_vio() local
1317 data_vio->last_async_operation = VIO_ASYNC_OP_CLEANUP; in complete_data_vio()
1318 perform_cleanup_stage(data_vio, in complete_data_vio()
1319 (data_vio->write ? VIO_CLEANUP_START : VIO_RELEASE_LOGICAL)); in complete_data_vio()
1328 struct data_vio *data_vio = as_data_vio(completion); in enter_read_only_mode() local
1332 (unsigned long long) data_vio->logical.lbn, in enter_read_only_mode()
1333 (unsigned long long) data_vio->new_mapped.pbn, in enter_read_only_mode()
1334 (unsigned long long) data_vio->mapped.pbn, in enter_read_only_mode()
1335 (unsigned long long) data_vio->allocation.pbn, in enter_read_only_mode()
1336 get_data_vio_operation_name(data_vio)); in enter_read_only_mode()
1344 struct data_vio *data_vio = as_data_vio(completion); in handle_data_vio_error() local
1346 if ((completion->result == VDO_READ_ONLY) || (data_vio->user_bio == NULL)) in handle_data_vio_error()
1349 update_data_vio_error_stats(data_vio); in handle_data_vio_error()
1357 const char *get_data_vio_operation_name(struct data_vio *data_vio) in get_data_vio_operation_name() argument
1362 return ((data_vio->last_async_operation < MAX_VIO_ASYNC_OPERATION_NUMBER) ? in get_data_vio_operation_name()
1363 ASYNC_OPERATION_NAMES[data_vio->last_async_operation] : in get_data_vio_operation_name()
1375 void data_vio_allocate_data_block(struct data_vio *data_vio, in data_vio_allocate_data_block() argument
1379 struct allocation *allocation = &data_vio->allocation; in data_vio_allocate_data_block()
1384 allocation->zone = vdo_get_next_allocation_zone(data_vio->logical.zone); in data_vio_allocate_data_block()
1387 data_vio->vio.completion.error_handler = error_handler; in data_vio_allocate_data_block()
1388 launch_data_vio_allocated_zone_callback(data_vio, callback); in data_vio_allocate_data_block()
1397 void release_data_vio_allocation_lock(struct data_vio *data_vio, bool reset) in release_data_vio_allocation_lock() argument
1399 struct allocation *allocation = &data_vio->allocation; in release_data_vio_allocation_lock()
1402 assert_data_vio_in_allocated_zone(data_vio); in release_data_vio_allocation_lock()
1416 int uncompress_data_vio(struct data_vio *data_vio, in uncompress_data_vio() argument
1421 struct compressed_block *block = data_vio->compression.block; in uncompress_data_vio()
1448 struct data_vio *data_vio = as_data_vio(completion); in modify_for_partial_write() local
1449 char *data = data_vio->vio.data; in modify_for_partial_write()
1450 struct bio *bio = data_vio->user_bio; in modify_for_partial_write()
1452 assert_data_vio_on_cpu_thread(data_vio); in modify_for_partial_write()
1455 memset(data + data_vio->offset, '\0', min_t(u32, in modify_for_partial_write()
1456 data_vio->remaining_discard, in modify_for_partial_write()
1457 VDO_BLOCK_SIZE - data_vio->offset)); in modify_for_partial_write()
1459 copy_from_bio(bio, data + data_vio->offset); in modify_for_partial_write()
1462 data_vio->is_zero = is_zero_block(data); in modify_for_partial_write()
1463 data_vio->read = false; in modify_for_partial_write()
1464 launch_data_vio_logical_callback(data_vio, in modify_for_partial_write()
1470 struct data_vio *data_vio = as_data_vio(completion); in complete_read() local
1471 char *data = data_vio->vio.data; in complete_read()
1472 bool compressed = vdo_is_state_compressed(data_vio->mapped.state); in complete_read()
1474 assert_data_vio_on_cpu_thread(data_vio); in complete_read()
1477 int result = uncompress_data_vio(data_vio, data_vio->mapped.state, data); in complete_read()
1480 continue_data_vio_with_error(data_vio, result); in complete_read()
1485 if (data_vio->write) { in complete_read()
1490 if (compressed || data_vio->is_partial) in complete_read()
1491 copy_to_bio(data_vio->user_bio, data + data_vio->offset); in complete_read()
1493 acknowledge_data_vio(data_vio); in complete_read()
1499 struct data_vio *data_vio = vio_as_data_vio(bio->bi_private); in read_endio() local
1504 continue_data_vio_with_error(data_vio, result); in read_endio()
1508 launch_data_vio_cpu_callback(data_vio, complete_read, in read_endio()
1514 struct data_vio *data_vio = as_data_vio(completion); in complete_zero_read() local
1516 assert_data_vio_on_cpu_thread(data_vio); in complete_zero_read()
1518 if (data_vio->is_partial) { in complete_zero_read()
1519 memset(data_vio->vio.data, 0, VDO_BLOCK_SIZE); in complete_zero_read()
1520 if (data_vio->write) { in complete_zero_read()
1525 zero_fill_bio(data_vio->user_bio); in complete_zero_read()
1538 struct data_vio *data_vio = as_data_vio(completion); in read_block() local
1542 if (data_vio->mapped.pbn == VDO_ZERO_BLOCK) { in read_block()
1543 launch_data_vio_cpu_callback(data_vio, complete_zero_read, in read_block()
1548 data_vio->last_async_operation = VIO_ASYNC_OP_READ_DATA_VIO; in read_block()
1549 if (vdo_is_state_compressed(data_vio->mapped.state)) { in read_block()
1550 result = vio_reset_bio(vio, (char *) data_vio->compression.block, in read_block()
1551 read_endio, REQ_OP_READ, data_vio->mapped.pbn); in read_block()
1553 blk_opf_t opf = ((data_vio->user_bio->bi_opf & PASSTHROUGH_FLAGS) | REQ_OP_READ); in read_block()
1555 if (data_vio->is_partial) { in read_block()
1557 data_vio->mapped.pbn); in read_block()
1561 bio_init_clone(data_vio->user_bio->bi_bdev, vio->bio, in read_block()
1562 data_vio->user_bio, GFP_KERNEL); in read_block()
1566 data_vio->mapped.pbn); in read_block()
1571 continue_data_vio_with_error(data_vio, result); in read_block()
1575 vdo_submit_data_vio(data_vio); in read_block()
1578 static inline struct data_vio *
1584 return container_of(completion, struct data_vio, decrement_completion); in reference_count_update_completion_as_data_vio()
1595 struct data_vio *data_vio = reference_count_update_completion_as_data_vio(completion); in update_block_map() local
1597 assert_data_vio_in_logical_zone(data_vio); in update_block_map()
1599 if (!data_vio->first_reference_operation_complete) { in update_block_map()
1601 data_vio->first_reference_operation_complete = true; in update_block_map()
1605 completion = &data_vio->vio.completion; in update_block_map()
1606 vdo_set_completion_result(completion, data_vio->decrement_completion.result); in update_block_map()
1613 if (data_vio->hash_lock != NULL) in update_block_map()
1614 set_data_vio_hash_zone_callback(data_vio, vdo_continue_hash_lock); in update_block_map()
1618 data_vio->last_async_operation = VIO_ASYNC_OP_PUT_MAPPED_BLOCK; in update_block_map()
1619 vdo_put_mapped_block(data_vio); in update_block_map()
1624 struct data_vio *data_vio = container_of(completion, struct data_vio, in decrement_reference_count() local
1627 assert_data_vio_in_mapped_zone(data_vio); in decrement_reference_count()
1630 data_vio->logical.zone->thread_id); in decrement_reference_count()
1632 vdo_modify_reference_count(completion, &data_vio->decrement_updater); in decrement_reference_count()
1637 struct data_vio *data_vio = as_data_vio(completion); in increment_reference_count() local
1639 assert_data_vio_in_new_mapped_zone(data_vio); in increment_reference_count()
1641 if (data_vio->downgrade_allocation_lock) { in increment_reference_count()
1649 vdo_downgrade_pbn_write_lock(data_vio->allocation.lock, false); in increment_reference_count()
1652 set_data_vio_logical_callback(data_vio, update_block_map); in increment_reference_count()
1654 vdo_modify_reference_count(completion, &data_vio->increment_updater); in increment_reference_count()
1660 struct data_vio *data_vio = as_data_vio(completion); in journal_remapping() local
1662 assert_data_vio_in_journal_zone(data_vio); in journal_remapping()
1664 data_vio->decrement_updater.operation = VDO_JOURNAL_DATA_REMAPPING; in journal_remapping()
1665 data_vio->decrement_updater.zpbn = data_vio->mapped; in journal_remapping()
1666 if (data_vio->new_mapped.pbn == VDO_ZERO_BLOCK) { in journal_remapping()
1667 data_vio->first_reference_operation_complete = true; in journal_remapping()
1668 if (data_vio->mapped.pbn == VDO_ZERO_BLOCK) in journal_remapping()
1669 set_data_vio_logical_callback(data_vio, update_block_map); in journal_remapping()
1671 set_data_vio_new_mapped_zone_callback(data_vio, in journal_remapping()
1675 if (data_vio->mapped.pbn == VDO_ZERO_BLOCK) { in journal_remapping()
1676 data_vio->first_reference_operation_complete = true; in journal_remapping()
1678 vdo_set_completion_callback(&data_vio->decrement_completion, in journal_remapping()
1680 data_vio->mapped.zone->thread_id); in journal_remapping()
1683 data_vio->last_async_operation = VIO_ASYNC_OP_JOURNAL_REMAPPING; in journal_remapping()
1684 vdo_add_recovery_journal_entry(completion->vdo->recovery_journal, data_vio); in journal_remapping()
1695 struct data_vio *data_vio = as_data_vio(completion); in read_old_block_mapping() local
1697 assert_data_vio_in_logical_zone(data_vio); in read_old_block_mapping()
1699 data_vio->last_async_operation = VIO_ASYNC_OP_GET_MAPPED_BLOCK_FOR_WRITE; in read_old_block_mapping()
1700 set_data_vio_journal_callback(data_vio, journal_remapping); in read_old_block_mapping()
1701 vdo_get_mapped_block(data_vio); in read_old_block_mapping()
1704 void update_metadata_for_data_vio_write(struct data_vio *data_vio, struct pbn_lock *lock) in update_metadata_for_data_vio_write() argument
1706 data_vio->increment_updater = (struct reference_updater) { in update_metadata_for_data_vio_write()
1709 .zpbn = data_vio->new_mapped, in update_metadata_for_data_vio_write()
1713 launch_data_vio_logical_callback(data_vio, read_old_block_mapping); in update_metadata_for_data_vio_write()
1723 struct data_vio *data_vio = as_data_vio(completion); in pack_compressed_data() local
1725 assert_data_vio_in_packer_zone(data_vio); in pack_compressed_data()
1727 if (!vdo_get_compressing(vdo_from_data_vio(data_vio)) || in pack_compressed_data()
1728 get_data_vio_compression_status(data_vio).may_not_compress) { in pack_compressed_data()
1729 write_data_vio(data_vio); in pack_compressed_data()
1733 data_vio->last_async_operation = VIO_ASYNC_OP_ATTEMPT_PACKING; in pack_compressed_data()
1734 vdo_attempt_packing(data_vio); in pack_compressed_data()
1744 struct data_vio *data_vio = as_data_vio(completion); in compress_data_vio() local
1747 assert_data_vio_on_cpu_thread(data_vio); in compress_data_vio()
1753 size = LZ4_compress_default(data_vio->vio.data, in compress_data_vio()
1754 data_vio->compression.block->data, VDO_BLOCK_SIZE, in compress_data_vio()
1758 data_vio->compression.size = size; in compress_data_vio()
1759 launch_data_vio_packer_callback(data_vio, pack_compressed_data); in compress_data_vio()
1763 write_data_vio(data_vio); in compress_data_vio()
1771 void launch_compress_data_vio(struct data_vio *data_vio) in launch_compress_data_vio() argument
1773 VDO_ASSERT_LOG_ONLY(!data_vio->is_duplicate, "compressing a non-duplicate block"); in launch_compress_data_vio()
1774 VDO_ASSERT_LOG_ONLY(data_vio->hash_lock != NULL, in launch_compress_data_vio()
1776 VDO_ASSERT_LOG_ONLY(data_vio_has_allocation(data_vio), in launch_compress_data_vio()
1794 if (data_vio->fua || in launch_compress_data_vio()
1795 !vdo_get_compressing(vdo_from_data_vio(data_vio)) || in launch_compress_data_vio()
1796 ((data_vio->user_bio != NULL) && (bio_op(data_vio->user_bio) == REQ_OP_DISCARD)) || in launch_compress_data_vio()
1797 (advance_data_vio_compression_stage(data_vio).stage != DATA_VIO_COMPRESSING)) { in launch_compress_data_vio()
1798 write_data_vio(data_vio); in launch_compress_data_vio()
1802 data_vio->last_async_operation = VIO_ASYNC_OP_COMPRESS_DATA_VIO; in launch_compress_data_vio()
1803 launch_data_vio_cpu_callback(data_vio, compress_data_vio, in launch_compress_data_vio()
1815 struct data_vio *data_vio = as_data_vio(completion); in hash_data_vio() local
1817 assert_data_vio_on_cpu_thread(data_vio); in hash_data_vio()
1818 VDO_ASSERT_LOG_ONLY(!data_vio->is_zero, "zero blocks should not be hashed"); in hash_data_vio()
1820 murmurhash3_128(data_vio->vio.data, VDO_BLOCK_SIZE, 0x62ea60be, in hash_data_vio()
1821 &data_vio->record_name); in hash_data_vio()
1823 data_vio->hash_zone = vdo_select_hash_zone(vdo_from_data_vio(data_vio)->hash_zones, in hash_data_vio()
1824 &data_vio->record_name); in hash_data_vio()
1825 data_vio->last_async_operation = VIO_ASYNC_OP_ACQUIRE_VDO_HASH_LOCK; in hash_data_vio()
1826 launch_data_vio_hash_zone_callback(data_vio, vdo_acquire_hash_lock); in hash_data_vio()
1830 static void prepare_for_dedupe(struct data_vio *data_vio) in prepare_for_dedupe() argument
1833 VDO_ASSERT_LOG_ONLY(!data_vio->is_zero, "must not prepare to dedupe zero blocks"); in prepare_for_dedupe()
1839 data_vio->last_async_operation = VIO_ASYNC_OP_HASH_DATA_VIO; in prepare_for_dedupe()
1840 launch_data_vio_cpu_callback(data_vio, hash_data_vio, CPU_Q_HASH_BLOCK_PRIORITY); in prepare_for_dedupe()
1849 struct data_vio *data_vio = vio_as_data_vio((struct vio *) bio->bi_private); in write_bio_finished() local
1852 vdo_set_completion_result(&data_vio->vio.completion, in write_bio_finished()
1854 data_vio->downgrade_allocation_lock = true; in write_bio_finished()
1855 update_metadata_for_data_vio_write(data_vio, data_vio->allocation.lock); in write_bio_finished()
1859 void write_data_vio(struct data_vio *data_vio) in write_data_vio() argument
1864 if (!data_vio_has_allocation(data_vio)) { in write_data_vio()
1869 continue_data_vio_with_error(data_vio, VDO_NO_SPACE); in write_data_vio()
1879 status = get_data_vio_compression_status(data_vio); in write_data_vio()
1881 !set_data_vio_compression_status(data_vio, status, new_status)); in write_data_vio()
1884 result = vio_reset_bio(&data_vio->vio, data_vio->vio.data, in write_data_vio()
1886 data_vio->allocation.pbn); in write_data_vio()
1888 continue_data_vio_with_error(data_vio, result); in write_data_vio()
1892 data_vio->last_async_operation = VIO_ASYNC_OP_WRITE_DATA_VIO; in write_data_vio()
1893 vdo_submit_data_vio(data_vio); in write_data_vio()
1903 struct data_vio *data_vio = as_data_vio(completion); in acknowledge_write_callback() local
1909 VDO_ASSERT_LOG_ONLY(data_vio_has_flush_generation_lock(data_vio), in acknowledge_write_callback()
1911 acknowledge_data_vio(data_vio); in acknowledge_write_callback()
1912 if (data_vio->new_mapped.pbn == VDO_ZERO_BLOCK) { in acknowledge_write_callback()
1914 update_metadata_for_data_vio_write(data_vio, NULL); in acknowledge_write_callback()
1918 prepare_for_dedupe(data_vio); in acknowledge_write_callback()
1928 struct data_vio *data_vio = as_data_vio(completion); in allocate_block() local
1930 assert_data_vio_in_allocated_zone(data_vio); in allocate_block()
1932 if (!vdo_allocate_block_in_zone(data_vio)) in allocate_block()
1936 WRITE_ONCE(data_vio->allocation_succeeded, true); in allocate_block()
1937 data_vio->new_mapped = (struct zoned_pbn) { in allocate_block()
1938 .zone = data_vio->allocation.zone, in allocate_block()
1939 .pbn = data_vio->allocation.pbn, in allocate_block()
1943 if (data_vio->fua || in allocate_block()
1944 data_vio->remaining_discard > (u32) (VDO_BLOCK_SIZE - data_vio->offset)) { in allocate_block()
1945 prepare_for_dedupe(data_vio); in allocate_block()
1949 data_vio->last_async_operation = VIO_ASYNC_OP_ACKNOWLEDGE_WRITE; in allocate_block()
1950 launch_data_vio_on_bio_ack_queue(data_vio, acknowledge_write_callback); in allocate_block()
1960 struct data_vio *data_vio = as_data_vio(completion); in handle_allocation_error() local
1966 prepare_for_dedupe(data_vio); in handle_allocation_error()
1974 static int assert_is_discard(struct data_vio *data_vio) in assert_is_discard() argument
1976 int result = VDO_ASSERT(data_vio->is_discard, in assert_is_discard()
1989 struct data_vio *data_vio = as_data_vio(completion); in continue_data_vio_with_block_map_slot() local
1991 assert_data_vio_in_logical_zone(data_vio); in continue_data_vio_with_block_map_slot()
1992 if (data_vio->read) { in continue_data_vio_with_block_map_slot()
1993 set_data_vio_logical_callback(data_vio, read_block); in continue_data_vio_with_block_map_slot()
1994 data_vio->last_async_operation = VIO_ASYNC_OP_GET_MAPPED_BLOCK_FOR_READ; in continue_data_vio_with_block_map_slot()
1995 vdo_get_mapped_block(data_vio); in continue_data_vio_with_block_map_slot()
1999 vdo_acquire_flush_generation_lock(data_vio); in continue_data_vio_with_block_map_slot()
2001 if (data_vio->tree_lock.tree_slots[0].block_map_slot.pbn == VDO_ZERO_BLOCK) { in continue_data_vio_with_block_map_slot()
2007 continue_data_vio_with_error(data_vio, assert_is_discard(data_vio)); in continue_data_vio_with_block_map_slot()
2015 if (!data_vio->is_zero && (!data_vio->is_discard || data_vio->is_partial)) { in continue_data_vio_with_block_map_slot()
2016 data_vio_allocate_data_block(data_vio, VIO_WRITE_LOCK, allocate_block, in continue_data_vio_with_block_map_slot()
2025 data_vio->new_mapped.pbn = VDO_ZERO_BLOCK; in continue_data_vio_with_block_map_slot()
2026 if (data_vio->is_zero) in continue_data_vio_with_block_map_slot()
2027 data_vio->new_mapped.state = VDO_MAPPING_STATE_UNCOMPRESSED; in continue_data_vio_with_block_map_slot()
2029 if (data_vio->remaining_discard > (u32) (VDO_BLOCK_SIZE - data_vio->offset)) { in continue_data_vio_with_block_map_slot()
2031 update_metadata_for_data_vio_write(data_vio, NULL); in continue_data_vio_with_block_map_slot()
2035 data_vio->last_async_operation = VIO_ASYNC_OP_ACKNOWLEDGE_WRITE; in continue_data_vio_with_block_map_slot()
2036 launch_data_vio_on_bio_ack_queue(data_vio, acknowledge_write_callback); in continue_data_vio_with_block_map_slot()