@@ -974,6 +974,14 @@ static int bio_iov_bvec_set_append(struct bio *bio, struct iov_iter *iter)
974974 return 0 ;
975975}
976976
977+ static void bio_put_pages (struct page * * pages , size_t size , size_t off )
978+ {
979+ size_t i , nr = DIV_ROUND_UP (size + (off & ~PAGE_MASK ), PAGE_SIZE );
980+
981+ for (i = 0 ; i < nr ; i ++ )
982+ put_page (pages [i ]);
983+ }
984+
977985#define PAGE_PTRS_PER_BVEC (sizeof(struct bio_vec) / sizeof(struct page *))
978986
979987/**
@@ -1018,8 +1026,10 @@ static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter)
10181026 if (same_page )
10191027 put_page (page );
10201028 } else {
1021- if (WARN_ON_ONCE (bio_full (bio , len )))
1022- return - EINVAL ;
1029+ if (WARN_ON_ONCE (bio_full (bio , len ))) {
1030+ bio_put_pages (pages + i , left , offset );
1031+ return - EINVAL ;
1032+ }
10231033 __bio_add_page (bio , page , len , offset );
10241034 }
10251035 offset = 0 ;
@@ -1064,6 +1074,7 @@ static int __bio_iov_append_get_pages(struct bio *bio, struct iov_iter *iter)
10641074 len = min_t (size_t , PAGE_SIZE - offset , left );
10651075 if (bio_add_hw_page (q , bio , page , len , offset ,
10661076 max_append_sectors , & same_page ) != len ) {
1077+ bio_put_pages (pages + i , left , offset );
10671078 ret = - EINVAL ;
10681079 break ;
10691080 }
0 commit comments