• Alex Elder's avatar
    ceph: simplify ceph_sync_write() page_align calculation · 3a42b6c4
    Alex Elder authored
    (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/4166Signed-off-by: default avatarAlex Elder <elder@inktank.com>
    Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
    3a42b6c4
file.c 23.5 KB