• I
    rbd: fix rbd_dev_parent_get() when parent_overlap == 0 · ae43e9d0
    Ilya Dryomov 提交于
    The comment for rbd_dev_parent_get() said
    
        * We must get the reference before checking for the overlap to
        * coordinate properly with zeroing the parent overlap in
        * rbd_dev_v2_parent_info() when an image gets flattened.  We
        * drop it again if there is no overlap.
    
    but the "drop it again if there is no overlap" part was missing from
    the implementation.  This lead to absurd parent_ref values for images
    with parent_overlap == 0, as parent_ref was incremented for each
    img_request and virtually never decremented.
    
    Fix this by leveraging the fact that refresh path calls
    rbd_dev_v2_parent_info() under header_rwsem and use it for read in
    rbd_dev_parent_get(), instead of messing around with atomics.  Get rid
    of barriers in rbd_dev_v2_parent_info() while at it - I don't see what
    they'd pair with now and I suspect we are in a pretty miserable
    situation as far as proper locking goes regardless.
    
    Cc: stable@vger.kernel.org # 3.11+
    Signed-off-by: NIlya Dryomov <idryomov@redhat.com>
    Reviewed-by: NJosh Durgin <jdurgin@redhat.com>
    Reviewed-by: NAlex Elder <elder@linaro.org>
    ae43e9d0
rbd.c 146.2 KB