• Chris Mason's avatar
    Btrfs: fix regression in btrfs_page_mkwrite() from vm_fault_t conversion · 717beb96
    Chris Mason authored
    The vm_fault_t conversion commit introduced a ret2 variable for tracking
    the integer return values from internal btrfs functions.  It was
    sometimes returning VM_FAULT_LOCKED for pages that were actually invalid
    and had been removed from the radix.  Something like this:
    
        ret2 = btrfs_delalloc_reserve_space() // returns zero on success
    
        lock_page(page)
        if (page->mapping != inode->i_mapping)
    	goto out_unlock;
    
    ...
    
    out_unlock:
        if (!ret2) {
    	    ...
    	    return VM_FAULT_LOCKED;
        }
    
    This ends up triggering this WARNING in btrfs_destroy_inode()
        WARN_ON(BTRFS_I(inode)->block_rsv.size);
    
    xfstests generic/095 was able to reliably reproduce the errors.
    
    Since out_unlock: is only used for errors, this fix moves it below the
    if (!ret2) check we use to return VM_FAULT_LOCKED for success.
    
    Fixes: a528a241 (btrfs: change return type of btrfs_page_mkwrite to vm_fault_t)
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    717beb96
inode.c 285 KB