Commit 2794a82a11cfeae0890741b18b0049ddb55ce646

Authored by Alex Elder
Committed by Sage Weil
1 parent 153e5167e0

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

... ... @@ -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  
... ... @@ -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);
... ... @@ -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;