Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3deff1a7 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe
Browse files

md: support REQ_OP_WRITE_ZEROES



Copy & paste from the REQ_OP_WRITE_SAME code.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent 02d26103
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -293,6 +293,7 @@ static void linear_make_request(struct mddev *mddev, struct bio *bio)
						      split, disk_devt(mddev->gendisk),
						      bio_sector);
			mddev_check_writesame(mddev, split);
			mddev_check_write_zeroes(mddev, split);
			generic_make_request(split);
		}
	} while (split != bio);
+7 −0
Original line number Diff line number Diff line
@@ -709,4 +709,11 @@ static inline void mddev_check_writesame(struct mddev *mddev, struct bio *bio)
	    !bdev_get_queue(bio->bi_bdev)->limits.max_write_same_sectors)
		mddev->queue->limits.max_write_same_sectors = 0;
}

static inline void mddev_check_write_zeroes(struct mddev *mddev, struct bio *bio)
{
	if (bio_op(bio) == REQ_OP_WRITE_ZEROES &&
	    !bdev_get_queue(bio->bi_bdev)->limits.max_write_zeroes_sectors)
		mddev->queue->limits.max_write_zeroes_sectors = 0;
}
#endif /* _MD_MD_H */
+1 −0
Original line number Diff line number Diff line
@@ -139,6 +139,7 @@ static void multipath_make_request(struct mddev *mddev, struct bio * bio)
	mp_bh->bio.bi_end_io = multipath_end_request;
	mp_bh->bio.bi_private = mp_bh;
	mddev_check_writesame(mddev, &mp_bh->bio);
	mddev_check_write_zeroes(mddev, &mp_bh->bio);
	generic_make_request(&mp_bh->bio);
	return;
}
+2 −0
Original line number Diff line number Diff line
@@ -383,6 +383,7 @@ static int raid0_run(struct mddev *mddev)

		blk_queue_max_hw_sectors(mddev->queue, mddev->chunk_sectors);
		blk_queue_max_write_same_sectors(mddev->queue, mddev->chunk_sectors);
		blk_queue_max_write_zeroes_sectors(mddev->queue, mddev->chunk_sectors);
		blk_queue_max_discard_sectors(mddev->queue, mddev->chunk_sectors);

		blk_queue_io_min(mddev->queue, mddev->chunk_sectors << 9);
@@ -504,6 +505,7 @@ static void raid0_make_request(struct mddev *mddev, struct bio *bio)
						      split, disk_devt(mddev->gendisk),
						      bio_sector);
			mddev_check_writesame(mddev, split);
			mddev_check_write_zeroes(mddev, split);
			generic_make_request(split);
		}
	} while (split != bio);
+3 −1
Original line number Diff line number Diff line
@@ -3177,8 +3177,10 @@ static int raid1_run(struct mddev *mddev)
	if (IS_ERR(conf))
		return PTR_ERR(conf);

	if (mddev->queue)
	if (mddev->queue) {
		blk_queue_max_write_same_sectors(mddev->queue, 0);
		blk_queue_max_write_zeroes_sectors(mddev->queue, 0);
	}

	rdev_for_each(rdev, mddev) {
		if (!mddev->gendisk)
Loading