lkml.org 
[lkml]   [2017]   [Dec]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V4 22/45] block: introduce segment_last_page()
    Date
    BTRFS and guard_bio_eod() need to get the last page from one segment, so
    introduce this helper to make them happy.

    Signed-off-by: Ming Lei <ming.lei@redhat.com>
    ---
    include/linux/bvec.h | 22 ++++++++++++++++++++++
    1 file changed, 22 insertions(+)

    diff --git a/include/linux/bvec.h b/include/linux/bvec.h
    index 84c395feed49..217afcd83a15 100644
    --- a/include/linux/bvec.h
    +++ b/include/linux/bvec.h
    @@ -219,4 +219,26 @@ static inline bool bvec_iter_seg_advance(const struct bio_vec *bv,
    .bi_bvec_done = 0, \
    }

    +/* get the last page from the multipage bvec and store it in @pg */
    +static inline void segment_last_page(const struct bio_vec *seg,
    + struct bio_vec *pg)
    +{
    + unsigned total = seg->bv_offset + seg->bv_len;
    + unsigned last_page = total / PAGE_SIZE;
    +
    + if (last_page * PAGE_SIZE == total)
    + last_page--;
    +
    + pg->bv_page = nth_page(seg->bv_page, last_page);
    +
    + /* the whole segment is inside the last page */
    + if (seg->bv_offset >= last_page * PAGE_SIZE) {
    + pg->bv_offset = seg->bv_offset % PAGE_SIZE;
    + pg->bv_len = seg->bv_len;
    + } else {
    + pg->bv_offset = 0;
    + pg->bv_len = total - last_page * PAGE_SIZE;
    + }
    +}
    +
    #endif /* __LINUX_BVEC_ITER_H */
    --
    2.9.5
    \
     
     \ /
      Last update: 2017-12-18 13:30    [W:3.541 / U:0.800 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site