@@ -1567,21 +1567,26 @@ static void bio_setup_sector(struct bio *bio, sector_t sector, unsigned len)
1567
1567
/*
1568
1568
* Creates a bio that consists of range of complete bvecs.
1569
1569
*/
1570
- static void clone_bio (struct dm_target_io * tio , struct bio * bio ,
1571
- sector_t sector , unsigned len )
1570
+ static int clone_bio (struct dm_target_io * tio , struct bio * bio ,
1571
+ sector_t sector , unsigned len )
1572
1572
{
1573
1573
struct bio * clone = & tio -> clone ;
1574
1574
1575
1575
__bio_clone_fast (clone , bio );
1576
1576
1577
- if (bio_integrity (bio ))
1578
- bio_integrity_clone (clone , bio , GFP_NOIO );
1577
+ if (bio_integrity (bio )) {
1578
+ int r = bio_integrity_clone (clone , bio , GFP_NOIO );
1579
+ if (r < 0 )
1580
+ return r ;
1581
+ }
1579
1582
1580
1583
bio_advance (clone , to_bytes (sector - clone -> bi_iter .bi_sector ));
1581
1584
clone -> bi_iter .bi_size = to_bytes (len );
1582
1585
1583
1586
if (bio_integrity (bio ))
1584
1587
bio_integrity_trim (clone , 0 , len );
1588
+
1589
+ return 0 ;
1585
1590
}
1586
1591
1587
1592
static struct dm_target_io * alloc_tio (struct clone_info * ci ,
@@ -1638,13 +1643,14 @@ static int __send_empty_flush(struct clone_info *ci)
1638
1643
return 0 ;
1639
1644
}
1640
1645
1641
- static void __clone_and_map_data_bio (struct clone_info * ci , struct dm_target * ti ,
1646
+ static int __clone_and_map_data_bio (struct clone_info * ci , struct dm_target * ti ,
1642
1647
sector_t sector , unsigned * len )
1643
1648
{
1644
1649
struct bio * bio = ci -> bio ;
1645
1650
struct dm_target_io * tio ;
1646
1651
unsigned target_bio_nr ;
1647
1652
unsigned num_target_bios = 1 ;
1653
+ int r = 0 ;
1648
1654
1649
1655
/*
1650
1656
* Does the target want to receive duplicate copies of the bio?
@@ -1655,9 +1661,13 @@ static void __clone_and_map_data_bio(struct clone_info *ci, struct dm_target *ti
1655
1661
for (target_bio_nr = 0 ; target_bio_nr < num_target_bios ; target_bio_nr ++ ) {
1656
1662
tio = alloc_tio (ci , ti , target_bio_nr );
1657
1663
tio -> len_ptr = len ;
1658
- clone_bio (tio , bio , sector , * len );
1664
+ r = clone_bio (tio , bio , sector , * len );
1665
+ if (r < 0 )
1666
+ break ;
1659
1667
__map_bio (tio );
1660
1668
}
1669
+
1670
+ return r ;
1661
1671
}
1662
1672
1663
1673
typedef unsigned (* get_num_bios_fn )(struct dm_target * ti );
@@ -1734,6 +1744,7 @@ static int __split_and_process_non_flush(struct clone_info *ci)
1734
1744
struct bio * bio = ci -> bio ;
1735
1745
struct dm_target * ti ;
1736
1746
unsigned len ;
1747
+ int r ;
1737
1748
1738
1749
if (unlikely (bio -> bi_rw & REQ_DISCARD ))
1739
1750
return __send_discard (ci );
@@ -1746,7 +1757,9 @@ static int __split_and_process_non_flush(struct clone_info *ci)
1746
1757
1747
1758
len = min_t (sector_t , max_io_len (ci -> sector , ti ), ci -> sector_count );
1748
1759
1749
- __clone_and_map_data_bio (ci , ti , ci -> sector , & len );
1760
+ r = __clone_and_map_data_bio (ci , ti , ci -> sector , & len );
1761
+ if (r < 0 )
1762
+ return r ;
1750
1763
1751
1764
ci -> sector += len ;
1752
1765
ci -> sector_count -= len ;
0 commit comments