diff options
| author | Enzo Matsumiya <ematsumiya@suse.de> | 2024-11-14 14:30:22 -0300 |
|---|---|---|
| committer | Enzo Matsumiya <ematsumiya@suse.de> | 2024-11-14 15:54:45 -0300 |
| commit | 624c2965b0681d3c41a18067001972a6e69f1171 (patch) | |
| tree | 0bd4b17d6d70b5c929103839bf4c824193b89b2b | |
| parent | 9ea3053596f7d4d63b80e28d0ed1ce5cab9a9457 (diff) | |
| download | linux-624c2965b0681d3c41a18067001972a6e69f1171.tar.gz linux-624c2965b0681d3c41a18067001972a6e69f1171.tar.bz2 linux-624c2965b0681d3c41a18067001972a6e69f1171.zip | |
smb: client: remove ->*transform* ops
- Add is_transform_hdr() and try_decrypt() functions to connect.c
- Expose smb3_init_transform_rq() and smb3_receive_transform() in
smb2proto.h
Signed-off-by: Enzo Matsumiya <ematsumiya@suse.de>
| -rw-r--r-- | fs/smb/client/cifsglob.h | 6 | ||||
| -rw-r--r-- | fs/smb/client/connect.c | 23 | ||||
| -rw-r--r-- | fs/smb/client/smb2ops.c | 24 | ||||
| -rw-r--r-- | fs/smb/client/smb2proto.h | 8 | ||||
| -rw-r--r-- | fs/smb/client/transport.c | 7 |
5 files changed, 30 insertions, 38 deletions
diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index 0c92cc0caef0..55656f25bde0 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -302,12 +302,6 @@ struct smb_version_operations { struct TCP_Server_Info *server); int (*calc_signature)(struct smb_rqst *, struct TCP_Server_Info *, bool allocate_crypto); - /* init transform request - used for encryption for now */ - int (*init_transform_rq)(struct TCP_Server_Info *, int num_rqst, - struct smb_rqst *, struct smb_rqst *); - int (*is_transform_hdr)(void *buf); - int (*receive_transform)(struct TCP_Server_Info *, - struct mid_q_entry **, char **, int *); }; struct smb_version_values { diff --git a/fs/smb/client/connect.c b/fs/smb/client/connect.c index e4027b97e168..065dde89febf 100644 --- a/fs/smb/client/connect.c +++ b/fs/smb/client/connect.c @@ -1137,6 +1137,20 @@ smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server) } } +static inline bool is_transform_hdr(void *buf) +{ + struct smb2_transform_hdr *trhdr = buf; + + return (trhdr->ProtocolId == SMB2_TRANSFORM_PROTO_NUM); +} + +static inline bool try_decrypt(struct TCP_Server_Info *server, void *buf) +{ + if (server->vals->protocol_id >= SMB30_PROT_ID) + return is_transform_hdr(buf); + + return false; +} static int cifs_demultiplex_thread(void *p) @@ -1221,13 +1235,8 @@ next_pdu: memset(bufs, 0, sizeof(bufs)); num_mids = 0; - if (server->ops->is_transform_hdr && - server->ops->receive_transform && - server->ops->is_transform_hdr(buf)) { - length = server->ops->receive_transform(server, - mids, - bufs, - &num_mids); + if (try_decrypt(server, buf)) { + length = smb3_receive_transform(server, mids, bufs, &num_mids); } else { mids[0] = smb2_find_mid(server, buf); bufs[0] = buf; diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c index d6fcff6aefac..838afc8add70 100644 --- a/fs/smb/client/smb2ops.c +++ b/fs/smb/client/smb2ops.c @@ -4253,9 +4253,8 @@ smb3_free_compound_rqst(int num_rqst, struct smb_rqst *rqst) * new_rq[0].rq_iov[0] : smb2_transform_hdr pre-allocated by the caller * new_rq[1+].rq_iov[*] == old_rq[0+].rq_iov[*] : SMB2/3 requests */ -static int -smb3_init_transform_rq(struct TCP_Server_Info *server, int num_rqst, - struct smb_rqst *new_rq, struct smb_rqst *old_rq) +int smb3_init_transform_rq(struct TCP_Server_Info *server, int num_rqst, struct smb_rqst *new_rq, + struct smb_rqst *old_rq) { struct smb2_transform_hdr *tr_hdr = new_rq[0].rq_iov[0].iov_base; struct page *page; @@ -4323,14 +4322,6 @@ err_free: } static int -smb3_is_transform_hdr(void *buf) -{ - struct smb2_transform_hdr *trhdr = buf; - - return trhdr->ProtocolId == SMB2_TRANSFORM_PROTO_NUM; -} - -static int decrypt_raw_data(struct TCP_Server_Info *server, char *buf, unsigned int buf_data_size, struct iov_iter *iter, bool is_offloaded) @@ -4833,9 +4824,8 @@ one_more: return ret; } -static int -smb3_receive_transform(struct TCP_Server_Info *server, - struct mid_q_entry **mids, char **bufs, int *num_mids) +int smb3_receive_transform(struct TCP_Server_Info *server, struct mid_q_entry **mids, char **bufs, + int *num_mids) { char *buf = server->smallbuf; unsigned int pdu_length = server->pdu_size; @@ -5018,9 +5008,6 @@ struct smb_version_operations smb30_operations = { .queryfs = smb2_queryfs, .generate_signingkey = generate_smb30signingkey, .calc_signature = smb3_calc_signature, - .init_transform_rq = smb3_init_transform_rq, - .is_transform_hdr = smb3_is_transform_hdr, - .receive_transform = smb3_receive_transform, }; struct smb_version_operations smb311_operations = { @@ -5034,9 +5021,6 @@ struct smb_version_operations smb311_operations = { .queryfs = smb311_queryfs, .generate_signingkey = generate_smb311signingkey, .calc_signature = smb3_calc_signature, - .init_transform_rq = smb3_init_transform_rq, - .is_transform_hdr = smb3_is_transform_hdr, - .receive_transform = smb3_receive_transform, }; struct smb_version_values smb21_values = { diff --git a/fs/smb/client/smb2proto.h b/fs/smb/client/smb2proto.h index 03c6e42f232f..3cefa3c5b1e5 100644 --- a/fs/smb/client/smb2proto.h +++ b/fs/smb/client/smb2proto.h @@ -481,8 +481,12 @@ extern struct cifs_ntsd * get_smb2_acl_by_fid(struct cifs_sb_info *, const struct cifs_fid *, u32 *, u32); extern int set_smb2_acl(struct cifs_ntsd *, __u32, struct inode *, const char *, int); - extern unsigned int smb2_wp_retry_size(struct inode *); - extern bool smb2_dir_needs_close(struct cifsFileInfo *); +extern unsigned int smb2_wp_retry_size(struct inode *); +extern int smb3_init_transform_rq(struct TCP_Server_Info *server, int num_rqst, + struct smb_rqst *new_rq, struct smb_rqst *old_rq); +extern int smb3_receive_transform(struct TCP_Server_Info *server, struct mid_q_entry **mids, + char **bufs, int *num_mids); +extern bool smb2_dir_needs_close(struct cifsFileInfo *); extern enum securityEnum smb2_select_sectype(struct TCP_Server_Info *, enum securityEnum); extern int smb2_next_header(struct TCP_Server_Info *server, char *buf, diff --git a/fs/smb/client/transport.c b/fs/smb/client/transport.c index 3bad12b59b57..949a65b61963 100644 --- a/fs/smb/client/transport.c +++ b/fs/smb/client/transport.c @@ -397,8 +397,9 @@ smb_send_rqst(struct TCP_Server_Info *server, int num_rqst, if (WARN_ON_ONCE(num_rqst > MAX_COMPOUND - 1)) return -EIO; - if (!server->ops->init_transform_rq) { - cifs_server_dbg(VFS, "Encryption requested but transform callback is missing\n"); + if (server->vals->protocol_id == SMB21_PROT_ID) { + cifs_server_dbg(VFS, "Encryption not supported in protocol 0x%x\n", + server->vals->protocol_id); return -EIO; } @@ -413,7 +414,7 @@ smb_send_rqst(struct TCP_Server_Info *server, int num_rqst, cur_rqst[0].rq_iov = iov; cur_rqst[0].rq_nvec = 1; - rc = server->ops->init_transform_rq(server, num_rqst + 1, &cur_rqst[0], rqst); + rc = smb3_init_transform_rq(server, num_rqst + 1, &cur_rqst[0], rqst); if (rc) goto out; |
