Loading Documentation/filesystems/cifs/ksmbd.rst +2 −1 Original line number Diff line number Diff line Loading @@ -84,7 +84,8 @@ SMB3 encryption(CCM, GCM) Supported. (CCM and GCM128 supported, GCM256 in progress) SMB direct(RDMA) Partially Supported. SMB3 Multi-channel is required to connect to Windows client. SMB3 Multi-channel In Progress. SMB3 Multi-channel Partially Supported. Planned to implement replay/retry mechanisms for future. SMB3.1.1 POSIX extension Supported. ACLs Partially Supported. only DACLs available, SACLs (auditing) is planned for the future. For Loading MAINTAINERS +1 −0 Original line number Diff line number Diff line Loading @@ -9945,6 +9945,7 @@ M: Steve French <sfrench@samba.org> M: Hyunchul Lee <hyc.lee@gmail.com> L: linux-cifs@vger.kernel.org S: Maintained T: git git://git.samba.org/ksmbd.git F: fs/ksmbd/ KERNEL UNIT TESTING FRAMEWORK (KUnit) Loading fs/ksmbd/Kconfig +0 −1 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ config SMB_SERVER select CRYPTO_GCM select ASN1 select OID_REGISTRY select FS_POSIX_ACL default n help Choose Y here if you want to allow SMB3 compliant clients Loading fs/ksmbd/smb2pdu.c +27 −23 Original line number Diff line number Diff line Loading @@ -58,18 +58,18 @@ static void __wbuf(struct ksmbd_work *work, void **req, void **rsp) * * Return: 1 if valid session id, otherwise 0 */ static inline int check_session_id(struct ksmbd_conn *conn, u64 id) static inline bool check_session_id(struct ksmbd_conn *conn, u64 id) { struct ksmbd_session *sess; if (id == 0 || id == -1) return 0; return false; sess = ksmbd_session_lookup_all(conn, id); if (sess) return 1; return true; pr_err("Invalid user session id: %llu\n", id); return 0; return false; } struct channel *lookup_chann_list(struct ksmbd_session *sess, struct ksmbd_conn *conn) Loading @@ -85,10 +85,11 @@ struct channel *lookup_chann_list(struct ksmbd_session *sess, struct ksmbd_conn } /** * smb2_get_ksmbd_tcon() - get tree connection information for a tree id * smb2_get_ksmbd_tcon() - get tree connection information using a tree id. * @work: smb work * * Return: matching tree connection on success, otherwise error * Return: 0 if there is a tree connection matched or these are * skipable commands, otherwise error */ int smb2_get_ksmbd_tcon(struct ksmbd_work *work) { Loading @@ -105,14 +106,14 @@ int smb2_get_ksmbd_tcon(struct ksmbd_work *work) if (xa_empty(&work->sess->tree_conns)) { ksmbd_debug(SMB, "NO tree connected\n"); return -1; return -ENOENT; } tree_id = le32_to_cpu(req_hdr->Id.SyncId.TreeId); work->tcon = ksmbd_tree_conn_lookup(work->sess, tree_id); if (!work->tcon) { pr_err("Invalid tid %d\n", tree_id); return -1; return -EINVAL; } return 1; Loading Loading @@ -145,45 +146,45 @@ void smb2_set_err_rsp(struct ksmbd_work *work) * is_smb2_neg_cmd() - is it smb2 negotiation command * @work: smb work containing smb header * * Return: 1 if smb2 negotiation command, otherwise 0 * Return: true if smb2 negotiation command, otherwise false */ int is_smb2_neg_cmd(struct ksmbd_work *work) bool is_smb2_neg_cmd(struct ksmbd_work *work) { struct smb2_hdr *hdr = work->request_buf; /* is it SMB2 header ? */ if (hdr->ProtocolId != SMB2_PROTO_NUMBER) return 0; return false; /* make sure it is request not response message */ if (hdr->Flags & SMB2_FLAGS_SERVER_TO_REDIR) return 0; return false; if (hdr->Command != SMB2_NEGOTIATE) return 0; return false; return 1; return true; } /** * is_smb2_rsp() - is it smb2 response * @work: smb work containing smb response buffer * * Return: 1 if smb2 response, otherwise 0 * Return: true if smb2 response, otherwise false */ int is_smb2_rsp(struct ksmbd_work *work) bool is_smb2_rsp(struct ksmbd_work *work) { struct smb2_hdr *hdr = work->response_buf; /* is it SMB2 header ? */ if (hdr->ProtocolId != SMB2_PROTO_NUMBER) return 0; return false; /* make sure it is response not request message */ if (!(hdr->Flags & SMB2_FLAGS_SERVER_TO_REDIR)) return 0; return false; return 1; return true; } /** Loading Loading @@ -2385,12 +2386,15 @@ static void ksmbd_acls_fattr(struct smb_fattr *fattr, struct inode *inode) fattr->cf_uid = inode->i_uid; fattr->cf_gid = inode->i_gid; fattr->cf_mode = inode->i_mode; fattr->cf_acls = NULL; fattr->cf_dacls = NULL; if (IS_ENABLED(CONFIG_FS_POSIX_ACL)) { fattr->cf_acls = get_acl(inode, ACL_TYPE_ACCESS); if (S_ISDIR(inode->i_mode)) fattr->cf_dacls = get_acl(inode, ACL_TYPE_DEFAULT); } } /** * smb2_open() - handler for smb file open request Loading Loading @@ -8291,7 +8295,7 @@ int smb3_encrypt_resp(struct ksmbd_work *work) return rc; } int smb3_is_transform_hdr(void *buf) bool smb3_is_transform_hdr(void *buf) { struct smb2_transform_hdr *trhdr = buf; Loading fs/ksmbd/smb2pdu.h +3 −3 Original line number Diff line number Diff line Loading @@ -1638,8 +1638,8 @@ void init_smb2_max_read_size(unsigned int sz); void init_smb2_max_write_size(unsigned int sz); void init_smb2_max_trans_size(unsigned int sz); int is_smb2_neg_cmd(struct ksmbd_work *work); int is_smb2_rsp(struct ksmbd_work *work); bool is_smb2_neg_cmd(struct ksmbd_work *work); bool is_smb2_rsp(struct ksmbd_work *work); u16 get_smb2_cmd_val(struct ksmbd_work *work); void set_smb2_rsp_status(struct ksmbd_work *work, __le32 err); Loading @@ -1664,7 +1664,7 @@ void smb2_send_interim_resp(struct ksmbd_work *work, __le32 status); struct channel *lookup_chann_list(struct ksmbd_session *sess, struct ksmbd_conn *conn); void smb3_preauth_hash_rsp(struct ksmbd_work *work); int smb3_is_transform_hdr(void *buf); bool smb3_is_transform_hdr(void *buf); int smb3_decrypt_req(struct ksmbd_work *work); int smb3_encrypt_resp(struct ksmbd_work *work); bool smb3_11_final_sess_setup_resp(struct ksmbd_work *work); Loading Loading
Documentation/filesystems/cifs/ksmbd.rst +2 −1 Original line number Diff line number Diff line Loading @@ -84,7 +84,8 @@ SMB3 encryption(CCM, GCM) Supported. (CCM and GCM128 supported, GCM256 in progress) SMB direct(RDMA) Partially Supported. SMB3 Multi-channel is required to connect to Windows client. SMB3 Multi-channel In Progress. SMB3 Multi-channel Partially Supported. Planned to implement replay/retry mechanisms for future. SMB3.1.1 POSIX extension Supported. ACLs Partially Supported. only DACLs available, SACLs (auditing) is planned for the future. For Loading
MAINTAINERS +1 −0 Original line number Diff line number Diff line Loading @@ -9945,6 +9945,7 @@ M: Steve French <sfrench@samba.org> M: Hyunchul Lee <hyc.lee@gmail.com> L: linux-cifs@vger.kernel.org S: Maintained T: git git://git.samba.org/ksmbd.git F: fs/ksmbd/ KERNEL UNIT TESTING FRAMEWORK (KUnit) Loading
fs/ksmbd/Kconfig +0 −1 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ config SMB_SERVER select CRYPTO_GCM select ASN1 select OID_REGISTRY select FS_POSIX_ACL default n help Choose Y here if you want to allow SMB3 compliant clients Loading
fs/ksmbd/smb2pdu.c +27 −23 Original line number Diff line number Diff line Loading @@ -58,18 +58,18 @@ static void __wbuf(struct ksmbd_work *work, void **req, void **rsp) * * Return: 1 if valid session id, otherwise 0 */ static inline int check_session_id(struct ksmbd_conn *conn, u64 id) static inline bool check_session_id(struct ksmbd_conn *conn, u64 id) { struct ksmbd_session *sess; if (id == 0 || id == -1) return 0; return false; sess = ksmbd_session_lookup_all(conn, id); if (sess) return 1; return true; pr_err("Invalid user session id: %llu\n", id); return 0; return false; } struct channel *lookup_chann_list(struct ksmbd_session *sess, struct ksmbd_conn *conn) Loading @@ -85,10 +85,11 @@ struct channel *lookup_chann_list(struct ksmbd_session *sess, struct ksmbd_conn } /** * smb2_get_ksmbd_tcon() - get tree connection information for a tree id * smb2_get_ksmbd_tcon() - get tree connection information using a tree id. * @work: smb work * * Return: matching tree connection on success, otherwise error * Return: 0 if there is a tree connection matched or these are * skipable commands, otherwise error */ int smb2_get_ksmbd_tcon(struct ksmbd_work *work) { Loading @@ -105,14 +106,14 @@ int smb2_get_ksmbd_tcon(struct ksmbd_work *work) if (xa_empty(&work->sess->tree_conns)) { ksmbd_debug(SMB, "NO tree connected\n"); return -1; return -ENOENT; } tree_id = le32_to_cpu(req_hdr->Id.SyncId.TreeId); work->tcon = ksmbd_tree_conn_lookup(work->sess, tree_id); if (!work->tcon) { pr_err("Invalid tid %d\n", tree_id); return -1; return -EINVAL; } return 1; Loading Loading @@ -145,45 +146,45 @@ void smb2_set_err_rsp(struct ksmbd_work *work) * is_smb2_neg_cmd() - is it smb2 negotiation command * @work: smb work containing smb header * * Return: 1 if smb2 negotiation command, otherwise 0 * Return: true if smb2 negotiation command, otherwise false */ int is_smb2_neg_cmd(struct ksmbd_work *work) bool is_smb2_neg_cmd(struct ksmbd_work *work) { struct smb2_hdr *hdr = work->request_buf; /* is it SMB2 header ? */ if (hdr->ProtocolId != SMB2_PROTO_NUMBER) return 0; return false; /* make sure it is request not response message */ if (hdr->Flags & SMB2_FLAGS_SERVER_TO_REDIR) return 0; return false; if (hdr->Command != SMB2_NEGOTIATE) return 0; return false; return 1; return true; } /** * is_smb2_rsp() - is it smb2 response * @work: smb work containing smb response buffer * * Return: 1 if smb2 response, otherwise 0 * Return: true if smb2 response, otherwise false */ int is_smb2_rsp(struct ksmbd_work *work) bool is_smb2_rsp(struct ksmbd_work *work) { struct smb2_hdr *hdr = work->response_buf; /* is it SMB2 header ? */ if (hdr->ProtocolId != SMB2_PROTO_NUMBER) return 0; return false; /* make sure it is response not request message */ if (!(hdr->Flags & SMB2_FLAGS_SERVER_TO_REDIR)) return 0; return false; return 1; return true; } /** Loading Loading @@ -2385,12 +2386,15 @@ static void ksmbd_acls_fattr(struct smb_fattr *fattr, struct inode *inode) fattr->cf_uid = inode->i_uid; fattr->cf_gid = inode->i_gid; fattr->cf_mode = inode->i_mode; fattr->cf_acls = NULL; fattr->cf_dacls = NULL; if (IS_ENABLED(CONFIG_FS_POSIX_ACL)) { fattr->cf_acls = get_acl(inode, ACL_TYPE_ACCESS); if (S_ISDIR(inode->i_mode)) fattr->cf_dacls = get_acl(inode, ACL_TYPE_DEFAULT); } } /** * smb2_open() - handler for smb file open request Loading Loading @@ -8291,7 +8295,7 @@ int smb3_encrypt_resp(struct ksmbd_work *work) return rc; } int smb3_is_transform_hdr(void *buf) bool smb3_is_transform_hdr(void *buf) { struct smb2_transform_hdr *trhdr = buf; Loading
fs/ksmbd/smb2pdu.h +3 −3 Original line number Diff line number Diff line Loading @@ -1638,8 +1638,8 @@ void init_smb2_max_read_size(unsigned int sz); void init_smb2_max_write_size(unsigned int sz); void init_smb2_max_trans_size(unsigned int sz); int is_smb2_neg_cmd(struct ksmbd_work *work); int is_smb2_rsp(struct ksmbd_work *work); bool is_smb2_neg_cmd(struct ksmbd_work *work); bool is_smb2_rsp(struct ksmbd_work *work); u16 get_smb2_cmd_val(struct ksmbd_work *work); void set_smb2_rsp_status(struct ksmbd_work *work, __le32 err); Loading @@ -1664,7 +1664,7 @@ void smb2_send_interim_resp(struct ksmbd_work *work, __le32 status); struct channel *lookup_chann_list(struct ksmbd_session *sess, struct ksmbd_conn *conn); void smb3_preauth_hash_rsp(struct ksmbd_work *work); int smb3_is_transform_hdr(void *buf); bool smb3_is_transform_hdr(void *buf); int smb3_decrypt_req(struct ksmbd_work *work); int smb3_encrypt_resp(struct ksmbd_work *work); bool smb3_11_final_sess_setup_resp(struct ksmbd_work *work); Loading