lkml.org 
[lkml]   [2019]   [Dec]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 144/321] dm flakey: Properly corrupt multi-page bios.
    Date
    From: Sweet Tea <sweettea@redhat.com>

    [ Upstream commit a00f5276e26636cbf72f24f79831026d2e2868e7 ]

    The flakey target is documented to be able to corrupt the Nth byte in
    a bio, but does not corrupt byte indices after the first biovec in the
    bio. Change the corrupting function to actually corrupt the Nth byte
    no matter in which biovec that index falls.

    A test device generating two-page bios, atop a flakey device configured
    to corrupt a byte index on the second page, verified both the failure
    to corrupt before this patch and the expected corruption after this
    change.

    Signed-off-by: John Dorminy <jdorminy@redhat.com>
    Signed-off-by: Mike Snitzer <snitzer@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/md/dm-flakey.c | 33 ++++++++++++++++++++++-----------
    1 file changed, 22 insertions(+), 11 deletions(-)

    diff --git a/drivers/md/dm-flakey.c b/drivers/md/dm-flakey.c
    index b86d2439ffc76..2fcf62fb2844f 100644
    --- a/drivers/md/dm-flakey.c
    +++ b/drivers/md/dm-flakey.c
    @@ -287,20 +287,31 @@ static void flakey_map_bio(struct dm_target *ti, struct bio *bio)

    static void corrupt_bio_data(struct bio *bio, struct flakey_c *fc)
    {
    - unsigned bio_bytes = bio_cur_bytes(bio);
    - char *data = bio_data(bio);
    + unsigned int corrupt_bio_byte = fc->corrupt_bio_byte - 1;
    +
    + struct bvec_iter iter;
    + struct bio_vec bvec;
    +
    + if (!bio_has_data(bio))
    + return;

    /*
    - * Overwrite the Nth byte of the data returned.
    + * Overwrite the Nth byte of the bio's data, on whichever page
    + * it falls.
    */
    - if (data && bio_bytes >= fc->corrupt_bio_byte) {
    - data[fc->corrupt_bio_byte - 1] = fc->corrupt_bio_value;
    -
    - DMDEBUG("Corrupting data bio=%p by writing %u to byte %u "
    - "(rw=%c bi_opf=%u bi_sector=%llu cur_bytes=%u)\n",
    - bio, fc->corrupt_bio_value, fc->corrupt_bio_byte,
    - (bio_data_dir(bio) == WRITE) ? 'w' : 'r', bio->bi_opf,
    - (unsigned long long)bio->bi_iter.bi_sector, bio_bytes);
    + bio_for_each_segment(bvec, bio, iter) {
    + if (bio_iter_len(bio, iter) > corrupt_bio_byte) {
    + char *segment = (page_address(bio_iter_page(bio, iter))
    + + bio_iter_offset(bio, iter));
    + segment[corrupt_bio_byte] = fc->corrupt_bio_value;
    + DMDEBUG("Corrupting data bio=%p by writing %u to byte %u "
    + "(rw=%c bi_opf=%u bi_sector=%llu size=%u)\n",
    + bio, fc->corrupt_bio_value, fc->corrupt_bio_byte,
    + (bio_data_dir(bio) == WRITE) ? 'w' : 'r', bio->bi_opf,
    + (unsigned long long)bio->bi_iter.bi_sector, bio->bi_iter.bi_size);
    + break;
    + }
    + corrupt_bio_byte -= bio_iter_len(bio, iter);
    }
    }

    --
    2.20.1


    \
     
     \ /
      Last update: 2019-12-03 23:52    [W:4.091 / U:0.288 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site