• Wang Xiaoguang's avatar
    btrfs: introduce tickets_id to determine whether asynchronous metadata reclaim work makes progress · ce129655
    Wang Xiaoguang authored
    In btrfs_async_reclaim_metadata_space(), we use ticket's address to
    determine whether asynchronous metadata reclaim work is making progress.
    
    	ticket = list_first_entry(&space_info->tickets,
    				  struct reserve_ticket, list);
    	if (last_ticket == ticket) {
    		flush_state++;
    	} else {
    		last_ticket = ticket;
    		flush_state = FLUSH_DELAYED_ITEMS_NR;
    		if (commit_cycles)
    			commit_cycles--;
    	}
    
    But indeed it's wrong, we should not rely on local variable's address to
    do this check, because addresses may be same. In my test environment, I
    dd one 168MB file in a 256MB fs, found that for this file, every time
    wait_reserve_ticket() called, local variable ticket's address is same,
    
    For above codes, assume a previous ticket's address is addrA, last_ticket
    is addrA. Btrfs_async_reclaim_metadata_space() finished this ticket and
    wake up it, then another ticket is added, but with the same address addrA,
    now last_ticket will be same to current ticket, then current ticket's flush
    work will start from current flush_state, not initial FLUSH_DELAYED_ITEMS_NR,
    which may result in some enospc issues(I have seen this in my test machine).
    Signed-off-by: default avatarWang Xiaoguang <wangxg.fnst@cn.fujitsu.com>
    Reviewed-by: default avatarJosef Bacik <jbacik@fb.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    ce129655
extent-tree.c 304 KB