@@ -1567,21 +1567,26 @@ static void bio_setup_sector(struct bio *bio, sector_t sector, unsigned len)
15671567/*
15681568 * Creates a bio that consists of range of complete bvecs.
15691569 */
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 )
15721572{
15731573 struct bio * clone = & tio -> clone ;
15741574
15751575 __bio_clone_fast (clone , bio );
15761576
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+ }
15791582
15801583 bio_advance (clone , to_bytes (sector - clone -> bi_iter .bi_sector ));
15811584 clone -> bi_iter .bi_size = to_bytes (len );
15821585
15831586 if (bio_integrity (bio ))
15841587 bio_integrity_trim (clone , 0 , len );
1588+
1589+ return 0 ;
15851590}
15861591
15871592static struct dm_target_io * alloc_tio (struct clone_info * ci ,
@@ -1638,13 +1643,14 @@ static int __send_empty_flush(struct clone_info *ci)
16381643 return 0 ;
16391644}
16401645
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 ,
16421647 sector_t sector , unsigned * len )
16431648{
16441649 struct bio * bio = ci -> bio ;
16451650 struct dm_target_io * tio ;
16461651 unsigned target_bio_nr ;
16471652 unsigned num_target_bios = 1 ;
1653+ int r = 0 ;
16481654
16491655 /*
16501656 * 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
16551661 for (target_bio_nr = 0 ; target_bio_nr < num_target_bios ; target_bio_nr ++ ) {
16561662 tio = alloc_tio (ci , ti , target_bio_nr );
16571663 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 ;
16591667 __map_bio (tio );
16601668 }
1669+
1670+ return r ;
16611671}
16621672
16631673typedef unsigned (* get_num_bios_fn )(struct dm_target * ti );
@@ -1734,6 +1744,7 @@ static int __split_and_process_non_flush(struct clone_info *ci)
17341744 struct bio * bio = ci -> bio ;
17351745 struct dm_target * ti ;
17361746 unsigned len ;
1747+ int r ;
17371748
17381749 if (unlikely (bio -> bi_rw & REQ_DISCARD ))
17391750 return __send_discard (ci );
@@ -1746,7 +1757,9 @@ static int __split_and_process_non_flush(struct clone_info *ci)
17461757
17471758 len = min_t (sector_t , max_io_len (ci -> sector , ti ), ci -> sector_count );
17481759
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 ;
17501763
17511764 ci -> sector += len ;
17521765 ci -> sector_count -= len ;
0 commit comments