@@ -1051,6 +1051,7 @@ static void make_request(struct mddev *mddev, struct bio * bio)
int i, disks;
struct bitmap *bitmap;
unsigned long flags;
+ const int op = bio->bi_op;
const int rw = bio_data_dir(bio);
const unsigned long do_sync = (bio->bi_rw & REQ_SYNC);
const unsigned long do_flush_fua = (bio->bi_rw & (REQ_FLUSH | REQ_FUA));
@@ -1164,6 +1165,7 @@ read_again:
mirror->rdev->data_offset;
read_bio->bi_bdev = mirror->rdev->bdev;
read_bio->bi_end_io = raid1_end_read_request;
+ read_bio->bi_op = REQ_OP_READ;
read_bio->bi_rw = READ | do_sync;
read_bio->bi_private = r1_bio;
@@ -1374,6 +1376,7 @@ read_again:
conf->mirrors[i].rdev->data_offset);
mbio->bi_bdev = conf->mirrors[i].rdev->bdev;
mbio->bi_end_io = raid1_end_write_request;
+ mbio->bi_op = op;
mbio->bi_rw =
WRITE | do_flush_fua | do_sync | do_discard | do_same;
mbio->bi_private = r1_bio;
@@ -2017,6 +2020,7 @@ static void sync_request_write(struct mddev *mddev, struct r1bio *r1_bio)
!test_bit(MD_RECOVERY_SYNC, &mddev->recovery))))
continue;
+ wbio->bi_op = REQ_OP_WRITE;
wbio->bi_rw = WRITE;
wbio->bi_end_io = end_sync_write;
atomic_inc(&r1_bio->remaining);
@@ -2188,6 +2192,7 @@ static int narrow_write_error(struct r1bio *r1_bio, int i)
wbio = bio_clone_mddev(r1_bio->master_bio, GFP_NOIO, mddev);
}
+ wbio->bi_op = REQ_OP_WRITE;
wbio->bi_rw = WRITE;
wbio->bi_iter.bi_sector = r1_bio->sector;
wbio->bi_iter.bi_size = r1_bio->sectors << 9;
@@ -2329,6 +2334,7 @@ read_more:
bio->bi_iter.bi_sector = r1_bio->sector + rdev->data_offset;
bio->bi_bdev = rdev->bdev;
bio->bi_end_io = raid1_end_read_request;
+ bio->bi_op = REQ_OP_READ;
bio->bi_rw = READ | do_sync;
bio->bi_private = r1_bio;
if (max_sectors < r1_bio->sectors) {
@@ -2544,6 +2550,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, int *skipp
if (i < conf->raid_disks)
still_degraded = 1;
} else if (!test_bit(In_sync, &rdev->flags)) {
+ bio->bi_op = REQ_OP_WRITE;
bio->bi_rw = WRITE;
bio->bi_end_io = end_sync_write;
write_targets ++;
@@ -2571,6 +2578,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, int *skipp
if (disk < 0)
disk = i;
}
+ bio->bi_op = REQ_OP_READ;
bio->bi_rw = READ;
bio->bi_end_io = end_sync_read;
read_targets++;
@@ -2583,6 +2591,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, int *skipp
* if we are doing resync or repair. Otherwise, leave
* this device alone for this sync request.
*/
+ bio->bi_op = REQ_OP_WRITE;
bio->bi_rw = WRITE;
bio->bi_end_io = end_sync_write;
write_targets++;
@@ -1058,6 +1058,7 @@ static void __make_request(struct mddev *mddev, struct bio *bio)
struct r10bio *r10_bio;
struct bio *read_bio;
int i;
+ const int op = bio->bi_op;
const int rw = bio_data_dir(bio);
const unsigned long do_sync = (bio->bi_rw & REQ_SYNC);
const unsigned long do_fua = (bio->bi_rw & REQ_FUA);
@@ -1156,6 +1157,7 @@ read_again:
choose_data_offset(r10_bio, rdev);
read_bio->bi_bdev = rdev->bdev;
read_bio->bi_end_io = raid10_end_read_request;
+ read_bio->bi_op = REQ_OP_READ;
read_bio->bi_rw = READ | do_sync;
read_bio->bi_private = r10_bio;
@@ -1363,6 +1365,7 @@ retry_write:
rdev));
mbio->bi_bdev = rdev->bdev;
mbio->bi_end_io = raid10_end_write_request;
+ mbio->bi_op = op;
mbio->bi_rw =
WRITE | do_sync | do_fua | do_discard | do_same;
mbio->bi_private = r10_bio;
@@ -1406,6 +1409,7 @@ retry_write:
r10_bio, rdev));
mbio->bi_bdev = rdev->bdev;
mbio->bi_end_io = raid10_end_write_request;
+ mbio->bi_op = op;
mbio->bi_rw =
WRITE | do_sync | do_fua | do_discard | do_same;
mbio->bi_private = r10_bio;
@@ -1988,6 +1992,7 @@ static void sync_request_write(struct mddev *mddev, struct r10bio *r10_bio)
tbio->bi_vcnt = vcnt;
tbio->bi_iter.bi_size = r10_bio->sectors << 9;
+ tbio->bi_op = REQ_OP_WRITE;
tbio->bi_rw = WRITE;
tbio->bi_private = r10_bio;
tbio->bi_iter.bi_sector = r10_bio->devs[i].addr;
@@ -2544,6 +2549,7 @@ read_more:
bio->bi_iter.bi_sector = r10_bio->devs[slot].addr
+ choose_data_offset(r10_bio, rdev);
bio->bi_bdev = rdev->bdev;
+ bio->bi_op = REQ_OP_READ;
bio->bi_rw = READ | do_sync;
bio->bi_private = r10_bio;
bio->bi_end_io = raid10_end_read_request;
@@ -3031,6 +3037,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr,
biolist = bio;
bio->bi_private = r10_bio;
bio->bi_end_io = end_sync_read;
+ bio->bi_op = REQ_OP_READ;
bio->bi_rw = READ;
from_addr = r10_bio->devs[j].addr;
bio->bi_iter.bi_sector = from_addr +
@@ -3057,6 +3064,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr,
biolist = bio;
bio->bi_private = r10_bio;
bio->bi_end_io = end_sync_write;
+ bio->bi_op = REQ_OP_WRITE;
bio->bi_rw = WRITE;
bio->bi_iter.bi_sector = to_addr
+ rdev->data_offset;
@@ -3086,6 +3094,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr,
biolist = bio;
bio->bi_private = r10_bio;
bio->bi_end_io = end_sync_write;
+ bio->bi_op = REQ_OP_WRITE;
bio->bi_rw = WRITE;
bio->bi_iter.bi_sector = to_addr +
rdev->data_offset;
@@ -3206,6 +3215,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr,
biolist = bio;
bio->bi_private = r10_bio;
bio->bi_end_io = end_sync_read;
+ bio->bi_op = REQ_OP_READ;
bio->bi_rw = READ;
bio->bi_iter.bi_sector = sector +
conf->mirrors[d].rdev->data_offset;
@@ -3228,6 +3238,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr,
biolist = bio;
bio->bi_private = r10_bio;
bio->bi_end_io = end_sync_write;
+ bio->bi_op = REQ_OP_WRITE;
bio->bi_rw = WRITE;
bio->bi_iter.bi_sector = sector +
conf->mirrors[d].replacement->data_offset;
@@ -4311,6 +4322,7 @@ read_more:
+ rdev->data_offset);
read_bio->bi_private = r10_bio;
read_bio->bi_end_io = end_sync_read;
+ read_bio->bi_op = REQ_OP_READ;
read_bio->bi_rw = READ;
read_bio->bi_flags &= (~0UL << BIO_RESET_BITS);
read_bio->bi_error = 0;
@@ -4345,6 +4357,7 @@ read_more:
rdev2->new_data_offset;
b->bi_private = r10_bio;
b->bi_end_io = end_reshape_write;
+ b->bi_op = REQ_OP_WRITE;
b->bi_rw = WRITE;
b->bi_next = blist;
blist = b;
@@ -896,29 +896,39 @@ static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s)
might_sleep();
for (i = disks; i--; ) {
- int rw;
+ int op;
+ int op_flags = 0;
int replace_only = 0;
struct bio *bi, *rbi;
struct md_rdev *rdev, *rrdev = NULL;
sh = head_sh;
if (test_and_clear_bit(R5_Wantwrite, &sh->dev[i].flags)) {
- if (test_and_clear_bit(R5_WantFUA, &sh->dev[i].flags))
- rw = WRITE_FUA;
- else
- rw = WRITE;
- if (test_bit(R5_Discard, &sh->dev[i].flags))
- rw |= REQ_DISCARD;
+ if (test_and_clear_bit(R5_WantFUA, &sh->dev[i].flags)) {
+ op = REQ_OP_WRITE;
+ op_flags = WRITE_FUA;
+ } else {
+ op = REQ_OP_WRITE;
+ }
+ if (test_bit(R5_Discard, &sh->dev[i].flags)) {
+ op = REQ_OP_DISCARD;
+ /*
+ * this temporary for compat because drivers
+ * expected this to be set for discards. It
+ * will be removed in the next patches.
+ */
+ op_flags |= REQ_WRITE;
+ }
} else if (test_and_clear_bit(R5_Wantread, &sh->dev[i].flags))
- rw = READ;
+ op = REQ_OP_READ;
else if (test_and_clear_bit(R5_WantReplace,
&sh->dev[i].flags)) {
- rw = WRITE;
+ op = REQ_OP_WRITE;
replace_only = 1;
} else
continue;
if (test_and_clear_bit(R5_SyncIO, &sh->dev[i].flags))
- rw |= REQ_SYNC;
+ op_flags |= REQ_SYNC;
again:
bi = &sh->dev[i].req;
@@ -932,7 +942,7 @@ again:
rdev = rrdev;
rrdev = NULL;
}
- if (rw & WRITE) {
+ if (op_to_data_dir(op) == WRITE) {
if (replace_only)
rdev = NULL;
if (rdev == rrdev)
@@ -958,7 +968,7 @@ again:
* need to check for writes. We never accept write errors
* on the replacement, so we don't to check rrdev.
*/
- while ((rw & WRITE) && rdev &&
+ while ((op_to_data_dir(op) == WRITE) && rdev &&
test_bit(WriteErrorSeen, &rdev->flags)) {
sector_t first_bad;
int bad_sectors;
@@ -1000,8 +1010,9 @@ again:
bio_reset(bi);
bi->bi_bdev = rdev->bdev;
- bi->bi_rw = rw;
- bi->bi_end_io = (rw & WRITE)
+ bi->bi_op = op;
+ bi->bi_rw = op | op_flags;
+ bi->bi_end_io = (op_to_data_dir(op) == WRITE)
? raid5_end_write_request
: raid5_end_read_request;
bi->bi_private = sh;
@@ -1032,7 +1043,7 @@ again:
* If this is discard request, set bi_vcnt 0. We don't
* want to confuse SCSI because SCSI will replace payload
*/
- if (rw & REQ_DISCARD)
+ if (op == REQ_OP_DISCARD)
bi->bi_vcnt = 0;
if (rrdev)
set_bit(R5_DOUBLE_LOCKED, &sh->dev[i].flags);
@@ -1052,8 +1063,9 @@ again:
bio_reset(rbi);
rbi->bi_bdev = rrdev->bdev;
- rbi->bi_rw = rw;
- BUG_ON(!(rw & WRITE));
+ rbi->bi_op = op;
+ rbi->bi_rw = op | op_flags;
+ BUG_ON(!(op_to_data_dir(op)));
rbi->bi_end_io = raid5_end_write_request;
rbi->bi_private = sh;
@@ -1081,7 +1093,7 @@ again:
* If this is discard request, set bi_vcnt 0. We don't
* want to confuse SCSI because SCSI will replace payload
*/
- if (rw & REQ_DISCARD)
+ if (op == REQ_OP_DISCARD)
rbi->bi_vcnt = 0;
if (conf->mddev->gendisk)
trace_block_bio_remap(bdev_get_queue(rbi->bi_bdev),
@@ -1090,7 +1102,7 @@ again:
generic_make_request(rbi);
}
if (!rdev && !rrdev) {
- if (rw & WRITE)
+ if (op_to_data_dir(op) == WRITE)
set_bit(STRIPE_DEGRADED, &sh->state);
pr_debug("skip op %ld on disc %d for sector %llu\n",
bi->bi_rw, i, (unsigned long long)sh->sector);