1. 14 2月, 2013 14 次提交
  2. 26 1月, 2013 3 次提交
  3. 18 1月, 2013 23 次提交
    • 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
    • A
      rbd: pull in ceph_calc_raw_layout() · 08296618
      Alex Elder 提交于
      This is the first in a series of patches aimed at eliminating
      the use of ceph_calc_raw_layout() by rbd.
      
      It simply pulls in a copy of that function and renames it
      rbd_calc_raw_layout().
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      08296618
    • A
      rbd: assume single op in a request · 30573d68
      Alex Elder 提交于
      We now know that every of rbd_req_sync_op() passes an array of
      exactly one operation, as evidenced by all callers passing 1 as its
      num_op argument.  So get rid of that argument, assuming a single op.
      
      Similarly, we now know that all callers of rbd_do_request() pass 1
      as the num_op value, so that parameter can be eliminated as well.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      30573d68
    • A
      rbd: there is really only one op · 139b4318
      Alex Elder 提交于
      Throughout the rbd code there are spots where it appears we can
      handle an osd request containing more than one osd request op.
      
      But that is only the way it appears.  In fact, currently only one
      operation at a time can be supported, and supporting more than
      one will require much more than fleshing out the support that's
      there now.
      
      This patch changes names to make it perfectly clear that anywhere
      we're dealing with a block of ops, we're in fact dealing with
      exactly one of them.  We'll be able to simplify some things as
      a result.
      
      When multiple op support is implemented, we can update things again
      accordingly.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      139b4318
    • A
      libceph: pass num_op with ops · ae7ca4a3
      Alex Elder 提交于
      Both ceph_osdc_alloc_request() and ceph_osdc_build_request() are
      provided an array of ceph osd request operations.  Rather than just
      passing the number of operations in the array, the caller is
      required append an additional zeroed operation structure to signal
      the end of the array.
      
      All callers know the number of operations at the time these
      functions are called, so drop the silly zero entry and supply that
      number directly.  As a result, get_num_ops() is no longer needed.
      This also means that ceph_osdc_alloc_request() never uses its ops
      argument, so that can be dropped.
      
      Also rbd_create_rw_ops() no longer needs to add one to reserve room
      for the additional op.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      ae7ca4a3
    • A
      rbd: pass num_op with ops array · d07c0958
      Alex Elder 提交于
      Add a num_op parameter to rbd_do_request() and rbd_req_sync_op() to
      indicate the number of entries in the array.  The callers of these
      functions always know how many entries are in the array, so just
      pass that information down.
      
      This is in anticipation of eliminating the extra zero-filled entry
      in these ops arrays.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      d07c0958
    • A
      libceph: don't set pages or bio in ceph_osdc_alloc_request() · 54a54007
      Alex Elder 提交于
      Only one of the two callers of ceph_osdc_alloc_request() provides
      page or bio data for its payload.  And essentially all that function
      was doing with those arguments was assigning them to fields in the
      osd request structure.
      
      Simplify ceph_osdc_alloc_request() by having the caller take care of
      making those assignments
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      54a54007
    • A
      libceph: don't set flags in ceph_osdc_alloc_request() · d178a9e7
      Alex Elder 提交于
      The only thing ceph_osdc_alloc_request() really does with the
      flags value it is passed is assign it to the newly-created
      osd request structure.  Do that in the caller instead.
      
      Both callers subsequently call ceph_osdc_build_request(), so have
      that function (instead of ceph_osdc_alloc_request()) issue a warning
      if a request comes through with neither the read nor write flags set.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      d178a9e7
    • A
      libceph: drop osdc from ceph_calc_raw_layout() · e75b45cf
      Alex Elder 提交于
      The osdc parameter to ceph_calc_raw_layout() is not used, so get rid
      of it.  Consequently, the corresponding parameter in calc_layout()
      becomes unused, so get rid of that as well.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      e75b45cf
    • A
      libceph: drop snapid in ceph_calc_raw_layout() · 4d6b250b
      Alex Elder 提交于
      A snapshot id must be provided to ceph_calc_raw_layout() even though
      it is not needed at all for calculating the layout.
      
      Where the snapshot id *is* needed is when building the request
      message for an osd operation.
      
      Drop the snapid parameter from ceph_calc_raw_layout() and pass
      that value instead in ceph_osdc_build_request().
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      4d6b250b
    • A
      libceph: pass length to ceph_osdc_build_request() · 0120be3c
      Alex Elder 提交于
      The len argument to ceph_osdc_build_request() is set up to be
      passed by address, but that function never updates its value
      so there's no need to do this.  Tighten up the interface by
      passing the length directly.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      0120be3c
    • A
      rbd: don't bother setting snapid in rbd_do_request() · 7c3d22cf
      Alex Elder 提交于
      For some reason, the snapid field of the osd request header is
      explicitly set to CEPH_NOSNAP in rbd_do_request().  Just a few lines
      later--with no code that would access this field in between--a call
      is made to ceph_calc_raw_layout() passing the snapid provided to
      rbd_do_request(), which encodes the snapid value it is provided into
      that field instead.
      
      In other words, there is no need to fill in CEPH_NOSNAP, and doing
      so suggests it might be necessary.  Don't do that any more.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      7c3d22cf