brd: Fix discard request processing
authorBart Van Assche <bart.vanassche@sandisk.com>
Tue, 15 Dec 2015 15:38:22 +0000 (16:38 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 12 Apr 2016 16:08:53 +0000 (09:08 -0700)
commit 5e4298be45e83ecdffaabb370eea9396889b07f1 upstream.

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>
Signed-off-by: Jens Axboe <axboe@fb.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/block/brd.c

index a5880f4ab40eb069bda60d6403b223d61ff1db80..1914c63ca8b1d858b07ae102f7b0715785004038 100644 (file)
@@ -338,7 +338,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;