block: manipulate bio->bi_flags through helpers
authorJens Axboe <axboe@fb.com>
Fri, 24 Jul 2015 18:37:59 +0000 (12:37 -0600)
committerJens Axboe <axboe@fb.com>
Wed, 29 Jul 2015 14:55:20 +0000 (08:55 -0600)
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>
block/bio.c
block/blk-core.c
block/blk-map.c
block/blk-merge.c
block/bounce.c
drivers/md/raid1.c
drivers/md/raid10.c
drivers/md/raid5.c
fs/buffer.c
include/linux/bio.h
include/linux/blk_types.h

index a23f489f398f660ae1eec926d1f04fe783aba04b..911ae8f827521a611df4b5666671572fc1145e90 100644 (file)
@@ -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);
 }
@@ -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;
        }
@@ -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;
@@ -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;
@@ -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,
@@ -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;
        }
 
@@ -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);
 
index 7ef15b947b91d7965bb0ec9f1f863d7a90ec0629..d1796b54e97a6289fc69d073a3b02abcb207a4b7 100644 (file)
@@ -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);
 
index 5fe1c30bfba7551f5b82e9f9577bdb3ab444dff2..233841644c9d3ab31c6b388db5fd74cb4976c270 100644 (file)
@@ -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) {
                /*
index 30a0d9f890170b7540546557b950713b8e372780..a455b9860143c8ee8e2ceb635cea053e3735665c 100644 (file)
@@ -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);
 
index f4db245b9f3a67632899dbc32c443b88974405a5..2c310ea007ee3653b085c1efe9d195b18772be85 100644 (file)
@@ -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)
index 9aa7d1fb2bc1775a5db870f61f4b6814e8704c51..60d0a8626e63171e6fc26883b6244ebc33507e6a 100644 (file)
@@ -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) {
                /*
@@ -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;
                                }
index 929e9a26d81b1937ad7bffcd1c7a7a2707533ecc..316ff6f611e96c2d97feac3322a223e36ce7f23a 100644 (file)
@@ -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) {
                /*
@@ -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;
                }
@@ -4433,7 +4433,7 @@ read_more:
                                /* 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;
                }
index 84d6eec1033ea93ffd8702c54e8c9d5621479e87..e3d48775c9df1c8b2b18214eac651ae5ca5b6fdc 100644 (file)
@@ -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,
index 7a49bb84ecb5de9864aa16c368515bd04c0d782a..7887bb46636817bd003087c44853a108803613c1 100644 (file)
@@ -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);
index 6b918177002d696adedf1ce813a1367ce013a4af..986e6e19feb58c1fceb83b64f94d0d1ad88b6c48 100644 (file)
@@ -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 */
index 6164fb8a817b912f9865c9b7d5d7f6459d3dfbbe..a765a50e780f85a8574ceb2d951e45ddbaca9560 100644 (file)
@@ -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
  */