]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: osdc properly note down osds
authorSage Weil <sage@newdream.net>
Mon, 21 Apr 2008 17:04:08 +0000 (10:04 -0700)
committerSage Weil <sage@newdream.net>
Mon, 21 Apr 2008 17:04:08 +0000 (10:04 -0700)
src/kernel/osd_client.c

index e02f0a4a3e7fefce8b13808191148be8a400172a..71c84d359822c8f6f44980923daff7ed64256020 100644 (file)
@@ -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);