aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ceph
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2013-02-16 12:07:32 -0500
committerSage Weil <sage@inktank.com>2013-05-02 00:16:22 -0400
commit3a42b6c43e4ef65d0edd7d9e5c4366002b4e951d (patch)
tree7f3284055df4a6b1b6d7ff7e044703535a7e6c3f /fs/ceph
parentcf7b7e1492e97dd0c44479239742eb4cb752eeed (diff)
ceph: simplify ceph_sync_write() page_align calculation
(This is being reposted. The first one had a problem because it erroneously added a similar change elsewhere; that change has been dropped.) The next patch in this series points out that the calculation for the number of pages in an osd request is getting done twice. It is not obvious, but the result of both calculations is identical. This patch simplifies one of them--as a separate step--to make it clear that the transformation in the next patch is valid. In ceph_sync_write() there is some magic that computes page_align for an osd request. But a little analysis shows it can be simplified. First, we have: io_align = pos & ~PAGE_MASK; which is used here: page_align = (pos - io_align + buf_align) & ~PAGE_MASK; Note (pos - io_align) simply rounds "pos" down to the nearest multiple of the page size. We also have: buf_align = (unsigned long)data & ~PAGE_MASK; Adding buf_align to that rounded-down "pos" value will stay within the same page; the result will just be offset by the page offset for the "data" pointer. The final mask therefore leaves just the value of "buf_align". One more simplification. Note that the result of calc_pages_for() is invariant of which page the offset starts in--the only thing that matters is the offset within the starting page. We will have put the proper page offset to use into "page_align", so just use that in calculating num_pages. This resolves: http://tracker.ceph.com/issues/4166 Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
Diffstat (limited to 'fs/ceph')
-rw-r--r--fs/ceph/file.c13
1 files changed, 4 insertions, 9 deletions
diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index dd47026c6064..146ac9040141 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -526,15 +526,10 @@ more:
526 io_align = pos & ~PAGE_MASK; 526 io_align = pos & ~PAGE_MASK;
527 buf_align = (unsigned long)data & ~PAGE_MASK; 527 buf_align = (unsigned long)data & ~PAGE_MASK;
528 len = left; 528 len = left;
529 if (file->f_flags & O_DIRECT) { 529
530 /* write from beginning of first page, regardless of 530 /* write from beginning of first page, regardless of io alignment */
531 io alignment */ 531 page_align = file->f_flags & O_DIRECT ? buf_align : io_align;
532 page_align = (pos - io_align + buf_align) & ~PAGE_MASK; 532 num_pages = calc_pages_for(page_align, len);
533 num_pages = calc_pages_for((unsigned long)data, len);
534 } else {
535 page_align = pos & ~PAGE_MASK;
536 num_pages = calc_pages_for(pos, len);
537 }
538 req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout, 533 req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout,
539 ceph_vino(inode), pos, &len, 534 ceph_vino(inode), pos, &len,
540 CEPH_OSD_OP_WRITE, flags, 535 CEPH_OSD_OP_WRITE, flags,