[dm-devel] [PATCH 1/4] brd: handle misaligned discard
Mikulas Patocka
mpatocka at redhat.com
Wed Oct 26 20:26:15 UTC 2016
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 at 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;
}
More information about the dm-devel
mailing list