All of lore.kernel.org
 help / color / mirror / Atom feed
From: Joe Thornber <thornber@redhat.com>
To: dm-devel@redhat.com
Cc: agk@redhat.com
Subject: dm-cache writethrough issue.
Date: Mon, 25 Mar 2013 10:25:01 +0000	[thread overview]
Message-ID: <20130325102500.GA6340@debian> (raw)

Alasdair,

Could you push this upstream ASAP please?

I'm not happy that we're now adding such a large structure to the per
bio data, at the very least we should only do this if writethrough is
enabled.  But I'll improve this later, for now correctness is the
important thing.

- Joe



Author: Joe Thornber <ejt@redhat.com>
Date:   Mon Mar 25 10:10:58 2013 +0000

    [dm-cache] Writethrough mode wasn't resetting bio fields before reusing
    
    The writethrough mode reuses the same bio to write to both the origin
    and cache device.  It was recording the bi_sector and restoring this,
    but this was inadequate; lower level drivers can change all sorts of
    bio fields.
    
    This patch adds a struct dm_bio_details field, and uses
    dm_bio_record() and dm_bio_restore() to ensure the bio is restored
    before reissuing to the cache device.
    
    Issue discovered by Darrick Wong.

diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c
index cf24a46..873f495 100644
--- a/drivers/md/dm-cache-target.c
+++ b/drivers/md/dm-cache-target.c
@@ -6,6 +6,7 @@
 
 #include "dm.h"
 #include "dm-bio-prison.h"
+#include "dm-bio-record.h"
 #include "dm-cache-metadata.h"
 
 #include <linux/dm-io.h>
@@ -205,6 +206,7 @@ struct per_bio_data {
        struct cache *cache;
        dm_cblock_t cblock;
        bio_end_io_t *saved_bi_end_io;
+       struct dm_bio_details bio_details;
 };
 
 struct dm_cache_migration {
@@ -642,6 +644,7 @@ static void writethrough_endio(struct bio *bio, int err)
                return;
        }
 
+       dm_bio_restore(&pb->bio_details, bio);
        remap_to_cache(pb->cache, bio, pb->cblock);
 
        /*
@@ -665,6 +668,7 @@ static void remap_to_origin_then_cache(struct cache *cache, struct bio *bio,
        pb->cache = cache;
        pb->cblock = cblock;
        pb->saved_bi_end_io = bio->bi_end_io;
+       dm_bio_record(&pb->bio_details, bio);
        bio->bi_end_io = writethrough_endio;
 
        remap_to_origin_clear_discard(pb->cache, bio, oblock);

             reply	other threads:[~2013-03-25 10:25 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-25 10:25 Joe Thornber [this message]
2013-03-25 16:36 ` dm-cache writethrough issue Darrick J. Wong
2013-03-26  9:39   ` Joe Thornber

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20130325102500.GA6340@debian \
    --to=thornber@redhat.com \
    --cc=agk@redhat.com \
    --cc=dm-devel@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.