Skip to content

Commit 3946d0d

Browse files
longlimsftsmfrench
authored andcommitted
cifs: Allocate encryption header through kmalloc
When encryption is used, smb2_transform_hdr is defined on the stack and is passed to the transport. This doesn't work with RDMA as the buffer needs to be DMA'ed. Fix it by using kmalloc. Signed-off-by: Long Li <[email protected]> Signed-off-by: Steve French <[email protected]>
1 parent 4ebb879 commit 3946d0d

File tree

1 file changed

+17
-11
lines changed

1 file changed

+17
-11
lines changed

fs/cifs/transport.c

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,7 @@ smb_send_rqst(struct TCP_Server_Info *server, int num_rqst,
466466
struct smb_rqst *rqst, int flags)
467467
{
468468
struct kvec iov;
469-
struct smb2_transform_hdr tr_hdr;
469+
struct smb2_transform_hdr *tr_hdr;
470470
struct smb_rqst cur_rqst[MAX_COMPOUND];
471471
int rc;
472472

@@ -476,28 +476,34 @@ smb_send_rqst(struct TCP_Server_Info *server, int num_rqst,
476476
if (num_rqst > MAX_COMPOUND - 1)
477477
return -ENOMEM;
478478

479-
memset(&cur_rqst[0], 0, sizeof(cur_rqst));
480-
memset(&iov, 0, sizeof(iov));
481-
memset(&tr_hdr, 0, sizeof(tr_hdr));
482-
483-
iov.iov_base = &tr_hdr;
484-
iov.iov_len = sizeof(tr_hdr);
485-
cur_rqst[0].rq_iov = &iov;
486-
cur_rqst[0].rq_nvec = 1;
487-
488479
if (!server->ops->init_transform_rq) {
489480
cifs_server_dbg(VFS, "Encryption requested but transform "
490481
"callback is missing\n");
491482
return -EIO;
492483
}
493484

485+
tr_hdr = kmalloc(sizeof(*tr_hdr), GFP_NOFS);
486+
if (!tr_hdr)
487+
return -ENOMEM;
488+
489+
memset(&cur_rqst[0], 0, sizeof(cur_rqst));
490+
memset(&iov, 0, sizeof(iov));
491+
memset(tr_hdr, 0, sizeof(*tr_hdr));
492+
493+
iov.iov_base = tr_hdr;
494+
iov.iov_len = sizeof(*tr_hdr);
495+
cur_rqst[0].rq_iov = &iov;
496+
cur_rqst[0].rq_nvec = 1;
497+
494498
rc = server->ops->init_transform_rq(server, num_rqst + 1,
495499
&cur_rqst[0], rqst);
496500
if (rc)
497-
return rc;
501+
goto out;
498502

499503
rc = __smb_send_rqst(server, num_rqst + 1, &cur_rqst[0]);
500504
smb3_free_compound_rqst(num_rqst, &cur_rqst[1]);
505+
out:
506+
kfree(tr_hdr);
501507
return rc;
502508
}
503509

0 commit comments

Comments
 (0)