CEPH_OSD_OP_READ, CEPH_OSD_FLAG_READ,
                                    NULL, 0,
                                    ci->i_truncate_seq, ci->i_truncate_size,
-                                   NULL, false, 0);
+                                   NULL, false);
        if (IS_ERR(req))
                return PTR_ERR(req);
 
        }
        req->r_pages = pages;
        req->r_num_pages = nr_pages;
+       req->r_page_alignment = 0;
        req->r_callback = finish_read;
        req->r_inode = inode;
 
                                            snapc, do_sync,
                                            ci->i_truncate_seq,
                                            ci->i_truncate_size,
-                                           &inode->i_mtime, true, 0);
+                                           &inode->i_mtime, true);
 
                                if (IS_ERR(req)) {
                                        rc = PTR_ERR(req);
                                        break;
                                }
 
+                               req->r_num_pages = calc_pages_for(0, len);
+                               req->r_page_alignment = 0;
                                max_pages = req->r_num_pages;
 
                                alloc_page_vec(fsc, req);
 
        buf_align = (unsigned long)data & ~PAGE_MASK;
        len = left;
 
-       /* write from beginning of first page, regardless of io alignment */
-       page_align = file->f_flags & O_DIRECT ? buf_align : io_align;
-       num_pages = calc_pages_for(page_align, len);
        req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout,
                                    ceph_vino(inode), pos, &len,
                                    CEPH_OSD_OP_WRITE, flags,
                                    ci->i_snap_realm->cached_context,
                                    do_sync,
                                    ci->i_truncate_seq, ci->i_truncate_size,
-                                   &mtime, false, page_align);
+                                   &mtime, false);
        if (IS_ERR(req))
                return PTR_ERR(req);
 
+       /* write from beginning of first page, regardless of io alignment */
+       page_align = file->f_flags & O_DIRECT ? buf_align : io_align;
+       num_pages = calc_pages_for(page_align, len);
        if (file->f_flags & O_DIRECT) {
                pages = ceph_get_direct_page_vector(data, num_pages, false);
                if (IS_ERR(pages)) {
        }
        req->r_pages = pages;
        req->r_num_pages = num_pages;
+       req->r_page_alignment = page_align;
        req->r_inode = inode;
 
        ret = ceph_osdc_start_request(&fsc->client->osdc, req, false);
 
                                      int do_sync, u32 truncate_seq,
                                      u64 truncate_size,
                                      struct timespec *mtime,
-                                     bool use_mempool, int page_align);
+                                     bool use_mempool);
 
 extern void ceph_osdc_set_request_linger(struct ceph_osd_client *osdc,
                                         struct ceph_osd_request *req);
 
                                               u32 truncate_seq,
                                               u64 truncate_size,
                                               struct timespec *mtime,
-                                              bool use_mempool,
-                                              int page_align)
+                                              bool use_mempool)
 {
        struct ceph_osd_req_op ops[2];
        struct ceph_osd_request *req;
        snprintf(req->r_oid, sizeof(req->r_oid), "%llx.%08llx", vino.ino, bno);
        req->r_oid_len = strlen(req->r_oid);
 
-       /* The alignment may differ from the natural (file) alignment */
-
-       req->r_num_pages = calc_pages_for(page_align, *plen);
-       req->r_page_alignment = page_align;
-
        ceph_osdc_build_request(req, off, *plen, num_op, ops,
                                snapc, vino.snap, mtime);
 
        req = ceph_osdc_new_request(osdc, layout, vino, off, plen,
                                    CEPH_OSD_OP_READ, CEPH_OSD_FLAG_READ,
                                    NULL, 0, truncate_seq, truncate_size, NULL,
-                                   false, page_align);
+                                   false);
        if (IS_ERR(req))
                return PTR_ERR(req);
 
        /* it may be a short read due to an object boundary */
        req->r_pages = pages;
+       req->r_num_pages = calc_pages_for(page_align, *plen);
+       req->r_page_alignment = page_align;
 
        dout("readpages  final extent is %llu~%llu (%d pages align %d)\n",
             off, *plen, req->r_num_pages, page_align);
                                    CEPH_OSD_FLAG_ONDISK | CEPH_OSD_FLAG_WRITE,
                                    snapc, 0,
                                    truncate_seq, truncate_size, mtime,
-                                   true, page_align);
+                                   true);
        if (IS_ERR(req))
                return PTR_ERR(req);
 
        /* it may be a short write due to an object boundary */
        req->r_pages = pages;
-       dout("writepages %llu~%llu (%d pages)\n", off, len,
-            req->r_num_pages);
+       req->r_num_pages = calc_pages_for(page_align, len);
+       req->r_page_alignment = page_align;
+       dout("writepages %llu~%llu (%d pages)\n", off, len, req->r_num_pages);
 
        rc = ceph_osdc_start_request(osdc, req, true);
        if (!rc)