• Filipe Manana's avatar
    Btrfs: send, don't leave without decrementing clone root's send_progress · 2f1f465a
    Filipe Manana authored
    If the clone root was not readonly or the dead flag was set on it, we were
    leaving without decrementing the root's send_progress counter (and before
    we just incremented it). If a concurrent snapshot deletion was in progress
    and ended up being aborted, it would be impossible to later attempt to
    delete again the snapshot, since the root's send_in_progress counter could
    never go back to 0.
    
    We were also setting clone_sources_to_rollback to i + 1 too early - if we
    bailed out because the clone root we got is not readonly or flagged as dead
    we ended up later derreferencing a null pointer because we didn't assign
    the clone root to sctx->clone_roots[i].root:
    
    		for (i = 0; sctx && i < clone_sources_to_rollback; i++)
    			btrfs_root_dec_send_in_progress(
    					sctx->clone_roots[i].root);
    
    So just don't increment the send_in_progress counter if the root is readonly
    or flagged as dead.
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.cz>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    2f1f465a
send.c 139 KB