Lines Matching refs:obj_request
252 struct rbd_obj_request *obj_request; /* STAT op */ member
302 struct rbd_obj_request *obj_request; /* obj req initiator */ member
527 static void rbd_osd_copyup_callback(struct rbd_obj_request *obj_request);
528 static int rbd_img_obj_request_submit(struct rbd_obj_request *obj_request);
529 static void rbd_img_parent_read(struct rbd_obj_request *obj_request);
1394 static void obj_request_img_data_set(struct rbd_obj_request *obj_request) in obj_request_img_data_set() argument
1396 if (test_and_set_bit(OBJ_REQ_IMG_DATA, &obj_request->flags)) { in obj_request_img_data_set()
1399 rbd_dev = obj_request->img_request->rbd_dev; in obj_request_img_data_set()
1401 obj_request); in obj_request_img_data_set()
1405 static bool obj_request_img_data_test(struct rbd_obj_request *obj_request) in obj_request_img_data_test() argument
1408 return test_bit(OBJ_REQ_IMG_DATA, &obj_request->flags) != 0; in obj_request_img_data_test()
1411 static void obj_request_done_set(struct rbd_obj_request *obj_request) in obj_request_done_set() argument
1413 if (test_and_set_bit(OBJ_REQ_DONE, &obj_request->flags)) { in obj_request_done_set()
1416 if (obj_request_img_data_test(obj_request)) in obj_request_done_set()
1417 rbd_dev = obj_request->img_request->rbd_dev; in obj_request_done_set()
1419 obj_request); in obj_request_done_set()
1423 static bool obj_request_done_test(struct rbd_obj_request *obj_request) in obj_request_done_test() argument
1426 return test_bit(OBJ_REQ_DONE, &obj_request->flags) != 0; in obj_request_done_test()
1439 static void obj_request_existence_set(struct rbd_obj_request *obj_request, in obj_request_existence_set() argument
1443 set_bit(OBJ_REQ_EXISTS, &obj_request->flags); in obj_request_existence_set()
1444 set_bit(OBJ_REQ_KNOWN, &obj_request->flags); in obj_request_existence_set()
1448 static bool obj_request_known_test(struct rbd_obj_request *obj_request) in obj_request_known_test() argument
1451 return test_bit(OBJ_REQ_KNOWN, &obj_request->flags) != 0; in obj_request_known_test()
1454 static bool obj_request_exists_test(struct rbd_obj_request *obj_request) in obj_request_exists_test() argument
1457 return test_bit(OBJ_REQ_EXISTS, &obj_request->flags) != 0; in obj_request_exists_test()
1460 static bool obj_request_overlaps_parent(struct rbd_obj_request *obj_request) in obj_request_overlaps_parent() argument
1462 struct rbd_device *rbd_dev = obj_request->img_request->rbd_dev; in obj_request_overlaps_parent()
1464 return obj_request->img_offset < in obj_request_overlaps_parent()
1468 static void rbd_obj_request_get(struct rbd_obj_request *obj_request) in rbd_obj_request_get() argument
1470 dout("%s: obj %p (was %d)\n", __func__, obj_request, in rbd_obj_request_get()
1471 atomic_read(&obj_request->kref.refcount)); in rbd_obj_request_get()
1472 kref_get(&obj_request->kref); in rbd_obj_request_get()
1476 static void rbd_obj_request_put(struct rbd_obj_request *obj_request) in rbd_obj_request_put() argument
1478 rbd_assert(obj_request != NULL); in rbd_obj_request_put()
1479 dout("%s: obj %p (was %d)\n", __func__, obj_request, in rbd_obj_request_put()
1480 atomic_read(&obj_request->kref.refcount)); in rbd_obj_request_put()
1481 kref_put(&obj_request->kref, rbd_obj_request_destroy); in rbd_obj_request_put()
1506 struct rbd_obj_request *obj_request) in rbd_img_obj_request_add() argument
1508 rbd_assert(obj_request->img_request == NULL); in rbd_img_obj_request_add()
1511 obj_request->img_request = img_request; in rbd_img_obj_request_add()
1512 obj_request->which = img_request->obj_request_count; in rbd_img_obj_request_add()
1513 rbd_assert(!obj_request_img_data_test(obj_request)); in rbd_img_obj_request_add()
1514 obj_request_img_data_set(obj_request); in rbd_img_obj_request_add()
1515 rbd_assert(obj_request->which != BAD_WHICH); in rbd_img_obj_request_add()
1517 list_add_tail(&obj_request->links, &img_request->obj_requests); in rbd_img_obj_request_add()
1518 dout("%s: img %p obj %p w=%u\n", __func__, img_request, obj_request, in rbd_img_obj_request_add()
1519 obj_request->which); in rbd_img_obj_request_add()
1523 struct rbd_obj_request *obj_request) in rbd_img_obj_request_del() argument
1525 rbd_assert(obj_request->which != BAD_WHICH); in rbd_img_obj_request_del()
1527 dout("%s: img %p obj %p w=%u\n", __func__, img_request, obj_request, in rbd_img_obj_request_del()
1528 obj_request->which); in rbd_img_obj_request_del()
1529 list_del(&obj_request->links); in rbd_img_obj_request_del()
1532 rbd_assert(obj_request->which == img_request->obj_request_count); in rbd_img_obj_request_del()
1533 obj_request->which = BAD_WHICH; in rbd_img_obj_request_del()
1534 rbd_assert(obj_request_img_data_test(obj_request)); in rbd_img_obj_request_del()
1535 rbd_assert(obj_request->img_request == img_request); in rbd_img_obj_request_del()
1536 obj_request->img_request = NULL; in rbd_img_obj_request_del()
1537 obj_request->callback = NULL; in rbd_img_obj_request_del()
1538 rbd_obj_request_put(obj_request); in rbd_img_obj_request_del()
1554 struct rbd_obj_request *obj_request) in rbd_obj_request_submit() argument
1556 dout("%s %p\n", __func__, obj_request); in rbd_obj_request_submit()
1557 return ceph_osdc_start_request(osdc, obj_request->osd_req, false); in rbd_obj_request_submit()
1560 static void rbd_obj_request_end(struct rbd_obj_request *obj_request) in rbd_obj_request_end() argument
1562 dout("%s %p\n", __func__, obj_request); in rbd_obj_request_end()
1563 ceph_osdc_cancel_request(obj_request->osd_req); in rbd_obj_request_end()
1570 static int rbd_obj_request_wait(struct rbd_obj_request *obj_request) in rbd_obj_request_wait() argument
1574 dout("%s %p\n", __func__, obj_request); in rbd_obj_request_wait()
1576 ret = wait_for_completion_interruptible(&obj_request->completion); in rbd_obj_request_wait()
1578 dout("%s %p interrupted\n", __func__, obj_request); in rbd_obj_request_wait()
1579 rbd_obj_request_end(obj_request); in rbd_obj_request_wait()
1583 dout("%s %p done\n", __func__, obj_request); in rbd_obj_request_wait()
1599 struct rbd_obj_request *obj_request; in rbd_img_request_complete() local
1602 for_each_obj_request(img_request, obj_request) in rbd_img_request_complete()
1603 xferred += obj_request->xferred; in rbd_img_request_complete()
1693 rbd_img_obj_request_read_callback(struct rbd_obj_request *obj_request) in rbd_img_obj_request_read_callback() argument
1695 u64 xferred = obj_request->xferred; in rbd_img_obj_request_read_callback()
1696 u64 length = obj_request->length; in rbd_img_obj_request_read_callback()
1699 obj_request, obj_request->img_request, obj_request->result, in rbd_img_obj_request_read_callback()
1709 rbd_assert(obj_request->type != OBJ_REQUEST_NODATA); in rbd_img_obj_request_read_callback()
1710 if (obj_request->result == -ENOENT) { in rbd_img_obj_request_read_callback()
1711 if (obj_request->type == OBJ_REQUEST_BIO) in rbd_img_obj_request_read_callback()
1712 zero_bio_chain(obj_request->bio_list, 0); in rbd_img_obj_request_read_callback()
1714 zero_pages(obj_request->pages, 0, length); in rbd_img_obj_request_read_callback()
1715 obj_request->result = 0; in rbd_img_obj_request_read_callback()
1716 } else if (xferred < length && !obj_request->result) { in rbd_img_obj_request_read_callback()
1717 if (obj_request->type == OBJ_REQUEST_BIO) in rbd_img_obj_request_read_callback()
1718 zero_bio_chain(obj_request->bio_list, xferred); in rbd_img_obj_request_read_callback()
1720 zero_pages(obj_request->pages, xferred, length); in rbd_img_obj_request_read_callback()
1722 obj_request->xferred = length; in rbd_img_obj_request_read_callback()
1723 obj_request_done_set(obj_request); in rbd_img_obj_request_read_callback()
1726 static void rbd_obj_request_complete(struct rbd_obj_request *obj_request) in rbd_obj_request_complete() argument
1728 dout("%s: obj %p cb %p\n", __func__, obj_request, in rbd_obj_request_complete()
1729 obj_request->callback); in rbd_obj_request_complete()
1730 if (obj_request->callback) in rbd_obj_request_complete()
1731 obj_request->callback(obj_request); in rbd_obj_request_complete()
1733 complete_all(&obj_request->completion); in rbd_obj_request_complete()
1736 static void rbd_osd_trivial_callback(struct rbd_obj_request *obj_request) in rbd_osd_trivial_callback() argument
1738 dout("%s: obj %p\n", __func__, obj_request); in rbd_osd_trivial_callback()
1739 obj_request_done_set(obj_request); in rbd_osd_trivial_callback()
1742 static void rbd_osd_read_callback(struct rbd_obj_request *obj_request) in rbd_osd_read_callback() argument
1748 if (obj_request_img_data_test(obj_request)) { in rbd_osd_read_callback()
1749 img_request = obj_request->img_request; in rbd_osd_read_callback()
1755 obj_request, img_request, obj_request->result, in rbd_osd_read_callback()
1756 obj_request->xferred, obj_request->length); in rbd_osd_read_callback()
1757 if (layered && obj_request->result == -ENOENT && in rbd_osd_read_callback()
1758 obj_request->img_offset < rbd_dev->parent_overlap) in rbd_osd_read_callback()
1759 rbd_img_parent_read(obj_request); in rbd_osd_read_callback()
1761 rbd_img_obj_request_read_callback(obj_request); in rbd_osd_read_callback()
1763 obj_request_done_set(obj_request); in rbd_osd_read_callback()
1766 static void rbd_osd_write_callback(struct rbd_obj_request *obj_request) in rbd_osd_write_callback() argument
1768 dout("%s: obj %p result %d %llu\n", __func__, obj_request, in rbd_osd_write_callback()
1769 obj_request->result, obj_request->length); in rbd_osd_write_callback()
1774 obj_request->xferred = obj_request->length; in rbd_osd_write_callback()
1775 obj_request_done_set(obj_request); in rbd_osd_write_callback()
1778 static void rbd_osd_discard_callback(struct rbd_obj_request *obj_request) in rbd_osd_discard_callback() argument
1780 dout("%s: obj %p result %d %llu\n", __func__, obj_request, in rbd_osd_discard_callback()
1781 obj_request->result, obj_request->length); in rbd_osd_discard_callback()
1786 obj_request->xferred = obj_request->length; in rbd_osd_discard_callback()
1788 if (obj_request->result == -ENOENT) in rbd_osd_discard_callback()
1789 obj_request->result = 0; in rbd_osd_discard_callback()
1790 obj_request_done_set(obj_request); in rbd_osd_discard_callback()
1797 static void rbd_osd_stat_callback(struct rbd_obj_request *obj_request) in rbd_osd_stat_callback() argument
1799 dout("%s: obj %p\n", __func__, obj_request); in rbd_osd_stat_callback()
1800 obj_request_done_set(obj_request); in rbd_osd_stat_callback()
1803 static void rbd_osd_call_callback(struct rbd_obj_request *obj_request) in rbd_osd_call_callback() argument
1805 dout("%s: obj %p\n", __func__, obj_request); in rbd_osd_call_callback()
1807 if (obj_request_img_data_test(obj_request)) in rbd_osd_call_callback()
1808 rbd_osd_copyup_callback(obj_request); in rbd_osd_call_callback()
1810 obj_request_done_set(obj_request); in rbd_osd_call_callback()
1816 struct rbd_obj_request *obj_request = osd_req->r_priv; in rbd_osd_req_callback() local
1820 rbd_assert(osd_req == obj_request->osd_req); in rbd_osd_req_callback()
1821 if (obj_request_img_data_test(obj_request)) { in rbd_osd_req_callback()
1822 rbd_assert(obj_request->img_request); in rbd_osd_req_callback()
1823 rbd_assert(obj_request->which != BAD_WHICH); in rbd_osd_req_callback()
1825 rbd_assert(obj_request->which == BAD_WHICH); in rbd_osd_req_callback()
1829 obj_request->result = osd_req->r_result; in rbd_osd_req_callback()
1838 obj_request->xferred = osd_req->r_reply_op_len[0]; in rbd_osd_req_callback()
1839 rbd_assert(obj_request->xferred < (u64)UINT_MAX); in rbd_osd_req_callback()
1844 rbd_osd_read_callback(obj_request); in rbd_osd_req_callback()
1850 rbd_osd_write_callback(obj_request); in rbd_osd_req_callback()
1853 rbd_osd_stat_callback(obj_request); in rbd_osd_req_callback()
1858 rbd_osd_discard_callback(obj_request); in rbd_osd_req_callback()
1861 rbd_osd_call_callback(obj_request); in rbd_osd_req_callback()
1865 rbd_osd_trivial_callback(obj_request); in rbd_osd_req_callback()
1869 obj_request->object_name, (unsigned short) opcode); in rbd_osd_req_callback()
1873 if (obj_request_done_test(obj_request)) in rbd_osd_req_callback()
1874 rbd_obj_request_complete(obj_request); in rbd_osd_req_callback()
1877 static void rbd_osd_req_format_read(struct rbd_obj_request *obj_request) in rbd_osd_req_format_read() argument
1879 struct rbd_img_request *img_request = obj_request->img_request; in rbd_osd_req_format_read()
1880 struct ceph_osd_request *osd_req = obj_request->osd_req; in rbd_osd_req_format_read()
1886 ceph_osdc_build_request(osd_req, obj_request->offset, in rbd_osd_req_format_read()
1890 static void rbd_osd_req_format_write(struct rbd_obj_request *obj_request) in rbd_osd_req_format_write() argument
1892 struct rbd_img_request *img_request = obj_request->img_request; in rbd_osd_req_format_write()
1893 struct ceph_osd_request *osd_req = obj_request->osd_req; in rbd_osd_req_format_write()
1900 ceph_osdc_build_request(osd_req, obj_request->offset, in rbd_osd_req_format_write()
1914 struct rbd_obj_request *obj_request) in rbd_osd_req_create() argument
1920 if (obj_request_img_data_test(obj_request) && in rbd_osd_req_create()
1922 struct rbd_img_request *img_request = obj_request->img_request; in rbd_osd_req_create()
1947 osd_req->r_priv = obj_request; in rbd_osd_req_create()
1950 ceph_oid_set_name(&osd_req->r_base_oid, obj_request->object_name); in rbd_osd_req_create()
1962 rbd_osd_req_create_copyup(struct rbd_obj_request *obj_request) in rbd_osd_req_create_copyup() argument
1971 rbd_assert(obj_request_img_data_test(obj_request)); in rbd_osd_req_create_copyup()
1972 img_request = obj_request->img_request; in rbd_osd_req_create_copyup()
1992 osd_req->r_priv = obj_request; in rbd_osd_req_create_copyup()
1995 ceph_oid_set_name(&osd_req->r_base_oid, obj_request->object_name); in rbd_osd_req_create_copyup()
2012 struct rbd_obj_request *obj_request; in rbd_obj_request_create() local
2023 obj_request = kmem_cache_zalloc(rbd_obj_request_cache, GFP_NOIO); in rbd_obj_request_create()
2024 if (!obj_request) { in rbd_obj_request_create()
2029 obj_request->object_name = memcpy(name, object_name, size); in rbd_obj_request_create()
2030 obj_request->offset = offset; in rbd_obj_request_create()
2031 obj_request->length = length; in rbd_obj_request_create()
2032 obj_request->flags = 0; in rbd_obj_request_create()
2033 obj_request->which = BAD_WHICH; in rbd_obj_request_create()
2034 obj_request->type = type; in rbd_obj_request_create()
2035 INIT_LIST_HEAD(&obj_request->links); in rbd_obj_request_create()
2036 init_completion(&obj_request->completion); in rbd_obj_request_create()
2037 kref_init(&obj_request->kref); in rbd_obj_request_create()
2040 offset, length, (int)type, obj_request); in rbd_obj_request_create()
2042 return obj_request; in rbd_obj_request_create()
2047 struct rbd_obj_request *obj_request; in rbd_obj_request_destroy() local
2049 obj_request = container_of(kref, struct rbd_obj_request, kref); in rbd_obj_request_destroy()
2051 dout("%s: obj %p\n", __func__, obj_request); in rbd_obj_request_destroy()
2053 rbd_assert(obj_request->img_request == NULL); in rbd_obj_request_destroy()
2054 rbd_assert(obj_request->which == BAD_WHICH); in rbd_obj_request_destroy()
2056 if (obj_request->osd_req) in rbd_obj_request_destroy()
2057 rbd_osd_req_destroy(obj_request->osd_req); in rbd_obj_request_destroy()
2059 rbd_assert(obj_request_type_valid(obj_request->type)); in rbd_obj_request_destroy()
2060 switch (obj_request->type) { in rbd_obj_request_destroy()
2064 if (obj_request->bio_list) in rbd_obj_request_destroy()
2065 bio_chain_put(obj_request->bio_list); in rbd_obj_request_destroy()
2068 if (obj_request->pages) in rbd_obj_request_destroy()
2069 ceph_release_page_vector(obj_request->pages, in rbd_obj_request_destroy()
2070 obj_request->page_count); in rbd_obj_request_destroy()
2074 kfree(obj_request->object_name); in rbd_obj_request_destroy()
2075 obj_request->object_name = NULL; in rbd_obj_request_destroy()
2076 kmem_cache_free(rbd_obj_request_cache, obj_request); in rbd_obj_request_destroy()
2191 struct rbd_obj_request *obj_request; in rbd_img_request_destroy() local
2198 for_each_obj_request_safe(img_request, obj_request, next_obj_request) in rbd_img_request_destroy()
2199 rbd_img_obj_request_del(img_request, obj_request); in rbd_img_request_destroy()
2215 struct rbd_obj_request *obj_request, in rbd_parent_request_create() argument
2221 rbd_assert(obj_request->img_request); in rbd_parent_request_create()
2222 rbd_dev = obj_request->img_request->rbd_dev; in rbd_parent_request_create()
2230 rbd_obj_request_get(obj_request); in rbd_parent_request_create()
2231 parent_request->obj_request = obj_request; in rbd_parent_request_create()
2242 orig_request = parent_request->obj_request; in rbd_parent_request_destroy()
2244 parent_request->obj_request = NULL; in rbd_parent_request_destroy()
2251 static bool rbd_img_obj_end_request(struct rbd_obj_request *obj_request) in rbd_img_obj_end_request() argument
2258 rbd_assert(obj_request_img_data_test(obj_request)); in rbd_img_obj_end_request()
2259 img_request = obj_request->img_request; in rbd_img_obj_end_request()
2261 rbd_assert(obj_request->xferred <= (u64)UINT_MAX); in rbd_img_obj_end_request()
2262 xferred = (unsigned int)obj_request->xferred; in rbd_img_obj_end_request()
2263 result = obj_request->result; in rbd_img_obj_end_request()
2276 obj_op_name(op_type), obj_request->length, in rbd_img_obj_end_request()
2277 obj_request->img_offset, obj_request->offset); in rbd_img_obj_end_request()
2286 xferred = obj_request->length; in rbd_img_obj_end_request()
2291 if (obj_request->type == OBJ_REQUEST_PAGES) { in rbd_img_obj_end_request()
2292 obj_request->pages = NULL; in rbd_img_obj_end_request()
2293 obj_request->page_count = 0; in rbd_img_obj_end_request()
2297 rbd_assert(img_request->obj_request != NULL); in rbd_img_obj_end_request()
2298 more = obj_request->which < img_request->obj_request_count - 1; in rbd_img_obj_end_request()
2310 static void rbd_img_obj_callback(struct rbd_obj_request *obj_request) in rbd_img_obj_callback() argument
2313 u32 which = obj_request->which; in rbd_img_obj_callback()
2316 rbd_assert(obj_request_img_data_test(obj_request)); in rbd_img_obj_callback()
2317 img_request = obj_request->img_request; in rbd_img_obj_callback()
2319 dout("%s: img %p obj %p\n", __func__, img_request, obj_request); in rbd_img_obj_callback()
2329 for_each_obj_request_from(img_request, obj_request) { in rbd_img_obj_callback()
2333 if (!obj_request_done_test(obj_request)) in rbd_img_obj_callback()
2335 more = rbd_img_obj_end_request(obj_request); in rbd_img_obj_callback()
2354 static void rbd_img_obj_request_fill(struct rbd_obj_request *obj_request, in rbd_img_obj_request_fill() argument
2359 struct rbd_img_request *img_request = obj_request->img_request; in rbd_img_obj_request_fill()
2362 u64 offset = obj_request->offset; in rbd_img_obj_request_fill()
2363 u64 length = obj_request->length; in rbd_img_obj_request_fill()
2370 !obj_request_overlaps_parent(obj_request))) { in rbd_img_obj_request_fill()
2379 if (obj_request->img_offset + length == img_end) in rbd_img_obj_request_fill()
2399 if (obj_request->type == OBJ_REQUEST_BIO) in rbd_img_obj_request_fill()
2401 obj_request->bio_list, length); in rbd_img_obj_request_fill()
2402 else if (obj_request->type == OBJ_REQUEST_PAGES) in rbd_img_obj_request_fill()
2404 obj_request->pages, length, in rbd_img_obj_request_fill()
2409 rbd_osd_req_format_write(obj_request); in rbd_img_obj_request_fill()
2411 rbd_osd_req_format_read(obj_request); in rbd_img_obj_request_fill()
2427 struct rbd_obj_request *obj_request = NULL; in rbd_img_request_fill() local
2463 obj_request = rbd_obj_request_create(object_name, in rbd_img_request_fill()
2467 if (!obj_request) in rbd_img_request_fill()
2474 rbd_img_obj_request_add(img_request, obj_request); in rbd_img_request_fill()
2481 obj_request->bio_list = in rbd_img_request_fill()
2486 if (!obj_request->bio_list) in rbd_img_request_fill()
2491 obj_request->pages = pages; in rbd_img_request_fill()
2493 obj_request->page_count = page_count; in rbd_img_request_fill()
2501 obj_request); in rbd_img_request_fill()
2505 obj_request->osd_req = osd_req; in rbd_img_request_fill()
2506 obj_request->callback = rbd_img_obj_callback; in rbd_img_request_fill()
2507 obj_request->img_offset = img_offset; in rbd_img_request_fill()
2509 rbd_img_obj_request_fill(obj_request, osd_req, op_type, 0); in rbd_img_request_fill()
2520 for_each_obj_request_safe(img_request, obj_request, next_obj_request) in rbd_img_request_fill()
2521 rbd_img_obj_request_del(img_request, obj_request); in rbd_img_request_fill()
2527 rbd_osd_copyup_callback(struct rbd_obj_request *obj_request) in rbd_osd_copyup_callback() argument
2534 dout("%s: obj %p\n", __func__, obj_request); in rbd_osd_copyup_callback()
2536 rbd_assert(obj_request->type == OBJ_REQUEST_BIO || in rbd_osd_copyup_callback()
2537 obj_request->type == OBJ_REQUEST_NODATA); in rbd_osd_copyup_callback()
2538 rbd_assert(obj_request_img_data_test(obj_request)); in rbd_osd_copyup_callback()
2539 img_request = obj_request->img_request; in rbd_osd_copyup_callback()
2545 pages = obj_request->copyup_pages; in rbd_osd_copyup_callback()
2547 obj_request->copyup_pages = NULL; in rbd_osd_copyup_callback()
2548 page_count = obj_request->copyup_page_count; in rbd_osd_copyup_callback()
2550 obj_request->copyup_page_count = 0; in rbd_osd_copyup_callback()
2559 if (!obj_request->result) in rbd_osd_copyup_callback()
2560 obj_request->xferred = obj_request->length; in rbd_osd_copyup_callback()
2562 obj_request_done_set(obj_request); in rbd_osd_copyup_callback()
2589 orig_request = img_request->obj_request; in rbd_img_obj_parent_read_full_callback()
2674 static int rbd_img_obj_parent_read_full(struct rbd_obj_request *obj_request) in rbd_img_obj_parent_read_full() argument
2685 rbd_assert(obj_request_img_data_test(obj_request)); in rbd_img_obj_parent_read_full()
2686 rbd_assert(obj_request_type_valid(obj_request->type)); in rbd_img_obj_parent_read_full()
2688 img_request = obj_request->img_request; in rbd_img_obj_parent_read_full()
2697 img_offset = obj_request->img_offset - obj_request->offset; in rbd_img_obj_parent_read_full()
2723 parent_request = rbd_parent_request_create(obj_request, in rbd_img_obj_parent_read_full()
2741 parent_request->obj_request = NULL; in rbd_img_obj_parent_read_full()
2742 rbd_obj_request_put(obj_request); in rbd_img_obj_parent_read_full()
2748 obj_request->result = result; in rbd_img_obj_parent_read_full()
2749 obj_request->xferred = 0; in rbd_img_obj_parent_read_full()
2750 obj_request_done_set(obj_request); in rbd_img_obj_parent_read_full()
2755 static void rbd_img_obj_exists_callback(struct rbd_obj_request *obj_request) in rbd_img_obj_exists_callback() argument
2761 rbd_assert(!obj_request_img_data_test(obj_request)); in rbd_img_obj_exists_callback()
2768 orig_request = obj_request->obj_request; in rbd_img_obj_exists_callback()
2769 obj_request->obj_request = NULL; in rbd_img_obj_exists_callback()
2774 result = obj_request->result; in rbd_img_obj_exists_callback()
2775 obj_request->result = 0; in rbd_img_obj_exists_callback()
2778 obj_request, orig_request, result, in rbd_img_obj_exists_callback()
2779 obj_request->xferred, obj_request->length); in rbd_img_obj_exists_callback()
2780 rbd_obj_request_put(obj_request); in rbd_img_obj_exists_callback()
2822 static int rbd_img_obj_exists_submit(struct rbd_obj_request *obj_request) in rbd_img_obj_exists_submit() argument
2847 stat_request = rbd_obj_request_create(obj_request->object_name, 0, 0, in rbd_img_obj_exists_submit()
2852 rbd_obj_request_get(obj_request); in rbd_img_obj_exists_submit()
2853 stat_request->obj_request = obj_request; in rbd_img_obj_exists_submit()
2857 rbd_assert(obj_request->img_request); in rbd_img_obj_exists_submit()
2858 rbd_dev = obj_request->img_request->rbd_dev; in rbd_img_obj_exists_submit()
2874 rbd_obj_request_put(obj_request); in rbd_img_obj_exists_submit()
2879 static bool img_obj_request_simple(struct rbd_obj_request *obj_request) in img_obj_request_simple() argument
2884 rbd_assert(obj_request_img_data_test(obj_request)); in img_obj_request_simple()
2886 img_request = obj_request->img_request; in img_obj_request_simple()
2903 if (!obj_request_overlaps_parent(obj_request)) in img_obj_request_simple()
2910 if (!obj_request->offset && in img_obj_request_simple()
2911 obj_request->length == rbd_obj_bytes(&rbd_dev->header)) in img_obj_request_simple()
2918 if (obj_request_known_test(obj_request) && in img_obj_request_simple()
2919 obj_request_exists_test(obj_request)) in img_obj_request_simple()
2925 static int rbd_img_obj_request_submit(struct rbd_obj_request *obj_request) in rbd_img_obj_request_submit() argument
2927 if (img_obj_request_simple(obj_request)) { in rbd_img_obj_request_submit()
2931 rbd_dev = obj_request->img_request->rbd_dev; in rbd_img_obj_request_submit()
2934 return rbd_obj_request_submit(osdc, obj_request); in rbd_img_obj_request_submit()
2943 if (obj_request_known_test(obj_request)) in rbd_img_obj_request_submit()
2944 return rbd_img_obj_parent_read_full(obj_request); in rbd_img_obj_request_submit()
2948 return rbd_img_obj_exists_submit(obj_request); in rbd_img_obj_request_submit()
2953 struct rbd_obj_request *obj_request; in rbd_img_request_submit() local
2957 for_each_obj_request_safe(img_request, obj_request, next_obj_request) { in rbd_img_request_submit()
2960 ret = rbd_img_obj_request_submit(obj_request); in rbd_img_request_submit()
2970 struct rbd_obj_request *obj_request; in rbd_img_parent_read_callback() local
2980 obj_request = img_request->obj_request; in rbd_img_parent_read_callback()
2990 rbd_assert(obj_request); in rbd_img_parent_read_callback()
2991 rbd_assert(obj_request->img_request); in rbd_img_parent_read_callback()
2992 rbd_dev = obj_request->img_request->rbd_dev; in rbd_img_parent_read_callback()
2997 img_result = rbd_obj_request_submit(osdc, obj_request); in rbd_img_parent_read_callback()
3002 obj_request->result = img_result; in rbd_img_parent_read_callback()
3003 if (obj_request->result) in rbd_img_parent_read_callback()
3013 rbd_assert(obj_request->img_offset < U64_MAX - obj_request->length); in rbd_img_parent_read_callback()
3014 obj_end = obj_request->img_offset + obj_request->length; in rbd_img_parent_read_callback()
3018 if (obj_request->img_offset < rbd_dev->parent_overlap) in rbd_img_parent_read_callback()
3020 obj_request->img_offset; in rbd_img_parent_read_callback()
3022 obj_request->xferred = min(img_xferred, xferred); in rbd_img_parent_read_callback()
3024 obj_request->xferred = img_xferred; in rbd_img_parent_read_callback()
3027 rbd_img_obj_request_read_callback(obj_request); in rbd_img_parent_read_callback()
3028 rbd_obj_request_complete(obj_request); in rbd_img_parent_read_callback()
3031 static void rbd_img_parent_read(struct rbd_obj_request *obj_request) in rbd_img_parent_read() argument
3036 rbd_assert(obj_request_img_data_test(obj_request)); in rbd_img_parent_read()
3037 rbd_assert(obj_request->img_request != NULL); in rbd_img_parent_read()
3038 rbd_assert(obj_request->result == (s32) -ENOENT); in rbd_img_parent_read()
3039 rbd_assert(obj_request_type_valid(obj_request->type)); in rbd_img_parent_read()
3042 img_request = rbd_parent_request_create(obj_request, in rbd_img_parent_read()
3043 obj_request->img_offset, in rbd_img_parent_read()
3044 obj_request->length); in rbd_img_parent_read()
3049 if (obj_request->type == OBJ_REQUEST_BIO) in rbd_img_parent_read()
3051 obj_request->bio_list); in rbd_img_parent_read()
3054 obj_request->pages); in rbd_img_parent_read()
3067 obj_request->result = result; in rbd_img_parent_read()
3068 obj_request->xferred = 0; in rbd_img_parent_read()
3069 obj_request_done_set(obj_request); in rbd_img_parent_read()
3074 struct rbd_obj_request *obj_request; in rbd_obj_notify_ack_sync() local
3078 obj_request = rbd_obj_request_create(rbd_dev->header_name, 0, 0, in rbd_obj_notify_ack_sync()
3080 if (!obj_request) in rbd_obj_notify_ack_sync()
3084 obj_request->osd_req = rbd_osd_req_create(rbd_dev, OBJ_OP_READ, 1, in rbd_obj_notify_ack_sync()
3085 obj_request); in rbd_obj_notify_ack_sync()
3086 if (!obj_request->osd_req) in rbd_obj_notify_ack_sync()
3089 osd_req_op_watch_init(obj_request->osd_req, 0, CEPH_OSD_OP_NOTIFY_ACK, in rbd_obj_notify_ack_sync()
3091 rbd_osd_req_format_read(obj_request); in rbd_obj_notify_ack_sync()
3093 ret = rbd_obj_request_submit(osdc, obj_request); in rbd_obj_notify_ack_sync()
3096 ret = rbd_obj_request_wait(obj_request); in rbd_obj_notify_ack_sync()
3098 rbd_obj_request_put(obj_request); in rbd_obj_notify_ack_sync()
3139 struct rbd_obj_request *obj_request; in rbd_obj_watch_request_helper() local
3142 obj_request = rbd_obj_request_create(rbd_dev->header_name, 0, 0, in rbd_obj_watch_request_helper()
3144 if (!obj_request) in rbd_obj_watch_request_helper()
3147 obj_request->osd_req = rbd_osd_req_create(rbd_dev, OBJ_OP_WRITE, 1, in rbd_obj_watch_request_helper()
3148 obj_request); in rbd_obj_watch_request_helper()
3149 if (!obj_request->osd_req) { in rbd_obj_watch_request_helper()
3154 osd_req_op_watch_init(obj_request->osd_req, 0, CEPH_OSD_OP_WATCH, in rbd_obj_watch_request_helper()
3156 rbd_osd_req_format_write(obj_request); in rbd_obj_watch_request_helper()
3159 ceph_osdc_set_request_linger(osdc, obj_request->osd_req); in rbd_obj_watch_request_helper()
3161 ret = rbd_obj_request_submit(osdc, obj_request); in rbd_obj_watch_request_helper()
3165 ret = rbd_obj_request_wait(obj_request); in rbd_obj_watch_request_helper()
3169 ret = obj_request->result; in rbd_obj_watch_request_helper()
3172 rbd_obj_request_end(obj_request); in rbd_obj_watch_request_helper()
3176 return obj_request; in rbd_obj_watch_request_helper()
3179 rbd_obj_request_put(obj_request); in rbd_obj_watch_request_helper()
3189 struct rbd_obj_request *obj_request; in rbd_dev_header_watch_sync() local
3200 obj_request = rbd_obj_watch_request_helper(rbd_dev, true); in rbd_dev_header_watch_sync()
3201 if (IS_ERR(obj_request)) { in rbd_dev_header_watch_sync()
3204 return PTR_ERR(obj_request); in rbd_dev_header_watch_sync()
3215 rbd_dev->watch_request = obj_request; in rbd_dev_header_watch_sync()
3225 struct rbd_obj_request *obj_request; in rbd_dev_header_unwatch_sync() local
3234 obj_request = rbd_obj_watch_request_helper(rbd_dev, false); in rbd_dev_header_unwatch_sync()
3235 if (!IS_ERR(obj_request)) in rbd_dev_header_unwatch_sync()
3236 rbd_obj_request_put(obj_request); in rbd_dev_header_unwatch_sync()
3239 PTR_ERR(obj_request)); in rbd_dev_header_unwatch_sync()
3259 struct rbd_obj_request *obj_request; in rbd_obj_method_sync() local
3277 obj_request = rbd_obj_request_create(object_name, 0, inbound_size, in rbd_obj_method_sync()
3279 if (!obj_request) in rbd_obj_method_sync()
3282 obj_request->pages = pages; in rbd_obj_method_sync()
3283 obj_request->page_count = page_count; in rbd_obj_method_sync()
3285 obj_request->osd_req = rbd_osd_req_create(rbd_dev, OBJ_OP_READ, 1, in rbd_obj_method_sync()
3286 obj_request); in rbd_obj_method_sync()
3287 if (!obj_request->osd_req) in rbd_obj_method_sync()
3290 osd_req_op_cls_init(obj_request->osd_req, 0, CEPH_OSD_OP_CALL, in rbd_obj_method_sync()
3301 osd_req_op_cls_request_data_pagelist(obj_request->osd_req, 0, in rbd_obj_method_sync()
3304 osd_req_op_cls_response_data_pages(obj_request->osd_req, 0, in rbd_obj_method_sync()
3305 obj_request->pages, inbound_size, in rbd_obj_method_sync()
3307 rbd_osd_req_format_read(obj_request); in rbd_obj_method_sync()
3309 ret = rbd_obj_request_submit(osdc, obj_request); in rbd_obj_method_sync()
3312 ret = rbd_obj_request_wait(obj_request); in rbd_obj_method_sync()
3316 ret = obj_request->result; in rbd_obj_method_sync()
3320 rbd_assert(obj_request->xferred < (u64)INT_MAX); in rbd_obj_method_sync()
3321 ret = (int)obj_request->xferred; in rbd_obj_method_sync()
3322 ceph_copy_from_page_vector(pages, inbound, 0, obj_request->xferred); in rbd_obj_method_sync()
3324 if (obj_request) in rbd_obj_method_sync()
3325 rbd_obj_request_put(obj_request); in rbd_obj_method_sync()
3527 struct rbd_obj_request *obj_request; in rbd_obj_read_sync() local
3539 obj_request = rbd_obj_request_create(object_name, offset, length, in rbd_obj_read_sync()
3541 if (!obj_request) in rbd_obj_read_sync()
3544 obj_request->pages = pages; in rbd_obj_read_sync()
3545 obj_request->page_count = page_count; in rbd_obj_read_sync()
3547 obj_request->osd_req = rbd_osd_req_create(rbd_dev, OBJ_OP_READ, 1, in rbd_obj_read_sync()
3548 obj_request); in rbd_obj_read_sync()
3549 if (!obj_request->osd_req) in rbd_obj_read_sync()
3552 osd_req_op_extent_init(obj_request->osd_req, 0, CEPH_OSD_OP_READ, in rbd_obj_read_sync()
3554 osd_req_op_extent_osd_data_pages(obj_request->osd_req, 0, in rbd_obj_read_sync()
3555 obj_request->pages, in rbd_obj_read_sync()
3556 obj_request->length, in rbd_obj_read_sync()
3557 obj_request->offset & ~PAGE_MASK, in rbd_obj_read_sync()
3559 rbd_osd_req_format_read(obj_request); in rbd_obj_read_sync()
3561 ret = rbd_obj_request_submit(osdc, obj_request); in rbd_obj_read_sync()
3564 ret = rbd_obj_request_wait(obj_request); in rbd_obj_read_sync()
3568 ret = obj_request->result; in rbd_obj_read_sync()
3572 rbd_assert(obj_request->xferred <= (u64) SIZE_MAX); in rbd_obj_read_sync()
3573 size = (size_t) obj_request->xferred; in rbd_obj_read_sync()
3578 if (obj_request) in rbd_obj_read_sync()
3579 rbd_obj_request_put(obj_request); in rbd_obj_read_sync()