提交 ed75ec2c 编写于 作者: Y Yan, Zheng 提交者: Alex Elder

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: NYan, Zheng <zheng.z.yan@intel.com>
Signed-off-by: NSage Weil <sage@inktank.com>
上级 5e62ad30
...@@ -1876,9 +1876,14 @@ static int __do_request(struct ceph_mds_client *mdsc, ...@@ -1876,9 +1876,14 @@ static int __do_request(struct ceph_mds_client *mdsc,
static void __wake_requests(struct ceph_mds_client *mdsc, static void __wake_requests(struct ceph_mds_client *mdsc,
struct list_head *head) 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); list_del_init(&req->r_wait);
__do_request(mdsc, req); __do_request(mdsc, req);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册