Lines Matching refs:req
32 struct ceph_osd_request *req);
34 struct ceph_osd_request *req);
36 struct ceph_osd_request *req);
37 static void __enqueue_request(struct ceph_osd_request *req);
39 struct ceph_osd_request *req);
315 struct ceph_osd_request *req = container_of(kref, in ceph_osdc_release_request() local
319 dout("%s %p (r_request %p r_reply %p)\n", __func__, req, in ceph_osdc_release_request()
320 req->r_request, req->r_reply); in ceph_osdc_release_request()
321 WARN_ON(!RB_EMPTY_NODE(&req->r_node)); in ceph_osdc_release_request()
322 WARN_ON(!list_empty(&req->r_req_lru_item)); in ceph_osdc_release_request()
323 WARN_ON(!list_empty(&req->r_osd_item)); in ceph_osdc_release_request()
324 WARN_ON(!list_empty(&req->r_linger_item)); in ceph_osdc_release_request()
325 WARN_ON(!list_empty(&req->r_linger_osd_item)); in ceph_osdc_release_request()
326 WARN_ON(req->r_osd); in ceph_osdc_release_request()
328 if (req->r_request) in ceph_osdc_release_request()
329 ceph_msg_put(req->r_request); in ceph_osdc_release_request()
330 if (req->r_reply) { in ceph_osdc_release_request()
331 ceph_msg_revoke_incoming(req->r_reply); in ceph_osdc_release_request()
332 ceph_msg_put(req->r_reply); in ceph_osdc_release_request()
335 for (which = 0; which < req->r_num_ops; which++) in ceph_osdc_release_request()
336 osd_req_op_data_release(req, which); in ceph_osdc_release_request()
338 ceph_put_snap_context(req->r_snapc); in ceph_osdc_release_request()
339 if (req->r_mempool) in ceph_osdc_release_request()
340 mempool_free(req, req->r_osdc->req_mempool); in ceph_osdc_release_request()
342 kmem_cache_free(ceph_osd_request_cache, req); in ceph_osdc_release_request()
346 void ceph_osdc_get_request(struct ceph_osd_request *req) in ceph_osdc_get_request() argument
348 dout("%s %p (was %d)\n", __func__, req, in ceph_osdc_get_request()
349 atomic_read(&req->r_kref.refcount)); in ceph_osdc_get_request()
350 kref_get(&req->r_kref); in ceph_osdc_get_request()
354 void ceph_osdc_put_request(struct ceph_osd_request *req) in ceph_osdc_put_request() argument
356 dout("%s %p (was %d)\n", __func__, req, in ceph_osdc_put_request()
357 atomic_read(&req->r_kref.refcount)); in ceph_osdc_put_request()
358 kref_put(&req->r_kref, ceph_osdc_release_request); in ceph_osdc_put_request()
368 struct ceph_osd_request *req; in ceph_osdc_alloc_request() local
386 req = mempool_alloc(osdc->req_mempool, gfp_flags); in ceph_osdc_alloc_request()
387 memset(req, 0, sizeof(*req)); in ceph_osdc_alloc_request()
389 req = kmem_cache_zalloc(ceph_osd_request_cache, gfp_flags); in ceph_osdc_alloc_request()
391 if (req == NULL) in ceph_osdc_alloc_request()
394 req->r_osdc = osdc; in ceph_osdc_alloc_request()
395 req->r_mempool = use_mempool; in ceph_osdc_alloc_request()
396 req->r_num_ops = num_ops; in ceph_osdc_alloc_request()
398 kref_init(&req->r_kref); in ceph_osdc_alloc_request()
399 init_completion(&req->r_completion); in ceph_osdc_alloc_request()
400 init_completion(&req->r_safe_completion); in ceph_osdc_alloc_request()
401 RB_CLEAR_NODE(&req->r_node); in ceph_osdc_alloc_request()
402 INIT_LIST_HEAD(&req->r_unsafe_item); in ceph_osdc_alloc_request()
403 INIT_LIST_HEAD(&req->r_linger_item); in ceph_osdc_alloc_request()
404 INIT_LIST_HEAD(&req->r_linger_osd_item); in ceph_osdc_alloc_request()
405 INIT_LIST_HEAD(&req->r_req_lru_item); in ceph_osdc_alloc_request()
406 INIT_LIST_HEAD(&req->r_osd_item); in ceph_osdc_alloc_request()
408 req->r_base_oloc.pool = -1; in ceph_osdc_alloc_request()
409 req->r_target_oloc.pool = -1; in ceph_osdc_alloc_request()
418 ceph_osdc_put_request(req); in ceph_osdc_alloc_request()
421 req->r_reply = msg; in ceph_osdc_alloc_request()
429 ceph_osdc_put_request(req); in ceph_osdc_alloc_request()
435 req->r_request = msg; in ceph_osdc_alloc_request()
437 return req; in ceph_osdc_alloc_request()
654 static u64 osd_req_encode_op(struct ceph_osd_request *req, in osd_req_encode_op() argument
662 BUG_ON(which >= req->r_num_ops); in osd_req_encode_op()
663 src = &req->r_ops[which]; in osd_req_encode_op()
673 ceph_osdc_msg_data_add(req->r_reply, osd_data); in osd_req_encode_op()
692 ceph_osdc_msg_data_add(req->r_request, osd_data); in osd_req_encode_op()
694 ceph_osdc_msg_data_add(req->r_reply, osd_data); in osd_req_encode_op()
700 ceph_osdc_msg_data_add(req->r_request, osd_data); in osd_req_encode_op()
709 ceph_osdc_msg_data_add(req->r_request, osd_data); in osd_req_encode_op()
714 ceph_osdc_msg_data_add(req->r_reply, osd_data); in osd_req_encode_op()
737 ceph_osdc_msg_data_add(req->r_request, osd_data); in osd_req_encode_op()
780 struct ceph_osd_request *req; in ceph_osdc_new_request() local
790 req = ceph_osdc_alloc_request(osdc, snapc, num_ops, use_mempool, in ceph_osdc_new_request()
792 if (!req) in ceph_osdc_new_request()
795 req->r_flags = flags; in ceph_osdc_new_request()
800 ceph_osdc_put_request(req); in ceph_osdc_new_request()
805 osd_req_op_init(req, which, opcode, 0); in ceph_osdc_new_request()
818 osd_req_op_extent_init(req, which, opcode, objoff, objlen, in ceph_osdc_new_request()
822 req->r_base_oloc.pool = ceph_file_layout_pg_pool(*layout); in ceph_osdc_new_request()
824 snprintf(req->r_base_oid.name, sizeof(req->r_base_oid.name), in ceph_osdc_new_request()
826 req->r_base_oid.name_len = strlen(req->r_base_oid.name); in ceph_osdc_new_request()
828 return req; in ceph_osdc_new_request()
840 struct ceph_osd_request *req = NULL; in __insert_request() local
844 req = rb_entry(parent, struct ceph_osd_request, r_node); in __insert_request()
845 if (new->r_tid < req->r_tid) in __insert_request()
847 else if (new->r_tid > req->r_tid) in __insert_request()
860 struct ceph_osd_request *req; in __lookup_request() local
864 req = rb_entry(n, struct ceph_osd_request, r_node); in __lookup_request()
865 if (tid < req->r_tid) in __lookup_request()
867 else if (tid > req->r_tid) in __lookup_request()
870 return req; in __lookup_request()
879 struct ceph_osd_request *req; in __lookup_request_ge() local
883 req = rb_entry(n, struct ceph_osd_request, r_node); in __lookup_request_ge()
884 if (tid < req->r_tid) { in __lookup_request_ge()
886 return req; in __lookup_request_ge()
888 } else if (tid > req->r_tid) { in __lookup_request_ge()
891 return req; in __lookup_request_ge()
897 static void __kick_linger_request(struct ceph_osd_request *req) in __kick_linger_request() argument
899 struct ceph_osd_client *osdc = req->r_osdc; in __kick_linger_request()
900 struct ceph_osd *osd = req->r_osd; in __kick_linger_request()
907 ceph_osdc_get_request(req); in __kick_linger_request()
908 if (!list_empty(&req->r_linger_item)) in __kick_linger_request()
909 __unregister_linger_request(osdc, req); in __kick_linger_request()
911 __unregister_request(osdc, req); in __kick_linger_request()
912 __register_request(osdc, req); in __kick_linger_request()
913 ceph_osdc_put_request(req); in __kick_linger_request()
921 WARN_ON(req->r_osd || !osd); in __kick_linger_request()
922 req->r_osd = osd; in __kick_linger_request()
924 dout("%s requeueing %p tid %llu\n", __func__, req, req->r_tid); in __kick_linger_request()
925 __enqueue_request(req); in __kick_linger_request()
934 struct ceph_osd_request *req, *nreq; in __kick_osd_requests() local
961 list_for_each_entry(req, &osd->o_requests, r_osd_item) { in __kick_osd_requests()
962 if (!req->r_sent) in __kick_osd_requests()
965 if (!req->r_linger) { in __kick_osd_requests()
966 dout("%s requeueing %p tid %llu\n", __func__, req, in __kick_osd_requests()
967 req->r_tid); in __kick_osd_requests()
968 list_move_tail(&req->r_req_lru_item, &resend); in __kick_osd_requests()
969 req->r_flags |= CEPH_OSD_FLAG_RETRY; in __kick_osd_requests()
971 list_move_tail(&req->r_req_lru_item, &resend_linger); in __kick_osd_requests()
982 list_for_each_entry_safe(req, nreq, &osd->o_linger_requests, in __kick_osd_requests()
984 WARN_ON(!list_empty(&req->r_req_lru_item)); in __kick_osd_requests()
985 __kick_linger_request(req); in __kick_osd_requests()
988 list_for_each_entry_safe(req, nreq, &resend_linger, r_req_lru_item) in __kick_osd_requests()
989 __kick_linger_request(req); in __kick_osd_requests()
1158 struct ceph_osd_request *req; in __reset_osd() local
1163 list_for_each_entry(req, &osd->o_requests, r_osd_item) in __reset_osd()
1164 req->r_stamp = jiffies; in __reset_osd()
1231 struct ceph_osd_request *req) in __register_request() argument
1233 req->r_tid = ++osdc->last_tid; in __register_request()
1234 req->r_request->hdr.tid = cpu_to_le64(req->r_tid); in __register_request()
1235 dout("__register_request %p tid %lld\n", req, req->r_tid); in __register_request()
1236 __insert_request(osdc, req); in __register_request()
1237 ceph_osdc_get_request(req); in __register_request()
1249 struct ceph_osd_request *req) in __unregister_request() argument
1251 if (RB_EMPTY_NODE(&req->r_node)) { in __unregister_request()
1253 req, req->r_tid); in __unregister_request()
1257 dout("__unregister_request %p tid %lld\n", req, req->r_tid); in __unregister_request()
1258 rb_erase(&req->r_node, &osdc->requests); in __unregister_request()
1259 RB_CLEAR_NODE(&req->r_node); in __unregister_request()
1262 if (req->r_osd) { in __unregister_request()
1264 ceph_msg_revoke(req->r_request); in __unregister_request()
1266 list_del_init(&req->r_osd_item); in __unregister_request()
1267 maybe_move_osd_to_lru(osdc, req->r_osd); in __unregister_request()
1268 if (list_empty(&req->r_linger_osd_item)) in __unregister_request()
1269 req->r_osd = NULL; in __unregister_request()
1272 list_del_init(&req->r_req_lru_item); in __unregister_request()
1273 ceph_osdc_put_request(req); in __unregister_request()
1284 static void __cancel_request(struct ceph_osd_request *req) in __cancel_request() argument
1286 if (req->r_sent && req->r_osd) { in __cancel_request()
1287 ceph_msg_revoke(req->r_request); in __cancel_request()
1288 req->r_sent = 0; in __cancel_request()
1293 struct ceph_osd_request *req) in __register_linger_request() argument
1295 dout("%s %p tid %llu\n", __func__, req, req->r_tid); in __register_linger_request()
1296 WARN_ON(!req->r_linger); in __register_linger_request()
1298 ceph_osdc_get_request(req); in __register_linger_request()
1299 list_add_tail(&req->r_linger_item, &osdc->req_linger); in __register_linger_request()
1300 if (req->r_osd) in __register_linger_request()
1301 list_add_tail(&req->r_linger_osd_item, in __register_linger_request()
1302 &req->r_osd->o_linger_requests); in __register_linger_request()
1306 struct ceph_osd_request *req) in __unregister_linger_request() argument
1308 WARN_ON(!req->r_linger); in __unregister_linger_request()
1310 if (list_empty(&req->r_linger_item)) { in __unregister_linger_request()
1311 dout("%s %p tid %llu not registered\n", __func__, req, in __unregister_linger_request()
1312 req->r_tid); in __unregister_linger_request()
1316 dout("%s %p tid %llu\n", __func__, req, req->r_tid); in __unregister_linger_request()
1317 list_del_init(&req->r_linger_item); in __unregister_linger_request()
1319 if (req->r_osd) { in __unregister_linger_request()
1320 list_del_init(&req->r_linger_osd_item); in __unregister_linger_request()
1321 maybe_move_osd_to_lru(osdc, req->r_osd); in __unregister_linger_request()
1322 if (list_empty(&req->r_osd_item)) in __unregister_linger_request()
1323 req->r_osd = NULL; in __unregister_linger_request()
1325 ceph_osdc_put_request(req); in __unregister_linger_request()
1329 struct ceph_osd_request *req) in ceph_osdc_set_request_linger() argument
1331 if (!req->r_linger) { in ceph_osdc_set_request_linger()
1332 dout("set_request_linger %p\n", req); in ceph_osdc_set_request_linger()
1333 req->r_linger = 1; in ceph_osdc_set_request_linger()
1345 struct ceph_osd_request *req) in __req_should_be_paused() argument
1350 return (req->r_flags & CEPH_OSD_FLAG_READ && pauserd) || in __req_should_be_paused()
1351 (req->r_flags & CEPH_OSD_FLAG_WRITE && pausewr); in __req_should_be_paused()
1358 struct ceph_osd_request *req, in __calc_request_pg() argument
1364 if (req->r_target_oloc.pool == -1) { in __calc_request_pg()
1365 req->r_target_oloc = req->r_base_oloc; /* struct */ in __calc_request_pg()
1368 if (req->r_target_oid.name_len == 0) { in __calc_request_pg()
1369 ceph_oid_copy(&req->r_target_oid, &req->r_base_oid); in __calc_request_pg()
1374 (req->r_flags & CEPH_OSD_FLAG_IGNORE_OVERLAY) == 0) { in __calc_request_pg()
1377 pi = ceph_pg_pool_by_id(osdmap, req->r_target_oloc.pool); in __calc_request_pg()
1379 if ((req->r_flags & CEPH_OSD_FLAG_READ) && in __calc_request_pg()
1381 req->r_target_oloc.pool = pi->read_tier; in __calc_request_pg()
1382 if ((req->r_flags & CEPH_OSD_FLAG_WRITE) && in __calc_request_pg()
1384 req->r_target_oloc.pool = pi->write_tier; in __calc_request_pg()
1389 return ceph_oloc_oid_to_pg(osdmap, &req->r_target_oloc, in __calc_request_pg()
1390 &req->r_target_oid, pg_out); in __calc_request_pg()
1393 static void __enqueue_request(struct ceph_osd_request *req) in __enqueue_request() argument
1395 struct ceph_osd_client *osdc = req->r_osdc; in __enqueue_request()
1397 dout("%s %p tid %llu to osd%d\n", __func__, req, req->r_tid, in __enqueue_request()
1398 req->r_osd ? req->r_osd->o_osd : -1); in __enqueue_request()
1400 if (req->r_osd) { in __enqueue_request()
1401 __remove_osd_from_lru(req->r_osd); in __enqueue_request()
1402 list_add_tail(&req->r_osd_item, &req->r_osd->o_requests); in __enqueue_request()
1403 list_move_tail(&req->r_req_lru_item, &osdc->req_unsent); in __enqueue_request()
1405 list_move_tail(&req->r_req_lru_item, &osdc->req_notarget); in __enqueue_request()
1420 struct ceph_osd_request *req, int force_resend) in __map_request() argument
1428 dout("map_request %p tid %lld\n", req, req->r_tid); in __map_request()
1430 err = __calc_request_pg(osdc->osdmap, req, &pgid); in __map_request()
1432 list_move(&req->r_req_lru_item, &osdc->req_notarget); in __map_request()
1435 req->r_pgid = pgid; in __map_request()
1441 was_paused = req->r_paused; in __map_request()
1442 req->r_paused = __req_should_be_paused(osdc, req); in __map_request()
1443 if (was_paused && !req->r_paused) in __map_request()
1447 req->r_osd && req->r_osd->o_osd == o && in __map_request()
1448 req->r_sent >= req->r_osd->o_incarnation && in __map_request()
1449 req->r_num_pg_osds == num && in __map_request()
1450 memcmp(req->r_pg_osds, acting, sizeof(acting[0])*num) == 0) || in __map_request()
1451 (req->r_osd == NULL && o == -1) || in __map_request()
1452 req->r_paused) in __map_request()
1456 req->r_tid, pgid.pool, pgid.seed, o, in __map_request()
1457 req->r_osd ? req->r_osd->o_osd : -1); in __map_request()
1460 memcpy(req->r_pg_osds, acting, sizeof(acting[0]) * num); in __map_request()
1461 req->r_num_pg_osds = num; in __map_request()
1463 if (req->r_osd) { in __map_request()
1464 __cancel_request(req); in __map_request()
1465 list_del_init(&req->r_osd_item); in __map_request()
1466 list_del_init(&req->r_linger_osd_item); in __map_request()
1467 req->r_osd = NULL; in __map_request()
1470 req->r_osd = __lookup_osd(osdc, o); in __map_request()
1471 if (!req->r_osd && o >= 0) { in __map_request()
1473 req->r_osd = create_osd(osdc, o); in __map_request()
1474 if (!req->r_osd) { in __map_request()
1475 list_move(&req->r_req_lru_item, &osdc->req_notarget); in __map_request()
1479 dout("map_request osd %p is osd%d\n", req->r_osd, o); in __map_request()
1480 __insert_osd(osdc, req->r_osd); in __map_request()
1482 ceph_con_open(&req->r_osd->o_con, in __map_request()
1487 __enqueue_request(req); in __map_request()
1498 struct ceph_osd_request *req) in __send_request() argument
1503 req, req->r_tid, req->r_osd->o_osd, req->r_flags, in __send_request()
1504 (unsigned long long)req->r_pgid.pool, req->r_pgid.seed); in __send_request()
1507 put_unaligned_le32(osdc->osdmap->epoch, req->r_request_osdmap_epoch); in __send_request()
1508 put_unaligned_le32(req->r_flags, req->r_request_flags); in __send_request()
1509 put_unaligned_le64(req->r_target_oloc.pool, req->r_request_pool); in __send_request()
1510 p = req->r_request_pgid; in __send_request()
1511 ceph_encode_64(&p, req->r_pgid.pool); in __send_request()
1512 ceph_encode_32(&p, req->r_pgid.seed); in __send_request()
1513 put_unaligned_le64(1, req->r_request_attempts); /* FIXME */ in __send_request()
1514 memcpy(req->r_request_reassert_version, &req->r_reassert_version, in __send_request()
1515 sizeof(req->r_reassert_version)); in __send_request()
1517 req->r_stamp = jiffies; in __send_request()
1518 list_move_tail(&req->r_req_lru_item, &osdc->req_lru); in __send_request()
1520 ceph_msg_get(req->r_request); /* send consumes a ref */ in __send_request()
1522 req->r_sent = req->r_osd->o_incarnation; in __send_request()
1524 ceph_con_send(&req->r_osd->o_con, req->r_request); in __send_request()
1532 struct ceph_osd_request *req, *tmp; in __send_queued() local
1535 list_for_each_entry_safe(req, tmp, &osdc->req_unsent, r_req_lru_item) in __send_queued()
1536 __send_request(osdc, req); in __send_queued()
1543 struct ceph_osd_request *req, in __ceph_osdc_start_request() argument
1548 __register_request(osdc, req); in __ceph_osdc_start_request()
1549 req->r_sent = 0; in __ceph_osdc_start_request()
1550 req->r_got_reply = 0; in __ceph_osdc_start_request()
1551 rc = __map_request(osdc, req, 0); in __ceph_osdc_start_request()
1555 " will retry %lld\n", req->r_tid); in __ceph_osdc_start_request()
1558 __unregister_request(osdc, req); in __ceph_osdc_start_request()
1563 if (req->r_osd == NULL) { in __ceph_osdc_start_request()
1564 dout("send_request %p no up osds in pg\n", req); in __ceph_osdc_start_request()
1587 struct ceph_osd_request *req; in handle_timeout() local
1603 list_for_each_entry(req, &osdc->req_lru, r_req_lru_item) { in handle_timeout()
1605 req->r_stamp + opts->osd_keepalive_timeout)) in handle_timeout()
1608 osd = req->r_osd; in handle_timeout()
1611 req->r_tid, osd->o_osd); in handle_timeout()
1746 static void complete_request(struct ceph_osd_request *req) in complete_request() argument
1748 complete_all(&req->r_safe_completion); /* fsync waiter */ in complete_request()
1758 struct ceph_osd_request *req; in handle_reply() local
1800 req = __lookup_request(osdc, tid); in handle_reply()
1801 if (req == NULL) { in handle_reply()
1805 ceph_osdc_get_request(req); in handle_reply()
1808 req, result); in handle_reply()
1814 if (numops != req->r_num_ops) in handle_reply()
1823 req->r_reply_op_len[i] = len; in handle_reply()
1838 req->r_reply_op_result[i] = ceph_decode_32(&p); in handle_reply()
1854 __unregister_request(osdc, req); in handle_reply()
1856 req->r_target_oloc = redir.oloc; /* struct */ in handle_reply()
1866 err = __ceph_osdc_start_request(osdc, req, true); in handle_reply()
1872 already_completed = req->r_got_reply; in handle_reply()
1873 if (!req->r_got_reply) { in handle_reply()
1874 req->r_result = result; in handle_reply()
1875 dout("handle_reply result %d bytes %d\n", req->r_result, in handle_reply()
1877 if (req->r_result == 0) in handle_reply()
1878 req->r_result = bytes; in handle_reply()
1881 req->r_reassert_version.epoch = cpu_to_le32(reassert_epoch); in handle_reply()
1882 req->r_reassert_version.version = cpu_to_le64(reassert_version); in handle_reply()
1884 req->r_got_reply = 1; in handle_reply()
1892 if (req->r_linger && (flags & CEPH_OSD_FLAG_ONDISK)) in handle_reply()
1893 __register_linger_request(osdc, req); in handle_reply()
1899 __unregister_request(osdc, req); in handle_reply()
1905 if (req->r_unsafe_callback && in handle_reply()
1907 req->r_unsafe_callback(req, true); in handle_reply()
1908 if (req->r_callback) in handle_reply()
1909 req->r_callback(req, msg); in handle_reply()
1911 complete_all(&req->r_completion); in handle_reply()
1915 if (req->r_unsafe_callback && already_completed) in handle_reply()
1916 req->r_unsafe_callback(req, false); in handle_reply()
1917 complete_request(req); in handle_reply()
1921 dout("req=%p req->r_linger=%d\n", req, req->r_linger); in handle_reply()
1922 ceph_osdc_put_request(req); in handle_reply()
1930 req->r_result = -EIO; in handle_reply()
1931 __unregister_request(osdc, req); in handle_reply()
1932 if (req->r_callback) in handle_reply()
1933 req->r_callback(req, msg); in handle_reply()
1935 complete_all(&req->r_completion); in handle_reply()
1936 complete_request(req); in handle_reply()
1937 ceph_osdc_put_request(req); in handle_reply()
1974 struct ceph_osd_request *req, *nreq; in kick_requests() local
1984 req = rb_entry(p, struct ceph_osd_request, r_node); in kick_requests()
1995 if (req->r_linger && list_empty(&req->r_linger_item)) { in kick_requests()
1997 req, req->r_tid, in kick_requests()
1998 req->r_osd ? req->r_osd->o_osd : -1); in kick_requests()
1999 ceph_osdc_get_request(req); in kick_requests()
2000 __unregister_request(osdc, req); in kick_requests()
2001 __register_linger_request(osdc, req); in kick_requests()
2002 ceph_osdc_put_request(req); in kick_requests()
2008 req->r_flags & CEPH_OSD_FLAG_WRITE); in kick_requests()
2009 err = __map_request(osdc, req, force_resend_req); in kick_requests()
2012 if (req->r_osd == NULL) { in kick_requests()
2013 dout("%p tid %llu maps to no osd\n", req, req->r_tid); in kick_requests()
2016 if (!req->r_linger) { in kick_requests()
2017 dout("%p tid %llu requeued on osd%d\n", req, in kick_requests()
2018 req->r_tid, in kick_requests()
2019 req->r_osd ? req->r_osd->o_osd : -1); in kick_requests()
2020 req->r_flags |= CEPH_OSD_FLAG_RETRY; in kick_requests()
2025 list_for_each_entry_safe(req, nreq, &osdc->req_linger, in kick_requests()
2027 dout("linger req=%p req->r_osd=%p\n", req, req->r_osd); in kick_requests()
2029 err = __map_request(osdc, req, in kick_requests()
2034 if (req->r_osd == NULL || err > 0) { in kick_requests()
2035 if (req->r_osd == NULL) { in kick_requests()
2037 req, req->r_tid); in kick_requests()
2050 dout("kicking lingering %p tid %llu osd%d\n", req, in kick_requests()
2051 req->r_tid, req->r_osd ? req->r_osd->o_osd : -1); in kick_requests()
2052 __register_request(osdc, req); in kick_requests()
2053 __unregister_linger_request(osdc, req); in kick_requests()
2402 void ceph_osdc_build_request(struct ceph_osd_request *req, u64 off, in ceph_osdc_build_request() argument
2406 struct ceph_msg *msg = req->r_request; in ceph_osdc_build_request()
2409 int flags = req->r_flags; in ceph_osdc_build_request()
2413 req->r_snapid = snap_id; in ceph_osdc_build_request()
2414 req->r_snapc = ceph_get_snap_context(snapc); in ceph_osdc_build_request()
2421 req->r_request_osdmap_epoch = p; in ceph_osdc_build_request()
2423 req->r_request_flags = p; in ceph_osdc_build_request()
2425 if (req->r_flags & CEPH_OSD_FLAG_WRITE) in ceph_osdc_build_request()
2428 req->r_request_reassert_version = p; in ceph_osdc_build_request()
2435 req->r_request_pool = p; in ceph_osdc_build_request()
2441 req->r_request_pgid = p; in ceph_osdc_build_request()
2446 ceph_encode_32(&p, req->r_base_oid.name_len); in ceph_osdc_build_request()
2447 memcpy(p, req->r_base_oid.name, req->r_base_oid.name_len); in ceph_osdc_build_request()
2448 dout("oid '%.*s' len %d\n", req->r_base_oid.name_len, in ceph_osdc_build_request()
2449 req->r_base_oid.name, req->r_base_oid.name_len); in ceph_osdc_build_request()
2450 p += req->r_base_oid.name_len; in ceph_osdc_build_request()
2453 ceph_encode_16(&p, (u16)req->r_num_ops); in ceph_osdc_build_request()
2455 for (i = 0; i < req->r_num_ops; i++) { in ceph_osdc_build_request()
2456 data_len += osd_req_encode_op(req, p, i); in ceph_osdc_build_request()
2461 ceph_encode_64(&p, req->r_snapid); in ceph_osdc_build_request()
2462 ceph_encode_64(&p, req->r_snapc ? req->r_snapc->seq : 0); in ceph_osdc_build_request()
2463 ceph_encode_32(&p, req->r_snapc ? req->r_snapc->num_snaps : 0); in ceph_osdc_build_request()
2464 if (req->r_snapc) { in ceph_osdc_build_request()
2466 ceph_encode_64(&p, req->r_snapc->snaps[i]); in ceph_osdc_build_request()
2470 req->r_request_attempts = p; in ceph_osdc_build_request()
2484 req->r_request->hdr.data_off = cpu_to_le16(data_off); in ceph_osdc_build_request()
2486 req->r_request->hdr.data_len = cpu_to_le32(data_len); in ceph_osdc_build_request()
2501 struct ceph_osd_request *req, in ceph_osdc_start_request() argument
2509 rc = __ceph_osdc_start_request(osdc, req, nofail); in ceph_osdc_start_request()
2523 void ceph_osdc_cancel_request(struct ceph_osd_request *req) in ceph_osdc_cancel_request() argument
2525 struct ceph_osd_client *osdc = req->r_osdc; in ceph_osdc_cancel_request()
2528 if (req->r_linger) in ceph_osdc_cancel_request()
2529 __unregister_linger_request(osdc, req); in ceph_osdc_cancel_request()
2530 __unregister_request(osdc, req); in ceph_osdc_cancel_request()
2533 dout("%s %p tid %llu canceled\n", __func__, req, req->r_tid); in ceph_osdc_cancel_request()
2541 struct ceph_osd_request *req) in ceph_osdc_wait_request() argument
2545 dout("%s %p tid %llu\n", __func__, req, req->r_tid); in ceph_osdc_wait_request()
2547 rc = wait_for_completion_interruptible(&req->r_completion); in ceph_osdc_wait_request()
2549 dout("%s %p tid %llu interrupted\n", __func__, req, req->r_tid); in ceph_osdc_wait_request()
2550 ceph_osdc_cancel_request(req); in ceph_osdc_wait_request()
2551 complete_request(req); in ceph_osdc_wait_request()
2555 dout("%s %p tid %llu result %d\n", __func__, req, req->r_tid, in ceph_osdc_wait_request()
2556 req->r_result); in ceph_osdc_wait_request()
2557 return req->r_result; in ceph_osdc_wait_request()
2566 struct ceph_osd_request *req; in ceph_osdc_sync() local
2572 req = __lookup_request_ge(osdc, next_tid); in ceph_osdc_sync()
2573 if (!req) in ceph_osdc_sync()
2575 if (req->r_tid > last_tid) in ceph_osdc_sync()
2578 next_tid = req->r_tid + 1; in ceph_osdc_sync()
2579 if ((req->r_flags & CEPH_OSD_FLAG_WRITE) == 0) in ceph_osdc_sync()
2582 ceph_osdc_get_request(req); in ceph_osdc_sync()
2585 req->r_tid, last_tid); in ceph_osdc_sync()
2586 wait_for_completion(&req->r_safe_completion); in ceph_osdc_sync()
2588 ceph_osdc_put_request(req); in ceph_osdc_sync()
2698 struct ceph_osd_request *req; in ceph_osdc_readpages() local
2703 req = ceph_osdc_new_request(osdc, layout, vino, off, plen, 0, 1, in ceph_osdc_readpages()
2707 if (IS_ERR(req)) in ceph_osdc_readpages()
2708 return PTR_ERR(req); in ceph_osdc_readpages()
2712 osd_req_op_extent_osd_data_pages(req, 0, in ceph_osdc_readpages()
2718 ceph_osdc_build_request(req, off, NULL, vino.snap, NULL); in ceph_osdc_readpages()
2720 rc = ceph_osdc_start_request(osdc, req, false); in ceph_osdc_readpages()
2722 rc = ceph_osdc_wait_request(osdc, req); in ceph_osdc_readpages()
2724 ceph_osdc_put_request(req); in ceph_osdc_readpages()
2741 struct ceph_osd_request *req; in ceph_osdc_writepages() local
2746 req = ceph_osdc_new_request(osdc, layout, vino, off, &len, 0, 1, in ceph_osdc_writepages()
2751 if (IS_ERR(req)) in ceph_osdc_writepages()
2752 return PTR_ERR(req); in ceph_osdc_writepages()
2755 osd_req_op_extent_osd_data_pages(req, 0, pages, len, page_align, in ceph_osdc_writepages()
2759 ceph_osdc_build_request(req, off, snapc, CEPH_NOSNAP, mtime); in ceph_osdc_writepages()
2761 rc = ceph_osdc_start_request(osdc, req, true); in ceph_osdc_writepages()
2763 rc = ceph_osdc_wait_request(osdc, req); in ceph_osdc_writepages()
2765 ceph_osdc_put_request(req); in ceph_osdc_writepages()
2837 struct ceph_osd_request *req; in get_reply() local
2844 req = __lookup_request(osdc, tid); in get_reply()
2845 if (!req) { in get_reply()
2853 ceph_msg_revoke_incoming(req->r_reply); in get_reply()
2855 if (front_len > req->r_reply->front_alloc_len) { in get_reply()
2857 __func__, osd->o_osd, req->r_tid, front_len, in get_reply()
2858 req->r_reply->front_alloc_len); in get_reply()
2863 ceph_msg_put(req->r_reply); in get_reply()
2864 req->r_reply = m; in get_reply()
2867 if (data_len > req->r_reply->data_length) { in get_reply()
2869 __func__, osd->o_osd, req->r_tid, data_len, in get_reply()
2870 req->r_reply->data_length); in get_reply()
2876 m = ceph_msg_get(req->r_reply); in get_reply()