@@ -501,6 +501,7 @@ static void launch_data_vio(struct data_vio *data_vio, logical_block_number_t lb
501
501
502
502
memset (& data_vio -> record_name , 0 , sizeof (data_vio -> record_name ));
503
503
memset (& data_vio -> duplicate , 0 , sizeof (data_vio -> duplicate ));
504
+ vdo_reset_completion (& data_vio -> decrement_completion );
504
505
vdo_reset_completion (completion );
505
506
completion -> error_handler = handle_data_vio_error ;
506
507
set_data_vio_logical_callback (data_vio , attempt_logical_block_lock );
@@ -1273,12 +1274,14 @@ static void clean_hash_lock(struct vdo_completion *completion)
1273
1274
static void finish_cleanup (struct data_vio * data_vio )
1274
1275
{
1275
1276
struct vdo_completion * completion = & data_vio -> vio .completion ;
1277
+ u32 discard_size = min_t (u32 , data_vio -> remaining_discard ,
1278
+ VDO_BLOCK_SIZE - data_vio -> offset );
1276
1279
1277
1280
VDO_ASSERT_LOG_ONLY (data_vio -> allocation .lock == NULL ,
1278
1281
"complete data_vio has no allocation lock" );
1279
1282
VDO_ASSERT_LOG_ONLY (data_vio -> hash_lock == NULL ,
1280
1283
"complete data_vio has no hash lock" );
1281
- if ((data_vio -> remaining_discard <= VDO_BLOCK_SIZE ) ||
1284
+ if ((data_vio -> remaining_discard <= discard_size ) ||
1282
1285
(completion -> result != VDO_SUCCESS )) {
1283
1286
struct data_vio_pool * pool = completion -> vdo -> data_vio_pool ;
1284
1287
@@ -1287,12 +1290,12 @@ static void finish_cleanup(struct data_vio *data_vio)
1287
1290
return ;
1288
1291
}
1289
1292
1290
- data_vio -> remaining_discard -= min_t (u32 , data_vio -> remaining_discard ,
1291
- VDO_BLOCK_SIZE - data_vio -> offset );
1293
+ data_vio -> remaining_discard -= discard_size ;
1292
1294
data_vio -> is_partial = (data_vio -> remaining_discard < VDO_BLOCK_SIZE );
1293
1295
data_vio -> read = data_vio -> is_partial ;
1294
1296
data_vio -> offset = 0 ;
1295
1297
completion -> requeue = true;
1298
+ data_vio -> first_reference_operation_complete = false;
1296
1299
launch_data_vio (data_vio , data_vio -> logical .lbn + 1 );
1297
1300
}
1298
1301
@@ -1965,7 +1968,8 @@ static void allocate_block(struct vdo_completion *completion)
1965
1968
.state = VDO_MAPPING_STATE_UNCOMPRESSED ,
1966
1969
};
1967
1970
1968
- if (data_vio -> fua ) {
1971
+ if (data_vio -> fua ||
1972
+ data_vio -> remaining_discard > (u32 ) (VDO_BLOCK_SIZE - data_vio -> offset )) {
1969
1973
prepare_for_dedupe (data_vio );
1970
1974
return ;
1971
1975
}
@@ -2042,7 +2046,6 @@ void continue_data_vio_with_block_map_slot(struct vdo_completion *completion)
2042
2046
return ;
2043
2047
}
2044
2048
2045
-
2046
2049
/*
2047
2050
* We don't need to write any data, so skip allocation and just update the block map and
2048
2051
* reference counts (via the journal).
@@ -2051,7 +2054,7 @@ void continue_data_vio_with_block_map_slot(struct vdo_completion *completion)
2051
2054
if (data_vio -> is_zero )
2052
2055
data_vio -> new_mapped .state = VDO_MAPPING_STATE_UNCOMPRESSED ;
2053
2056
2054
- if (data_vio -> remaining_discard > VDO_BLOCK_SIZE ) {
2057
+ if (data_vio -> remaining_discard > ( u32 ) ( VDO_BLOCK_SIZE - data_vio -> offset ) ) {
2055
2058
/* This is not the final block of a discard so we can't acknowledge it yet. */
2056
2059
update_metadata_for_data_vio_write (data_vio , NULL );
2057
2060
return ;
0 commit comments