struct ceph_msg_data    *data;          /* current data item */
        size_t                  resid;          /* bytes not yet consumed */
-       bool                    last_piece;     /* current is last piece */
        bool                    need_crc;       /* crc update needed */
        union {
 #ifdef CONFIG_BLOCK
 void ceph_msg_data_cursor_init(struct ceph_msg_data_cursor *cursor,
                               struct ceph_msg *msg, size_t length);
 struct page *ceph_msg_data_next(struct ceph_msg_data_cursor *cursor,
-                               size_t *page_offset, size_t *length,
-                               bool *last_piece);
+                               size_t *page_offset, size_t *length);
 void ceph_msg_data_advance(struct ceph_msg_data_cursor *cursor, size_t bytes);
 
 u32 ceph_crc32c_page(u32 crc, struct page *page, unsigned int page_offset,
 
                it->iter.bi_size = cursor->resid;
 
        BUG_ON(cursor->resid < bio_iter_len(it->bio, it->iter));
-       cursor->last_piece = cursor->resid == bio_iter_len(it->bio, it->iter);
 }
 
 static struct page *ceph_msg_data_bio_next(struct ceph_msg_data_cursor *cursor,
        cursor->resid -= bytes;
        bio_advance_iter(it->bio, &it->iter, bytes);
 
-       if (!cursor->resid) {
-               BUG_ON(!cursor->last_piece);
+       if (!cursor->resid)
                return false;   /* no more data */
-       }
 
        if (!bytes || (it->iter.bi_size && it->iter.bi_bvec_done &&
                       page == bio_iter_page(it->bio, it->iter)))
                        it->iter.bi_size = cursor->resid;
        }
 
-       BUG_ON(cursor->last_piece);
        BUG_ON(cursor->resid < bio_iter_len(it->bio, it->iter));
-       cursor->last_piece = cursor->resid == bio_iter_len(it->bio, it->iter);
        return true;
 }
 #endif /* CONFIG_BLOCK */
        cursor->bvec_iter.bi_size = cursor->resid;
 
        BUG_ON(cursor->resid < bvec_iter_len(bvecs, cursor->bvec_iter));
-       cursor->last_piece =
-           cursor->resid == bvec_iter_len(bvecs, cursor->bvec_iter);
 }
 
 static struct page *ceph_msg_data_bvecs_next(struct ceph_msg_data_cursor *cursor,
        cursor->resid -= bytes;
        bvec_iter_advance(bvecs, &cursor->bvec_iter, bytes);
 
-       if (!cursor->resid) {
-               BUG_ON(!cursor->last_piece);
+       if (!cursor->resid)
                return false;   /* no more data */
-       }
 
        if (!bytes || (cursor->bvec_iter.bi_bvec_done &&
                       page == bvec_iter_page(bvecs, cursor->bvec_iter)))
                return false;   /* more bytes to process in this segment */
 
-       BUG_ON(cursor->last_piece);
        BUG_ON(cursor->resid < bvec_iter_len(bvecs, cursor->bvec_iter));
-       cursor->last_piece =
-           cursor->resid == bvec_iter_len(bvecs, cursor->bvec_iter);
        return true;
 }
 
        BUG_ON(page_count > (int)USHRT_MAX);
        cursor->page_count = (unsigned short)page_count;
        BUG_ON(length > SIZE_MAX - cursor->page_offset);
-       cursor->last_piece = cursor->page_offset + cursor->resid <= PAGE_SIZE;
 }
 
 static struct page *
        BUG_ON(cursor->page_offset >= PAGE_SIZE);
 
        *page_offset = cursor->page_offset;
-       if (cursor->last_piece)
-               *length = cursor->resid;
-       else
-               *length = PAGE_SIZE - *page_offset;
-
+       *length = min_t(size_t, cursor->resid, PAGE_SIZE - *page_offset);
        return data->pages[cursor->page_index];
 }
 
 
        BUG_ON(cursor->page_index >= cursor->page_count);
        cursor->page_index++;
-       cursor->last_piece = cursor->resid <= PAGE_SIZE;
-
        return true;
 }
 
        cursor->resid = min(length, pagelist->length);
        cursor->page = page;
        cursor->offset = 0;
-       cursor->last_piece = cursor->resid <= PAGE_SIZE;
 }
 
 static struct page *
 
        /* offset of first page in pagelist is always 0 */
        *page_offset = cursor->offset & ~PAGE_MASK;
-       if (cursor->last_piece)
-               *length = cursor->resid;
-       else
-               *length = PAGE_SIZE - *page_offset;
-
+       *length = min_t(size_t, cursor->resid, PAGE_SIZE - *page_offset);
        return cursor->page;
 }
 
 
        BUG_ON(list_is_last(&cursor->page->lru, &pagelist->head));
        cursor->page = list_next_entry(cursor->page, lru);
-       cursor->last_piece = cursor->resid <= PAGE_SIZE;
-
        return true;
 }
 
  * Indicate whether this is the last piece in this data item.
  */
 struct page *ceph_msg_data_next(struct ceph_msg_data_cursor *cursor,
-                               size_t *page_offset, size_t *length,
-                               bool *last_piece)
+                               size_t *page_offset, size_t *length)
 {
        struct page *page;
 
        BUG_ON(*page_offset + *length > PAGE_SIZE);
        BUG_ON(!*length);
        BUG_ON(*length > cursor->resid);
-       if (last_piece)
-               *last_piece = cursor->last_piece;
 
        return page;
 }
        cursor->total_resid -= bytes;
 
        if (!cursor->resid && cursor->total_resid) {
-               WARN_ON(!cursor->last_piece);
                cursor->data++;
                __ceph_msg_data_cursor_init(cursor);
                new_piece = true;
 
                        continue;
                }
 
-               page = ceph_msg_data_next(cursor, &page_offset, &length, NULL);
+               page = ceph_msg_data_next(cursor, &page_offset, &length);
                if (length == cursor->total_resid)
                        more = MSG_MORE;
                ret = ceph_tcp_sendpage(con->sock, page, page_offset, length,
                        continue;
                }
 
-               page = ceph_msg_data_next(cursor, &page_offset, &length, NULL);
+               page = ceph_msg_data_next(cursor, &page_offset, &length);
                ret = ceph_tcp_recvpage(con->sock, page, page_offset, length);
                if (ret <= 0) {
                        if (do_datacrc)
                        continue;
                }
 
-               page = ceph_msg_data_next(cursor, &off, &len, NULL);
+               page = ceph_msg_data_next(cursor, &off, &len);
                ret = ceph_tcp_recvpage(con->sock, con->bounce_page, 0, len);
                if (ret <= 0) {
                        con->in_data_crc = crc;