summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEnzo Matsumiya <ematsumiya@suse.de>2024-11-14 14:30:22 -0300
committerEnzo Matsumiya <ematsumiya@suse.de>2024-11-14 15:54:45 -0300
commit624c2965b0681d3c41a18067001972a6e69f1171 (patch)
tree0bd4b17d6d70b5c929103839bf4c824193b89b2b
parent9ea3053596f7d4d63b80e28d0ed1ce5cab9a9457 (diff)
downloadlinux-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.h6
-rw-r--r--fs/smb/client/connect.c23
-rw-r--r--fs/smb/client/smb2ops.c24
-rw-r--r--fs/smb/client/smb2proto.h8
-rw-r--r--fs/smb/client/transport.c7
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;