lkml.org 
[lkml]   [2020]   [Apr]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 041/245] btrfs: Add checker for EXTENT_CSUM
    3.16.83-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Qu Wenruo <quwenruo.btrfs@gmx.com>

    commit 4b865cab96fe2a30ed512cf667b354bd291b3b0a upstream.

    EXTENT_CSUM checker is a relatively easy one, only needs to check:

    1) Objectid
    Fixed to BTRFS_EXTENT_CSUM_OBJECTID

    2) Key offset alignment
    Must be aligned to sectorsize

    3) Item size alignedment
    Must be aligned to csum size

    Signed-off-by: Qu Wenruo <quwenruo.btrfs@gmx.com>
    Reviewed-by: Nikolay Borisov <nborisov@suse.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    [bwh: Backported to 4.4: Use root->sectorsize instead of
    root->fs_info->sectorsize]
    Signed-off-by: Ben Hutchings <ben.hutchings@codethink.co.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    fs/btrfs/disk-io.c | 24 ++++++++++++++++++++++++
    1 file changed, 24 insertions(+)

    --- a/fs/btrfs/disk-io.c
    +++ b/fs/btrfs/disk-io.c
    @@ -590,6 +590,27 @@ static int check_extent_data_item(struct
    return 0;
    }

    +static int check_csum_item(struct btrfs_root *root, struct extent_buffer *leaf,
    + struct btrfs_key *key, int slot)
    +{
    + u32 sectorsize = root->sectorsize;
    + u32 csumsize = btrfs_super_csum_size(root->fs_info->super_copy);
    +
    + if (key->objectid != BTRFS_EXTENT_CSUM_OBJECTID) {
    + CORRUPT("invalid objectid for csum item", leaf, root, slot);
    + return -EUCLEAN;
    + }
    + if (!IS_ALIGNED(key->offset, sectorsize)) {
    + CORRUPT("unaligned key offset for csum item", leaf, root, slot);
    + return -EUCLEAN;
    + }
    + if (!IS_ALIGNED(btrfs_item_size_nr(leaf, slot), csumsize)) {
    + CORRUPT("unaligned csum item size", leaf, root, slot);
    + return -EUCLEAN;
    + }
    + return 0;
    +}
    +
    /*
    * Common point to switch the item-specific validation.
    */
    @@ -603,6 +624,9 @@ static int check_leaf_item(struct btrfs_
    case BTRFS_EXTENT_DATA_KEY:
    ret = check_extent_data_item(root, leaf, key, slot);
    break;
    + case BTRFS_EXTENT_CSUM_KEY:
    + ret = check_csum_item(root, leaf, key, slot);
    + break;
    }
    return ret;
    }
    \
     
     \ /
      Last update: 2020-04-24 01:24    [W:3.187 / U:0.084 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site