The brd driver refuses misaligned discard requests with an error. However, this is suboptimal, misaligned requests could be handled by discarding a part of the request that is aligned on a page boundary. This patch changes the code so that it handles misaligned requests. Signed-off-by: Mikulas Patocka <mpatocka@xxxxxxxxxx> --- drivers/block/brd.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) Index: linux-2.6/drivers/block/brd.c =================================================================== --- linux-2.6.orig/drivers/block/brd.c +++ linux-2.6/drivers/block/brd.c @@ -213,9 +213,14 @@ static int copy_to_brd_setup(struct brd_ } static void discard_from_brd(struct brd_device *brd, - sector_t sector, size_t n) + sector_t sector, unsigned n_sectors) { - while (n >= PAGE_SIZE) { + unsigned boundary = -sector & ((PAGE_SIZE >> SECTOR_SHIFT) - 1); + if (unlikely(boundary >= n_sectors)) + return; + sector += boundary; + n_sectors -= boundary; + while (n_sectors >= PAGE_SIZE >> SECTOR_SHIFT) { /* * Don't want to actually discard pages here because * re-allocating the pages can result in writeback @@ -226,7 +231,7 @@ static void discard_from_brd(struct brd_ else brd_zero_page(brd, sector); sector += PAGE_SIZE >> SECTOR_SHIFT; - n -= PAGE_SIZE; + n_sectors -= PAGE_SIZE >> SECTOR_SHIFT; } } @@ -339,10 +344,7 @@ static blk_qc_t brd_make_request(struct goto io_error; if (unlikely(bio_op(bio) == REQ_OP_DISCARD)) { - if (sector & ((PAGE_SIZE >> SECTOR_SHIFT) - 1) || - bio->bi_iter.bi_size & ~PAGE_MASK) - goto io_error; - discard_from_brd(brd, sector, bio->bi_iter.bi_size); + discard_from_brd(brd, sector, bio->bi_iter.bi_size >> SECTOR_SHIFT); goto out; } -- To unsubscribe from this list: send the line "unsubscribe linux-block" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html