From 8e7e3bf6c872d7bf0d70a8101488f77686bc3502 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 21 Apr 2008 10:04:08 -0700 Subject: [PATCH] kclient: osdc properly note down osds --- src/kernel/osd_client.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/kernel/osd_client.c b/src/kernel/osd_client.c index e02f0a4a3e7fe..71c84d359822c 100644 --- a/src/kernel/osd_client.c +++ b/src/kernel/osd_client.c @@ -278,24 +278,28 @@ more: spin_lock(&osdc->request_lock); got = radix_tree_gang_lookup(&osdc->request_tree, (void **)&req, next_tid, 1); - if (got) { - next_tid = req->r_tid + 1; - osd = pick_osd(osdc, req); - if (osd < 0) - ret = 1; /* request a newer map */ - else if (!ceph_entity_addr_equal(&req->r_last_osd, - &osdc->osdmap->osd_addr[osd])) { - dout(20, "kicking tid %llu osd%d\n", req->r_tid, osd); - get_request(req); - spin_unlock(&osdc->request_lock); - req->r_request = redup_request(req->r_request); - send_request(osdc, req, osd); - put_request(req); - goto more; - } + if (got == 0) + goto done; + + next_tid = req->r_tid + 1; + osd = pick_osd(osdc, req); + if (osd < 0) { + ret = 1; /* request a newer map */ + memset(&req->r_last_osd, 0, sizeof(req->r_last_osd)); + } else if (!ceph_entity_addr_equal(&req->r_last_osd, + &osdc->osdmap->osd_addr[osd])) { + dout(20, "kicking tid %llu osd%d\n", req->r_tid, osd); + get_request(req); spin_unlock(&osdc->request_lock); + req->r_request = redup_request(req->r_request); + send_request(osdc, req, osd); + put_request(req); goto more; } + spin_unlock(&osdc->request_lock); + goto more; + +done: spin_unlock(&osdc->request_lock); if (ret) dout(10, "%d requests still pending on down osds\n", ret); -- 2.39.5