Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 77f38e0e authored by Sage Weil's avatar Sage Weil
Browse files

libceph: fix linger request requeueing



Fix the request transition from linger -> normal request.  The key is to
preserve r_osd and requeue on the same OSD.  Reregister as a normal request,
add the request to the proper queues, then unregister the linger.  Fix the
unregister helper to avoid clearing r_osd (and also simplify the parallel
check in __unregister_request()).

Reported-by: default avatarHenry Chang <henry.cy.chang@gmail.com>
Signed-off-by: default avatarSage Weil <sage@newdream.net>
parent 4b2a58ab
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -579,9 +579,15 @@ static void __kick_osd_requests(struct ceph_osd_client *osdc,

	list_for_each_entry_safe(req, nreq, &osd->o_linger_requests,
				 r_linger_osd) {
		__unregister_linger_request(osdc, req);
		/*
		 * reregister request prior to unregistering linger so
		 * that r_osd is preserved.
		 */
		BUG_ON(!list_empty(&req->r_req_lru_item));
		__register_request(osdc, req);
		list_move(&req->r_req_lru_item, &osdc->req_unsent);
		list_add(&req->r_req_lru_item, &osdc->req_unsent);
		list_add(&req->r_osd_item, &req->r_osd->o_requests);
		__unregister_linger_request(osdc, req);
		dout("requeued lingering %p tid %llu osd%d\n", req, req->r_tid,
		     osd->o_osd);
	}
@@ -798,7 +804,7 @@ static void __register_request(struct ceph_osd_client *osdc,
	req->r_request->hdr.tid = cpu_to_le64(req->r_tid);
	INIT_LIST_HEAD(&req->r_req_lru_item);

	dout("register_request %p tid %lld\n", req, req->r_tid);
	dout("__register_request %p tid %lld\n", req, req->r_tid);
	__insert_request(osdc, req);
	ceph_osdc_get_request(req);
	osdc->num_requests++;