Skip to content

Commit

Permalink
block: manipulate bio->bi_flags through helpers
Browse files Browse the repository at this point in the history
Some places use helpers now, others don't. We only have the 'is set'
helper, add helpers for setting and clearing flags too.

It was a bit of a mess of atomic vs non-atomic access. With
BIO_UPTODATE gone, we don't have any risk of concurrent access to the
flags. So relax the restriction and don't make any of them atomic. The
flags that do have serialization issues (reffed and chained), we
already handle those separately.

Signed-off-by: Jens Axboe <axboe@fb.com>
  • Loading branch information
axboe committed Jul 29, 2015
1 parent 4246a0b commit b7c44ed
Show file tree
Hide file tree
Showing 11 changed files with 33 additions and 20 deletions.
14 changes: 7 additions & 7 deletions block/bio.c
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,7 @@ static void bio_chain_endio(struct bio *bio)
*/
static inline void bio_inc_remaining(struct bio *bio)
{
bio->bi_flags |= (1 << BIO_CHAIN);
bio_set_flag(bio, BIO_CHAIN);
smp_mb__before_atomic();
atomic_inc(&bio->__bi_remaining);
}
Expand Down Expand Up @@ -495,7 +495,7 @@ struct bio *bio_alloc_bioset(gfp_t gfp_mask, int nr_iovecs, struct bio_set *bs)
if (unlikely(!bvl))
goto err_free;

bio->bi_flags |= 1 << BIO_OWNS_VEC;
bio_set_flag(bio, BIO_OWNS_VEC);
} else if (nr_iovecs) {
bvl = bio->bi_inline_vecs;
}
Expand Down Expand Up @@ -580,7 +580,7 @@ void __bio_clone_fast(struct bio *bio, struct bio *bio_src)
* so we don't set nor calculate new physical/hw segment counts here
*/
bio->bi_bdev = bio_src->bi_bdev;
bio->bi_flags |= 1 << BIO_CLONED;
bio_set_flag(bio, BIO_CLONED);
bio->bi_rw = bio_src->bi_rw;
bio->bi_iter = bio_src->bi_iter;
bio->bi_io_vec = bio_src->bi_io_vec;
Expand Down Expand Up @@ -829,7 +829,7 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page

/* If we may be able to merge these biovecs, force a recount */
if (bio->bi_vcnt > 1 && (BIOVEC_PHYS_MERGEABLE(bvec-1, bvec)))
bio->bi_flags &= ~(1 << BIO_SEG_VALID);
bio_clear_flag(bio, BIO_SEG_VALID);

done:
return len;
Expand Down Expand Up @@ -1390,7 +1390,7 @@ struct bio *bio_map_user_iov(struct request_queue *q,
if (iter->type & WRITE)
bio->bi_rw |= REQ_WRITE;

bio->bi_flags |= (1 << BIO_USER_MAPPED);
bio_set_flag(bio, BIO_USER_MAPPED);

/*
* subtle -- if __bio_map_user() ended up bouncing a bio,
Expand Down Expand Up @@ -1770,7 +1770,7 @@ static inline bool bio_remaining_done(struct bio *bio)
BUG_ON(atomic_read(&bio->__bi_remaining) <= 0);

if (atomic_dec_and_test(&bio->__bi_remaining)) {
clear_bit(BIO_CHAIN, &bio->bi_flags);
bio_clear_flag(bio, BIO_CHAIN);
return true;
}

Expand Down Expand Up @@ -1866,7 +1866,7 @@ void bio_trim(struct bio *bio, int offset, int size)
if (offset == 0 && size == bio->bi_iter.bi_size)
return;

clear_bit(BIO_SEG_VALID, &bio->bi_flags);
bio_clear_flag(bio, BIO_SEG_VALID);

bio_advance(bio, offset << 9);

Expand Down
2 changes: 1 addition & 1 deletion block/blk-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ static void req_bio_endio(struct request *rq, struct bio *bio,
bio->bi_error = error;

if (unlikely(rq->cmd_flags & REQ_QUIET))
set_bit(BIO_QUIET, &bio->bi_flags);
bio_set_flag(bio, BIO_QUIET);

bio_advance(bio, nbytes);

Expand Down
2 changes: 1 addition & 1 deletion block/blk-map.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq,
return PTR_ERR(bio);

if (map_data && map_data->null_mapped)
bio->bi_flags |= (1 << BIO_NULL_MAPPED);
bio_set_flag(bio, BIO_NULL_MAPPED);

if (bio->bi_iter.bi_size != iter->count) {
/*
Expand Down
2 changes: 1 addition & 1 deletion block/blk-merge.c
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ void blk_recount_segments(struct request_queue *q, struct bio *bio)
bio->bi_next = nxt;
}

bio->bi_flags |= (1 << BIO_SEG_VALID);
bio_set_flag(bio, BIO_SEG_VALID);
}
EXPORT_SYMBOL(blk_recount_segments);

Expand Down
2 changes: 1 addition & 1 deletion block/bounce.c
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ static int must_snapshot_stable_pages(struct request_queue *q, struct bio *bio)
if (!bdi_cap_stable_pages_required(&q->backing_dev_info))
return 0;

return test_bit(BIO_SNAP_STABLE, &bio->bi_flags);
return bio_flagged(bio, BIO_SNAP_STABLE);
}
#else
static int must_snapshot_stable_pages(struct request_queue *q, struct bio *bio)
Expand Down
4 changes: 2 additions & 2 deletions drivers/md/raid1.c
Original file line number Diff line number Diff line change
Expand Up @@ -1157,7 +1157,7 @@ static void make_request(struct mddev *mddev, struct bio * bio)
* non-zero, then it is the number of not-completed requests.
*/
bio->bi_phys_segments = 0;
clear_bit(BIO_SEG_VALID, &bio->bi_flags);
bio_clear_flag(bio, BIO_SEG_VALID);

if (rw == READ) {
/*
Expand Down Expand Up @@ -2711,7 +2711,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, int *skipp
/* remove last page from this bio */
bio->bi_vcnt--;
bio->bi_iter.bi_size -= len;
__clear_bit(BIO_SEG_VALID, &bio->bi_flags);
bio_clear_flag(bio, BIO_SEG_VALID);
}
goto bio_full;
}
Expand Down
6 changes: 3 additions & 3 deletions drivers/md/raid10.c
Original file line number Diff line number Diff line change
Expand Up @@ -1216,7 +1216,7 @@ static void __make_request(struct mddev *mddev, struct bio *bio)
* non-zero, then it is the number of not-completed requests.
*/
bio->bi_phys_segments = 0;
clear_bit(BIO_SEG_VALID, &bio->bi_flags);
bio_clear_flag(bio, BIO_SEG_VALID);

if (rw == READ) {
/*
Expand Down Expand Up @@ -3353,7 +3353,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr,
/* remove last page from this bio */
bio2->bi_vcnt--;
bio2->bi_iter.bi_size -= len;
__clear_bit(BIO_SEG_VALID, &bio2->bi_flags);
bio_clear_flag(bio2, BIO_SEG_VALID);
}
goto bio_full;
}
Expand Down Expand Up @@ -4433,7 +4433,7 @@ static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr,
/* Remove last page from this bio */
bio2->bi_vcnt--;
bio2->bi_iter.bi_size -= len;
__clear_bit(BIO_SEG_VALID, &bio2->bi_flags);
bio_clear_flag(bio2, BIO_SEG_VALID);
}
goto bio_full;
}
Expand Down
2 changes: 1 addition & 1 deletion drivers/md/raid5.c
Original file line number Diff line number Diff line change
Expand Up @@ -4850,7 +4850,7 @@ static int chunk_aligned_read(struct mddev *mddev, struct bio * raid_bio)
rcu_read_unlock();
raid_bio->bi_next = (void*)rdev;
align_bi->bi_bdev = rdev->bdev;
__clear_bit(BIO_SEG_VALID, &align_bi->bi_flags);
bio_clear_flag(align_bi, BIO_SEG_VALID);

if (!bio_fits_rdev(align_bi) ||
is_badblock(rdev, align_bi->bi_iter.bi_sector,
Expand Down
2 changes: 1 addition & 1 deletion fs/buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -2961,7 +2961,7 @@ static void end_bio_bh_io_sync(struct bio *bio)
{
struct buffer_head *bh = bio->bi_private;

if (unlikely (test_bit(BIO_QUIET,&bio->bi_flags)))
if (unlikely(bio_flagged(bio, BIO_QUIET)))
set_bit(BH_Quiet, &bh->b_state);

bh->b_end_io(bh, !bio->bi_error);
Expand Down
15 changes: 15 additions & 0 deletions include/linux/bio.h
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,21 @@ static inline void bio_cnt_set(struct bio *bio, unsigned int count)
atomic_set(&bio->__bi_cnt, count);
}

static inline bool bio_flagged(struct bio *bio, unsigned int bit)
{
return (bio->bi_flags & (1UL << bit)) != 0;
}

static inline void bio_set_flag(struct bio *bio, unsigned int bit)
{
bio->bi_flags |= (1UL << bit);
}

static inline void bio_clear_flag(struct bio *bio, unsigned int bit)
{
bio->bi_flags &= ~(1UL << bit);
}

enum bip_flags {
BIP_BLOCK_INTEGRITY = 1 << 0, /* block layer owns integrity data */
BIP_MAPPED_INTEGRITY = 1 << 1, /* ref tag has been remapped */
Expand Down
2 changes: 0 additions & 2 deletions include/linux/blk_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,6 @@ struct bio {
#define BIO_RESET_BITS 13
#define BIO_OWNS_VEC 13 /* bio_free() should free bvec */

#define bio_flagged(bio, flag) ((bio)->bi_flags & (1 << (flag)))

/*
* top 4 bits of bio flags indicate the pool this bio came from
*/
Expand Down

0 comments on commit b7c44ed

Please sign in to comment.