Skip to content

Commit 2c30c71

Browse files
author
Kent Overstreet
committed
block: Convert various code to bio_for_each_segment()
With immutable biovecs we don't want code accessing bi_io_vec directly - the uses this patch changes weren't incorrect since they all own the bio, but it makes the code harder to audit for no good reason - also, this will help with multipage bvecs later. Signed-off-by: Kent Overstreet <[email protected]> Cc: Jens Axboe <[email protected]> Cc: Alexander Viro <[email protected]> Cc: Chris Mason <[email protected]> Cc: Jaegeuk Kim <[email protected]> Cc: Joern Engel <[email protected]> Cc: Prasad Joshi <[email protected]> Cc: Trond Myklebust <[email protected]>
1 parent 33879d4 commit 2c30c71

File tree

10 files changed

+67
-102
lines changed

10 files changed

+67
-102
lines changed

fs/btrfs/compression.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -201,18 +201,16 @@ static void end_compressed_bio_read(struct bio *bio, int err)
201201
if (cb->errors) {
202202
bio_io_error(cb->orig_bio);
203203
} else {
204-
int bio_index = 0;
205-
struct bio_vec *bvec = cb->orig_bio->bi_io_vec;
204+
int i;
205+
struct bio_vec *bvec;
206206

207207
/*
208208
* we have verified the checksum already, set page
209209
* checked so the end_io handlers know about it
210210
*/
211-
while (bio_index < cb->orig_bio->bi_vcnt) {
211+
bio_for_each_segment_all(bvec, cb->orig_bio, i)
212212
SetPageChecked(bvec->bv_page);
213-
bvec++;
214-
bio_index++;
215-
}
213+
216214
bio_endio(cb->orig_bio, 0);
217215
}
218216

fs/btrfs/disk-io.c

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -842,20 +842,17 @@ int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, struct inode *inode,
842842

843843
static int btree_csum_one_bio(struct bio *bio)
844844
{
845-
struct bio_vec *bvec = bio->bi_io_vec;
846-
int bio_index = 0;
845+
struct bio_vec *bvec;
847846
struct btrfs_root *root;
848-
int ret = 0;
847+
int i, ret = 0;
849848

850-
WARN_ON(bio->bi_vcnt <= 0);
851-
while (bio_index < bio->bi_vcnt) {
849+
bio_for_each_segment_all(bvec, bio, i) {
852850
root = BTRFS_I(bvec->bv_page->mapping->host)->root;
853851
ret = csum_dirty_buffer(root, bvec->bv_page);
854852
if (ret)
855853
break;
856-
bio_index++;
857-
bvec++;
858854
}
855+
859856
return ret;
860857
}
861858

fs/btrfs/extent_io.c

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2332,12 +2332,13 @@ int end_extent_writepage(struct page *page, int err, u64 start, u64 end)
23322332
*/
23332333
static void end_bio_extent_writepage(struct bio *bio, int err)
23342334
{
2335-
struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
2335+
struct bio_vec *bvec;
23362336
struct extent_io_tree *tree;
23372337
u64 start;
23382338
u64 end;
2339+
int i;
23392340

2340-
do {
2341+
bio_for_each_segment_all(bvec, bio, i) {
23412342
struct page *page = bvec->bv_page;
23422343
tree = &BTRFS_I(page->mapping->host)->io_tree;
23432344

@@ -2355,14 +2356,11 @@ static void end_bio_extent_writepage(struct bio *bio, int err)
23552356
start = page_offset(page);
23562357
end = start + bvec->bv_offset + bvec->bv_len - 1;
23572358

2358-
if (--bvec >= bio->bi_io_vec)
2359-
prefetchw(&bvec->bv_page->flags);
2360-
23612359
if (end_extent_writepage(page, err, start, end))
23622360
continue;
23632361

23642362
end_page_writeback(page);
2365-
} while (bvec >= bio->bi_io_vec);
2363+
}
23662364

23672365
bio_put(bio);
23682366
}
@@ -2392,9 +2390,8 @@ endio_readpage_release_extent(struct extent_io_tree *tree, u64 start, u64 len,
23922390
*/
23932391
static void end_bio_extent_readpage(struct bio *bio, int err)
23942392
{
2393+
struct bio_vec *bvec;
23952394
int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
2396-
struct bio_vec *bvec_end = bio->bi_io_vec + bio->bi_vcnt - 1;
2397-
struct bio_vec *bvec = bio->bi_io_vec;
23982395
struct btrfs_io_bio *io_bio = btrfs_io_bio(bio);
23992396
struct extent_io_tree *tree;
24002397
u64 offset = 0;
@@ -2405,11 +2402,12 @@ static void end_bio_extent_readpage(struct bio *bio, int err)
24052402
u64 extent_len = 0;
24062403
int mirror;
24072404
int ret;
2405+
int i;
24082406

24092407
if (err)
24102408
uptodate = 0;
24112409

2412-
do {
2410+
bio_for_each_segment_all(bvec, bio, i) {
24132411
struct page *page = bvec->bv_page;
24142412
struct inode *inode = page->mapping->host;
24152413

@@ -2433,9 +2431,6 @@ static void end_bio_extent_readpage(struct bio *bio, int err)
24332431
end = start + bvec->bv_offset + bvec->bv_len - 1;
24342432
len = bvec->bv_len;
24352433

2436-
if (++bvec <= bvec_end)
2437-
prefetchw(&bvec->bv_page->flags);
2438-
24392434
mirror = io_bio->mirror_num;
24402435
if (likely(uptodate && tree->ops &&
24412436
tree->ops->readpage_end_io_hook)) {
@@ -2516,7 +2511,7 @@ static void end_bio_extent_readpage(struct bio *bio, int err)
25162511
extent_start = start;
25172512
extent_len = end + 1 - start;
25182513
}
2519-
} while (bvec <= bvec_end);
2514+
}
25202515

25212516
if (extent_len)
25222517
endio_readpage_release_extent(tree, extent_start, extent_len,
@@ -2547,7 +2542,6 @@ btrfs_bio_alloc(struct block_device *bdev, u64 first_sector, int nr_vecs,
25472542
}
25482543

25492544
if (bio) {
2550-
bio->bi_size = 0;
25512545
bio->bi_bdev = bdev;
25522546
bio->bi_sector = first_sector;
25532547
btrfs_bio = btrfs_io_bio(bio);
@@ -3410,20 +3404,18 @@ static void end_extent_buffer_writeback(struct extent_buffer *eb)
34103404

34113405
static void end_bio_extent_buffer_writepage(struct bio *bio, int err)
34123406
{
3413-
int uptodate = err == 0;
3414-
struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
3407+
struct bio_vec *bvec;
34153408
struct extent_buffer *eb;
3416-
int done;
3409+
int i, done;
34173410

3418-
do {
3411+
bio_for_each_segment_all(bvec, bio, i) {
34193412
struct page *page = bvec->bv_page;
34203413

3421-
bvec--;
34223414
eb = (struct extent_buffer *)page->private;
34233415
BUG_ON(!eb);
34243416
done = atomic_dec_and_test(&eb->io_pages);
34253417

3426-
if (!uptodate || test_bit(EXTENT_BUFFER_IOERR, &eb->bflags)) {
3418+
if (err || test_bit(EXTENT_BUFFER_IOERR, &eb->bflags)) {
34273419
set_bit(EXTENT_BUFFER_IOERR, &eb->bflags);
34283420
ClearPageUptodate(page);
34293421
SetPageError(page);
@@ -3435,10 +3427,9 @@ static void end_bio_extent_buffer_writepage(struct bio *bio, int err)
34353427
continue;
34363428

34373429
end_extent_buffer_writeback(eb);
3438-
} while (bvec >= bio->bi_io_vec);
3430+
}
34393431

34403432
bio_put(bio);
3441-
34423433
}
34433434

34443435
static int write_one_eb(struct extent_buffer *eb,

fs/btrfs/inode.c

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6779,17 +6779,16 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock,
67796779
static void btrfs_endio_direct_read(struct bio *bio, int err)
67806780
{
67816781
struct btrfs_dio_private *dip = bio->bi_private;
6782-
struct bio_vec *bvec_end = bio->bi_io_vec + bio->bi_vcnt - 1;
6783-
struct bio_vec *bvec = bio->bi_io_vec;
6782+
struct bio_vec *bvec;
67846783
struct inode *inode = dip->inode;
67856784
struct btrfs_root *root = BTRFS_I(inode)->root;
67866785
struct bio *dio_bio;
67876786
u32 *csums = (u32 *)dip->csum;
6788-
int index = 0;
67896787
u64 start;
6788+
int i;
67906789

67916790
start = dip->logical_offset;
6792-
do {
6791+
bio_for_each_segment_all(bvec, bio, i) {
67936792
if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM)) {
67946793
struct page *page = bvec->bv_page;
67956794
char *kaddr;
@@ -6805,18 +6804,16 @@ static void btrfs_endio_direct_read(struct bio *bio, int err)
68056804
local_irq_restore(flags);
68066805

68076806
flush_dcache_page(bvec->bv_page);
6808-
if (csum != csums[index]) {
6807+
if (csum != csums[i]) {
68096808
btrfs_err(root->fs_info, "csum failed ino %llu off %llu csum %u expected csum %u",
68106809
btrfs_ino(inode), start, csum,
6811-
csums[index]);
6810+
csums[i]);
68126811
err = -EIO;
68136812
}
68146813
}
68156814

68166815
start += bvec->bv_len;
6817-
bvec++;
6818-
index++;
6819-
} while (bvec <= bvec_end);
6816+
}
68206817

68216818
unlock_extent(&BTRFS_I(inode)->io_tree, dip->logical_offset,
68226819
dip->logical_offset + dip->bytes - 1);

fs/ext4/page-io.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,9 @@ static void ext4_finish_bio(struct bio *bio)
6565
{
6666
int i;
6767
int error = !test_bit(BIO_UPTODATE, &bio->bi_flags);
68+
struct bio_vec *bvec;
6869

69-
for (i = 0; i < bio->bi_vcnt; i++) {
70-
struct bio_vec *bvec = &bio->bi_io_vec[i];
70+
bio_for_each_segment_all(bvec, bio, i) {
7171
struct page *page = bvec->bv_page;
7272
struct buffer_head *bh, *head;
7373
unsigned bio_start = bvec->bv_offset;

fs/f2fs/data.c

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -351,23 +351,20 @@ struct page *get_new_data_page(struct inode *inode,
351351

352352
static void read_end_io(struct bio *bio, int err)
353353
{
354-
const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
355-
struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
354+
struct bio_vec *bvec;
355+
int i;
356356

357-
do {
357+
bio_for_each_segment_all(bvec, bio, i) {
358358
struct page *page = bvec->bv_page;
359359

360-
if (--bvec >= bio->bi_io_vec)
361-
prefetchw(&bvec->bv_page->flags);
362-
363-
if (uptodate) {
360+
if (!err) {
364361
SetPageUptodate(page);
365362
} else {
366363
ClearPageUptodate(page);
367364
SetPageError(page);
368365
}
369366
unlock_page(page);
370-
} while (bvec >= bio->bi_io_vec);
367+
}
371368
bio_put(bio);
372369
}
373370

fs/f2fs/segment.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -575,16 +575,14 @@ static const struct segment_allocation default_salloc_ops = {
575575

576576
static void f2fs_end_io_write(struct bio *bio, int err)
577577
{
578-
const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
579-
struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
580578
struct bio_private *p = bio->bi_private;
579+
struct bio_vec *bvec;
580+
int i;
581581

582-
do {
582+
bio_for_each_segment_all(bvec, bio, i) {
583583
struct page *page = bvec->bv_page;
584584

585-
if (--bvec >= bio->bi_io_vec)
586-
prefetchw(&bvec->bv_page->flags);
587-
if (!uptodate) {
585+
if (err) {
588586
SetPageError(page);
589587
if (page->mapping)
590588
set_bit(AS_EIO, &page->mapping->flags);
@@ -593,7 +591,7 @@ static void f2fs_end_io_write(struct bio *bio, int err)
593591
}
594592
end_page_writeback(page);
595593
dec_page_count(p->sbi, F2FS_WRITEBACK);
596-
} while (bvec >= bio->bi_io_vec);
594+
}
597595

598596
if (p->is_sync)
599597
complete(p->wait);

fs/logfs/dev_bdev.c

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -56,22 +56,18 @@ static DECLARE_WAIT_QUEUE_HEAD(wq);
5656
static void writeseg_end_io(struct bio *bio, int err)
5757
{
5858
const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
59-
struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
59+
struct bio_vec *bvec;
60+
int i;
6061
struct super_block *sb = bio->bi_private;
6162
struct logfs_super *super = logfs_super(sb);
62-
struct page *page;
6363

6464
BUG_ON(!uptodate); /* FIXME: Retry io or write elsewhere */
6565
BUG_ON(err);
66-
BUG_ON(bio->bi_vcnt == 0);
67-
do {
68-
page = bvec->bv_page;
69-
if (--bvec >= bio->bi_io_vec)
70-
prefetchw(&bvec->bv_page->flags);
71-
72-
end_page_writeback(page);
73-
page_cache_release(page);
74-
} while (bvec >= bio->bi_io_vec);
66+
67+
bio_for_each_segment_all(bvec, bio, i) {
68+
end_page_writeback(bvec->bv_page);
69+
page_cache_release(bvec->bv_page);
70+
}
7571
bio_put(bio);
7672
if (atomic_dec_and_test(&super->s_pending_writes))
7773
wake_up(&wq);

fs/mpage.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,31 +43,30 @@
4343
*/
4444
static void mpage_end_io(struct bio *bio, int err)
4545
{
46-
const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
47-
struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
46+
struct bio_vec *bv;
47+
int i;
4848

49-
do {
50-
struct page *page = bvec->bv_page;
49+
bio_for_each_segment_all(bv, bio, i) {
50+
struct page *page = bv->bv_page;
5151

52-
if (--bvec >= bio->bi_io_vec)
53-
prefetchw(&bvec->bv_page->flags);
5452
if (bio_data_dir(bio) == READ) {
55-
if (uptodate) {
53+
if (!err) {
5654
SetPageUptodate(page);
5755
} else {
5856
ClearPageUptodate(page);
5957
SetPageError(page);
6058
}
6159
unlock_page(page);
6260
} else { /* bio_data_dir(bio) == WRITE */
63-
if (!uptodate) {
61+
if (err) {
6462
SetPageError(page);
6563
if (page->mapping)
6664
set_bit(AS_EIO, &page->mapping->flags);
6765
}
6866
end_page_writeback(page);
6967
}
70-
} while (bvec >= bio->bi_io_vec);
68+
}
69+
7170
bio_put(bio);
7271
}
7372

0 commit comments

Comments
 (0)