• Ilya Dryomov's avatar
    rbd: take snap_id into account when reading in parent info · 4d9b67cd
    Ilya Dryomov authored
    If we are mapping a snapshot, we must read in the parent_overlap value
    of that snapshot instead of that of the base image.  Not doing so may
    in particular result in us returning zeros instead of user data:
    
        # cat overlap-snap.sh
        #!/bin/bash
        rbd create --size 10 --image-format 2 foo
        FOO_DEV=$(rbd map foo)
        dd if=/dev/urandom of=$FOO_DEV bs=1M &>/dev/null
        echo "Base image"
        dd if=$FOO_DEV bs=1 count=16 skip=$(((4 << 20) - 8)) 2>/dev/null | xxd
        rbd snap create foo@snap
        rbd snap protect foo@snap
        rbd clone foo@snap bar
        rbd snap create bar@snap
        BAR_DEV=$(rbd map bar@snap)
        echo "Snapshot"
        dd if=$BAR_DEV bs=1 count=16 skip=$(((4 << 20) - 8)) 2>/dev/null | xxd
        rbd resize --allow-shrink --size 4 bar
        echo "Snapshot after base image resize"
        dd if=$BAR_DEV bs=1 count=16 skip=$(((4 << 20) - 8)) 2>/dev/null | xxd
    
        # ./overlap-snap.sh
        Base image
        0000000: e781 e33b d34b 2225 6034 2845 a2e3 36ed  ...;.K"%`4(E..6.
        Snapshot
        0000000: e781 e33b d34b 2225 6034 2845 a2e3 36ed  ...;.K"%`4(E..6.
        Resizing image: 100% complete...done.
        Snapshot after base image resize
        0000000: e781 e33b d34b 2225 0000 0000 0000 0000  ...;.K"%........
    
    Even though bar@snap is taken with the old bar parent_overlap (8M),
    reads from bar@snap beyond the new bar parent_overlap (4M) return
    zeroes.  Fix it.
    Signed-off-by: default avatarIlya Dryomov <ilya.dryomov@inktank.com>
    Reviewed-by: default avatarAlex Elder <elder@linaro.org>
    4d9b67cd
rbd.c 141 KB