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 <mpato...@redhat.com>

---
 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;
        }
 

--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel

Reply via email to