mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
f4dff37111
[ Upstream commit de4eceab57
]
When multiple mounts are to the same share from the same client it was not
possible to determine which section of /proc/fs/cifs/Stats (and DebugData)
correspond to that mount. In some recent examples this turned out to be
a significant problem when trying to analyze performance data - since
there are many cases where unless we know the tree id and session id we
can't figure out which stats (e.g. number of SMB3.1.1 requests by type,
the total time they take, which is slowest, how many fail etc.) apply to
which mount. The only existing loosely related ioctl CIFS_IOC_GET_MNT_INFO
does not return the information needed to uniquely identify which tcon
is which mount although it does return various flags and device info.
Add a cifs.ko ioctl CIFS_IOC_GET_TCON_INFO (0x800ccf0c) to return tid,
session id, tree connect count.
Cc: stable@vger.kernel.org
Reviewed-by: Shyam Prasad N <sprasad@microsoft.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
133 lines
3.7 KiB
C
133 lines
3.7 KiB
C
/* SPDX-License-Identifier: LGPL-2.1 */
|
|
/*
|
|
*
|
|
* Structure definitions for io control for cifs/smb3
|
|
*
|
|
* Copyright (c) 2015 Steve French <steve.french@primarydata.com>
|
|
*
|
|
*/
|
|
|
|
struct smb_mnt_fs_info {
|
|
__u32 version; /* 0001 */
|
|
__u16 protocol_id;
|
|
__u16 tcon_flags;
|
|
__u32 vol_serial_number;
|
|
__u32 vol_create_time;
|
|
__u32 share_caps;
|
|
__u32 share_flags;
|
|
__u32 sector_flags;
|
|
__u32 optimal_sector_size;
|
|
__u32 max_bytes_chunk;
|
|
__u32 fs_attributes;
|
|
__u32 max_path_component;
|
|
__u32 device_type;
|
|
__u32 device_characteristics;
|
|
__u32 maximal_access;
|
|
__u64 cifs_posix_caps;
|
|
} __packed;
|
|
|
|
struct smb_mnt_tcon_info {
|
|
__u32 tid;
|
|
__u64 session_id;
|
|
} __packed;
|
|
|
|
struct smb_snapshot_array {
|
|
__u32 number_of_snapshots;
|
|
__u32 number_of_snapshots_returned;
|
|
__u32 snapshot_array_size;
|
|
/* snapshots[]; */
|
|
} __packed;
|
|
|
|
/* query_info flags */
|
|
#define PASSTHRU_QUERY_INFO 0x00000000
|
|
#define PASSTHRU_FSCTL 0x00000001
|
|
#define PASSTHRU_SET_INFO 0x00000002
|
|
struct smb_query_info {
|
|
__u32 info_type;
|
|
__u32 file_info_class;
|
|
__u32 additional_information;
|
|
__u32 flags;
|
|
__u32 input_buffer_length;
|
|
__u32 output_buffer_length;
|
|
/* char buffer[]; */
|
|
} __packed;
|
|
|
|
/*
|
|
* Dumping the commonly used 16 byte (e.g. CCM and GCM128) keys still supported
|
|
* for backlevel compatibility, but is not sufficient for dumping the less
|
|
* frequently used GCM256 (32 byte) keys (see the newer "CIFS_DUMP_FULL_KEY"
|
|
* ioctl for dumping decryption info for GCM256 mounts)
|
|
*/
|
|
struct smb3_key_debug_info {
|
|
__u64 Suid;
|
|
__u16 cipher_type;
|
|
__u8 auth_key[16]; /* SMB2_NTLMV2_SESSKEY_SIZE */
|
|
__u8 smb3encryptionkey[SMB3_SIGN_KEY_SIZE];
|
|
__u8 smb3decryptionkey[SMB3_SIGN_KEY_SIZE];
|
|
} __packed;
|
|
|
|
/*
|
|
* Dump variable-sized keys
|
|
*/
|
|
struct smb3_full_key_debug_info {
|
|
/* INPUT: size of userspace buffer */
|
|
__u32 in_size;
|
|
|
|
/*
|
|
* INPUT: 0 for current user, otherwise session to dump
|
|
* OUTPUT: session id that was dumped
|
|
*/
|
|
__u64 session_id;
|
|
__u16 cipher_type;
|
|
__u8 session_key_length;
|
|
__u8 server_in_key_length;
|
|
__u8 server_out_key_length;
|
|
__u8 data[];
|
|
/*
|
|
* return this struct with the keys appended at the end:
|
|
* __u8 session_key[session_key_length];
|
|
* __u8 server_in_key[server_in_key_length];
|
|
* __u8 server_out_key[server_out_key_length];
|
|
*/
|
|
} __packed;
|
|
|
|
struct smb3_notify {
|
|
__u32 completion_filter;
|
|
bool watch_tree;
|
|
} __packed;
|
|
|
|
struct smb3_notify_info {
|
|
__u32 completion_filter;
|
|
bool watch_tree;
|
|
__u32 data_len; /* size of notify data below */
|
|
__u8 notify_data[];
|
|
} __packed;
|
|
|
|
#define CIFS_IOCTL_MAGIC 0xCF
|
|
#define CIFS_IOC_COPYCHUNK_FILE _IOW(CIFS_IOCTL_MAGIC, 3, int)
|
|
#define CIFS_IOC_SET_INTEGRITY _IO(CIFS_IOCTL_MAGIC, 4)
|
|
#define CIFS_IOC_GET_MNT_INFO _IOR(CIFS_IOCTL_MAGIC, 5, struct smb_mnt_fs_info)
|
|
#define CIFS_ENUMERATE_SNAPSHOTS _IOR(CIFS_IOCTL_MAGIC, 6, struct smb_snapshot_array)
|
|
#define CIFS_QUERY_INFO _IOWR(CIFS_IOCTL_MAGIC, 7, struct smb_query_info)
|
|
#define CIFS_DUMP_KEY _IOWR(CIFS_IOCTL_MAGIC, 8, struct smb3_key_debug_info)
|
|
#define CIFS_IOC_NOTIFY _IOW(CIFS_IOCTL_MAGIC, 9, struct smb3_notify)
|
|
#define CIFS_DUMP_FULL_KEY _IOWR(CIFS_IOCTL_MAGIC, 10, struct smb3_full_key_debug_info)
|
|
#define CIFS_IOC_NOTIFY_INFO _IOWR(CIFS_IOCTL_MAGIC, 11, struct smb3_notify_info)
|
|
#define CIFS_IOC_GET_TCON_INFO _IOR(CIFS_IOCTL_MAGIC, 12, struct smb_mnt_tcon_info)
|
|
#define CIFS_IOC_SHUTDOWN _IOR('X', 125, __u32)
|
|
|
|
/*
|
|
* Flags for going down operation
|
|
*/
|
|
#define CIFS_GOING_FLAGS_DEFAULT 0x0 /* going down */
|
|
#define CIFS_GOING_FLAGS_LOGFLUSH 0x1 /* flush log but not data */
|
|
#define CIFS_GOING_FLAGS_NOLOGFLUSH 0x2 /* don't flush log nor data */
|
|
|
|
static inline bool cifs_forced_shutdown(struct cifs_sb_info *sbi)
|
|
{
|
|
if (CIFS_MOUNT_SHUTDOWN & sbi->mnt_cifs_flags)
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|