From 3b1ff869610c5efcf683e0d5f5e84accb0f7cb1a Mon Sep 17 00:00:00 2001 From: Justin Eno Date: Thu, 29 Jan 2015 12:59:22 -0800 Subject: [PATCH 1/1] Allow verification of random overwrites w/ba < bs When blockalign is less than blocksize, random overwrite workloads may partially overwrite blocks. This change evicts partially-overwritten blocks from the iolog tree so subsequent verification targets only intact blocks. This change also allows verification with norandommap and bsrange, though that is left disabled. Signed-off-by: Justin Eno Signed-off-by: Jens Axboe --- iolog.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/iolog.c b/iolog.c index 99f8bc18..b867583a 100644 --- a/iolog.c +++ b/iolog.c @@ -250,6 +250,7 @@ restart: p = &td->io_hist_tree.rb_node; parent = NULL; while (*p) { + int overlap = 0; parent = *p; __ipo = rb_entry(parent, struct io_piece, rb_node); @@ -257,11 +258,18 @@ restart: p = &(*p)->rb_left; else if (ipo->file > __ipo->file) p = &(*p)->rb_right; - else if (ipo->offset < __ipo->offset) + else if (ipo->offset < __ipo->offset) { p = &(*p)->rb_left; - else if (ipo->offset > __ipo->offset) + overlap = ipo->offset + ipo->len > __ipo->offset; + } + else if (ipo->offset > __ipo->offset) { p = &(*p)->rb_right; - else { + overlap = __ipo->offset + __ipo->len > ipo->offset; + } + else + overlap = 1; + + if (overlap) { dprint(FD_IO, "iolog: overlap %llu/%lu, %llu/%lu", __ipo->offset, __ipo->len, ipo->offset, ipo->len); -- 2.25.1