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

Commit ed75ec2c authored by Yan, Zheng's avatar Yan, Zheng Committed by Alex Elder
Browse files

ceph: Fix infinite loop in __wake_requests



__wake_requests() will enter infinite loop if we use it to wake
requests in the session->s_waiting list. __wake_requests() deletes
requests from the list and __do_request() adds requests back to
the list.

Signed-off-by: default avatarYan, Zheng <zheng.z.yan@intel.com>
Signed-off-by: default avatarSage Weil <sage@inktank.com>
parent 5e62ad30
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -1876,9 +1876,14 @@ static int __do_request(struct ceph_mds_client *mdsc,
static void __wake_requests(struct ceph_mds_client *mdsc,
			    struct list_head *head)
{
	struct ceph_mds_request *req, *nreq;
	struct ceph_mds_request *req;
	LIST_HEAD(tmp_list);

	list_splice_init(head, &tmp_list);

	list_for_each_entry_safe(req, nreq, head, r_wait) {
	while (!list_empty(&tmp_list)) {
		req = list_entry(tmp_list.next,
				 struct ceph_mds_request, r_wait);
		list_del_init(&req->r_wait);
		__do_request(mdsc, req);
	}