brd: Fix discard request processing
authorBart Van Assche <bart.vanassche@sandisk.com>
Tue, 15 Dec 2015 15:38:22 +0000 (16:38 +0100)
committerJens Axboe <axboe@fb.com>
Tue, 15 Mar 2016 21:10:29 +0000 (14:10 -0700)
Avoid that discard requests with size => PAGE_SIZE fail with
-EIO. Refuse discard requests if the discard size is not a
multiple of the page size.

Fixes: 2dbe54957636 ("brd: Refuse improperly aligned discard requests")
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Reviewed-by: Jan Kara <jack@suse.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Robert Elliot <elliott@hp.com>
Cc: stable <stable@vger.kernel.org> # v4.4+
Signed-off-by: Jens Axboe <axboe@fb.com>
drivers/block/brd.c

index cb27190..f7ecc28 100644 (file)
@@ -341,7 +341,7 @@ static blk_qc_t brd_make_request(struct request_queue *q, struct bio *bio)
 
        if (unlikely(bio->bi_rw & REQ_DISCARD)) {
                if (sector & ((PAGE_SIZE >> SECTOR_SHIFT) - 1) ||
-                   bio->bi_iter.bi_size & PAGE_MASK)
+                   bio->bi_iter.bi_size & ~PAGE_MASK)
                        goto io_error;
                discard_from_brd(brd, sector, bio->bi_iter.bi_size);
                goto out;