@@ -2965,19 +2965,17 @@ static int smb2_query_reparse_point(const unsigned int xid,
2965
2965
u32 * tag , struct kvec * rsp ,
2966
2966
int * rsp_buftype )
2967
2967
{
2968
+ struct smb2_compound_vars * vars ;
2968
2969
int rc ;
2969
2970
__le16 * utf16_path = NULL ;
2970
2971
__u8 oplock = SMB2_OPLOCK_LEVEL_NONE ;
2971
2972
struct cifs_open_parms oparms ;
2972
2973
struct cifs_fid fid ;
2973
2974
struct TCP_Server_Info * server = cifs_pick_channel (tcon -> ses );
2974
2975
int flags = CIFS_CP_CREATE_CLOSE_OP ;
2975
- struct smb_rqst rqst [ 3 ] ;
2976
+ struct smb_rqst * rqst ;
2976
2977
int resp_buftype [3 ];
2977
- struct kvec rsp_iov [3 ];
2978
- struct kvec open_iov [SMB2_CREATE_IOV_SIZE ];
2979
- struct kvec io_iov [SMB2_IOCTL_IOV_SIZE ];
2980
- struct kvec close_iov [1 ];
2978
+ struct kvec * rsp_iov ;
2981
2979
struct smb2_ioctl_rsp * ioctl_rsp ;
2982
2980
struct reparse_data_buffer * reparse_buf ;
2983
2981
u32 plen ;
@@ -2987,20 +2985,24 @@ static int smb2_query_reparse_point(const unsigned int xid,
2987
2985
if (smb3_encryption_required (tcon ))
2988
2986
flags |= CIFS_TRANSFORM_REQ ;
2989
2987
2990
- memset (rqst , 0 , sizeof (rqst ));
2991
- resp_buftype [0 ] = resp_buftype [1 ] = resp_buftype [2 ] = CIFS_NO_BUFFER ;
2992
- memset (rsp_iov , 0 , sizeof (rsp_iov ));
2993
-
2994
2988
utf16_path = cifs_convert_path_to_utf16 (full_path , cifs_sb );
2995
2989
if (!utf16_path )
2996
2990
return - ENOMEM ;
2997
2991
2992
+ resp_buftype [0 ] = resp_buftype [1 ] = resp_buftype [2 ] = CIFS_NO_BUFFER ;
2993
+ vars = kzalloc (sizeof (* vars ), GFP_KERNEL );
2994
+ if (!vars ) {
2995
+ rc = - ENOMEM ;
2996
+ goto out_free_path ;
2997
+ }
2998
+ rqst = vars -> rqst ;
2999
+ rsp_iov = vars -> rsp_iov ;
3000
+
2998
3001
/*
2999
3002
* setup smb2open - TODO add optimization to call cifs_get_readable_path
3000
3003
* to see if there is a handle already open that we can use
3001
3004
*/
3002
- memset (& open_iov , 0 , sizeof (open_iov ));
3003
- rqst [0 ].rq_iov = open_iov ;
3005
+ rqst [0 ].rq_iov = vars -> open_iov ;
3004
3006
rqst [0 ].rq_nvec = SMB2_CREATE_IOV_SIZE ;
3005
3007
3006
3008
oparms = (struct cifs_open_parms ) {
@@ -3020,8 +3022,7 @@ static int smb2_query_reparse_point(const unsigned int xid,
3020
3022
3021
3023
3022
3024
/* IOCTL */
3023
- memset (& io_iov , 0 , sizeof (io_iov ));
3024
- rqst [1 ].rq_iov = io_iov ;
3025
+ rqst [1 ].rq_iov = vars -> io_iov ;
3025
3026
rqst [1 ].rq_nvec = SMB2_IOCTL_IOV_SIZE ;
3026
3027
3027
3028
rc = SMB2_ioctl_init (tcon , server ,
@@ -3036,10 +3037,8 @@ static int smb2_query_reparse_point(const unsigned int xid,
3036
3037
smb2_set_next_command (tcon , & rqst [1 ]);
3037
3038
smb2_set_related (& rqst [1 ]);
3038
3039
3039
-
3040
3040
/* Close */
3041
- memset (& close_iov , 0 , sizeof (close_iov ));
3042
- rqst [2 ].rq_iov = close_iov ;
3041
+ rqst [2 ].rq_iov = & vars -> close_iov ;
3043
3042
rqst [2 ].rq_nvec = 1 ;
3044
3043
3045
3044
rc = SMB2_close_init (tcon , server ,
@@ -3080,13 +3079,15 @@ static int smb2_query_reparse_point(const unsigned int xid,
3080
3079
}
3081
3080
3082
3081
query_rp_exit :
3083
- kfree (utf16_path );
3084
3082
SMB2_open_free (& rqst [0 ]);
3085
3083
SMB2_ioctl_free (& rqst [1 ]);
3086
3084
SMB2_close_free (& rqst [2 ]);
3087
3085
free_rsp_buf (resp_buftype [0 ], rsp_iov [0 ].iov_base );
3088
3086
free_rsp_buf (resp_buftype [1 ], rsp_iov [1 ].iov_base );
3089
3087
free_rsp_buf (resp_buftype [2 ], rsp_iov [2 ].iov_base );
3088
+ kfree (vars );
3089
+ out_free_path :
3090
+ kfree (utf16_path );
3090
3091
return rc ;
3091
3092
}
3092
3093
0 commit comments