1. 02 May, 2013 40 commits
    • Alex Elder's avatar
      rbd: make rbd spec names pointer to const · ecb4dc22
      Alex Elder authored
      Make the names and image id in an rbd_spec be pointers to constant
      data.  This required the use of a local variable to hold the
      snapshot name in rbd_add_parse_args() to avoid a warning.
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      ecb4dc22
    • Alex Elder's avatar
      rbd: set snapshot id in rbd_dev_probe_update_spec() · e1d4213f
      Alex Elder authored
      Set the rbd spec's snapshot id for an image getting mapped in
      rbd_dev_probe_update_spec() rather than rbd_dev_set_mapping().
      This is the more logical place for that to happen (even though
      it means we might look up the snapshot by name twice).
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      e1d4213f
    • Alex Elder's avatar
      rbd: have snap_by_name() return a snapshot · 8b0241f8
      Alex Elder authored
      A function called snap_by_name() ought to just look up a snapshot by
      name.  It does that, but then it assigns some stuff to the rbd
      device structure as well.
      
      Change the function to do just the lookup, and have the caller do
      the assignments that follow.
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      8b0241f8
    • Alex Elder's avatar
      rbd: fix image id leak in initial probe · 5655c4d9
      Alex Elder authored
      If a format 2 image id is found for an image being mapped, but the
      subsequent probe of the image fails, rbd_dev_probe() quits without
      freeing the image id.  Fix that.
      
      Also drop a redundant hunk of code in rbd_dev_image_id().
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      5655c4d9
    • Alex Elder's avatar
      rbd: have rbd_dev_image_id() set format 1 image id · c0fba368
      Alex Elder authored
      Currently, rbd_dev_probe() assumes that any error returned by
      rbd_dev_image_id() is most likely -ENOENT, and responds by
      calling the format 1 probe routine, rbd_dev_v1_probe().  Then,
      at the top of rbd_dev_v1_probe(), an empty string is allocated
      for the image id.
      
      This is sort of unbalanced.  Fix this by having rbd_dev_image_id()
      look for -ENOENT from its "get_id" method call.  If that is seen,
      have it allocate the empty string there rather than depending on
      rbd_dev_v1_probe() to do it.
      
      Given that this is effectively defining the format of the image,
      set rbd_dev->image_format inside rbd_dev_image_id() rather than in
      the format-specific probe routines.
      
      Also drop a redundant hunk of code in rbd_dev_image_id().
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      c0fba368
    • Alex Elder's avatar
      rbd: avoid dropping extra reference in rbd_free_disk() · a0cab924
      Alex Elder authored
      I found during some failure injection testing that the call to
      rbd_free_disk() in the error path of rbd_dev_probe_finish() was
      dropping an extra reference to the disk queue.  The problem
      occurred when put_disk tried to drop a reference to the disk's
      queue.  A call to blk_cleanup_queue() just prior to that will have
      also dropped a reference to the queue.
      
      The problem is that the reference dropped by put_disk() is assumed
      to have been taken by add_disk().  Our code has error paths that can
      occur after the disk and its queue are initialized, but before the
      call to add_disk(), and in those paths we won't have that extra
      reference.
      
      The fix is easy though.  In rbd_free_disk() we're already checking
      the disk's GENHD_FL_UP flag.  That flag is an indication that
      add_disk() has been called, so just call blk_cleanup_queue()
      conditional on that flag being set.
      
      This resolves:
          http://tracker.ceph.com/issues/4800Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      a0cab924
    • Alex Elder's avatar
      rbd: use rbd_obj_method_sync() return value · f40eb349
      Alex Elder authored
      Now that rbd_obj_method_sync() returns the number of bytes
      returned by the method call, that value should be used by
      callers to ensure we don't overrun the valid portion of the
      buffer.
      
      Fix the two spots that remained that weren't doing that,
      rbd_dev_image_name() and rbd_dev_v2_snap_name().
      
      Rearrange the error path slightly in rbd_dev_v2_snap_name().
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      f40eb349
    • Alex Elder's avatar
      rbd: fix leak of format 2 snapshot names · 6e584f52
      Alex Elder authored
      When the snapshot context for an rbd device gets updated (or the
      initial one is recorded) a a list of snapshot structures is created
      to represent them, one entry per snapshot.  Each entry includes a
      dynamically-allocated copy of the snapshot name.
      
      Currently the name is allocated in rbd_snap_create(), as a duplicate
      of the passed-in name.
      
      For format 1 images, the snapshot name provided is just a pointer to
      an existing name.  But for format 2 images, the passed-in name is
      already dynamically allocated, and in the the process of duplicating
      it here we are leaking the passed-in name.
      
      Fix this by dynamically allocating the name for format 1 snapshots
      also, and then stop allocating a duplicate in rbd_snap_create().
      
      Change rbd_dev_v1_snap_info() so none of its parameters is
      side-effected unless it's going to return success.
      
      This is part of:
          http://tracker.ceph.com/issues/4803Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      6e584f52
    • Alex Elder's avatar
      rbd: rename __rbd_add_snap_dev() · 6087b51b
      Alex Elder authored
      Rename __rbd_add_snap_dev() to be rbd_snap_create().  We no longer
      have devices for non-mapped snapshots, and we're not actually
      "adding" it to the list in this function, just creating it.
      
      Rename rbd_remove_snap_dev() to be rbd_snap_destroy() for reasons
      similar to the above.  Stop having this function delete the snapshot
      from its list (to be symmetrical with its create counterpart) and do
      that in the caller instead.
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      6087b51b
    • Alex Elder's avatar
      rbd: only update values on snap_info success · acb1b6ca
      Alex Elder authored
      Change rbd_dev_v2_snap_info() so it only ever sets values of the
      size and features parameters if looking up the snapshot name was
      successful.
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      acb1b6ca
    • Alex Elder's avatar
      rbd: make snap_size order parameter optional · c86f86e9
      Alex Elder authored
      Only one of the two callers of _rbd_dev_v2_snap_size() needs the
      order value returned.  So make that an optional argument--a null
      pointer if the caller doesn't need it.
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      c86f86e9
    • Alex Elder's avatar
      rbd: fix leak of snapshots during initial probe · 522a0cc0
      Alex Elder authored
      When an rbd image is initially mapped, its snapshot context is
      collected, and then a list of snapshot entries representing the
      snapshots in that context is created.  The list is created using
      rbd_dev_snaps_update().  (This function also supports updating an
      existing snapshot list based on a new snapshot context.)
      
      If an error occurs, updating the list is aborted, and the list is
      currently left as-is, in an inconsistent state.  At that point,
      there may be a partially-constructed list, but the calling functions
      (rbd_dev_probe_finish() from rbd_dev_probe() from rbd_add()) never
      clean them up.  So this constitutes a leak.
      
      A snapshot list that is inconsistent with the current snapshot
      context is of no use, and might even be actively bad.  So rather
      than just having the caller clean it up, have rbd_dev_snaps_update()
      just clear out the entire snapshot list in the event an error
      occurs.
      
      The other place rbd_dev_snaps_update() is used is when a refresh is
      triggered, either because of a watch callback or via a write to the
      /sys/bus/rbd/devices/<id>/refresh interface.  An error while
      updating the snapshots has no substantive effect in either of those
      cases, but one of them issues a warning.  Move that warning to the
      common rbd_dev_refresh() function so it gets issued regardless of
      how it got initiated.
      
      This is part of:
          http://tracker.ceph.com/issues/4803Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      522a0cc0
    • Alex Elder's avatar
      rbd: don't create sysfs entries for non-mapped snapshots · 3e83b65b
      Alex Elder authored
      When an rbd image gets mapped a device entry gets created for it
      under /sys/bus/rbd/devices/<id>/.  Inside that directory there are
      sysfs files that contain information about the image: its size,
      feature bits, major device number, and so on.
      
      Additionally, if that image has any snapshots, a device entry gets
      created for each of those as a "child" of the mapped device.  Each
      of these is a subdirectory of the mapped device, and each directory
      contains a few files with information about the snapshot (its
      snapshot id, size, and feature mask).
      
      There is no clear benefit to having those device entries for the
      snapshots.  The information provided via sysfs of of little real
      value--and all of it is available via rbd CLI commands.  If we
      still wanted to see the kernel's view of this information it could
      be done much more simply by including it in a single sysfs file for
      the mapped image.
      
      But there *is* a clear cost to supporting them.  Every time a snapshot
      context changes, these entries need to be updated (deleted snapshots
      removed, new snapshots created).  The rbd driver is notified of
      changes to the snapshot context via callbacks from an osd, and care
      must be taken to coordinate removal of snapshot data structures
      with the possibility of one these notifications occurring.
      
      Things would be considerably simpler if we just didn't have to
      maintain device entries for the snapshots.
      
      So get rid of them.
      
      The ability to map a snapshot of an rbd image will remain; the only
      thing lost will be the ability to query these sysfs directories for
      information about snapshots of mapped images.
      
      This resolves:
          http://tracker.ceph.com/issues/4796Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      3e83b65b
    • Alex Elder's avatar
      libceph: fix byte order mismatch · 9ef1ee5a
      Alex Elder authored
      A WATCH op includes an object version.  The version that's supplied
      is incorrectly byte-swapped osd_req_op_watch_init() where it's first
      assigned (it's been this way since that code was first added).
      
      The result is that the version sent to the osd is wrong, because
      that value gets byte-swapped again in osd_req_encode_op().  This
      is the source of a sparse warning related to improper byte order in
      the assignment.
      
      The approach of using the version to avoid a race is deprecated
      (see http://tracker.ceph.com/issues/3871), and the watch parameter
      is no longer even examined by the osd.  So fix the assignment in
      osd_req_op_watch_init() so it no longer does the byte swap.
      
      This resolves:
          http://tracker.ceph.com/issues/3847Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      9ef1ee5a
    • Alex Elder's avatar
      rbd: activate support for layered images · 770eba6e
      Alex Elder authored
      Now that we have most everything in place to support layered rbd
      images, enable support for them in the kernel client.  Issue a
      warning to the log that the support is considered experimental
      whenever a format 2 layered image is mapped.
      
      Note that we also have to claim to support the STRIPINGV2 feature,
      due to a mistake in the way the rbd CLI set up those flags.  This
      feature can work if it has the right parameters, and safeguards
      have been put in place to reject those images that do not have
      compatible parameters.
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      770eba6e
    • Alex Elder's avatar
      rbd: get and check striping parameters · cc070d59
      Alex Elder authored
      If an rbd format 2 image indicates it supports the STRIPINGV2
      feature we need to find out its stripe unit and stripe count in
      order to know whether we can use it.  We don't yet support fancy
      striping fully, but if the default parameters are used the behavior
      is indistinguishible from non-fancy striping.
      
      This is necessary because some images require the STRIPINGV2 feature
      even if they use the default parameters.  (Which is to say the feature
      bit was erroneously set even if the feature was not used.)
      
      This resolves:
          http://tracker.ceph.com/issues/4709Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      cc070d59
    • Alex Elder's avatar
      rbd: have rbd_obj_method_sync() return transfer count · 57385b51
      Alex Elder authored
      Callers of rbd_obj_method_sync() don't know how many bytes of data
      got returned by the class method call.  As a result, they have been
      assuming enough got returned to decode whatever was expected.
      
      This isn't safe.  We know how many bytes got transferred, so have
      rbd_obj_method_sync() return that amount (rather than just 0) if
      the call is successful.
      
      Change all callers to use this return value to ensure decoding of
      the results is done safely.
      
      On the other hand, most callers of rbd_obj_method_sync() only
      indicate success or failure, so all of *their* callers can simply
      test for non-zero result.
      
      This resolves:
          http://tracker.ceph.com/issues/4773Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      57385b51
    • Alex Elder's avatar
      rbd: void data pointers for rbd_obj_method_sync() · 4157976b
      Alex Elder authored
      Make the inbound and outbound data parameters have void rather than
      character type for rbd_obj_method_sync().  This makes it more clear
      they don't expect typed data, and eliminates the need for some silly
      type casts.
      
      One more unrelated change: define the features buffer used in
      _rbd_dev_v2_snap_features() to be a packed data structure.
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      4157976b
    • Alex Elder's avatar
      rbd: give rbd_obj_read_sync() buffer void type · 80ef15bf
      Alex Elder authored
      Make the buf parameter into which the data is to be read have type
      void pointer.
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      80ef15bf
    • Alex Elder's avatar
      libceph: validate timespec conversions · c3f56102
      Alex Elder authored
      A ceph timespec contains 32-bit unsigned values for its seconds and
      nanoseconds components.  For a standard timespec, both fields are
      signed, and the seconds field is almost surely 64 bits.
      
      Add some explicit casts so the fact that this conversion is taking
      place is obvious.  Also trip a bug if we ever try to put out of
      range (negative or too big) values into a ceph timespec.
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      c3f56102
    • Alex Elder's avatar
      libceph: add signed type limits · b587398a
      Alex Elder authored
      Flesh out the limits defined in <linux/ceph/decode.h> to include the
      maximum and minimum values for signed type S8, S16, S32, and S64.
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      b587398a
    • Alex Elder's avatar
      rbd: enforce parent overlap · a9e8ba2c
      Alex Elder authored
      A clone image has a defined overlap point with its parent image.
      That is the byte offset beyond which the parent image has no
      defined data to back the clone, and anything thereafter can be
      viewed as being zero-filled by the clone image.
      
      This is needed because a clone image can be resized.  If it gets
      resized larger than the snapshot it is based on, the overlap defines
      the original size.  If the clone gets resized downward below the
      original size the new clone size defines the overlap.  If the clone
      is subsequently resized to be larger, the overlap won't be increased
      because the previous resize invalidated any parent data beyond that
      point.
      
      This resolves:
          http://tracker.ceph.com/issues/4724Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      a9e8ba2c
    • Alex Elder's avatar
      rbd: issue a copyup for layered writes · 0eefd470
      Alex Elder authored
      This implements the main copyup functionality for layered writes.
      
      Here we add a copyup_pages field to the object request, which is
      used only for copyup requests to keep track of the page array
      containing data read from the parent image.
      
      A copyup request is currently the only request rbd has that requires
      two osd operations.  Because of this we handle copyup specially.
      All image object requests get an osd request allocated when they are
      created.  For a write request, if a copyup is required, the osd
      request originally allocated is released, and a new one (with room
      for two osd ops) is allocated to replace it.  A new function
      rbd_osd_req_create_copyup() allocates an osd request suitable for
      a copyup request.
      
      The first op is then filled with a copyup object class method call,
      supplying the array of pages containing data read from the parent.
      The second op is filled in with the original write request.
      
      The original request otherwise remains intact, and it describes the
      original write request (found in the second osd op).  The presence
      of the copyup op is sort of implicit; a non-null copyup_pages field
      could be used to distinguish between a "normal" write request and a
      request containing both a copyup call and a write.
      
      This resolves:
          http://tracker.ceph.com/issues/3419Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      0eefd470
    • Alex Elder's avatar
      rbd: implement full object parent reads · 3d7efd18
      Alex Elder authored
      As a step toward implementing layered writes, implement reading the
      data for a target object from the parent image for a write request
      whose target object is known to not exist.  Add a copyup_pages field
      to an image request to track the page array used (only) for such a
      request.
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      3d7efd18
    • Laurent Barbe's avatar
      rbd: revalidate_disk upon rbd resize · d98df63e
      Laurent Barbe authored
      If rbd disk is open and rbd resize is done, new size is not
      visible by filesystem.  Like is done in virtio-blk and dm driver,
      revalidate_disk() permits to update the bd_inode size.
      Signed-off-by: default avatarLaurent Barbe <laurent@ksperis.com>
      Reviewed-by: default avatarAlex Elder <elder@inktank.com>
      d98df63e
    • Alex Elder's avatar
      rbd: support page array image requests · f1a4739f
      Alex Elder authored
      This patch adds the ability to build an image request whose data
      will be written from or read into memory described by a page array.
      (Previously only bio lists were supported.)
      
      Originally this was going to define a new function for this purpose
      but it was largely identical to the rbd_img_request_fill_bio().  So
      instead, rbd_img_request_fill_bio() has been generalized to handle
      both types of image request.
      
      For the moment we still only fill image requests with bio data.
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      f1a4739f
    • Alex Elder's avatar
      rbd: define zero_pages() · b9434c5b
      Alex Elder authored
      Define a new function zero_pages() that zeroes a range of memory
      defined by a page array, along the lines of zero_bio_chain().  It
      saves and the irq flags like bvec_kmap_irq() does, though I'm not
      sure at this point that it's necessary.
      
      Update rbd_img_obj_request_read_callback() to use the new function
      if the object request contains page rather than bio data.
      
      For the moment, only bio data is used for osd READ ops.
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      b9434c5b
    • Alex Elder's avatar
      rbd: encapsulate submission of image object requests · b454e36d
      Alex Elder authored
      Object requests that are part of an image request are subject to
      some additional handling.  Define rbd_img_obj_request_submit() to
      encapsulate that, and use it when initially submitting an image
      object request, and when re-submitting it during callback of
      an object existence check.
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      b454e36d
    • Alex Elder's avatar
      rbd: define separate read and write format funcs · 9d4df01f
      Alex Elder authored
      Separate rbd_osd_req_format() into two functions, one for read
      requests and the other for write requests.
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      9d4df01f
    • Alex Elder's avatar
      libceph: support pages for class request data · 6c57b554
      Alex Elder authored
      Add the ability to provide an array of pages as outbound request
      data for object class method calls.
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      6c57b554
    • Alex Elder's avatar
      libceph: fix two messenger bugs · a51b272e
      Alex Elder authored
      This patch makes four small changes in the ceph messenger.
      
      While getting copyup functionality working I found two bugs in the
      messenger.  Existing paths through the code did not trigger these
      problems, but they're fixed here:
          - In ceph_msg_data_pagelist_cursor_init(), the cursor's
            last_piece field was being checked against the length
            supplied.  This was OK until this commit: ccba6d98 libceph:
            implement multiple data items in a message That commit changed
            the cursor init routines to allow lengths to be supplied that
            exceeded the size of the current data item. Because of this,
            we have to use the assigned cursor resid field rather than the
            provided length in determining whether the cursor points to
            the last piece of a data item.
          - In ceph_msg_data_add_pages(), a BUG_ON() was erroneously
            catching attempts to add page data to a message if the message
            already had data assigned to it. That was OK until that same
            commit, at which point it was fine for messages to have
            multiple data items. It slipped through because that BUG_ON()
            call was present twice in that function. (You can never be too
            careful.)
      
      In addition two other minor things are changed:
          - In ceph_msg_data_cursor_init(), the local variable "data" was
            getting assigned twice.
          - In ceph_msg_data_advance(), it was assumed that the
            type-specific advance routine would set new_piece to true
            after it advanced past the last piece. That may have been
            fine, but since we check for that case we might as well set it
            explicitly in ceph_msg_data_advance().
      
      This resolves:
          http://tracker.ceph.com/issues/4762Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      a51b272e
    • Alex Elder's avatar
      rbd: issue stat request before layered write · c5b5ef6c
      Alex Elder authored
      This is a step toward fully implementing layered writes.
      
      Add checks before request submission for the object(s) associated
      with an image request.  For write requests, if we don't know that
      the target object exists, issue a STAT request to find out.  When
      that request completes, mark the known and exists flags for the
      original object request accordingly and re-submit the object
      request.  (Note that this still does the existence check only; the
      copyup operation is not yet done.)
      
      A new object request is created to perform the existence check.  A
      pointer to the original request is added to that object request to
      allow the stat request to re-issue the original request after
      updating its flags.  If there is a failure with the stat request
      the error code is stored with the original request, which is then
      completed.
      
      This resolves:
          http://tracker.ceph.com/issues/3418Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      c5b5ef6c
    • Alex Elder's avatar
      rbd: add target object existence flags · 5679c59f
      Alex Elder authored
      This creates two new flags for object requests to indicate what is
      known about the existence of the object to which a request is to be
      sent.  The KNOWN flag will be true if the the EXISTS flag is
      meaningful.  That is:
      
          KNOWN   EXISTS
          -----   ------
            0       0     don't know whether the object exists
            0       1     (not used/invalid)
            1       0     object is known to not exist
            1       0     object is known to exist
      
      This will be used in determining how to handle write requests for
      data objects for layered rbd images.
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      5679c59f
    • Alex Elder's avatar
      rbd: always check IMG_DATA flag · 57acbaa7
      Alex Elder authored
      In a few spots, whether the an object request's img_request pointer
      is null is used to determine whether an object request is being done
      as part of an image data request.
      
      Stop doing that, and instead always use the object request IMG_DATA
      flag for that purpose.  Swap the order of the definition of the
      IMG_DATA and DONE flag helpers, because obj_request_done_set() now
      refers to obj_request_img_data_set() to get its rbd_dev value.
      
      This will become important because the img_request pointer is
      about to become part of a union.
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      57acbaa7
    • Alex Elder's avatar
      rbd: adjust image object request ref counting · b155e86c
      Alex Elder authored
      An extra reference is taken when an object request is added as one
      of the requests making up an image object.  A reference is dropped
      again when the image's object requests get submitted.
      
      The original reference for the object request will remain throughout
      this period, so we don't need to add and then take away an extra
      one.
      
      This can be interpreted as the image request inheriting the original
      object request's reference.
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      b155e86c
    • Alex Elder's avatar
      libceph: support raw data requests · 49719778
      Alex Elder authored
      Allow osd request ops that aren't otherwise structured (not class,
      extent, or watch ops) to specify "raw" data to be used to hold
      incoming data for the op.  Make use of this capability for the osd
      STAT op.
      
      Prefix the name of the private function osd_req_op_init() with "_",
      and expose a new function by that (earlier) name whose purpose is to
      initialize osd ops with (only) implied data.
      
      For now we'll just support the use of a page array for an osd op
      with incoming raw data.
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      49719778
    • Alex Elder's avatar
      libceph: clean up osd data field access functions · 863c7eb5
      Alex Elder authored
      There are a bunch of functions defined to encapsulate getting the
      address of a data field for a particular op in an osd request.
      They're all defined the same way, so create a macro to take the
      place of all of them.
      
      Two of these are used outside the osd client code, so preserve them
      (but convert them to use the new macro internally).  Stop exporting
      the ones that aren't used elsewhere.
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      863c7eb5
    • Alex Elder's avatar
      libceph: kill off osd data write_request parameters · 406e2c9f
      Alex Elder authored
      In the incremental move toward supporting distinct data items in an
      osd request some of the functions had "write_request" parameters to
      indicate, basically, whether the data belonged to in_data or the
      out_data.  Now that we maintain the data fields in the op structure
      there is no need to indicate the direction, so get rid of the
      "write_request" parameters.
      Signed-off-by: default avatarAlex Elder <elder@inktank.com>
      Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
      406e2c9f
    • Randy Dunlap's avatar
      ceph: fix printk format warnings in file.c · ac7f29bf
      Randy Dunlap authored
      Fix printk format warnings by using %zd for 'ssize_t' variables:
      
      fs/ceph/file.c:751:2: warning: format '%ld' expects argument of type 'long int', but argument 11 has type 'ssize_t' [-Wformat]
      fs/ceph/file.c:762:2: warning: format '%ld' expects argument of type 'long int', but argument 11 has type 'ssize_t' [-Wformat]
      Signed-off-by: default avatarRandy Dunlap <rdunlap@infradead.org>
      Cc:	ceph-devel@vger.kernel.org
      Signed-off-by: default avatarSage Weil <sage@inktank.com>
      ac7f29bf
    • Yan, Zheng's avatar
      ceph: fix race between writepages and truncate · 1ac0fc8a
      Yan, Zheng authored
      ceph_writepages_start() reads inode->i_size in two places. It can get
      different values between successive read, because truncate can change
      inode->i_size at any time. The race can lead to mismatch between data
      length of osd request and pages marked as writeback. When osd request
      finishes, it clear writeback page according to its data length. So
      some pages can be left in writeback state forever. The fix is only
      read inode->i_size once, save its value to a local variable and use
      the local variable when i_size is needed.
      Signed-off-by: default avatarYan, Zheng <zheng.z.yan@intel.com>
      Reviewed-by: default avatarAlex Elder <elder@inktank.com>
      1ac0fc8a