@@ -1447,31 +1447,52 @@ static enum wc_map_op writecache_map_write(struct dm_writecache *wc, struct bio
14471447 return WC_MAP_SUBMIT ;
14481448}
14491449
1450+ static enum wc_map_op writecache_map_flush (struct dm_writecache * wc , struct bio * bio )
1451+ {
1452+ if (writecache_has_error (wc ))
1453+ return WC_MAP_ERROR ;
1454+
1455+ if (WC_MODE_PMEM (wc )) {
1456+ writecache_flush (wc );
1457+ if (writecache_has_error (wc ))
1458+ return WC_MAP_ERROR ;
1459+ else if (unlikely (wc -> cleaner ) || unlikely (wc -> metadata_only ))
1460+ return WC_MAP_REMAP_ORIGIN ;
1461+ return WC_MAP_SUBMIT ;
1462+ }
1463+ /* SSD: */
1464+ if (dm_bio_get_target_bio_nr (bio ))
1465+ return WC_MAP_REMAP_ORIGIN ;
1466+ writecache_offload_bio (wc , bio );
1467+ return WC_MAP_RETURN ;
1468+ }
1469+
1470+ static enum wc_map_op writecache_map_discard (struct dm_writecache * wc , struct bio * bio )
1471+ {
1472+ if (writecache_has_error (wc ))
1473+ return WC_MAP_ERROR ;
1474+
1475+ if (WC_MODE_PMEM (wc )) {
1476+ writecache_discard (wc , bio -> bi_iter .bi_sector , bio_end_sector (bio ));
1477+ return WC_MAP_REMAP_ORIGIN ;
1478+ }
1479+ /* SSD: */
1480+ writecache_offload_bio (wc , bio );
1481+ return WC_MAP_RETURN ;
1482+ }
1483+
14501484static int writecache_map (struct dm_target * ti , struct bio * bio )
14511485{
14521486 struct dm_writecache * wc = ti -> private ;
1453- enum wc_map_op map_op = WC_MAP_ERROR ;
1487+ enum wc_map_op map_op ;
14541488
14551489 bio -> bi_private = NULL ;
14561490
14571491 wc_lock (wc );
14581492
14591493 if (unlikely (bio -> bi_opf & REQ_PREFLUSH )) {
1460- if (writecache_has_error (wc ))
1461- goto unlock_error ;
1462- if (WC_MODE_PMEM (wc )) {
1463- writecache_flush (wc );
1464- if (writecache_has_error (wc ))
1465- goto unlock_error ;
1466- if (unlikely (wc -> cleaner ) || unlikely (wc -> metadata_only ))
1467- goto unlock_remap_origin ;
1468- goto unlock_submit ;
1469- } else {
1470- if (dm_bio_get_target_bio_nr (bio ))
1471- goto unlock_remap_origin ;
1472- writecache_offload_bio (wc , bio );
1473- goto unlock_return ;
1474- }
1494+ map_op = writecache_map_flush (wc , bio );
1495+ goto done ;
14751496 }
14761497
14771498 bio -> bi_iter .bi_sector = dm_target_offset (ti , bio -> bi_iter .bi_sector );
@@ -1481,29 +1502,22 @@ static int writecache_map(struct dm_target *ti, struct bio *bio)
14811502 DMERR ("I/O is not aligned, sector %llu, size %u, block size %u" ,
14821503 (unsigned long long )bio -> bi_iter .bi_sector ,
14831504 bio -> bi_iter .bi_size , wc -> block_size );
1484- goto unlock_error ;
1505+ map_op = WC_MAP_ERROR ;
1506+ goto done ;
14851507 }
14861508
14871509 if (unlikely (bio_op (bio ) == REQ_OP_DISCARD )) {
1488- if (writecache_has_error (wc ))
1489- goto unlock_error ;
1490- if (WC_MODE_PMEM (wc )) {
1491- writecache_discard (wc , bio -> bi_iter .bi_sector , bio_end_sector (bio ));
1492- goto unlock_remap_origin ;
1493- } else {
1494- writecache_offload_bio (wc , bio );
1495- goto unlock_return ;
1496- }
1510+ map_op = writecache_map_discard (wc , bio );
1511+ goto done ;
14971512 }
14981513
14991514 if (bio_data_dir (bio ) == READ )
15001515 map_op = writecache_map_read (wc , bio );
15011516 else
15021517 map_op = writecache_map_write (wc , bio );
1503-
1518+ done :
15041519 switch (map_op ) {
15051520 case WC_MAP_REMAP_ORIGIN :
1506- unlock_remap_origin :
15071521 if (likely (wc -> pause != 0 )) {
15081522 if (bio_op (bio ) == REQ_OP_WRITE ) {
15091523 dm_iot_io_begin (& wc -> iot , 1 );
@@ -1515,26 +1529,23 @@ static int writecache_map(struct dm_target *ti, struct bio *bio)
15151529 return DM_MAPIO_REMAPPED ;
15161530
15171531 case WC_MAP_REMAP :
1518- unlock_remap :
15191532 /* make sure that writecache_end_io decrements bio_in_progress: */
15201533 bio -> bi_private = (void * )1 ;
15211534 atomic_inc (& wc -> bio_in_progress [bio_data_dir (bio )]);
15221535 wc_unlock (wc );
15231536 return DM_MAPIO_REMAPPED ;
15241537
15251538 case WC_MAP_SUBMIT :
1526- unlock_submit :
15271539 wc_unlock (wc );
15281540 bio_endio (bio );
15291541 return DM_MAPIO_SUBMITTED ;
15301542
15311543 case WC_MAP_RETURN :
1532- unlock_return :
15331544 wc_unlock (wc );
15341545 return DM_MAPIO_SUBMITTED ;
15351546
15361547 case WC_MAP_ERROR :
1537- unlock_error :
1548+ default :
15381549 wc_unlock (wc );
15391550 bio_io_error (bio );
15401551 return DM_MAPIO_SUBMITTED ;
0 commit comments