[dm-devel] dm-cache writethrough issue.

Darrick J. Wong darrick.wong at oracle.com
Mon Mar 25 16:36:54 UTC 2013


On Mon, Mar 25, 2013 at 10:25:01AM +0000, Joe Thornber wrote:
> 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

Makes my problems go away on my setup, so you can add:
Tested-by: Darrick J. Wong <darrick.wong at oracle.com>

--D
> 
> 
> 
> Author: Joe Thornber <ejt at 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);
> 
> --
> dm-devel mailing list
> dm-devel at redhat.com
> https://www.redhat.com/mailman/listinfo/dm-devel




More information about the dm-devel mailing list