@@ -830,10 +830,6 @@ add_posix_context(struct kvec *iov, unsigned int *num_iovec, umode_t mode)
830830 if (iov [num ].iov_base == NULL )
831831 return - ENOMEM ;
832832 iov [num ].iov_len = sizeof (struct create_posix );
833- if (!req -> CreateContextsOffset )
834- req -> CreateContextsOffset = cpu_to_le32 (
835- sizeof (struct smb2_create_req ) +
836- iov [num - 1 ].iov_len );
837833 le32_add_cpu (& req -> CreateContextsLength , sizeof (struct create_posix ));
838834 * num_iovec = num + 1 ;
839835 return 0 ;
@@ -2183,10 +2179,6 @@ add_lease_context(struct TCP_Server_Info *server, struct kvec *iov,
21832179 return - ENOMEM ;
21842180 iov [num ].iov_len = server -> vals -> create_lease_size ;
21852181 req -> RequestedOplockLevel = SMB2_OPLOCK_LEVEL_LEASE ;
2186- if (!req -> CreateContextsOffset )
2187- req -> CreateContextsOffset = cpu_to_le32 (
2188- sizeof (struct smb2_create_req ) +
2189- iov [num - 1 ].iov_len );
21902182 le32_add_cpu (& req -> CreateContextsLength ,
21912183 server -> vals -> create_lease_size );
21922184 * num_iovec = num + 1 ;
@@ -2274,10 +2266,6 @@ add_durable_v2_context(struct kvec *iov, unsigned int *num_iovec,
22742266 if (iov [num ].iov_base == NULL )
22752267 return - ENOMEM ;
22762268 iov [num ].iov_len = sizeof (struct create_durable_v2 );
2277- if (!req -> CreateContextsOffset )
2278- req -> CreateContextsOffset =
2279- cpu_to_le32 (sizeof (struct smb2_create_req ) +
2280- iov [1 ].iov_len );
22812269 le32_add_cpu (& req -> CreateContextsLength , sizeof (struct create_durable_v2 ));
22822270 * num_iovec = num + 1 ;
22832271 return 0 ;
@@ -2297,10 +2285,6 @@ add_durable_reconnect_v2_context(struct kvec *iov, unsigned int *num_iovec,
22972285 if (iov [num ].iov_base == NULL )
22982286 return - ENOMEM ;
22992287 iov [num ].iov_len = sizeof (struct create_durable_handle_reconnect_v2 );
2300- if (!req -> CreateContextsOffset )
2301- req -> CreateContextsOffset =
2302- cpu_to_le32 (sizeof (struct smb2_create_req ) +
2303- iov [1 ].iov_len );
23042288 le32_add_cpu (& req -> CreateContextsLength ,
23052289 sizeof (struct create_durable_handle_reconnect_v2 ));
23062290 * num_iovec = num + 1 ;
@@ -2331,10 +2315,6 @@ add_durable_context(struct kvec *iov, unsigned int *num_iovec,
23312315 if (iov [num ].iov_base == NULL )
23322316 return - ENOMEM ;
23332317 iov [num ].iov_len = sizeof (struct create_durable );
2334- if (!req -> CreateContextsOffset )
2335- req -> CreateContextsOffset =
2336- cpu_to_le32 (sizeof (struct smb2_create_req ) +
2337- iov [1 ].iov_len );
23382318 le32_add_cpu (& req -> CreateContextsLength , sizeof (struct create_durable ));
23392319 * num_iovec = num + 1 ;
23402320 return 0 ;
@@ -2376,10 +2356,6 @@ add_twarp_context(struct kvec *iov, unsigned int *num_iovec, __u64 timewarp)
23762356 if (iov [num ].iov_base == NULL )
23772357 return - ENOMEM ;
23782358 iov [num ].iov_len = sizeof (struct crt_twarp_ctxt );
2379- if (!req -> CreateContextsOffset )
2380- req -> CreateContextsOffset = cpu_to_le32 (
2381- sizeof (struct smb2_create_req ) +
2382- iov [num - 1 ].iov_len );
23832359 le32_add_cpu (& req -> CreateContextsLength , sizeof (struct crt_twarp_ctxt ));
23842360 * num_iovec = num + 1 ;
23852361 return 0 ;
@@ -2511,10 +2487,6 @@ add_sd_context(struct kvec *iov, unsigned int *num_iovec, umode_t mode, bool set
25112487 if (iov [num ].iov_base == NULL )
25122488 return - ENOMEM ;
25132489 iov [num ].iov_len = len ;
2514- if (!req -> CreateContextsOffset )
2515- req -> CreateContextsOffset = cpu_to_le32 (
2516- sizeof (struct smb2_create_req ) +
2517- iov [num - 1 ].iov_len );
25182490 le32_add_cpu (& req -> CreateContextsLength , len );
25192491 * num_iovec = num + 1 ;
25202492 return 0 ;
@@ -2553,10 +2525,6 @@ add_query_id_context(struct kvec *iov, unsigned int *num_iovec)
25532525 if (iov [num ].iov_base == NULL )
25542526 return - ENOMEM ;
25552527 iov [num ].iov_len = sizeof (struct crt_query_id_ctxt );
2556- if (!req -> CreateContextsOffset )
2557- req -> CreateContextsOffset = cpu_to_le32 (
2558- sizeof (struct smb2_create_req ) +
2559- iov [num - 1 ].iov_len );
25602528 le32_add_cpu (& req -> CreateContextsLength , sizeof (struct crt_query_id_ctxt ));
25612529 * num_iovec = num + 1 ;
25622530 return 0 ;
@@ -2720,6 +2688,9 @@ int smb311_posix_mkdir(const unsigned int xid, struct inode *inode,
27202688 rc = add_posix_context (iov , & n_iov , mode );
27212689 if (rc )
27222690 goto err_free_req ;
2691+ req -> CreateContextsOffset = cpu_to_le32 (
2692+ sizeof (struct smb2_create_req ) +
2693+ iov [1 ].iov_len );
27232694 pc_buf = iov [n_iov - 1 ].iov_base ;
27242695 }
27252696
@@ -2943,6 +2914,16 @@ SMB2_open_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server,
29432914 }
29442915 add_query_id_context (iov , & n_iov );
29452916
2917+ if (n_iov > 2 ) {
2918+ /*
2919+ * We have create contexts behind iov[1] (the file
2920+ * name), point at them from the main create request
2921+ */
2922+ req -> CreateContextsOffset = cpu_to_le32 (
2923+ sizeof (struct smb2_create_req ) +
2924+ iov [1 ].iov_len );
2925+ }
2926+
29462927 rqst -> rq_nvec = n_iov ;
29472928 return 0 ;
29482929}
0 commit comments