• K
    qcow2: Limit COW to where it's needed · 54e68143
    Kevin Wolf 提交于
    This fixes a regression introduced in commit 250196f1. The bug leads to
    data corruption, found during an Autotest run with a Fedora 8 guest.
    
    Consider a write request whose first part is covered by an already
    allocated cluster, but additional clusters need to be newly allocated.
    When counting the number of clusters to allocate, the qcow2 code would
    decide to do COW for all remaining clusters of the write request, even
    if some of them are already allocated.
    
    If during this COW operation another write request is issued that touches
    the same cluster, it will still refer to the old cluster. When the COW
    completes, the first request will update the L2 table and the second
    write request will be lost. Note that the requests need not overlap, it's
    enough for them to touch the same cluster.
    
    This patch ensures that only clusters that really require COW are
    considered for allocation. In this case any other request writing to the
    same cluster will be an allocating write and gets serialised.
    Reported-by: NMarcelo Tosatti <mtosatti@redhat.com>
    Tested-by: NMarcelo Tosatti <mtosatti@redhat.com>
    Signed-off-by: NKevin Wolf <kwolf@redhat.com>
    54e68143
qcow2-cluster.c 35.0 KB