• Josef Bacik's avatar
    btrfs: handle errors from btrfs_read_node_slot in split · 9cf14029
    Josef Bacik authored
    While investigating a problem with error injection I tripped over
    curious behavior in the node/leaf splitting code.  If we get an EIO when
    trying to read either the left or right leaf/node for splitting we'll
    simply treat the node as if it were full and continue on.  The end
    result of this isn't too bad, we simply end up allocating a block when
    we may have pushed items into the adjacent blocks.
    
    However this does essentially allow us to continue to modify a file
    system that we've gotten errors on, either from a bad disk or csum
    mismatch or other corruption.  This isn't particularly safe, so instead
    handle these btrfs_read_node_slot() usages differently.  We allow you to
    pass in any slot, the idea being that we save some code if the slot
    number is outside of the range of the parent.  This means we treat all
    errors the same, when in reality we only want to ignore -ENOENT.
    
    Fix this by changing how we call btrfs_read_node_slot(), which is to
    only call it for slots we know are valid.  This way if we get an error
    back from reading the block we can properly pass the error up the chain.
    This was validated with the error injection testing I was doing.
    Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    9cf14029
ctree.c 131 KB