1. 06 6月, 2012 4 次提交
    • A
      libceph: tweak ceph_alloc_msg() · 1c20f2d2
      Alex Elder 提交于
      The function ceph_alloc_msg() is only used to allocate a message
      that will be assigned to a connection's in_msg pointer.  Rename the
      function so this implied usage is more clear.
      
      In addition, make that assignment inside the function (again, since
      that's precisely what it's intended to be used for).  This allows us
      to return what is now provided via the passed-in address of a "skip"
      variable.  The return type is now Boolean to be explicit that there
      are only two possible outcomes.
      
      Make sure the result of an ->alloc_msg method call always sets the
      value of *skip properly.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NSage Weil <sage@inktank.com>
      1c20f2d2
    • A
      libceph: fully initialize connection in con_init() · 1bfd89f4
      Alex Elder 提交于
      Move the initialization of a ceph connection's private pointer,
      operations vector pointer, and peer name information into
      ceph_con_init().  Rearrange the arguments so the connection pointer
      is first.  Hide the byte-swapping of the peer entity number inside
      ceph_con_init()
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NSage Weil <sage@inktank.com>
      1bfd89f4
    • S
      libceph: use con get/put ops from osd_client · 0d47766f
      Sage Weil 提交于
      There were a few direct calls to ceph_con_{get,put}() instead of the con
      ops from osd_client.c.  This is a bug since those ops aren't defined to
      be ceph_con_get/put.
      
      This breaks refcounting on the ceph_osd structs that contain the
      ceph_connections, and could lead to all manner of strangeness.
      
      The purpose of the ->get and ->put methods in a ceph connection are
      to allow the connection to indicate it has a reference to something
      external to the messaging system, *not* to indicate something
      external has a reference to the connection.
      
      [elder@inktank.com: added that last sentence]
      Signed-off-by: NSage Weil <sage@newdream.net>
      Reviewed-by: NAlex Elder <elder@inktank.com>
      0d47766f
    • A
      libceph: osd_client: don't drop reply reference too early · ab8cb34a
      Alex Elder 提交于
      In ceph_osdc_release_request(), a reference to the r_reply message
      is dropped.  But just after that, that same message is revoked if it
      was in use to receive an incoming reply.  Reorder these so we are
      sure we hold a reference until we're actually done with the message.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NSage Weil <sage@inktank.com>
      ab8cb34a
  2. 01 6月, 2012 2 次提交
  3. 19 5月, 2012 1 次提交
  4. 17 5月, 2012 5 次提交
  5. 15 5月, 2012 1 次提交
  6. 11 1月, 2012 1 次提交
  7. 12 11月, 2011 1 次提交
  8. 26 10月, 2011 2 次提交
  9. 17 9月, 2011 1 次提交
    • S
      libceph: fix linger request requeuing · 935b639a
      Sage Weil 提交于
      The r_req_lru_item list node moves between several lists, and that cycle
      is not directly related (and does not begin) with __register_request().
      Initialize it in the request constructor, not __register_request(). This
      fixes later badness (below) when OSDs restart underneath an rbd mount.
      
      Crashes we've seen due to this include:
      
      [  213.974288] kernel BUG at net/ceph/messenger.c:2193!
      
      and
      
      [  144.035274] BUG: unable to handle kernel NULL pointer dereference at 0000000000000048
      [  144.035278] IP: [<ffffffffa036c053>] con_work+0x1463/0x2ce0 [libceph]
      Signed-off-by: NSage Weil <sage@newdream.net>
      935b639a
  10. 01 9月, 2011 1 次提交
  11. 27 7月, 2011 1 次提交
  12. 14 6月, 2011 1 次提交
  13. 08 6月, 2011 1 次提交
  14. 25 5月, 2011 1 次提交
  15. 20 5月, 2011 2 次提交
  16. 04 5月, 2011 1 次提交
  17. 07 4月, 2011 1 次提交
  18. 31 3月, 2011 1 次提交
  19. 30 3月, 2011 1 次提交
    • S
      libceph: fix null dereference when unregistering linger requests · fbdb9190
      Sage Weil 提交于
      We should only clear r_osd if we are neither registered as a linger or a
      regular request.  We may unregister as a linger while still registered as
      a regular request (e.g., in reset_osd).  Incorrectly clearing r_osd there
      leads to a null pointer dereference in __send_request.
      
      Also simplify the parallel check in __unregister_request() where we just
      removed r_osd_item and know it's empty.
      Signed-off-by: NSage Weil <sage@newdream.net>
      fbdb9190
  20. 29 3月, 2011 1 次提交
  21. 27 3月, 2011 1 次提交
  22. 23 3月, 2011 1 次提交
  23. 22 3月, 2011 1 次提交
    • S
      libceph: fix osd request queuing on osdmap updates · 6f6c7006
      Sage Weil 提交于
      If we send a request to osd A, and the request's pg remaps to osd B and
      then back to A in quick succession, we need to resend the request to A. The
      old code was only calling kick_requests after processing all incremental
      maps in a message, so it was very possible to not resend a request that
      needed to be resent.  This would make the osd eventually time out (at least
      with the current default of osd timeouts enabled).
      
      The correct approach is to scan requests on every map incremental.  This
      patch refactors the kick code in a few ways:
       - all requests are either on req_lru (in flight), req_unsent (ready to
         send), or req_notarget (currently map to no up osd)
       - mapping always done by map_request (previous map_osds)
       - if the mapping changes, we requeue.  requests are resent only after all
         map incrementals are processed.
       - some osd reset code is moved out of kick_requests into a separate
         function
       - the "kick this osd" functionality is moved to kick_osd_requests, as it
         is unrelated to scanning for request->pg->osd mapping changes
      Signed-off-by: NSage Weil <sage@newdream.net>
      6f6c7006
  24. 10 11月, 2010 2 次提交
    • S
      ceph: explicitly specify page alignment in network messages · c5c6b19d
      Sage Weil 提交于
      The alignment used for reading data into or out of pages used to be taken
      from the data_off field in the message header.  This only worked as long
      as the page alignment matched the object offset, breaking direct io to
      non-page aligned offsets.
      
      Instead, explicitly specify the page alignment next to the page vector
      in the ceph_msg struct, and use that instead of the message header (which
      probably shouldn't be trusted).  The alloc_msg callback is responsible for
      filling in this field properly when it sets up the page vector.
      Signed-off-by: NSage Weil <sage@newdream.net>
      c5c6b19d
    • S
      ceph: make page alignment explicit in osd interface · b7495fc2
      Sage Weil 提交于
      We used to infer alignment of IOs within a page based on the file offset,
      which assumed they matched.  This broke with direct IO that was not aligned
      to pages (e.g., 512-byte aligned IO).  We were also trusting the alignment
      specified in the OSD reply, which could have been adjusted by the server.
      
      Explicitly specify the page alignment when setting up OSD IO requests.
      Signed-off-by: NSage Weil <sage@newdream.net>
      b7495fc2
  25. 21 10月, 2010 4 次提交
  26. 07 10月, 2010 1 次提交