mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-21 16:29:59 +00:00
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: Yan, Zheng <zheng.z.yan@intel.com> Signed-off-by: Sage Weil <sage@inktank.com>
This commit is contained in:
parent
5e62ad3015
commit
ed75ec2cd1
1 changed files with 7 additions and 2 deletions
|
@ -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_for_each_entry_safe(req, nreq, head, r_wait) {
|
||||
list_splice_init(head, &tmp_list);
|
||||
|
||||
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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue