diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/ceph/osd_client.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c index 07920cac31a6..c605705c2f57 100644 --- a/net/ceph/osd_client.c +++ b/net/ceph/osd_client.c | |||
@@ -891,7 +891,9 @@ static void __register_linger_request(struct ceph_osd_client *osdc, | |||
891 | { | 891 | { |
892 | dout("__register_linger_request %p\n", req); | 892 | dout("__register_linger_request %p\n", req); |
893 | list_add_tail(&req->r_linger_item, &osdc->req_linger); | 893 | list_add_tail(&req->r_linger_item, &osdc->req_linger); |
894 | list_add_tail(&req->r_linger_osd, &req->r_osd->o_linger_requests); | 894 | if (req->r_osd) |
895 | list_add_tail(&req->r_linger_osd, | ||
896 | &req->r_osd->o_linger_requests); | ||
895 | } | 897 | } |
896 | 898 | ||
897 | static void __unregister_linger_request(struct ceph_osd_client *osdc, | 899 | static void __unregister_linger_request(struct ceph_osd_client *osdc, |
@@ -1305,8 +1307,9 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend) | |||
1305 | 1307 | ||
1306 | dout("kick_requests %s\n", force_resend ? " (force resend)" : ""); | 1308 | dout("kick_requests %s\n", force_resend ? " (force resend)" : ""); |
1307 | mutex_lock(&osdc->request_mutex); | 1309 | mutex_lock(&osdc->request_mutex); |
1308 | for (p = rb_first(&osdc->requests); p; p = rb_next(p)) { | 1310 | for (p = rb_first(&osdc->requests); p; ) { |
1309 | req = rb_entry(p, struct ceph_osd_request, r_node); | 1311 | req = rb_entry(p, struct ceph_osd_request, r_node); |
1312 | p = rb_next(p); | ||
1310 | err = __map_request(osdc, req, force_resend); | 1313 | err = __map_request(osdc, req, force_resend); |
1311 | if (err < 0) | 1314 | if (err < 0) |
1312 | continue; /* error */ | 1315 | continue; /* error */ |
@@ -1314,10 +1317,23 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend) | |||
1314 | dout("%p tid %llu maps to no osd\n", req, req->r_tid); | 1317 | dout("%p tid %llu maps to no osd\n", req, req->r_tid); |
1315 | needmap++; /* request a newer map */ | 1318 | needmap++; /* request a newer map */ |
1316 | } else if (err > 0) { | 1319 | } else if (err > 0) { |
1317 | dout("%p tid %llu requeued on osd%d\n", req, req->r_tid, | 1320 | if (!req->r_linger) { |
1318 | req->r_osd ? req->r_osd->o_osd : -1); | 1321 | dout("%p tid %llu requeued on osd%d\n", req, |
1319 | if (!req->r_linger) | 1322 | req->r_tid, |
1323 | req->r_osd ? req->r_osd->o_osd : -1); | ||
1320 | req->r_flags |= CEPH_OSD_FLAG_RETRY; | 1324 | req->r_flags |= CEPH_OSD_FLAG_RETRY; |
1325 | } | ||
1326 | } | ||
1327 | if (req->r_linger && list_empty(&req->r_linger_item)) { | ||
1328 | /* | ||
1329 | * register as a linger so that we will | ||
1330 | * re-submit below and get a new tid | ||
1331 | */ | ||
1332 | dout("%p tid %llu restart on osd%d\n", | ||
1333 | req, req->r_tid, | ||
1334 | req->r_osd ? req->r_osd->o_osd : -1); | ||
1335 | __register_linger_request(osdc, req); | ||
1336 | __unregister_request(osdc, req); | ||
1321 | } | 1337 | } |
1322 | } | 1338 | } |
1323 | 1339 | ||