From d5e330f6f89e7ce13fe1f787d7f00a02dc702a09 Mon Sep 17 00:00:00 2001 From: Josh Boyer Date: Wed, 17 Apr 2013 19:11:03 -0400 Subject: [PATCH] Actually add patch from last commit. Sigh and stuff. --- ...le-REQ_WRITE_SAME-flag-in-write-bios.patch | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 md-raid1-10-Handle-REQ_WRITE_SAME-flag-in-write-bios.patch diff --git a/md-raid1-10-Handle-REQ_WRITE_SAME-flag-in-write-bios.patch b/md-raid1-10-Handle-REQ_WRITE_SAME-flag-in-write-bios.patch new file mode 100644 index 000000000..d9d66e22a --- /dev/null +++ b/md-raid1-10-Handle-REQ_WRITE_SAME-flag-in-write-bios.patch @@ -0,0 +1,95 @@ +From c8dc9c654794a765ca61baed07f84ed8aaa7ca8c Mon Sep 17 00:00:00 2001 +From: Joe Lawrence +Date: Thu, 21 Feb 2013 13:28:09 +1100 +Subject: [PATCH] md: raid1,10: Handle REQ_WRITE_SAME flag in write bios + +Set mddev queue's max_write_same_sectors to its chunk_sector value (before +disk_stack_limits merges the underlying disk limits.) With that in place, +be sure to handle writes coming down from the block layer that have the +REQ_WRITE_SAME flag set. That flag needs to be copied into any newly cloned +write bio. + +Signed-off-by: Joe Lawrence +Acked-by: "Martin K. Petersen" +Signed-off-by: NeilBrown +--- + drivers/md/raid1.c | 7 ++++++- + drivers/md/raid10.c | 9 +++++++-- + 2 files changed, 13 insertions(+), 3 deletions(-) + +diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c +index d5bddfc..6e5d5a5 100644 +--- a/drivers/md/raid1.c ++++ b/drivers/md/raid1.c +@@ -1000,6 +1000,7 @@ static void make_request(struct mddev *mddev, struct bio * bio) + const unsigned long do_flush_fua = (bio->bi_rw & (REQ_FLUSH | REQ_FUA)); + const unsigned long do_discard = (bio->bi_rw + & (REQ_DISCARD | REQ_SECURE)); ++ const unsigned long do_same = (bio->bi_rw & REQ_WRITE_SAME); + struct md_rdev *blocked_rdev; + struct blk_plug_cb *cb; + struct raid1_plug_cb *plug = NULL; +@@ -1301,7 +1302,8 @@ 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_rw = WRITE | do_flush_fua | do_sync | do_discard; ++ mbio->bi_rw = ++ WRITE | do_flush_fua | do_sync | do_discard | do_same; + mbio->bi_private = r1_bio; + + atomic_inc(&r1_bio->remaining); +@@ -2818,6 +2820,9 @@ static int run(struct mddev *mddev) + if (IS_ERR(conf)) + return PTR_ERR(conf); + ++ if (mddev->queue) ++ blk_queue_max_write_same_sectors(mddev->queue, ++ mddev->chunk_sectors); + rdev_for_each(rdev, mddev) { + if (!mddev->gendisk) + continue; +diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c +index 64d4824..1a74c12 100644 +--- a/drivers/md/raid10.c ++++ b/drivers/md/raid10.c +@@ -1105,6 +1105,7 @@ static void make_request(struct mddev *mddev, struct bio * bio) + const unsigned long do_fua = (bio->bi_rw & REQ_FUA); + const unsigned long do_discard = (bio->bi_rw + & (REQ_DISCARD | REQ_SECURE)); ++ const unsigned long do_same = (bio->bi_rw & REQ_WRITE_SAME); + unsigned long flags; + struct md_rdev *blocked_rdev; + struct blk_plug_cb *cb; +@@ -1460,7 +1461,8 @@ retry_write: + rdev)); + mbio->bi_bdev = rdev->bdev; + mbio->bi_end_io = raid10_end_write_request; +- mbio->bi_rw = WRITE | do_sync | do_fua | do_discard; ++ mbio->bi_rw = ++ WRITE | do_sync | do_fua | do_discard | do_same; + mbio->bi_private = r10_bio; + + atomic_inc(&r10_bio->remaining); +@@ -1502,7 +1504,8 @@ retry_write: + r10_bio, rdev)); + mbio->bi_bdev = rdev->bdev; + mbio->bi_end_io = raid10_end_write_request; +- mbio->bi_rw = WRITE | do_sync | do_fua | do_discard; ++ mbio->bi_rw = ++ WRITE | do_sync | do_fua | do_discard | do_same; + mbio->bi_private = r10_bio; + + atomic_inc(&r10_bio->remaining); +@@ -3569,6 +3572,8 @@ static int run(struct mddev *mddev) + if (mddev->queue) { + blk_queue_max_discard_sectors(mddev->queue, + mddev->chunk_sectors); ++ blk_queue_max_write_same_sectors(mddev->queue, ++ mddev->chunk_sectors); + blk_queue_io_min(mddev->queue, chunk_size); + if (conf->geo.raid_disks % conf->geo.near_copies) + blk_queue_io_opt(mddev->queue, chunk_size * conf->geo.raid_disks); +-- +1.8.1.4 +