@@ -1190,20 +1190,16 @@ void __bio_release_pages(struct bio *bio, bool mark_dirty)
1190
1190
struct folio_iter fi ;
1191
1191
1192
1192
bio_for_each_folio_all (fi , bio ) {
1193
- struct page * page ;
1194
1193
size_t nr_pages ;
1195
1194
1196
1195
if (mark_dirty ) {
1197
1196
folio_lock (fi .folio );
1198
1197
folio_mark_dirty (fi .folio );
1199
1198
folio_unlock (fi .folio );
1200
1199
}
1201
- page = folio_page (fi .folio , fi .offset / PAGE_SIZE );
1202
1200
nr_pages = (fi .offset + fi .length - 1 ) / PAGE_SIZE -
1203
1201
fi .offset / PAGE_SIZE + 1 ;
1204
- do {
1205
- bio_release_page (bio , page ++ );
1206
- } while (-- nr_pages != 0 );
1202
+ unpin_user_folio (fi .folio , nr_pages );
1207
1203
}
1208
1204
}
1209
1205
EXPORT_SYMBOL_GPL (__bio_release_pages );
@@ -1241,8 +1237,8 @@ static int bio_iov_add_folio(struct bio *bio, struct folio *folio, size_t len,
1241
1237
folio_page (folio , 0 ), len , offset ,
1242
1238
& same_page )) {
1243
1239
bio -> bi_iter .bi_size += len ;
1244
- if (same_page )
1245
- bio_release_page ( bio , folio_page ( folio , 0 ) );
1240
+ if (same_page && bio_flagged ( bio , BIO_PAGE_PINNED ) )
1241
+ unpin_user_folio ( folio , 1 );
1246
1242
return 0 ;
1247
1243
}
1248
1244
bio_add_folio_nofail (bio , folio , len , offset );
@@ -1258,8 +1254,8 @@ static int bio_iov_add_zone_append_folio(struct bio *bio, struct folio *folio,
1258
1254
if (bio_add_hw_folio (q , bio , folio , len , offset ,
1259
1255
queue_max_zone_append_sectors (q ), & same_page ) != len )
1260
1256
return - EINVAL ;
1261
- if (same_page )
1262
- bio_release_page ( bio , folio_page ( folio , 0 ) );
1257
+ if (same_page && bio_flagged ( bio , BIO_PAGE_PINNED ) )
1258
+ unpin_user_folio ( folio , 1 );
1263
1259
return 0 ;
1264
1260
}
1265
1261
0 commit comments