Commit 2794a82a11cfeae0890741b18b0049ddb55ce646
Committed by
Sage Weil
1 parent
153e5167e0
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
libceph: separate osd request data info
Pull the fields in an osd request structure that define the data for the request out into a separate structure. Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
Showing 5 changed files with 74 additions and 65 deletions Side-by-side Diff
drivers/block/rbd.c
... | ... | @@ -1425,12 +1425,12 @@ |
1425 | 1425 | break; /* Nothing to do */ |
1426 | 1426 | case OBJ_REQUEST_BIO: |
1427 | 1427 | rbd_assert(obj_request->bio_list != NULL); |
1428 | - osd_req->r_bio = obj_request->bio_list; | |
1428 | + osd_req->r_data.bio = obj_request->bio_list; | |
1429 | 1429 | break; |
1430 | 1430 | case OBJ_REQUEST_PAGES: |
1431 | - osd_req->r_pages = obj_request->pages; | |
1432 | - osd_req->r_num_pages = obj_request->page_count; | |
1433 | - osd_req->r_page_alignment = offset & ~PAGE_MASK; | |
1431 | + osd_req->r_data.pages = obj_request->pages; | |
1432 | + osd_req->r_data.num_pages = obj_request->page_count; | |
1433 | + osd_req->r_data.alignment = offset & ~PAGE_MASK; | |
1434 | 1434 | break; |
1435 | 1435 | } |
1436 | 1436 |
fs/ceph/addr.c
... | ... | @@ -243,8 +243,8 @@ |
243 | 243 | dout("finish_read %p req %p rc %d bytes %d\n", inode, req, rc, bytes); |
244 | 244 | |
245 | 245 | /* unlock all pages, zeroing any data we didn't read */ |
246 | - for (i = 0; i < req->r_num_pages; i++, bytes -= PAGE_CACHE_SIZE) { | |
247 | - struct page *page = req->r_pages[i]; | |
246 | + for (i = 0; i < req->r_data.num_pages; i++, bytes -= PAGE_CACHE_SIZE) { | |
247 | + struct page *page = req->r_data.pages[i]; | |
248 | 248 | |
249 | 249 | if (bytes < (int)PAGE_CACHE_SIZE) { |
250 | 250 | /* zero (remainder of) page */ |
... | ... | @@ -258,7 +258,7 @@ |
258 | 258 | unlock_page(page); |
259 | 259 | page_cache_release(page); |
260 | 260 | } |
261 | - kfree(req->r_pages); | |
261 | + kfree(req->r_data.pages); | |
262 | 262 | } |
263 | 263 | |
264 | 264 | static void ceph_unlock_page_vector(struct page **pages, int num_pages) |
... | ... | @@ -336,9 +336,9 @@ |
336 | 336 | } |
337 | 337 | pages[i] = page; |
338 | 338 | } |
339 | - req->r_pages = pages; | |
340 | - req->r_num_pages = nr_pages; | |
341 | - req->r_page_alignment = 0; | |
339 | + req->r_data.pages = pages; | |
340 | + req->r_data.num_pages = nr_pages; | |
341 | + req->r_data.alignment = 0; | |
342 | 342 | req->r_callback = finish_read; |
343 | 343 | req->r_inode = inode; |
344 | 344 | |
... | ... | @@ -374,7 +374,8 @@ |
374 | 374 | max = (fsc->mount_options->rsize + PAGE_CACHE_SIZE - 1) |
375 | 375 | >> PAGE_SHIFT; |
376 | 376 | |
377 | - dout("readpages %p file %p nr_pages %d max %d\n", inode, file, nr_pages, | |
377 | + dout("readpages %p file %p nr_pages %d max %d\n", inode, | |
378 | + file, nr_pages, | |
378 | 379 | max); |
379 | 380 | while (!list_empty(page_list)) { |
380 | 381 | rc = start_read(inode, page_list, max); |
... | ... | @@ -567,7 +568,7 @@ |
567 | 568 | * raced with a truncation and was adjusted at the osd, |
568 | 569 | * so don't believe the reply. |
569 | 570 | */ |
570 | - wrote = req->r_num_pages; | |
571 | + wrote = req->r_data.num_pages; | |
571 | 572 | } else { |
572 | 573 | wrote = 0; |
573 | 574 | mapping_set_error(mapping, rc); |
... | ... | @@ -576,8 +577,8 @@ |
576 | 577 | inode, rc, bytes, wrote); |
577 | 578 | |
578 | 579 | /* clean all pages */ |
579 | - for (i = 0; i < req->r_num_pages; i++) { | |
580 | - page = req->r_pages[i]; | |
580 | + for (i = 0; i < req->r_data.num_pages; i++) { | |
581 | + page = req->r_data.pages[i]; | |
581 | 582 | BUG_ON(!page); |
582 | 583 | WARN_ON(!PageUptodate(page)); |
583 | 584 | |
584 | 585 | |
585 | 586 | |
586 | 587 | |
587 | 588 | |
588 | 589 | |
... | ... | @@ -606,31 +607,31 @@ |
606 | 607 | unlock_page(page); |
607 | 608 | } |
608 | 609 | dout("%p wrote+cleaned %d pages\n", inode, wrote); |
609 | - ceph_put_wrbuffer_cap_refs(ci, req->r_num_pages, snapc); | |
610 | + ceph_put_wrbuffer_cap_refs(ci, req->r_data.num_pages, snapc); | |
610 | 611 | |
611 | - ceph_release_pages(req->r_pages, req->r_num_pages); | |
612 | - if (req->r_pages_from_pool) | |
613 | - mempool_free(req->r_pages, | |
612 | + ceph_release_pages(req->r_data.pages, req->r_data.num_pages); | |
613 | + if (req->r_data.pages_from_pool) | |
614 | + mempool_free(req->r_data.pages, | |
614 | 615 | ceph_sb_to_client(inode->i_sb)->wb_pagevec_pool); |
615 | 616 | else |
616 | - kfree(req->r_pages); | |
617 | + kfree(req->r_data.pages); | |
617 | 618 | ceph_osdc_put_request(req); |
618 | 619 | } |
619 | 620 | |
620 | 621 | /* |
621 | 622 | * allocate a page vec, either directly, or if necessary, via a the |
622 | - * mempool. we avoid the mempool if we can because req->r_num_pages | |
623 | + * mempool. we avoid the mempool if we can because req->r_data.num_pages | |
623 | 624 | * may be less than the maximum write size. |
624 | 625 | */ |
625 | 626 | static void alloc_page_vec(struct ceph_fs_client *fsc, |
626 | 627 | struct ceph_osd_request *req) |
627 | 628 | { |
628 | - req->r_pages = kmalloc(sizeof(struct page *) * req->r_num_pages, | |
629 | + req->r_data.pages = kmalloc(sizeof(struct page *) * req->r_data.num_pages, | |
629 | 630 | GFP_NOFS); |
630 | - if (!req->r_pages) { | |
631 | - req->r_pages = mempool_alloc(fsc->wb_pagevec_pool, GFP_NOFS); | |
632 | - req->r_pages_from_pool = 1; | |
633 | - WARN_ON(!req->r_pages); | |
631 | + if (!req->r_data.pages) { | |
632 | + req->r_data.pages = mempool_alloc(fsc->wb_pagevec_pool, GFP_NOFS); | |
633 | + req->r_data.pages_from_pool = 1; | |
634 | + WARN_ON(!req->r_data.pages); | |
634 | 635 | } |
635 | 636 | } |
636 | 637 | |
... | ... | @@ -829,9 +830,9 @@ |
829 | 830 | break; |
830 | 831 | } |
831 | 832 | |
832 | - req->r_num_pages = calc_pages_for(0, len); | |
833 | - req->r_page_alignment = 0; | |
834 | - max_pages = req->r_num_pages; | |
833 | + req->r_data.num_pages = calc_pages_for(0, len); | |
834 | + req->r_data.alignment = 0; | |
835 | + max_pages = req->r_data.num_pages; | |
835 | 836 | |
836 | 837 | alloc_page_vec(fsc, req); |
837 | 838 | req->r_callback = writepages_finish; |
... | ... | @@ -853,7 +854,7 @@ |
853 | 854 | } |
854 | 855 | |
855 | 856 | set_page_writeback(page); |
856 | - req->r_pages[locked_pages] = page; | |
857 | + req->r_data.pages[locked_pages] = page; | |
857 | 858 | locked_pages++; |
858 | 859 | next = page->index + 1; |
859 | 860 | } |
860 | 861 | |
... | ... | @@ -883,14 +884,14 @@ |
883 | 884 | } |
884 | 885 | |
885 | 886 | /* submit the write */ |
886 | - offset = req->r_pages[0]->index << PAGE_CACHE_SHIFT; | |
887 | + offset = req->r_data.pages[0]->index << PAGE_CACHE_SHIFT; | |
887 | 888 | len = min((snap_size ? snap_size : i_size_read(inode)) - offset, |
888 | 889 | (u64)locked_pages << PAGE_CACHE_SHIFT); |
889 | 890 | dout("writepages got %d pages at %llu~%llu\n", |
890 | 891 | locked_pages, offset, len); |
891 | 892 | |
892 | 893 | /* revise final length, page count */ |
893 | - req->r_num_pages = locked_pages; | |
894 | + req->r_data.num_pages = locked_pages; | |
894 | 895 | req->r_request_ops[0].extent.length = cpu_to_le64(len); |
895 | 896 | req->r_request_ops[0].payload_len = cpu_to_le32(len); |
896 | 897 | req->r_request->hdr.data_len = cpu_to_le32(len); |
fs/ceph/file.c
... | ... | @@ -568,12 +568,12 @@ |
568 | 568 | if ((file->f_flags & O_SYNC) == 0) { |
569 | 569 | /* get a second commit callback */ |
570 | 570 | req->r_safe_callback = sync_write_commit; |
571 | - req->r_own_pages = 1; | |
571 | + req->r_data.own_pages = 1; | |
572 | 572 | } |
573 | 573 | } |
574 | - req->r_pages = pages; | |
575 | - req->r_num_pages = num_pages; | |
576 | - req->r_page_alignment = page_align; | |
574 | + req->r_data.pages = pages; | |
575 | + req->r_data.num_pages = num_pages; | |
576 | + req->r_data.alignment = page_align; | |
577 | 577 | req->r_inode = inode; |
578 | 578 | |
579 | 579 | ret = ceph_osdc_start_request(&fsc->client->osdc, req, false); |
include/linux/ceph/osd_client.h
... | ... | @@ -50,6 +50,21 @@ |
50 | 50 | |
51 | 51 | #define CEPH_OSD_MAX_OP 10 |
52 | 52 | |
53 | +struct ceph_osd_data { | |
54 | + struct { | |
55 | + struct { | |
56 | + struct page **pages; | |
57 | + u32 num_pages; | |
58 | + u32 alignment; | |
59 | + bool pages_from_pool; | |
60 | + bool own_pages; | |
61 | + }; | |
62 | +#ifdef CONFIG_BLOCK | |
63 | + struct bio *bio; | |
64 | +#endif /* CONFIG_BLOCK */ | |
65 | + }; | |
66 | +}; | |
67 | + | |
53 | 68 | /* an in-flight request */ |
54 | 69 | struct ceph_osd_request { |
55 | 70 | u64 r_tid; /* unique for this client */ |
56 | 71 | |
... | ... | @@ -105,15 +120,8 @@ |
105 | 120 | |
106 | 121 | struct ceph_file_layout r_file_layout; |
107 | 122 | struct ceph_snap_context *r_snapc; /* snap context for writes */ |
108 | - unsigned r_num_pages; /* size of page array (follows) */ | |
109 | - unsigned r_page_alignment; /* io offset in first page */ | |
110 | - struct page **r_pages; /* pages for data payload */ | |
111 | - int r_pages_from_pool; | |
112 | - int r_own_pages; /* if true, i own page list */ | |
113 | -#ifdef CONFIG_BLOCK | |
114 | - struct bio *r_bio; /* instead of pages */ | |
115 | -#endif | |
116 | 123 | |
124 | + struct ceph_osd_data r_data; | |
117 | 125 | struct ceph_pagelist r_trail; /* trailing part of the data */ |
118 | 126 | }; |
119 | 127 |
net/ceph/osd_client.c
... | ... | @@ -122,9 +122,9 @@ |
122 | 122 | } |
123 | 123 | if (req->r_reply) |
124 | 124 | ceph_msg_put(req->r_reply); |
125 | - if (req->r_own_pages) | |
126 | - ceph_release_page_vector(req->r_pages, | |
127 | - req->r_num_pages); | |
125 | + if (req->r_data.own_pages) | |
126 | + ceph_release_page_vector(req->r_data.pages, | |
127 | + req->r_data.num_pages); | |
128 | 128 | ceph_put_snap_context(req->r_snapc); |
129 | 129 | ceph_pagelist_release(&req->r_trail); |
130 | 130 | if (req->r_mempool) |
131 | 131 | |
... | ... | @@ -1739,11 +1739,11 @@ |
1739 | 1739 | { |
1740 | 1740 | int rc = 0; |
1741 | 1741 | |
1742 | - req->r_request->pages = req->r_pages; | |
1743 | - req->r_request->page_count = req->r_num_pages; | |
1744 | - req->r_request->page_alignment = req->r_page_alignment; | |
1742 | + req->r_request->pages = req->r_data.pages; | |
1743 | + req->r_request->page_count = req->r_data.num_pages; | |
1744 | + req->r_request->page_alignment = req->r_data.alignment; | |
1745 | 1745 | #ifdef CONFIG_BLOCK |
1746 | - req->r_request->bio = req->r_bio; | |
1746 | + req->r_request->bio = req->r_data.bio; | |
1747 | 1747 | #endif |
1748 | 1748 | req->r_request->trail = &req->r_trail; |
1749 | 1749 | |
1750 | 1750 | |
... | ... | @@ -1944,12 +1944,12 @@ |
1944 | 1944 | return PTR_ERR(req); |
1945 | 1945 | |
1946 | 1946 | /* it may be a short read due to an object boundary */ |
1947 | - req->r_pages = pages; | |
1948 | - req->r_num_pages = calc_pages_for(page_align, *plen); | |
1949 | - req->r_page_alignment = page_align; | |
1947 | + req->r_data.pages = pages; | |
1948 | + req->r_data.num_pages = calc_pages_for(page_align, *plen); | |
1949 | + req->r_data.alignment = page_align; | |
1950 | 1950 | |
1951 | 1951 | dout("readpages final extent is %llu~%llu (%d pages align %d)\n", |
1952 | - off, *plen, req->r_num_pages, page_align); | |
1952 | + off, *plen, req->r_data.num_pages, page_align); | |
1953 | 1953 | |
1954 | 1954 | rc = ceph_osdc_start_request(osdc, req, false); |
1955 | 1955 | if (!rc) |
... | ... | @@ -1987,10 +1987,10 @@ |
1987 | 1987 | return PTR_ERR(req); |
1988 | 1988 | |
1989 | 1989 | /* it may be a short write due to an object boundary */ |
1990 | - req->r_pages = pages; | |
1991 | - req->r_num_pages = calc_pages_for(page_align, len); | |
1992 | - req->r_page_alignment = page_align; | |
1993 | - dout("writepages %llu~%llu (%d pages)\n", off, len, req->r_num_pages); | |
1990 | + req->r_data.pages = pages; | |
1991 | + req->r_data.num_pages = calc_pages_for(page_align, len); | |
1992 | + req->r_data.alignment = page_align; | |
1993 | + dout("writepages %llu~%llu (%d pages)\n", off, len, req->r_data.num_pages); | |
1994 | 1994 | |
1995 | 1995 | rc = ceph_osdc_start_request(osdc, req, true); |
1996 | 1996 | if (!rc) |
1997 | 1997 | |
1998 | 1998 | |
1999 | 1999 | |
2000 | 2000 | |
... | ... | @@ -2083,22 +2083,22 @@ |
2083 | 2083 | m = ceph_msg_get(req->r_reply); |
2084 | 2084 | |
2085 | 2085 | if (data_len > 0) { |
2086 | - int want = calc_pages_for(req->r_page_alignment, data_len); | |
2086 | + int want = calc_pages_for(req->r_data.alignment, data_len); | |
2087 | 2087 | |
2088 | - if (req->r_pages && unlikely(req->r_num_pages < want)) { | |
2088 | + if (req->r_data.pages && unlikely(req->r_data.num_pages < want)) { | |
2089 | 2089 | pr_warning("tid %lld reply has %d bytes %d pages, we" |
2090 | 2090 | " had only %d pages ready\n", tid, data_len, |
2091 | - want, req->r_num_pages); | |
2091 | + want, req->r_data.num_pages); | |
2092 | 2092 | *skip = 1; |
2093 | 2093 | ceph_msg_put(m); |
2094 | 2094 | m = NULL; |
2095 | 2095 | goto out; |
2096 | 2096 | } |
2097 | - m->pages = req->r_pages; | |
2098 | - m->page_count = req->r_num_pages; | |
2099 | - m->page_alignment = req->r_page_alignment; | |
2097 | + m->pages = req->r_data.pages; | |
2098 | + m->page_count = req->r_data.num_pages; | |
2099 | + m->page_alignment = req->r_data.alignment; | |
2100 | 2100 | #ifdef CONFIG_BLOCK |
2101 | - m->bio = req->r_bio; | |
2101 | + m->bio = req->r_data.bio; | |
2102 | 2102 | #endif |
2103 | 2103 | } |
2104 | 2104 | *skip = 0; |