Message ID | 20241112124256.4106435-5-john.g.garry@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | RAID 0/1/10 atomic write support | expand |
在 2024/11/12 20:42, John Garry 写道: > Set BLK_FEAT_ATOMIC_WRITES_STACKED to enable atomic writes. > > For an attempt to atomic write to a region which has bad blocks, error > the write as we just cannot do this. It is unlikely to find devices which > support atomic writes and bad blocks. > > Signed-off-by: John Garry <john.g.garry@oracle.com> > --- > drivers/md/raid1.c | 14 ++++++++++++-- > 1 file changed, 12 insertions(+), 2 deletions(-) > I review the patch 5 first, it's the same, so. Reviewed-by: Yu Kuai <yukuai3@huawei.com> > diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c > index a5adf08ee174..cd44b4bebf49 100644 > --- a/drivers/md/raid1.c > +++ b/drivers/md/raid1.c > @@ -1571,7 +1571,15 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio, > continue; > } > if (is_bad) { > - int good_sectors = first_bad - r1_bio->sector; > + int good_sectors; > + > + if (bio->bi_opf & REQ_ATOMIC) { > + /* We just cannot atomically write this ... */ > + error = -EFAULT; > + goto err_handle; > + } > + > + good_sectors = first_bad - r1_bio->sector; > if (good_sectors < max_sectors) > max_sectors = good_sectors; > } > @@ -1657,7 +1665,8 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio, > > mbio->bi_iter.bi_sector = (r1_bio->sector + rdev->data_offset); > mbio->bi_end_io = raid1_end_write_request; > - mbio->bi_opf = bio_op(bio) | (bio->bi_opf & (REQ_SYNC | REQ_FUA)); > + mbio->bi_opf = bio_op(bio) | > + (bio->bi_opf & (REQ_SYNC | REQ_FUA | REQ_ATOMIC)); > if (test_bit(FailFast, &rdev->flags) && > !test_bit(WriteMostly, &rdev->flags) && > conf->raid_disks - mddev->degraded > 1) > @@ -3224,6 +3233,7 @@ static int raid1_set_limits(struct mddev *mddev) > > md_init_stacking_limits(&lim); > lim.max_write_zeroes_sectors = 0; > + lim.features |= BLK_FEAT_ATOMIC_WRITES_STACKED; > err = mddev_stack_rdev_limits(mddev, &lim, MDDEV_STACK_INTEGRITY); > if (err) { > queue_limits_cancel_update(mddev->gendisk->queue); >
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index a5adf08ee174..cd44b4bebf49 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -1571,7 +1571,15 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio, continue; } if (is_bad) { - int good_sectors = first_bad - r1_bio->sector; + int good_sectors; + + if (bio->bi_opf & REQ_ATOMIC) { + /* We just cannot atomically write this ... */ + error = -EFAULT; + goto err_handle; + } + + good_sectors = first_bad - r1_bio->sector; if (good_sectors < max_sectors) max_sectors = good_sectors; } @@ -1657,7 +1665,8 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio, mbio->bi_iter.bi_sector = (r1_bio->sector + rdev->data_offset); mbio->bi_end_io = raid1_end_write_request; - mbio->bi_opf = bio_op(bio) | (bio->bi_opf & (REQ_SYNC | REQ_FUA)); + mbio->bi_opf = bio_op(bio) | + (bio->bi_opf & (REQ_SYNC | REQ_FUA | REQ_ATOMIC)); if (test_bit(FailFast, &rdev->flags) && !test_bit(WriteMostly, &rdev->flags) && conf->raid_disks - mddev->degraded > 1) @@ -3224,6 +3233,7 @@ static int raid1_set_limits(struct mddev *mddev) md_init_stacking_limits(&lim); lim.max_write_zeroes_sectors = 0; + lim.features |= BLK_FEAT_ATOMIC_WRITES_STACKED; err = mddev_stack_rdev_limits(mddev, &lim, MDDEV_STACK_INTEGRITY); if (err) { queue_limits_cancel_update(mddev->gendisk->queue);
Set BLK_FEAT_ATOMIC_WRITES_STACKED to enable atomic writes. For an attempt to atomic write to a region which has bad blocks, error the write as we just cannot do this. It is unlikely to find devices which support atomic writes and bad blocks. Signed-off-by: John Garry <john.g.garry@oracle.com> --- drivers/md/raid1.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)