OSDN Git Service

cifs: Simplify SMB2_open_init()
authorVolker Lendecke <vl@samba.org>
Thu, 30 Mar 2023 12:04:45 +0000 (12:04 +0000)
committerSteve French <stfrench@microsoft.com>
Mon, 24 Apr 2023 01:31:44 +0000 (20:31 -0500)
We can point to the create contexts in just one place, we don't have
to do this in every add_*_context routine.

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Enzo Matsumiya <ematsumiya@suse.de>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifs/smb2pdu.c

index 366f0c3..4f0d7c4 100644 (file)
@@ -830,10 +830,6 @@ add_posix_context(struct kvec *iov, unsigned int *num_iovec, umode_t mode)
        if (iov[num].iov_base == NULL)
                return -ENOMEM;
        iov[num].iov_len = sizeof(struct create_posix);
-       if (!req->CreateContextsOffset)
-               req->CreateContextsOffset = cpu_to_le32(
-                               sizeof(struct smb2_create_req) +
-                               iov[num - 1].iov_len);
        le32_add_cpu(&req->CreateContextsLength, sizeof(struct create_posix));
        *num_iovec = num + 1;
        return 0;
@@ -2183,10 +2179,6 @@ add_lease_context(struct TCP_Server_Info *server, struct kvec *iov,
                return -ENOMEM;
        iov[num].iov_len = server->vals->create_lease_size;
        req->RequestedOplockLevel = SMB2_OPLOCK_LEVEL_LEASE;
-       if (!req->CreateContextsOffset)
-               req->CreateContextsOffset = cpu_to_le32(
-                               sizeof(struct smb2_create_req) +
-                               iov[num - 1].iov_len);
        le32_add_cpu(&req->CreateContextsLength,
                     server->vals->create_lease_size);
        *num_iovec = num + 1;
@@ -2274,10 +2266,6 @@ add_durable_v2_context(struct kvec *iov, unsigned int *num_iovec,
        if (iov[num].iov_base == NULL)
                return -ENOMEM;
        iov[num].iov_len = sizeof(struct create_durable_v2);
-       if (!req->CreateContextsOffset)
-               req->CreateContextsOffset =
-                       cpu_to_le32(sizeof(struct smb2_create_req) +
-                                                               iov[1].iov_len);
        le32_add_cpu(&req->CreateContextsLength, sizeof(struct create_durable_v2));
        *num_iovec = num + 1;
        return 0;
@@ -2297,10 +2285,6 @@ add_durable_reconnect_v2_context(struct kvec *iov, unsigned int *num_iovec,
        if (iov[num].iov_base == NULL)
                return -ENOMEM;
        iov[num].iov_len = sizeof(struct create_durable_handle_reconnect_v2);
-       if (!req->CreateContextsOffset)
-               req->CreateContextsOffset =
-                       cpu_to_le32(sizeof(struct smb2_create_req) +
-                                                               iov[1].iov_len);
        le32_add_cpu(&req->CreateContextsLength,
                        sizeof(struct create_durable_handle_reconnect_v2));
        *num_iovec = num + 1;
@@ -2331,10 +2315,6 @@ add_durable_context(struct kvec *iov, unsigned int *num_iovec,
        if (iov[num].iov_base == NULL)
                return -ENOMEM;
        iov[num].iov_len = sizeof(struct create_durable);
-       if (!req->CreateContextsOffset)
-               req->CreateContextsOffset =
-                       cpu_to_le32(sizeof(struct smb2_create_req) +
-                                                               iov[1].iov_len);
        le32_add_cpu(&req->CreateContextsLength, sizeof(struct create_durable));
        *num_iovec = num + 1;
        return 0;
@@ -2376,10 +2356,6 @@ add_twarp_context(struct kvec *iov, unsigned int *num_iovec, __u64 timewarp)
        if (iov[num].iov_base == NULL)
                return -ENOMEM;
        iov[num].iov_len = sizeof(struct crt_twarp_ctxt);
-       if (!req->CreateContextsOffset)
-               req->CreateContextsOffset = cpu_to_le32(
-                               sizeof(struct smb2_create_req) +
-                               iov[num - 1].iov_len);
        le32_add_cpu(&req->CreateContextsLength, sizeof(struct crt_twarp_ctxt));
        *num_iovec = num + 1;
        return 0;
@@ -2511,10 +2487,6 @@ add_sd_context(struct kvec *iov, unsigned int *num_iovec, umode_t mode, bool set
        if (iov[num].iov_base == NULL)
                return -ENOMEM;
        iov[num].iov_len = len;
-       if (!req->CreateContextsOffset)
-               req->CreateContextsOffset = cpu_to_le32(
-                               sizeof(struct smb2_create_req) +
-                               iov[num - 1].iov_len);
        le32_add_cpu(&req->CreateContextsLength, len);
        *num_iovec = num + 1;
        return 0;
@@ -2553,10 +2525,6 @@ add_query_id_context(struct kvec *iov, unsigned int *num_iovec)
        if (iov[num].iov_base == NULL)
                return -ENOMEM;
        iov[num].iov_len = sizeof(struct crt_query_id_ctxt);
-       if (!req->CreateContextsOffset)
-               req->CreateContextsOffset = cpu_to_le32(
-                               sizeof(struct smb2_create_req) +
-                               iov[num - 1].iov_len);
        le32_add_cpu(&req->CreateContextsLength, sizeof(struct crt_query_id_ctxt));
        *num_iovec = num + 1;
        return 0;
@@ -2720,6 +2688,9 @@ int smb311_posix_mkdir(const unsigned int xid, struct inode *inode,
                rc = add_posix_context(iov, &n_iov, mode);
                if (rc)
                        goto err_free_req;
+               req->CreateContextsOffset = cpu_to_le32(
+                       sizeof(struct smb2_create_req) +
+                       iov[1].iov_len);
                pc_buf = iov[n_iov-1].iov_base;
        }
 
@@ -2943,6 +2914,16 @@ SMB2_open_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server,
        }
        add_query_id_context(iov, &n_iov);
 
+       if (n_iov > 2) {
+               /*
+                * We have create contexts behind iov[1] (the file
+                * name), point at them from the main create request
+                */
+               req->CreateContextsOffset = cpu_to_le32(
+                       sizeof(struct smb2_create_req) +
+                       iov[1].iov_len);
+       }
+
        rqst->rq_nvec = n_iov;
        return 0;
 }