1. 20 2月, 2013 2 次提交
  2. 19 2月, 2013 1 次提交
  3. 14 2月, 2013 22 次提交
  4. 26 1月, 2013 3 次提交
  5. 18 1月, 2013 12 次提交
    • A
      rbd: fix type of snap_id in rbd_dev_v2_snap_info() · e0b49868
      Alex Elder 提交于
      The type of the snap_id local variable is defined with the
      wrong byte order.  Fix that.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      e0b49868
    • A
      rbd: assign watch request more directly · 8b84de79
      Alex Elder 提交于
      Both rbd_req_sync_op() and rbd_do_request() have a "linger"
      parameter, which is the address of a pointer that should refer to
      the osd request structure used to issue a request to an osd.
      
      Only one case ever supplies a non-null "linger" argument: an
      CEPH_OSD_OP_WATCH start.  And in that one case it is assigned
      &rbd_dev->watch_request.
      
      Within rbd_do_request() (where the assignment ultimately gets made)
      we know the rbd_dev and therefore its watch_request field.  We
      also know whether the op being sent is CEPH_OSD_OP_WATCH start.
      
      Stop opaquely passing down the "linger" pointer, and instead just
      assign the value directly inside rbd_do_request() when it's needed.
      
      This makes it unnecessary for rbd_req_sync_watch() to make
      arrangements to hold a value that's not available until a
      bit later.  This more clearly separates setting up a watch
      request from submitting it.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      8b84de79
    • A
      rbd: move remaining osd op setup into rbd_osd_req_op_create() · 5efea49a
      Alex Elder 提交于
      The two remaining osd ops used by rbd are CEPH_OSD_OP_WATCH and
      CEPH_OSD_OP_NOTIFY_ACK.  Move the setup of those operations into
      rbd_osd_req_op_create(), and get rid of rbd_create_rw_op() and
      rbd_destroy_op().
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      5efea49a
    • A
      rbd: move call osd op setup into rbd_osd_req_op_create() · 2647ba38
      Alex Elder 提交于
      Move the initialization of the CEPH_OSD_OP_CALL operation into
      rbd_osd_req_op_create().
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      2647ba38
    • A
      rbd: don't assign extent info in rbd_req_sync_op() · 8d23bf29
      Alex Elder 提交于
      Move the assignment of the extent offset and length and payload
      length out of rbd_req_sync_op() and into its caller in the one spot
      where a read (and note--no write) operation might be initiated.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      8d23bf29
    • A
      rbd: don't assign extent info in rbd_do_request() · c5611918
      Alex Elder 提交于
      In rbd_do_request() there's a sort of last-minute assignment of the
      extent offset and length and payload length for read and write
      operations.  Move those assignments into the caller (in those spots
      that might initiate read or write operations)
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      c5611918
    • A
      rbd: don't leak rbd_req for rbd_req_sync_notify_ack() · 18216657
      Alex Elder 提交于
      When rbd_req_sync_notify_ack() calls rbd_do_request() it supplies
      rbd_simple_req_cb() as its callback function.  Because the callback
      is supplied, an rbd_req structure gets allocated and populated so it
      can be used by the callback.  However rbd_simple_req_cb() is not
      freeing (or even using) the rbd_req structure, so it's getting
      leaked.
      
      Since rbd_simple_req_cb() has no need for the rbd_req structure,
      just avoid allocating one for this case.  Of the three calls to
      rbd_do_request(), only the one from rbd_do_op() needs the rbd_req
      structure, and that call can be distinguished from the other two
      because it supplies a non-null rbd_collection pointer.
      
      So fix this leak by only allocating the rbd_req structure if a
      non-null "coll" value is provided to rbd_do_request().
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      18216657
    • A
      rbd: don't leak rbd_req on synchronous requests · 2e53c6c3
      Alex Elder 提交于
      When rbd_do_request() is called it allocates and populates an
      rbd_req structure to hold information about the osd request to be
      sent.  This is done for the benefit of the callback function (in
      particular, rbd_req_cb()), which uses this in processing when
      the request completes.
      
      Synchronous requests provide no callback function, in which case
      rbd_do_request() waits for the request to complete before returning.
      This case is not handling the needed free of the rbd_req structure
      like it should, so it is getting leaked.
      
      Note however that the synchronous case has no need for the rbd_req
      structure at all.  So rather than simply freeing this structure for
      synchronous requests, just don't allocate it to begin with.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      2e53c6c3
    • A
      rbd: combine rbd sync watch/unwatch functions · 907703d0
      Alex Elder 提交于
      The rbd_req_sync_watch() and rbd_req_sync_unwatch() functions are
      nearly identical.  Combine them into a single function with a flag
      indicating whether a watch is to be initiated or torn down.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      907703d0
    • A
      rbd: use a common layout for each device · 0903e875
      Alex Elder 提交于
      Each osd message includes a layout structure, and for rbd it is
      always the same (at least for osd's in a given pool).
      
      Initialize a layout structure when an rbd_dev gets created and just
      copy that into osd requests for the rbd image.
      
      Replace an assertion that was done when initializing the layout
      structures with code that catches and handles anything that would
      trigger the assertion as soon as it is identified.  This precludes
      that (bad) condition from ever occurring.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      0903e875
    • A
      rbd: don't bother calculating file mapping · 47dba7ba
      Alex Elder 提交于
      When rbd_do_request() has a request to process it initializes a ceph
      file layout structure and uses it to compute offsets and limits for
      the range of the request using ceph_calc_file_object_mapping().
      
      The layout used is fixed, and is based on RBD_MAX_OBJ_ORDER (30).
      It sets the layout's object size and stripe unit to be 1 GB (2^30),
      and sets the stripe count to be 1.
      
      The job of ceph_calc_file_object_mapping() is to determine which
      of a sequence of objects will contain data covered by range, and
      within that object, at what offset the range starts.  It also
      truncates the length of the range at the end of the selected object
      if necessary.
      
      This is needed for ceph fs, but for rbd it really serves no purpose.
      It does its own blocking of images into objects, echo of which is
      (1 << obj_order) in size, and as a result it ignores the "bno"
      value returned by ceph_calc_file_object_mapping().  In addition,
      by the point a request has reached this function, it is already
      destined for a single rbd object, and its length will not exceed
      that object's extent.  Because of this, and because the mapping will
      result in blocking up the range using an integer multiple of the
      image's object order, ceph_calc_file_object_mapping() will never
      change the offset or length values defined by the request.
      
      In other words, this call is a big no-op for rbd data requests.
      
      There is one exception.  We read the header object using this
      function, and in that case we will not have already limited the
      request size.  However, the header is a single object (not a file or
      rbd image), and should not be broken into pieces anyway.  So in fact
      we should *not* be calling ceph_calc_file_object_mapping() when
      operating on the header object.
      
      So...
      
      Don't call ceph_calc_file_object_mapping() in rbd_do_request(),
      because useless for image data and incorrect to do sofor the image
      header.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      47dba7ba
    • A
      rbd: open code rbd_calc_raw_layout() · e01e7927
      Alex Elder 提交于
      This patch gets rid of rbd_calc_raw_layout() by simply open coding
      it in its one caller.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      e01e7927