[dm-devel] [PATCH 1/2]: save/restore bio vector
Jonathan Brassow
jbrassow at redhat.com
Thu Feb 5 22:03:45 UTC 2009
Review-not-tested-by: Jonathan Brassow <jbrassow at redhat.com>
brassow
On Feb 4, 2009, at 8:47 PM, Mikulas Patocka wrote:
> Hi
>
> This patch should fix bug 472796 in upstream kernel.
>
> ---
>
> Bio layer modifies the vector list when the request partially
> succeeds.
>
> Device mapper saves and restores various fields in the bio, but it
> doesn't save
> the vector. So, when the block driver modifies the vector on
> partially succeeded
> request, dm-raid1 and dm-multipath will attempt to resubmit a bio
> that has
> mismatching bi_size and the size of vector. That will cause BUG() in
> the block
> layer.
>
> To make requests resubmittable in dm-raid1 and dm-multipath, we must
> save
> and restore the bio vector as well.
>
> Signed-off-by: Mikulas Patocka <mpatocka at redhat.com>
>
> ---
> drivers/md/dm-bio-record.h | 3 +++
> 1 file changed, 3 insertions(+)
>
> Index: linux-2.6.29-rc3-devel/drivers/md/dm-bio-record.h
> ===================================================================
> --- linux-2.6.29-rc3-devel.orig/drivers/md/dm-bio-record.h
> 2009-02-05 03:10:49.000000000 +0100
> +++ linux-2.6.29-rc3-devel/drivers/md/dm-bio-record.h 2009-02-05
> 03:12:52.000000000 +0100
> @@ -22,6 +22,7 @@ struct dm_bio_details {
> unsigned int bi_size;
> unsigned short bi_idx;
> unsigned long bi_flags;
> + struct bio_vec bi_io_vec[BIO_MAX_PAGES];
> };
>
> static inline void dm_bio_record(struct dm_bio_details *bd, struct
> bio *bio)
> @@ -31,6 +32,7 @@ static inline void dm_bio_record(struct
> bd->bi_size = bio->bi_size;
> bd->bi_idx = bio->bi_idx;
> bd->bi_flags = bio->bi_flags;
> + memcpy(bd->bi_io_vec, bio->bi_io_vec, bio->bi_vcnt * sizeof(struct
> bio_vec));
> }
>
> static inline void dm_bio_restore(struct dm_bio_details *bd, struct
> bio *bio)
> @@ -40,6 +42,7 @@ static inline void dm_bio_restore(struct
> bio->bi_size = bd->bi_size;
> bio->bi_idx = bd->bi_idx;
> bio->bi_flags = bd->bi_flags;
> + memcpy(bio->bi_io_vec, bd->bi_io_vec, bio->bi_vcnt * sizeof(struct
> bio_vec));
> }
>
> #endif
>
> --
> 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