@@ -2444,44 +2444,63 @@ SMB2_set_compression(const unsigned int xid, struct cifs_tcon *tcon,
2444
2444
return rc ;
2445
2445
}
2446
2446
2447
+ int
2448
+ SMB2_close_init (struct cifs_tcon * tcon , struct smb_rqst * rqst ,
2449
+ u64 persistent_fid , u64 volatile_fid )
2450
+ {
2451
+ struct smb2_close_req * req ;
2452
+ struct kvec * iov = rqst -> rq_iov ;
2453
+ unsigned int total_len ;
2454
+ int rc ;
2455
+
2456
+ rc = smb2_plain_req_init (SMB2_CLOSE , tcon , (void * * ) & req , & total_len );
2457
+ if (rc )
2458
+ return rc ;
2459
+
2460
+ req -> PersistentFileId = persistent_fid ;
2461
+ req -> VolatileFileId = volatile_fid ;
2462
+ iov [0 ].iov_base = (char * )req ;
2463
+ iov [0 ].iov_len = total_len ;
2464
+
2465
+ return 0 ;
2466
+ }
2467
+
2468
+ void
2469
+ SMB2_close_free (struct smb_rqst * rqst )
2470
+ {
2471
+ cifs_small_buf_release (rqst -> rq_iov [0 ].iov_base ); /* request */
2472
+ }
2473
+
2447
2474
int
2448
2475
SMB2_close_flags (const unsigned int xid , struct cifs_tcon * tcon ,
2449
2476
u64 persistent_fid , u64 volatile_fid , int flags )
2450
2477
{
2451
2478
struct smb_rqst rqst ;
2452
- struct smb2_close_req * req ;
2453
- struct smb2_close_rsp * rsp ;
2479
+ struct smb2_close_rsp * rsp = NULL ;
2454
2480
struct cifs_ses * ses = tcon -> ses ;
2455
2481
struct kvec iov [1 ];
2456
2482
struct kvec rsp_iov ;
2457
2483
int resp_buftype ;
2458
2484
int rc = 0 ;
2459
- unsigned int total_len ;
2460
2485
2461
2486
cifs_dbg (FYI , "Close\n" );
2462
2487
2463
2488
if (!ses || !(ses -> server ))
2464
2489
return - EIO ;
2465
2490
2466
- rc = smb2_plain_req_init (SMB2_CLOSE , tcon , (void * * ) & req , & total_len );
2467
- if (rc )
2468
- return rc ;
2469
-
2470
2491
if (smb3_encryption_required (tcon ))
2471
2492
flags |= CIFS_TRANSFORM_REQ ;
2472
2493
2473
- req -> PersistentFileId = persistent_fid ;
2474
- req -> VolatileFileId = volatile_fid ;
2475
-
2476
- iov [0 ].iov_base = (char * )req ;
2477
- iov [0 ].iov_len = total_len ;
2478
-
2479
2494
memset (& rqst , 0 , sizeof (struct smb_rqst ));
2495
+ memset (& iov , 0 , sizeof (iov ));
2480
2496
rqst .rq_iov = iov ;
2481
2497
rqst .rq_nvec = 1 ;
2482
2498
2499
+ rc = SMB2_close_init (tcon , & rqst , persistent_fid , volatile_fid );
2500
+ if (rc )
2501
+ goto close_exit ;
2502
+
2483
2503
rc = cifs_send_recv (xid , ses , & rqst , & resp_buftype , flags , & rsp_iov );
2484
- cifs_small_buf_release (req );
2485
2504
rsp = (struct smb2_close_rsp * )rsp_iov .iov_base ;
2486
2505
2487
2506
if (rc != 0 ) {
@@ -2494,6 +2513,7 @@ SMB2_close_flags(const unsigned int xid, struct cifs_tcon *tcon,
2494
2513
/* BB FIXME - decode close response, update inode for caching */
2495
2514
2496
2515
close_exit :
2516
+ SMB2_close_free (& rqst );
2497
2517
free_rsp_buf (resp_buftype , rsp );
2498
2518
return rc ;
2499
2519
}
0 commit comments