1. 02 10月, 2012 29 次提交
    • A
      rbd: return snap name from rbd_add_parse_args() · 3feeb894
      Alex Elder 提交于
      This is the first of two patches aimed at isolating the code that
      sets the mapping information into a single spot.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      3feeb894
    • A
      rbd: record mapped size · 99c1f08f
      Alex Elder 提交于
      Add the size of the mapped image to the set of mapping-specific
      fields in an rbd_device, and use it when setting the capacity of the
      disk.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      99c1f08f
    • A
      rbd: separate mapping info in rbd_dev · f84344f3
      Alex Elder 提交于
      Several fields in a struct rbd_dev are related to what is mapped, as
      opposed to the actual base rbd image.  If the base image is mapped
      these are almost unneeded, but if a snapshot is mapped they describe
      information about that snapshot.
      
      In some contexts this can be a little bit confusing.  So group these
      mapping-related field into a structure to make it clear what they
      are describing.
      
      This also includes a minor change that rearranges the fields in the
      in-core image header structure so that invariant fields are at the
      top, followed by those that change.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      f84344f3
    • A
      rbd: kill rbd_image_header->total_snaps · c9aadfe7
      Alex Elder 提交于
      The "total_snaps" field in an rbd header structure is never any
      different from the value of "num_snaps" stored within a snapshot
      context.  Avoid any confusion by just using the value held within
      the snapshot context, and get rid of the "total_snaps" field.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      c9aadfe7
    • A
      rbd: kill rbd_dev->q · 98cec111
      Alex Elder 提交于
      A copy of rbd_dev->disk->queue is held in rbd_dev->q, but it's
      never actually used.  So get just get rid of the field.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      98cec111
    • A
      rbd: rename __rbd_init_snaps_header() · 9fcbb800
      Alex Elder 提交于
      The name __rbd_init_snaps_header() doesn't really convey what that
      function does very well.  Its purpose is to scan a new snapshot
      context and either create or destroy snapshot device entries so
      that local host's view is consistent with the reality maintained
      on the OSDs.  This patch just changes the name of this function,
      to be rbd_dev_snap_devs_update().  Still not perfect, but I think
      better.
      
      Also add some dynamic debug statements to this function.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      9fcbb800
    • A
      rbd: rename rbd_id_get() · e2839308
      Alex Elder 提交于
      This should have been done as part of this commit:
      
          commit de71a297
          Author: Alex Elder <elder@inktank.com>
          Date:   Tue Jul 3 16:01:19 2012 -0500
          rbd: rename rbd_device->id
      
      rbd_id_get() is assigning the rbd_dev->dev_id field.  Change the
      name of that function as well as rbd_id_put() and rbd_id_max
      to reflect what they are affecting.
      
      Add some dynamic debug statements related to rbd device id activity.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      e2839308
    • A
      rbd: define rbd_assert() · aafb230e
      Alex Elder 提交于
      Define rbd_assert() and use it in place of various BUG_ON() calls
      now present in the code.  By default assertion checking is enabled;
      we want to do this differently at some point.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      aafb230e
    • A
      rbd: split up rbd_get_segment() · 65ccfe21
      Alex Elder 提交于
      There are two places where rbd_get_segment() is called.  One, in
      rbd_rq_fn(), only needs to know the length within a segment that an
      I/O request should be.  The other, in rbd_do_op(), also needs the
      name of the object and the offset within it for the I/O request.
      
      Split out rbd_segment_name() into three dedicated functions:
          - rbd_segment_name() allocates and formats the name of the
            object for a segment containing a given rbd image offset
          - rbd_segment_offset() computes the offset within a segment for
            a given rbd image offset
          - rbd_segment_length() computes the length to use for I/O within
            a segment for a request, not to exceed the end of a segment
            object.
      
      In the new functions be a bit more careful, checking for possible
      error conditions:
          - watch for errors or overflows returned by snprintf()
          - catch (using BUG_ON()) potential overflow conditions
            when computing segment length
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NYehuda Sadeh <yehuda@inktank.com>
      65ccfe21
    • A
      rbd: check for overflow in rbd_get_num_segments() · df111be6
      Alex Elder 提交于
      It is possible in rbd_get_num_segments() for an overflow to occur
      when adding the offset and length.  This is easily avoided.
      
      Since the function returns an int and the one caller is already
      prepared to handle errors, have it return -ERANGE if overflow would
      occur.
      
      The overflow check would not work if a zero-length request was
      being tested, so short-circuit that case, returning 0 for the
      number of segments required.  (This condition might be avoided
      elsewhere already, I don't know.)
      
      Have the caller end the request if either an error or 0 is returned.
      The returned value is passed to __blk_end_request_all(), meaning
      a 0 length request is not treated an error.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NYehuda Sadeh <yehuda@inktank.com>
      df111be6
    • A
      rbd: drop needless test in rbd_rq_fn() · 38f5f65e
      Alex Elder 提交于
      There's a test for null rq pointer inside the while loop in
      rbd_rq_fn() that's not needed.  That same test already occurred
      in the immediatly preceding loop condition test.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NYehuda Sadeh <yehuda@inktank.com>
      38f5f65e
    • A
      rbd: bio_chain_clone() cleanups · 542582fc
      Alex Elder 提交于
      In bio_chain_clone(), at the end of the function the bi_next field
      of the tail of the new bio chain is nulled.  This isn't necessary,
      because if "tail" is non-null, its value will be the last bio
      structure allocated at the top of the while loop in that function.
      And before that structure is added to the end of the new chain, its
      bi_next pointer is always made null.
      
      While touching that function, clean a few other things:
          - define each local variable on its own line
          - move the definition of "tmp" to an inner scope
          - move the modification of gfpmask closer to where it's used
          - rearrange the logic that sets the chain's tail pointer
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NYehuda Sadeh <yehuda@inktank.com>
      542582fc
    • A
      rbd: kill notify_timeout option · 84d34dcc
      Alex Elder 提交于
      The "notify_timeout" rbd device option is never used, so get rid of
      it.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NYehuda Sadeh <yehuda@inktank.com>
      84d34dcc
    • A
      rbd: add read_only rbd map option · cc0538b6
      Alex Elder 提交于
      Add the ability to map an rbd image read-only, by specifying either
      "read_only" or "ro" as an option on the rbd "command line."  Also
      allow the inverse to be explicitly specified using "read_write" or
      "rw".
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NYehuda Sadeh <yehuda@inktank.com>
      cc0538b6
    • A
      rbd: move rbd_opts to struct rbd_device · f8c38929
      Alex Elder 提交于
      The rbd options don't really apply to the ceph client.  So don't
      store a pointer to it in the ceph_client structure, and put them
      (a struct, not a pointer) into the rbd_dev structure proper.
      
      Pass the rbd device structure to rbd_client_create() so it can
      assign rbd_dev->rbdc if successful, and have it return an error code
      instead of the rbd client pointer.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NYehuda Sadeh <yehuda@inktank.com>
      f8c38929
    • A
      rbd: more cleanup in rbd_header_from_disk() · 621901d6
      Alex Elder 提交于
      This just rearranges things a bit more in rbd_header_from_disk()
      so that the snapshot sizes are initialized right after the buffer
      to hold them is allocated and doing a little further consolidation
      that follows from that.  Also adds a few simple comments.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NYehuda Sadeh <yehuda@inktank.com>
      621901d6
    • A
      rbd: kill incore snap_names_len · f785cc1d
      Alex Elder 提交于
      The only thing the on-disk snap_names_len field is needed is to
      size the buffer allocated to hold a copy of the snapshot names
      for an rbd image.
      
      So don't bother saving it in the in-core rbd_image_header structure.
      Just use a local variable to hold the required buffer size while
      it's needed.
      
      Move the code that actually copies the snapshot names up closer
      to where the required length is saved.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NYehuda Sadeh <yehuda@inktank.com>
      f785cc1d
    • A
      rbd: don't over-allocate space for object prefix · 58c17b0e
      Alex Elder 提交于
      In rbd_header_from_disk() the object prefix buffer is sized based on
      the maximum size it's block_name equivalent on disk could be.
      
      Instead, only allocate enough to hold null-terminated string from
      the on-disk header--or the maximum size of no NUL is found.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NYehuda Sadeh <yehuda@inktank.com>
      58c17b0e
    • A
      rbd: handle locking inside __rbd_client_find() · 1f7ba331
      Alex Elder 提交于
      There is only caller of __rbd_client_find(), and it somewhat
      clumsily gets the appropriate lock and gets a reference to the
      existing ceph_client structure if it's found.
      
      Instead, have that function handle its own locking, and acquire the
      reference if found while it holds the lock.  Drop the underscores
      from the name because there's no need to signify anything special
      about this function.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NYehuda Sadeh <yehuda@inktank.com>
      1f7ba331
    • A
      rbd: add new snapshots at the tail · 523f3258
      Alex Elder 提交于
      This fixes a bug that went in with this commit:
      
          commit f6e0c99092cca7be00fca4080cfc7081739ca544
          Author: Alex Elder <elder@inktank.com>
          Date:   Thu Aug 2 11:29:46 2012 -0500
          rbd: simplify __rbd_init_snaps_header()
      
      The problem is that a new rbd snapshot needs to go either after an
      existing snapshot entry, or at the *end* of an rbd device's snapshot
      list.  As originally coded, it is placed at the beginning.  This was
      based on the assumption the list would be empty (so it wouldn't
      matter), but in fact if multiple new snapshots are added to an empty
      list in one shot the list will be non-empty after the first one is
      added.
      
      This addresses http://tracker.newdream.net/issues/3063Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      523f3258
    • A
      rbd: rename block_name -> object_prefix · 843a0d08
      Alex Elder 提交于
      In the on-disk image header structure there is a field "block_name"
      which represents what we now call the "object prefix" for an rbd
      image.  Rename this field "object_prefix" to be consistent with
      modern usage.
      
      This appears to be the only remaining vestige of the use of "block"
      in symbols that represent objects in the rbd code.
      
      This addresses http://tracker.newdream.net/issues/1761Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      Reviewed-by: NDan Mick <dan.mick@inktank.com>
      843a0d08
    • A
      rbd: separate reading header from decoding it · 4156d998
      Alex Elder 提交于
      Right now rbd_read_header() both reads the header object for an rbd
      image and decodes its contents.  It does this repeatedly if needed,
      in order to ensure a complete and intact header is obtained.
      
      Separate this process into two steps--reading of the raw header
      data (in new function, rbd_dev_v1_header_read()) and separately
      decoding its contents (in rbd_header_from_disk()).  As a result,
      the latter function no longer requires its allocated_snaps argument.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      4156d998
    • A
      rbd: expand rbd_dev_ondisk_valid() checks · 103a150f
      Alex Elder 提交于
      Add checks on the validity of the snap_count and snap_names_len
      field values in rbd_dev_ondisk_valid().  This eliminates the
      need to do them in rbd_header_from_disk().
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      103a150f
    • A
      rbd: return earlier in rbd_header_from_disk() · 28cb775d
      Alex Elder 提交于
      The only caller of rbd_header_from_disk() is rbd_read_header().
      It passes as allocated_snaps the number of snapshots it will
      have received from the server for the snapshot context that
      rbd_header_from_disk() is to interpret.  The first time through
      it provides 0--mainly to extract the number of snapshots from
      the snapshot context header--so that it can allocate an
      appropriately-sized buffer to receive the entire snapshot
      context from the server in a second request.
      
      rbd_header_from_disk() will not fill in the array of snapshot ids
      unless the number in the snapshot matches the number the caller
      had allocated.
      
      This patch adjusts that logic a little further to be more efficient.
      rbd_read_header() doesn't even examine the snapshot context unless
      the snapshot count (stored in header->total_snaps) matches the
      number of snapshots allocated.  So rbd_header_from_disk() doesn't
      need to allocate or fill in the snapshot context field at all in
      that case.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      28cb775d
    • A
      rbd: rearrange rbd_header_from_disk() · 6a52325f
      Alex Elder 提交于
      This just moves code around for the most part.  It was pulled out as
      a separate patch to avoid cluttering up some upcoming patches which
      are more substantive.  The point is basically to group everything
      related to initializing the snapshot context together.
      
      The only functional change is that rbd_header_from_disk() now
      ensures the (in-core) header it is passed is zero-filled.  This
      allows a simpler error handling path in rbd_header_from_disk().
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      6a52325f
    • A
      rbd: use sizeof (object) instead of sizeof (type) · d2bb24e5
      Alex Elder 提交于
      Fix a few spots in rbd_header_from_disk() to use sizeof (object)
      rather than sizeof (type).  Use a local variable to record sizes
      to shorten some lines and improve readability.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      d2bb24e5
    • A
      rbd: ensure invalid pointers are made null · d78fd7ae
      Alex Elder 提交于
      Fix a number of spots where a pointer value that is known to
      have become invalid but was not reset to null.
      
      Also, toss in a change so we use sizeof (object) rather than
      sizeof (type).
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      d78fd7ae
    • A
      rbd: make snap_names_len a u64 · 0f1d3f93
      Alex Elder 提交于
      The snap_names_len field of an rbd_image_header structure is defined
      with type size_t.  That field is used as both the source and target
      of 64-bit byte-order swapping operations though, so it's best to
      define it with type u64 instead.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      0f1d3f93
    • A
      rbd: simplify __rbd_init_snaps_header() · 35938150
      Alex Elder 提交于
      The purpose of __rbd_init_snaps_header() is to compare a new
      snapshot context with an rbd device's list of existing snapshots.
      It updates the list by adding any new snapshots or removing any
      that are not present in the new snapshot context.
      
      The code as written is a little confusing, because it traverses both
      the existing snapshot list and the set of snapshots in the snapshot
      context in reverse.  This was done based on an assumption about
      snapshots that is not true--namely that a duplicate snapshot name
      could cause an error in intepreting things if they were not
      processed in ascending order.
      
      These precautions are not necessary, because:
          - all snapshots are uniquely identified by their snapshot id
          - a new snapshot cannot be created if the rbd device has another
            snapshot with the same name
      (It is furthermore not currently possible to rename a snapshot.)
      
      This patch re-implements __rbd_init_snaps_header() so it passes
      through both the existing snapshot list and the entries in the
      snapshot context in forward order.  It still does the same thing
      as before, but I find the logic considerably easier to understand.
      
      By going forward through the names in the snapshot context, there
      is no longer a need for the rbd_prev_snap_name() helper function.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      35938150
  2. 22 9月, 2012 1 次提交
  3. 31 7月, 2012 10 次提交
    • A
      rbd: create rbd_refresh_helper() · 1fe5e993
      Alex Elder 提交于
      Create a simple helper that handles the common case of calling
      __rbd_refresh_header() while holding the ctl_mutex.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: Josh Durgin <josh.durgin@inktank.com> 
      1fe5e993
    • A
      rbd: return obj version in __rbd_refresh_header() · b813623a
      Alex Elder 提交于
      Add a new parameter to __rbd_refresh_header() through which the
      version of the header object is passed back to the caller.  In most
      cases this isn't needed.  The main motivation is to normalize
      (almost) all calls to __rbd_refresh_header() so they are all
      wrapped immediately by mutex_lock()/mutex_unlock().
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: Josh Durgin <josh.durgin@inktank.com> 
      b813623a
    • A
      rbd: fixes in rbd_header_from_disk() · ccece235
      Alex Elder 提交于
      This fixes a few issues in rbd_header_from_disk():
          - There is a check intended to catch overflow, but it's wrong in
            two ways.
      	- First, the type we don't want to overflow is size_t, not
      	  unsigned int, and there is now a SIZE_MAX we can use for
      	  use with that type.
      	- Second, we're allocating the snapshot ids and snapshot
      	  image sizes separately (each has type u64; on disk they
                grouped together as a rbd_image_header_ondisk structure).
      	  So we can use the size of u64 in this overflow check.
          - If there are no snapshots, then there should be no snapshot
            names.  Enforce this, and issue a warning if we encounter a
            header with no snapshots but a non-zero snap_names_len.
          - When saving the snapshot names into the header, be more direct
            in defining the offset in the on-disk structure from which
            they're being copied by using "snap_count" rather than "i"
            in the array index.
          - If an error occurs, the "snapc" and "snap_names" fields are
            freed at the end of the function.  Make those fields be null
            pointers after they're freed, to be explicit that they are
            no longer valid.
          - Finally, move the definition of the local variable "i" to the
            innermost scope in which it's needed.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: Josh Durgin <josh.durgin@inktank.com> 
      ccece235
    • A
      rbd: always pass ops array to rbd_req_sync_op() · 913d2fdc
      Alex Elder 提交于
      All of the callers of rbd_req_sync_op() except one pass a non-null
      "ops" pointer.  The only one that does not is rbd_req_sync_read(),
      which passes CEPH_OSD_OP_READ as its "opcode" and, CEPH_OSD_FLAG_READ
      for "flags".
      
      By allocating the ops array in rbd_req_sync_read() and moving the
      special case code for the null ops pointer into it, it becomes
      clear that much of that code is not even necessary.
      
      In addition, the "opcode" argument to rbd_req_sync_op() is never
      actually used, so get rid of that.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: Josh Durgin <josh.durgin@inktank.com> 
      913d2fdc
    • A
      rbd: pass null version pointer in add_snap() · d67d4be5
      Alex Elder 提交于
      rbd_header_add_snap() passes the address of a version variable to
      rbd_req_sync_exec(), but it ignores the result.  Just pass a null
      pointer instead.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: Josh Durgin <josh.durgin@inktank.com> 
      d67d4be5
    • A
      rbd: make rbd_create_rw_ops() return a pointer · 57cfc106
      Alex Elder 提交于
      Either rbd_create_rw_ops() will succeed, or it will fail because a
      memory allocation failed.  Have it just return a valid pointer or
      null rather than stuffing a pointer into a provided address and
      returning an errno.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: Josh Durgin <josh.durgin@inktank.com> 
      57cfc106
    • A
      rbd: have __rbd_add_snap_dev() return a pointer · 4e891e0a
      Alex Elder 提交于
      It's not obvious whether the snapshot pointer whose address is
      provided to __rbd_add_snap_dev() will be assigned by that function.
      Change it to return the snapshot, or a pointer-coded errno in the
      event of a failure.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: Josh Durgin <josh.durgin@inktank.com> 
      4e891e0a
    • A
      rbd: drop "object_name" from rbd_req_sync_unwatch() · 070c633f
      Alex Elder 提交于
      rbd_req_sync_unwatch() only ever uses rbd_dev->header_name as the
      value of its "object_name" parameter, and that value is available
      within the function already.  So get rid of the parameter.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      070c633f
    • A
      rbd: drop "object_name" from rbd_req_sync_notify_ack() · 7f0a24d8
      Alex Elder 提交于
      rbd_req_sync_notify_ack() only ever uses rbd_dev->header_name as the
      value of its "object_name" parameter, and that value is available
      within the function already.  So get rid of the parameter.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      7f0a24d8
    • A
      rbd: drop "object_name" from rbd_req_sync_notify() · 4cb16250
      Alex Elder 提交于
      rbd_req_sync_notify() only ever uses rbd_dev->header_name as the
      value of its "object_name" parameter, and that value is available
      within the function already.  So get rid of the parameter.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NJosh Durgin <josh.durgin@inktank.com>
      4cb16250