• Ilya Dryomov's avatar
    rbd: drop parent_ref in rbd_dev_unprobe() unconditionally · e69b8d41
    Ilya Dryomov authored
    This effectively reverts the last hunk of 392a9dad ("rbd: detect
    when clone image is flattened").
    
    The problem with parent_overlap != 0 condition is that it's possible
    and completely valid to have an image with parent_overlap == 0 whose
    parent state needs to be cleaned up on unmap.  The next commit, which
    drops the "clone image now standalone" logic, opens up another window
    of opportunity to hit this, but even without it
    
        # cat parent-ref.sh
        #!/bin/bash
        rbd create --image-format 2 --size 1 foo
        rbd snap create foo@snap
        rbd snap protect foo@snap
        rbd clone foo@snap bar
        rbd resize --allow-shrink --size 0 bar
        rbd resize --size 1 bar
        DEV=$(rbd map bar)
        rbd unmap $DEV
    
    leaves rbd_device/rbd_spec/etc and rbd_client along with ceph_client
    hanging around.
    
    My thinking behind calling rbd_dev_parent_put() unconditionally is that
    there shouldn't be any requests in flight at that point in time as we
    are deep into unmap sequence.  Hence, even if rbd_dev_unparent() caused
    by flatten is delayed by in-flight requests, it will have finished by
    the time we reach rbd_dev_unprobe() caused by unmap, thus turning
    unconditional rbd_dev_parent_put() into a no-op.
    
    Fixes: http://tracker.ceph.com/issues/10352
    
    Cc: stable@vger.kernel.org # 3.11+
    Signed-off-by: default avatarIlya Dryomov <idryomov@redhat.com>
    Reviewed-by: default avatarJosh Durgin <jdurgin@redhat.com>
    Reviewed-by: default avatarAlex Elder <elder@linaro.org>
    e69b8d41
rbd.c 146 KB