]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
test_librbd_fsx: flush before discard in krbd mode 4451/head
authorIlya Dryomov <idryomov@gmail.com>
Thu, 23 Apr 2015 16:22:05 +0000 (19:22 +0300)
committerIlya Dryomov <idryomov@gmail.com>
Thu, 23 Apr 2015 16:31:43 +0000 (19:31 +0300)
We need to sync dirty pages before issuing BLKDISCARD, explained in
a comment.

Fixes: #11448
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
src/test/librbd/fsx.c

index e2ad45c4bb3f6421e7d9116c5135d2d0c725e26d..782522b7e5e790d9b3433496b14212b377bf4bfe 100644 (file)
@@ -658,6 +658,20 @@ krbd_discard(struct rbd_ctx *ctx, uint64_t off, uint64_t len)
        uint64_t range[2] = { off, len };
        int ret;
 
+       /*
+        * BLKDISCARD doesn't affect dirty pages.  This means we can't
+        * rely on discarded sectors to match good_buf (i.e. contain
+        * zeros) without a preceding cache flush:
+        *
+        *   write 0..3M
+        *   discard 1..2M
+        *
+        * results in "data data data" rather than "data 0000 data".
+        */
+       ret = __krbd_flush(ctx);
+       if (ret < 0)
+               return ret;
+
        /*
         * off and len must be 512-byte aligned, otherwise BLKDISCARD
         * will fail with -EINVAL.  This means that -K (enable krbd
@@ -697,11 +711,18 @@ krbd_resize(struct rbd_ctx *ctx, uint64_t size)
        assert(size % truncbdy == 0);
 
        /*
-        * This is essential: when krbd detects a size change, it calls
-        * revalidate_disk(), which ends up calling invalidate_bdev(),
-        * which invalidates only clean buffers.  The cache flush makes
-        * it invalidate everything, which is what we need if we are
-        * shrinking.
+        * When krbd detects a size change, it calls revalidate_disk(),
+        * which ends up calling invalidate_bdev(), which invalidates
+        * clean pages and does nothing about dirty pages beyond the
+        * new size.  The preceding cache flush makes sure those pages
+        * are invalidated, which is what we need on shrink:
+        *
+        *  write 0..1M
+        *  resize 0
+        *  resize 2M
+        *  write 1..2M
+        *
+        * results in "data data" rather than "0000 data".
         */
        ret = __krbd_flush(ctx);
        if (ret < 0)