• Mark Fasheh's avatar
    btrfs: fix deadlock with extent-same and readpage · f4414602
    Mark Fasheh authored
    ->readpage() does page_lock() before extent_lock(), we do the opposite in
    extent-same. We want to reverse the order in btrfs_extent_same() but it's
    not quite straightforward since the page locks are taken inside btrfs_cmp_data().
    
    So I split btrfs_cmp_data() into 3 parts with a small context structure that
    is passed between them. The first, btrfs_cmp_data_prepare() gathers up the
    pages needed (taking page lock as required) and puts them on our context
    structure. At this point, we are safe to lock the extent range. Afterwards,
    we use btrfs_cmp_data() to do the data compare as usual and btrfs_cmp_data_free()
    to clean up our context.
    Signed-off-by: default avatarMark Fasheh <mfasheh@suse.de>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.cz>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    f4414602
ioctl.c 131 KB