1. 25 6月, 2015 1 次提交
  2. 02 5月, 2015 1 次提交
    • I
      rbd: end I/O the entire obj_request on error · 082a75da
      Ilya Dryomov 提交于
      When we end I/O struct request with error, we need to pass
      obj_request->length as @nr_bytes so that the entire obj_request worth
      of bytes is completed.  Otherwise block layer ends up confused and we
      trip on
      
          rbd_assert(more ^ (which == img_request->obj_request_count));
      
      in rbd_img_obj_callback() due to more being true no matter what.  We
      already do it in most cases but we are missing some, in particular
      those where we don't even get a chance to submit any obj_requests, due
      to an early -ENOMEM for example.
      
      A number of obj_request->xferred assignments seem to be redundant but
      I haven't touched any of obj_request->xferred stuff to keep this small
      and isolated.
      
      Cc: Alex Elder <elder@linaro.org>
      Cc: stable@vger.kernel.org # 3.10+
      Reported-by: NShawn Edwards <lesser.evil@gmail.com>
      Reviewed-by: NSage Weil <sage@redhat.com>
      Signed-off-by: NIlya Dryomov <idryomov@gmail.com>
      082a75da
  3. 22 4月, 2015 1 次提交
  4. 20 4月, 2015 2 次提交
  5. 19 2月, 2015 4 次提交
  6. 28 1月, 2015 2 次提交
    • I
      rbd: drop parent_ref in rbd_dev_unprobe() unconditionally · e69b8d41
      Ilya Dryomov 提交于
      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: NIlya Dryomov <idryomov@redhat.com>
      Reviewed-by: NJosh Durgin <jdurgin@redhat.com>
      Reviewed-by: NAlex Elder <elder@linaro.org>
      e69b8d41
    • 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
  7. 18 12月, 2014 2 次提交
  8. 30 10月, 2014 2 次提交
  9. 15 10月, 2014 14 次提交
  10. 10 9月, 2014 2 次提交
  11. 07 8月, 2014 3 次提交
  12. 25 7月, 2014 6 次提交
    • I
      rbd: take snap_id into account when reading in parent info · 4d9b67cd
      Ilya Dryomov 提交于
      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: NIlya Dryomov <ilya.dryomov@inktank.com>
      Reviewed-by: NAlex Elder <elder@linaro.org>
      4d9b67cd
    • I
      rbd: do not read in parent info before snap context · e8f59b59
      Ilya Dryomov 提交于
      Currently rbd_dev_v2_header_info() reads in parent info before the snap
      context is read in.  This is wrong, because we may need to look at the
      the parent_overlap value of the snapshot instead of that of the base
      image, for example when mapping a snapshot - see next commit.  (When
      mapping a snapshot, all we got is its name and we need the snap context
      to translate that name into an id to know which parent info to look
      for.)
      
      The approach taken here is to make sure rbd_dev_v2_parent_info() is
      called after the snap context has been read in.  The other approach
      would be to add a parent_overlap field to struct rbd_mapping and
      maintain it the same way rbd_mapping::size is maintained.  The reason
      I chose the first approach is that the value of keeping around both
      base image values and the actual mapping values is unclear to me.
      Signed-off-by: NIlya Dryomov <ilya.dryomov@inktank.com>
      Reviewed-by: NAlex Elder <elder@linaro.org>
      e8f59b59
    • I
      rbd: update mapping size only on refresh · 5ff1108c
      Ilya Dryomov 提交于
      There is no sense in trying to update the mapping size before it's even
      been set.
      Signed-off-by: NIlya Dryomov <ilya.dryomov@inktank.com>
      Reviewed-by: NAlex Elder <elder@linaro.org>
      5ff1108c
    • I
      rbd: harden rbd_dev_refresh() and callers a bit · 52bb1f9b
      Ilya Dryomov 提交于
      Recently discovered watch/notify problems showed that we really can't
      ignore errors in anything refresh related.  Alas, currently there is
      not much we can do in response to those errors, except print warnings.
      Signed-off-by: NIlya Dryomov <ilya.dryomov@inktank.com>
      Reviewed-by: NAlex Elder <elder@linaro.org>
      52bb1f9b
    • I
      rbd: split rbd_dev_spec_update() into two functions · 04077599
      Ilya Dryomov 提交于
      rbd_dev_spec_update() has two modes of operation, with nothing in
      common between them.  Split it into two functions, one for each mode
      and make our expectations more clear.
      Signed-off-by: NIlya Dryomov <ilya.dryomov@inktank.com>
      Reviewed-by: NAlex Elder <elder@linaro.org>
      04077599
    • I
      rbd: remove unnecessary asserts in rbd_dev_image_probe() · 7626eb7d
      Ilya Dryomov 提交于
      spec->image_id assert doesn't buy us much and image_format is asserted
      in rbd_dev_header_name() and rbd_dev_header_info() anyway.
      Signed-off-by: NIlya Dryomov <ilya.dryomov@inktank.com>
      Reviewed-by: NAlex Elder <elder@linaro.org>
      7626eb7d