• Alex Elder's avatar
    rbd: detect when clone image is flattened · 392a9dad
    Alex Elder authored
    A format 2 clone image can be the subject of a "flatten" operation,
    during which all of its data gets "copied up" from its parent image,
    leaving the image fully populated.  Once this is complete, the
    clone's association with the parent is abolished.
    
    Since this can occur when a clone is mapped, we need to detect when
    it has occurred and handle it accordingly.  We know an image has
    been flattened when we know it at one time had a parent, but we have
    learned (via a "get_parent" object class method call) it no longer
    has one.
    
    There might be in-flight requests at the point we learn an image has
    been flattened, so we can't simply clean up parent data structures
    right away.  Instead, we'll drop the initial parent reference when
    the parent has disappeared (rather than when the image gets
    destroyed), which will allow the last in-flight reference to clean
    things up when it's complete.
    
    We leverage the fact that a zero parent overlap renders an image
    effectively unlayered.  We set the overlap to 0 at the point we
    detect the clone image has flattened, which allows the unlayered
    behavior to take effect immediately, while keeping other parent
    structures in place until in-flight requests to complete.
    
    This and the next few patches resolve:
        http://tracker.ceph.com/issues/3763Signed-off-by: default avatarAlex Elder <elder@inktank.com>
    Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
    392a9dad
rbd.c 133 KB