cifs: Change the I/O paths to use an iterator rather than a page list
[sfrench/cifs-2.6.git] / fs / cifs / smb2pdu.c
index b16b41d3556018572737a1b308db3ba0bb01c8e9..541d8174afb9ec5e703da466c8f3daf3c47417e3 100644 (file)
@@ -4140,10 +4140,8 @@ smb2_new_read_req(void **buf, unsigned int *total_len,
                struct smbd_buffer_descriptor_v1 *v1;
                bool need_invalidate = server->dialect == SMB30_PROT_ID;
 
-               rdata->mr = smbd_register_mr(
-                               server->smbd_conn, rdata->pages,
-                               rdata->nr_pages, rdata->page_offset,
-                               rdata->tailsz, true, need_invalidate);
+               rdata->mr = smbd_register_mr(server->smbd_conn, &rdata->iter,
+                                            true, need_invalidate);
                if (!rdata->mr)
                        return -EAGAIN;
 
@@ -4200,15 +4198,9 @@ smb2_readv_callback(struct mid_q_entry *mid)
                                (struct smb2_hdr *)rdata->iov[0].iov_base;
        struct cifs_credits credits = { .value = 0, .instance = 0 };
        struct smb_rqst rqst = { .rq_iov = &rdata->iov[1],
-                                .rq_nvec = 1, };
-
-       if (rdata->got_bytes) {
-               rqst.rq_pages = rdata->pages;
-               rqst.rq_offset = rdata->page_offset;
-               rqst.rq_npages = rdata->nr_pages;
-               rqst.rq_pagesz = rdata->pagesz;
-               rqst.rq_tailsz = rdata->tailsz;
-       }
+                                .rq_nvec = 1,
+                                .rq_iter = rdata->iter,
+                                .rq_iter_size = iov_iter_count(&rdata->iter), };
 
        WARN_ONCE(rdata->server != mid->server,
                  "rdata server %p != mid server %p",
@@ -4226,6 +4218,8 @@ smb2_readv_callback(struct mid_q_entry *mid)
                if (server->sign && !mid->decrypted) {
                        int rc;
 
+                       iov_iter_revert(&rqst.rq_iter, rdata->got_bytes);
+                       iov_iter_truncate(&rqst.rq_iter, rdata->got_bytes);
                        rc = smb2_verify_signature(&rqst, server);
                        if (rc)
                                cifs_tcon_dbg(VFS, "SMB signature verification returned error = %d\n",
@@ -4568,7 +4562,7 @@ smb2_async_writev(struct cifs_writedata *wdata,
        req->VolatileFileId = io_parms->volatile_fid;
        req->WriteChannelInfoOffset = 0;
        req->WriteChannelInfoLength = 0;
-       req->Channel = 0;
+       req->Channel = SMB2_CHANNEL_NONE;
        req->Offset = cpu_to_le64(io_parms->offset);
        req->DataOffset = cpu_to_le16(
                                offsetof(struct smb2_write_req, Buffer));
@@ -4588,26 +4582,18 @@ smb2_async_writev(struct cifs_writedata *wdata,
         */
        if (smb3_use_rdma_offload(io_parms)) {
                struct smbd_buffer_descriptor_v1 *v1;
+               size_t data_size = iov_iter_count(&wdata->iter);
                bool need_invalidate = server->dialect == SMB30_PROT_ID;
 
-               wdata->mr = smbd_register_mr(
-                               server->smbd_conn, wdata->pages,
-                               wdata->nr_pages, wdata->page_offset,
-                               wdata->tailsz, false, need_invalidate);
+               wdata->mr = smbd_register_mr(server->smbd_conn, &wdata->iter,
+                                            false, need_invalidate);
                if (!wdata->mr) {
                        rc = -EAGAIN;
                        goto async_writev_out;
                }
                req->Length = 0;
                req->DataOffset = 0;
-               if (wdata->nr_pages > 1)
-                       req->RemainingBytes =
-                               cpu_to_le32(
-                                       (wdata->nr_pages - 1) * wdata->pagesz -
-                                       wdata->page_offset + wdata->tailsz
-                               );
-               else
-                       req->RemainingBytes = cpu_to_le32(wdata->tailsz);
+               req->RemainingBytes = cpu_to_le32(data_size);
                req->Channel = SMB2_CHANNEL_RDMA_V1_INVALIDATE;
                if (need_invalidate)
                        req->Channel = SMB2_CHANNEL_RDMA_V1;
@@ -4626,19 +4612,14 @@ smb2_async_writev(struct cifs_writedata *wdata,
 
        rqst.rq_iov = iov;
        rqst.rq_nvec = 1;
-       rqst.rq_pages = wdata->pages;
-       rqst.rq_offset = wdata->page_offset;
-       rqst.rq_npages = wdata->nr_pages;
-       rqst.rq_pagesz = wdata->pagesz;
-       rqst.rq_tailsz = wdata->tailsz;
+       rqst.rq_iter = wdata->iter;
+       rqst.rq_iter_size = iov_iter_count(&rqst.rq_iter);
 #ifdef CONFIG_CIFS_SMB_DIRECT
-       if (wdata->mr) {
+       if (wdata->mr)
                iov[0].iov_len += sizeof(struct smbd_buffer_descriptor_v1);
-               rqst.rq_npages = 0;
-       }
 #endif
-       cifs_dbg(FYI, "async write at %llu %u bytes\n",
-                io_parms->offset, io_parms->length);
+       cifs_dbg(FYI, "async write at %llu %u bytes iter=%zx\n",
+                io_parms->offset, io_parms->length, iov_iter_count(&rqst.rq_iter));
 
 #ifdef CONFIG_CIFS_SMB_DIRECT
        /* For RDMA read, I/O size is in RemainingBytes not in Length */