blob: ea00e1a91250c9fac19992a6eef74802a6165019 [file] [log] [blame]
Thomas Gleixner1a59d1b82019-05-27 08:55:05 +02001// SPDX-License-Identifier: GPL-2.0-or-later
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07003 *
Steve Frenchb8643e12005-04-28 22:41:07 -07004 * Copyright (C) International Business Machines Corp., 2000,2005
Linus Torvalds1da177e2005-04-16 15:20:36 -07005 *
6 * Modified by Steve French (sfrench@us.ibm.com)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007 */
8#include <linux/fs.h>
9#include <linux/string.h>
10#include <linux/ctype.h>
11#include <linux/module.h>
12#include <linux/proc_fs.h>
Linus Torvalds7c0f6ba2016-12-24 11:46:01 -080013#include <linux/uaccess.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070014#include "cifspdu.h"
15#include "cifsglob.h"
16#include "cifsproto.h"
17#include "cifs_debug.h"
Steve French6c91d362005-04-28 22:41:06 -070018#include "cifsfs.h"
Aurelien Aptel94b0595a2021-03-18 13:52:59 +010019#include "fs_context.h"
Paulo Alcantara54be1f62018-11-14 16:01:21 -020020#ifdef CONFIG_CIFS_DFS_UPCALL
21#include "dfs_cache.h"
22#endif
Long Lid8ec9132017-11-07 01:54:58 -070023#ifdef CONFIG_CIFS_SMB_DIRECT
24#include "smbdirect.h"
25#endif
Samuel Cabrero20fab0d2020-11-30 19:02:53 +010026#include "cifs_swn.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070027
28void
29cifs_dump_mem(char *label, void *data, int length)
30{
Andy Shevchenko0b456f02014-08-27 16:49:44 +030031 pr_debug("%s: dump of %d bytes of data at 0x%p\n", label, length, data);
Andy Shevchenko55d83e02014-08-27 16:49:43 +030032 print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 16, 4,
33 data, length, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -070034}
35
Ronnie Sahlberg14547f72018-04-22 14:45:53 -060036void cifs_dump_detail(void *buf, struct TCP_Server_Info *server)
Steve French39798772006-05-31 22:40:51 +000037{
Pavel Shilovsky8aa26f32012-05-17 13:25:35 +040038#ifdef CONFIG_CIFS_DEBUG2
Pavel Shilovskyd4e48542012-03-23 14:28:02 -040039 struct smb_hdr *smb = (struct smb_hdr *)buf;
40
Joe Perchesf96637b2013-05-04 22:12:25 -050041 cifs_dbg(VFS, "Cmd: %d Err: 0x%x Flags: 0x%x Flgs2: 0x%x Mid: %d Pid: %d\n",
42 smb->Command, smb->Status.CifsError,
43 smb->Flags, smb->Flags2, smb->Mid, smb->Pid);
Ronnie Sahlberg14547f72018-04-22 14:45:53 -060044 cifs_dbg(VFS, "smb buf %p len %u\n", smb,
Steve French71992e622018-05-06 15:58:51 -050045 server->ops->calc_smb_size(smb, server));
Pavel Shilovsky8aa26f32012-05-17 13:25:35 +040046#endif /* CONFIG_CIFS_DEBUG2 */
Steve French39798772006-05-31 22:40:51 +000047}
48
Steve Frenchffdd6e42007-06-24 21:15:44 +000049void cifs_dump_mids(struct TCP_Server_Info *server)
Steve French39798772006-05-31 22:40:51 +000050{
Pavel Shilovsky8aa26f32012-05-17 13:25:35 +040051#ifdef CONFIG_CIFS_DEBUG2
Steve Frenchffdd6e42007-06-24 21:15:44 +000052 struct mid_q_entry *mid_entry;
Steve French39798772006-05-31 22:40:51 +000053
Steve French221601c2007-06-05 20:35:06 +000054 if (server == NULL)
Steve French39798772006-05-31 22:40:51 +000055 return;
56
Joe Perchesf96637b2013-05-04 22:12:25 -050057 cifs_dbg(VFS, "Dump pending requests:\n");
Steve French39798772006-05-31 22:40:51 +000058 spin_lock(&GlobalMid_Lock);
Baokun Lia506ccb2021-06-17 19:36:40 +080059 list_for_each_entry(mid_entry, &server->pending_mid_q, qhead) {
Joe Perchesf96637b2013-05-04 22:12:25 -050060 cifs_dbg(VFS, "State: %d Cmd: %d Pid: %d Cbdata: %p Mid %llu\n",
61 mid_entry->mid_state,
62 le16_to_cpu(mid_entry->command),
63 mid_entry->pid,
64 mid_entry->callback_data,
65 mid_entry->mid);
Steve French39798772006-05-31 22:40:51 +000066#ifdef CONFIG_CIFS_STATS2
Joe Perchesf96637b2013-05-04 22:12:25 -050067 cifs_dbg(VFS, "IsLarge: %d buf: %p time rcv: %ld now: %ld\n",
68 mid_entry->large_buf,
69 mid_entry->resp_buf,
70 mid_entry->when_received,
71 jiffies);
Steve French39798772006-05-31 22:40:51 +000072#endif /* STATS2 */
Joe Perchesf96637b2013-05-04 22:12:25 -050073 cifs_dbg(VFS, "IsMult: %d IsEnd: %d\n",
74 mid_entry->multiRsp, mid_entry->multiEnd);
Steve Frenchad8b15f2008-08-08 21:10:16 +000075 if (mid_entry->resp_buf) {
Steve French71992e622018-05-06 15:58:51 -050076 cifs_dump_detail(mid_entry->resp_buf, server);
Steve Frenchad8b15f2008-08-08 21:10:16 +000077 cifs_dump_mem("existing buf: ",
78 mid_entry->resp_buf, 62);
Steve French39798772006-05-31 22:40:51 +000079 }
80 }
81 spin_unlock(&GlobalMid_Lock);
Steve French39798772006-05-31 22:40:51 +000082#endif /* CONFIG_CIFS_DEBUG2 */
Pavel Shilovsky8aa26f32012-05-17 13:25:35 +040083}
Steve French39798772006-05-31 22:40:51 +000084
Linus Torvalds1da177e2005-04-16 15:20:36 -070085#ifdef CONFIG_PROC_FS
Aurelien Aptel02cf5902018-01-24 13:46:12 +010086static void cifs_debug_tcon(struct seq_file *m, struct cifs_tcon *tcon)
87{
88 __u32 dev_type = le32_to_cpu(tcon->fsDevInfo.DeviceType);
89
90 seq_printf(m, "%s Mounts: %d ", tcon->treeName, tcon->tc_count);
91 if (tcon->nativeFileSystem)
92 seq_printf(m, "Type: %s ", tcon->nativeFileSystem);
93 seq_printf(m, "DevInfo: 0x%x Attributes: 0x%x\n\tPathComponentMax: %d Status: %d",
94 le32_to_cpu(tcon->fsDevInfo.DeviceCharacteristics),
95 le32_to_cpu(tcon->fsAttrInfo.Attributes),
96 le32_to_cpu(tcon->fsAttrInfo.MaxPathNameComponentLength),
97 tcon->tidStatus);
98 if (dev_type == FILE_DEVICE_DISK)
99 seq_puts(m, " type: DISK ");
100 else if (dev_type == FILE_DEVICE_CD_ROM)
101 seq_puts(m, " type: CDROM ");
102 else
103 seq_printf(m, " type: %d ", dev_type);
Steve Frenchab7b10c2019-03-12 01:29:03 -0500104
105 seq_printf(m, "Serial Number: 0x%x", tcon->vol_serial_number);
106
Steve Frenchffd1ef12019-03-09 18:12:18 -0600107 if ((tcon->seal) ||
108 (tcon->ses->session_flags & SMB2_SESSION_FLAG_ENCRYPT_DATA) ||
109 (tcon->share_flags & SHI1005_FLAGS_ENCRYPT_DATA))
Steve Frenchede2e522018-01-31 14:34:37 -0600110 seq_printf(m, " Encrypted");
Steve French5c5a41b2018-05-30 17:11:55 -0500111 if (tcon->nocase)
112 seq_printf(m, " nocase");
Steve Frenchede2e522018-01-31 14:34:37 -0600113 if (tcon->unix_ext)
114 seq_printf(m, " POSIX Extensions");
Aurelien Aptel02cf5902018-01-24 13:46:12 +0100115 if (tcon->ses->server->ops->dump_share_caps)
116 tcon->ses->server->ops->dump_share_caps(m, tcon);
Samuel Cabrero20fab0d2020-11-30 19:02:53 +0100117 if (tcon->use_witness)
118 seq_puts(m, " Witness");
Aurelien Aptel02cf5902018-01-24 13:46:12 +0100119
120 if (tcon->need_reconnect)
121 seq_puts(m, "\tDISCONNECTED ");
122 seq_putc(m, '\n');
123}
124
Aurelien Aptelbc0fe8b2018-06-14 15:43:20 +0200125static void
Aurelien Aptel85150922019-11-20 17:15:58 +0100126cifs_dump_channel(struct seq_file *m, int i, struct cifs_chan *chan)
127{
128 struct TCP_Server_Info *server = chan->server;
129
Shyam Prasad N03e9bb1a2021-02-03 23:27:52 -0800130 seq_printf(m, "\n\n\t\tChannel: %d ConnectionId: 0x%llx"
131 "\n\t\tNumber of credits: %d Dialect 0x%x"
132 "\n\t\tTCP status: %d Instance: %d"
133 "\n\t\tLocal Users To Server: %d SecMode: 0x%x Req On Wire: %d"
134 "\n\t\tIn Send: %d In MaxReq Wait: %d",
135 i+1, server->conn_id,
Aurelien Aptel85150922019-11-20 17:15:58 +0100136 server->credits,
137 server->dialect,
138 server->tcpStatus,
139 server->reconnect_instance,
140 server->srv_count,
141 server->sec_mode,
142 in_flight(server),
143 atomic_read(&server->in_send),
144 atomic_read(&server->num_waiters));
145}
146
147static void
Aurelien Aptelbc0fe8b2018-06-14 15:43:20 +0200148cifs_dump_iface(struct seq_file *m, struct cifs_server_iface *iface)
149{
150 struct sockaddr_in *ipv4 = (struct sockaddr_in *)&iface->sockaddr;
151 struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)&iface->sockaddr;
152
Steve French35a90802018-10-19 21:21:37 -0500153 seq_printf(m, "\tSpeed: %zu bps\n", iface->speed);
Aurelien Aptelbc0fe8b2018-06-14 15:43:20 +0200154 seq_puts(m, "\t\tCapabilities: ");
155 if (iface->rdma_capable)
156 seq_puts(m, "rdma ");
157 if (iface->rss_capable)
158 seq_puts(m, "rss ");
159 seq_putc(m, '\n');
160 if (iface->sockaddr.ss_family == AF_INET)
161 seq_printf(m, "\t\tIPv4: %pI4\n", &ipv4->sin_addr);
162 else if (iface->sockaddr.ss_family == AF_INET6)
163 seq_printf(m, "\t\tIPv6: %pI6\n", &ipv6->sin6_addr);
164}
165
Steve Frenchdfe33f92018-10-30 19:50:31 -0500166static int cifs_debug_files_proc_show(struct seq_file *m, void *v)
167{
Baokun Lia506ccb2021-06-17 19:36:40 +0800168 struct list_head *tmp, *tmp1, *tmp2;
Steve Frenchdfe33f92018-10-30 19:50:31 -0500169 struct TCP_Server_Info *server;
170 struct cifs_ses *ses;
171 struct cifs_tcon *tcon;
172 struct cifsFileInfo *cfile;
173
174 seq_puts(m, "# Version:1\n");
175 seq_puts(m, "# Format:\n");
176 seq_puts(m, "# <tree id> <persistent fid> <flags> <count> <pid> <uid>");
177#ifdef CONFIG_CIFS_DEBUG2
178 seq_printf(m, " <filename> <mid>\n");
179#else
180 seq_printf(m, " <filename>\n");
181#endif /* CIFS_DEBUG2 */
182 spin_lock(&cifs_tcp_ses_lock);
Baokun Lia506ccb2021-06-17 19:36:40 +0800183 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
Steve Frenchdfe33f92018-10-30 19:50:31 -0500184 list_for_each(tmp, &server->smb_ses_list) {
185 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
186 list_for_each(tmp1, &ses->tcon_list) {
187 tcon = list_entry(tmp1, struct cifs_tcon, tcon_list);
188 spin_lock(&tcon->open_file_lock);
189 list_for_each(tmp2, &tcon->openFileList) {
190 cfile = list_entry(tmp2, struct cifsFileInfo,
191 tlist);
192 seq_printf(m,
Al Virob9e46662021-01-06 21:53:52 -0500193 "0x%x 0x%llx 0x%x %d %d %d %pd",
Steve Frenchdfe33f92018-10-30 19:50:31 -0500194 tcon->tid,
195 cfile->fid.persistent_fid,
196 cfile->f_flags,
197 cfile->count,
198 cfile->pid,
199 from_kuid(&init_user_ns, cfile->uid),
Al Virob9e46662021-01-06 21:53:52 -0500200 cfile->dentry);
Steve Frenchdfe33f92018-10-30 19:50:31 -0500201#ifdef CONFIG_CIFS_DEBUG2
Paulo Alcantarabf1bc6942021-03-08 12:00:47 -0300202 seq_printf(m, " %llu\n", cfile->fid.mid);
Steve Frenchdfe33f92018-10-30 19:50:31 -0500203#else
204 seq_printf(m, "\n");
205#endif /* CIFS_DEBUG2 */
206 }
207 spin_unlock(&tcon->open_file_lock);
208 }
209 }
210 }
211 spin_unlock(&cifs_tcp_ses_lock);
212 seq_putc(m, '\n');
213 return 0;
214}
215
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000216static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700217{
Baokun Lia506ccb2021-06-17 19:36:40 +0800218 struct list_head *tmp2, *tmp3;
Steve Frenchffdd6e42007-06-24 21:15:44 +0000219 struct mid_q_entry *mid_entry;
Jeff Layton14fbf502008-11-14 13:53:46 -0500220 struct TCP_Server_Info *server;
Steve French96daf2b2011-05-27 04:34:02 +0000221 struct cifs_ses *ses;
222 struct cifs_tcon *tcon;
Shyam Prasad N03e9bb1a2021-02-03 23:27:52 -0800223 int c, i, j;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700224
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000225 seq_puts(m,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700226 "Display Internal CIFS Data Structures for Debugging\n"
227 "---------------------------------------------------\n");
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000228 seq_printf(m, "CIFS Version %s\n", CIFS_VERSION);
Jeff Laytonca40b712011-01-07 11:30:29 -0500229 seq_printf(m, "Features:");
Suresh Jayaramanf5799032010-07-30 18:25:56 +0530230#ifdef CONFIG_CIFS_DFS_UPCALL
Steve French950132a2018-06-28 18:46:40 -0500231 seq_printf(m, " DFS");
Suresh Jayaramanf5799032010-07-30 18:25:56 +0530232#endif
233#ifdef CONFIG_CIFS_FSCACHE
Steve French950132a2018-06-28 18:46:40 -0500234 seq_printf(m, ",FSCACHE");
235#endif
236#ifdef CONFIG_CIFS_SMB_DIRECT
237 seq_printf(m, ",SMB_DIRECT");
238#endif
239#ifdef CONFIG_CIFS_STATS2
240 seq_printf(m, ",STATS2");
Steve Frenchd2586502018-08-01 22:34:04 -0500241#else
Steve French950132a2018-06-28 18:46:40 -0500242 seq_printf(m, ",STATS");
243#endif
244#ifdef CONFIG_CIFS_DEBUG2
245 seq_printf(m, ",DEBUG2");
246#elif defined(CONFIG_CIFS_DEBUG)
247 seq_printf(m, ",DEBUG");
248#endif
249#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
250 seq_printf(m, ",ALLOW_INSECURE_LEGACY");
Suresh Jayaramanf5799032010-07-30 18:25:56 +0530251#endif
Suresh Jayaramanf5799032010-07-30 18:25:56 +0530252#ifdef CONFIG_CIFS_POSIX
Steve French950132a2018-06-28 18:46:40 -0500253 seq_printf(m, ",CIFS_POSIX");
Suresh Jayaramanf5799032010-07-30 18:25:56 +0530254#endif
255#ifdef CONFIG_CIFS_UPCALL
Steve French950132a2018-06-28 18:46:40 -0500256 seq_printf(m, ",UPCALL(SPNEGO)");
Suresh Jayaramanf5799032010-07-30 18:25:56 +0530257#endif
258#ifdef CONFIG_CIFS_XATTR
Steve French950132a2018-06-28 18:46:40 -0500259 seq_printf(m, ",XATTR");
Jeff Laytonca40b712011-01-07 11:30:29 -0500260#endif
Steve French950132a2018-06-28 18:46:40 -0500261 seq_printf(m, ",ACL");
Samuel Cabrero20fab0d2020-11-30 19:02:53 +0100262#ifdef CONFIG_CIFS_SWN_UPCALL
263 seq_puts(m, ",WITNESS");
264#endif
Suresh Jayaramanf5799032010-07-30 18:25:56 +0530265 seq_putc(m, '\n');
Ronnie Sahlberga5f1a812019-01-24 16:19:31 +1000266 seq_printf(m, "CIFSMaxBufSize: %d\n", CIFSMaxBufSize);
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000267 seq_printf(m, "Active VFS Requests: %d\n", GlobalTotalActiveXid);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700268
Shyam Prasad N03e9bb1a2021-02-03 23:27:52 -0800269 seq_printf(m, "\nServers: ");
270
271 c = 0;
Suresh Jayaraman3f9bcca2010-10-18 23:29:37 +0530272 spin_lock(&cifs_tcp_ses_lock);
Baokun Lia506ccb2021-06-17 19:36:40 +0800273 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
Shyam Prasad N0f2b3052021-07-19 11:26:24 +0000274 /* channel info will be printed as a part of sessions below */
275 if (CIFS_SERVER_IS_CHAN(server))
Shyam Prasad N03e9bb1a2021-02-03 23:27:52 -0800276 continue;
277
278 c++;
279 seq_printf(m, "\n%d) ConnectionId: 0x%llx ",
280 c, server->conn_id);
281
Steve French40f077a2021-02-21 23:00:46 -0600282 if (server->hostname)
283 seq_printf(m, "Hostname: %s ", server->hostname);
Long Li08a3b962017-11-22 17:38:48 -0700284#ifdef CONFIG_CIFS_SMB_DIRECT
285 if (!server->rdma)
286 goto skip_rdma;
287
Long Li14cc6392019-10-16 13:51:50 -0700288 if (!server->smbd_conn) {
289 seq_printf(m, "\nSMBDirect transport not available");
290 goto skip_rdma;
291 }
292
Long Li08a3b962017-11-22 17:38:48 -0700293 seq_printf(m, "\nSMBDirect (in hex) protocol version: %x "
294 "transport status: %x",
295 server->smbd_conn->protocol,
296 server->smbd_conn->transport_status);
297 seq_printf(m, "\nConn receive_credit_max: %x "
298 "send_credit_target: %x max_send_size: %x",
299 server->smbd_conn->receive_credit_max,
300 server->smbd_conn->send_credit_target,
301 server->smbd_conn->max_send_size);
302 seq_printf(m, "\nConn max_fragmented_recv_size: %x "
303 "max_fragmented_send_size: %x max_receive_size:%x",
304 server->smbd_conn->max_fragmented_recv_size,
305 server->smbd_conn->max_fragmented_send_size,
306 server->smbd_conn->max_receive_size);
307 seq_printf(m, "\nConn keep_alive_interval: %x "
308 "max_readwrite_size: %x rdma_readwrite_threshold: %x",
309 server->smbd_conn->keep_alive_interval,
310 server->smbd_conn->max_readwrite_size,
311 server->smbd_conn->rdma_readwrite_threshold);
312 seq_printf(m, "\nDebug count_get_receive_buffer: %x "
313 "count_put_receive_buffer: %x count_send_empty: %x",
314 server->smbd_conn->count_get_receive_buffer,
315 server->smbd_conn->count_put_receive_buffer,
316 server->smbd_conn->count_send_empty);
317 seq_printf(m, "\nRead Queue count_reassembly_queue: %x "
318 "count_enqueue_reassembly_queue: %x "
319 "count_dequeue_reassembly_queue: %x "
320 "fragment_reassembly_remaining: %x "
321 "reassembly_data_length: %x "
322 "reassembly_queue_length: %x",
323 server->smbd_conn->count_reassembly_queue,
324 server->smbd_conn->count_enqueue_reassembly_queue,
325 server->smbd_conn->count_dequeue_reassembly_queue,
326 server->smbd_conn->fragment_reassembly_remaining,
327 server->smbd_conn->reassembly_data_length,
328 server->smbd_conn->reassembly_queue_length);
329 seq_printf(m, "\nCurrent Credits send_credits: %x "
330 "receive_credits: %x receive_credit_target: %x",
331 atomic_read(&server->smbd_conn->send_credits),
332 atomic_read(&server->smbd_conn->receive_credits),
333 server->smbd_conn->receive_credit_target);
Long Li072a14e2020-03-30 11:04:06 -0700334 seq_printf(m, "\nPending send_pending: %x ",
335 atomic_read(&server->smbd_conn->send_pending));
Long Li08a3b962017-11-22 17:38:48 -0700336 seq_printf(m, "\nReceive buffers count_receive_queue: %x "
337 "count_empty_packet_queue: %x",
338 server->smbd_conn->count_receive_queue,
339 server->smbd_conn->count_empty_packet_queue);
340 seq_printf(m, "\nMR responder_resources: %x "
341 "max_frmr_depth: %x mr_type: %x",
342 server->smbd_conn->responder_resources,
343 server->smbd_conn->max_frmr_depth,
344 server->smbd_conn->mr_type);
345 seq_printf(m, "\nMR mr_ready_count: %x mr_used_count: %x",
346 atomic_read(&server->smbd_conn->mr_ready_count),
347 atomic_read(&server->smbd_conn->mr_used_count));
348skip_rdma:
349#endif
Steve Frenchede2e522018-01-31 14:34:37 -0600350 seq_printf(m, "\nNumber of credits: %d Dialect 0x%x",
351 server->credits, server->dialect);
Steve French26ea8882019-04-26 20:36:08 -0700352 if (server->compress_algorithm == SMB3_COMPRESS_LZNT1)
353 seq_printf(m, " COMPRESS_LZNT1");
354 else if (server->compress_algorithm == SMB3_COMPRESS_LZ77)
355 seq_printf(m, " COMPRESS_LZ77");
356 else if (server->compress_algorithm == SMB3_COMPRESS_LZ77_HUFF)
357 seq_printf(m, " COMPRESS_LZ77_HUFF");
Steve Frenchede2e522018-01-31 14:34:37 -0600358 if (server->sign)
359 seq_printf(m, " signed");
Steve Frenchfcef0db2018-05-19 20:45:27 -0500360 if (server->posix_ext_supported)
361 seq_printf(m, " posix");
Shyam Prasad Nc9f1c192021-11-06 11:31:53 +0000362 if (server->nosharesock)
363 seq_printf(m, " nosharesock");
Steve French0fdfef92018-06-28 19:30:23 -0500364
Shyam Prasad N03e9bb1a2021-02-03 23:27:52 -0800365 if (server->rdma)
366 seq_printf(m, "\nRDMA ");
367 seq_printf(m, "\nTCP status: %d Instance: %d"
368 "\nLocal Users To Server: %d SecMode: 0x%x Req On Wire: %d",
369 server->tcpStatus,
370 server->reconnect_instance,
371 server->srv_count,
372 server->sec_mode, in_flight(server));
373
374 seq_printf(m, "\nIn Send: %d In MaxReq Wait: %d",
375 atomic_read(&server->in_send),
376 atomic_read(&server->num_waiters));
377
378 seq_printf(m, "\n\n\tSessions: ");
379 i = 0;
Jeff Layton14fbf502008-11-14 13:53:46 -0500380 list_for_each(tmp2, &server->smb_ses_list) {
Steve French96daf2b2011-05-27 04:34:02 +0000381 ses = list_entry(tmp2, struct cifs_ses,
Jeff Layton14fbf502008-11-14 13:53:46 -0500382 smb_ses_list);
Shyam Prasad N03e9bb1a2021-02-03 23:27:52 -0800383 i++;
Jeff Layton14fbf502008-11-14 13:53:46 -0500384 if ((ses->serverDomain == NULL) ||
385 (ses->serverOS == NULL) ||
386 (ses->serverNOS == NULL)) {
Steve French40f077a2021-02-21 23:00:46 -0600387 seq_printf(m, "\n\t%d) Address: %s Uses: %d Capability: 0x%x\tSession Status: %d ",
Steve Frenchb438fcf2021-02-20 19:24:11 -0600388 i, ses->ip_addr, ses->ses_count,
Steve French1fa089e2017-09-20 16:46:49 -0500389 ses->capabilities, ses->status);
390 if (ses->session_flags & SMB2_SESSION_FLAG_IS_GUEST)
Shyam Prasad N03e9bb1a2021-02-03 23:27:52 -0800391 seq_printf(m, "Guest ");
Steve French1fa089e2017-09-20 16:46:49 -0500392 else if (ses->session_flags & SMB2_SESSION_FLAG_IS_NULL)
Shyam Prasad N03e9bb1a2021-02-03 23:27:52 -0800393 seq_printf(m, "Anonymous ");
Jeff Layton14fbf502008-11-14 13:53:46 -0500394 } else {
395 seq_printf(m,
Shyam Prasad N03e9bb1a2021-02-03 23:27:52 -0800396 "\n\t%d) Name: %s Domain: %s Uses: %d OS: %s "
397 "\n\tNOS: %s\tCapability: 0x%x"
398 "\n\tSMB session status: %d ",
Steve Frenchb438fcf2021-02-20 19:24:11 -0600399 i, ses->ip_addr, ses->serverDomain,
Jeff Layton14fbf502008-11-14 13:53:46 -0500400 ses->ses_count, ses->serverOS, ses->serverNOS,
Steve French221601c2007-06-05 20:35:06 +0000401 ses->capabilities, ses->status);
Jeff Layton14fbf502008-11-14 13:53:46 -0500402 }
Kenneth D'souza8e84a612020-06-04 21:14:41 +0530403
Shyam Prasad N03e9bb1a2021-02-03 23:27:52 -0800404 seq_printf(m, "\n\tSecurity type: %s ",
Kenneth D'souza0b0430c2020-06-09 10:12:10 +0530405 get_security_type_str(server->ops->select_sectype(server, ses->sectype)));
Kenneth D'souza8e84a612020-06-04 21:14:41 +0530406
Steve Frenchb63a9de2019-05-08 22:41:37 -0500407 /* dump session id helpful for use with network trace */
408 seq_printf(m, " SessionId: 0x%llx", ses->Suid);
Steve Frenchffd1ef12019-03-09 18:12:18 -0600409 if (ses->session_flags & SMB2_SESSION_FLAG_ENCRYPT_DATA)
410 seq_puts(m, " encrypted");
411 if (ses->sign)
412 seq_puts(m, " signed");
Steve French131afd0b2005-10-07 09:51:05 -0700413
Paul Aurichaadd69ca2020-06-26 12:58:04 -0700414 seq_printf(m, "\n\tUser: %d Cred User: %d",
415 from_kuid(&init_user_ns, ses->linux_uid),
416 from_kuid(&init_user_ns, ses->cred_uid));
417
Shyam Prasad N724244c2021-07-19 10:54:46 +0000418 spin_lock(&ses->chan_lock);
Shyam Prasad N66eb0c62021-07-19 14:01:32 +0000419 if (CIFS_CHAN_NEEDS_RECONNECT(ses, 0))
420 seq_puts(m, "\tPrimary channel: DISCONNECTED ");
421
Aurelien Aptel85150922019-11-20 17:15:58 +0100422 if (ses->chan_count > 1) {
Shyam Prasad N03e9bb1a2021-02-03 23:27:52 -0800423 seq_printf(m, "\n\n\tExtra Channels: %zu ",
Aurelien Aptel85150922019-11-20 17:15:58 +0100424 ses->chan_count-1);
Shyam Prasad N66eb0c62021-07-19 14:01:32 +0000425 for (j = 1; j < ses->chan_count; j++) {
Aurelien Aptel85150922019-11-20 17:15:58 +0100426 cifs_dump_channel(m, j, &ses->chans[j]);
Shyam Prasad N66eb0c62021-07-19 14:01:32 +0000427 if (CIFS_CHAN_NEEDS_RECONNECT(ses, j))
428 seq_puts(m, "\tDISCONNECTED ");
429 }
Aurelien Aptel85150922019-11-20 17:15:58 +0100430 }
Shyam Prasad N724244c2021-07-19 10:54:46 +0000431 spin_unlock(&ses->chan_lock);
Aurelien Aptel85150922019-11-20 17:15:58 +0100432
Shyam Prasad N03e9bb1a2021-02-03 23:27:52 -0800433 seq_puts(m, "\n\n\tShares: ");
Jeff Laytonf1987b42008-11-15 11:12:47 -0500434 j = 0;
Aurelien Aptel02cf5902018-01-24 13:46:12 +0100435
436 seq_printf(m, "\n\t%d) IPC: ", j);
437 if (ses->tcon_ipc)
438 cifs_debug_tcon(m, ses->tcon_ipc);
439 else
440 seq_puts(m, "none\n");
441
Jeff Laytonf1987b42008-11-15 11:12:47 -0500442 list_for_each(tmp3, &ses->tcon_list) {
Steve French96daf2b2011-05-27 04:34:02 +0000443 tcon = list_entry(tmp3, struct cifs_tcon,
Jeff Laytonf1987b42008-11-15 11:12:47 -0500444 tcon_list);
445 ++j;
Aurelien Aptel02cf5902018-01-24 13:46:12 +0100446 seq_printf(m, "\n\t%d) ", j);
447 cifs_debug_tcon(m, tcon);
Jeff Laytonf1987b42008-11-15 11:12:47 -0500448 }
449
Aurelien Aptelbc0fe8b2018-06-14 15:43:20 +0200450 spin_lock(&ses->iface_lock);
Steve French115d5d22018-06-14 21:59:31 -0500451 if (ses->iface_count)
Shyam Prasad N03e9bb1a2021-02-03 23:27:52 -0800452 seq_printf(m, "\n\n\tServer interfaces: %zu",
Steve French115d5d22018-06-14 21:59:31 -0500453 ses->iface_count);
Aurelien Aptelbc0fe8b2018-06-14 15:43:20 +0200454 for (j = 0; j < ses->iface_count; j++) {
Aurelien Aptel85150922019-11-20 17:15:58 +0100455 struct cifs_server_iface *iface;
456
457 iface = &ses->iface_list[j];
Shyam Prasad N03e9bb1a2021-02-03 23:27:52 -0800458 seq_printf(m, "\n\t%d)", j+1);
Aurelien Aptel85150922019-11-20 17:15:58 +0100459 cifs_dump_iface(m, iface);
460 if (is_ses_using_iface(ses, iface))
461 seq_puts(m, "\t\t[CONNECTED]\n");
Aurelien Aptelbc0fe8b2018-06-14 15:43:20 +0200462 }
463 spin_unlock(&ses->iface_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700464 }
Shyam Prasad N03e9bb1a2021-02-03 23:27:52 -0800465 if (i == 0)
466 seq_printf(m, "\n\t\t[NONE]");
467
468 seq_puts(m, "\n\n\tMIDs: ");
469 spin_lock(&GlobalMid_Lock);
470 list_for_each(tmp3, &server->pending_mid_q) {
471 mid_entry = list_entry(tmp3, struct mid_q_entry,
472 qhead);
473 seq_printf(m, "\n\tState: %d com: %d pid:"
474 " %d cbdata: %p mid %llu\n",
475 mid_entry->mid_state,
476 le16_to_cpu(mid_entry->command),
477 mid_entry->pid,
478 mid_entry->callback_data,
479 mid_entry->mid);
480 }
481 spin_unlock(&GlobalMid_Lock);
482 seq_printf(m, "\n--\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700483 }
Shyam Prasad N03e9bb1a2021-02-03 23:27:52 -0800484 if (c == 0)
485 seq_printf(m, "\n\t[NONE]");
486
Suresh Jayaraman3f9bcca2010-10-18 23:29:37 +0530487 spin_unlock(&cifs_tcp_ses_lock);
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000488 seq_putc(m, '\n');
Samuel Cabrero20fab0d2020-11-30 19:02:53 +0100489 cifs_swn_dump(m);
Aurelien Aptelb7fd0fa2021-04-09 16:31:37 +0200490
Linus Torvalds1da177e2005-04-16 15:20:36 -0700491 /* BB add code to dump additional info such as TCP session info now */
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000492 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700493}
494
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000495static ssize_t cifs_stats_proc_write(struct file *file,
496 const char __user *buffer, size_t count, loff_t *ppos)
Steve French1047abc2005-10-11 19:58:06 -0700497{
Andy Shevchenko28e2aed2014-08-27 16:49:42 +0300498 bool bv;
Steve French221601c2007-06-05 20:35:06 +0000499 int rc;
Jeff Laytonf1987b42008-11-15 11:12:47 -0500500 struct list_head *tmp1, *tmp2, *tmp3;
501 struct TCP_Server_Info *server;
Steve French96daf2b2011-05-27 04:34:02 +0000502 struct cifs_ses *ses;
503 struct cifs_tcon *tcon;
Steve French1047abc2005-10-11 19:58:06 -0700504
Kees Cook14042972016-03-17 14:22:54 -0700505 rc = kstrtobool_from_user(buffer, count, &bv);
506 if (rc == 0) {
Steve French4498eed52005-12-03 13:58:57 -0800507#ifdef CONFIG_CIFS_STATS2
Steve French468d6772018-08-04 05:24:34 -0500508 int i;
509
Steve French4498eed52005-12-03 13:58:57 -0800510 atomic_set(&totBufAllocCount, 0);
511 atomic_set(&totSmBufAllocCount, 0);
512#endif /* CONFIG_CIFS_STATS2 */
Steve French2c8876352018-09-15 23:04:41 -0500513 atomic_set(&tcpSesReconnectCount, 0);
514 atomic_set(&tconInfoReconnectCount, 0);
515
Steve Frenchc281bc02018-08-01 00:56:12 -0500516 spin_lock(&GlobalMid_Lock);
517 GlobalMaxActiveXid = 0;
518 GlobalCurrentXid = 0;
519 spin_unlock(&GlobalMid_Lock);
Suresh Jayaraman3f9bcca2010-10-18 23:29:37 +0530520 spin_lock(&cifs_tcp_ses_lock);
Jeff Laytonf1987b42008-11-15 11:12:47 -0500521 list_for_each(tmp1, &cifs_tcp_ses_list) {
522 server = list_entry(tmp1, struct TCP_Server_Info,
523 tcp_ses_list);
Steve French1b63f182019-09-09 22:57:11 -0500524 server->max_in_flight = 0;
Steve French468d6772018-08-04 05:24:34 -0500525#ifdef CONFIG_CIFS_STATS2
Steve French433b8dd2019-03-26 13:53:21 -0500526 for (i = 0; i < NUMBER_OF_SMB2_COMMANDS; i++) {
527 atomic_set(&server->num_cmds[i], 0);
Steve French468d6772018-08-04 05:24:34 -0500528 atomic_set(&server->smb2slowcmd[i], 0);
Steve French433b8dd2019-03-26 13:53:21 -0500529 server->time_per_cmd[i] = 0;
530 server->slowest_cmd[i] = 0;
531 server->fastest_cmd[0] = 0;
532 }
Steve French468d6772018-08-04 05:24:34 -0500533#endif /* CONFIG_CIFS_STATS2 */
Steve Frenchc2b33822008-11-17 03:57:13 +0000534 list_for_each(tmp2, &server->smb_ses_list) {
Steve French96daf2b2011-05-27 04:34:02 +0000535 ses = list_entry(tmp2, struct cifs_ses,
Steve Frenchc2b33822008-11-17 03:57:13 +0000536 smb_ses_list);
Jeff Laytonf1987b42008-11-15 11:12:47 -0500537 list_for_each(tmp3, &ses->tcon_list) {
538 tcon = list_entry(tmp3,
Steve French96daf2b2011-05-27 04:34:02 +0000539 struct cifs_tcon,
Jeff Laytonf1987b42008-11-15 11:12:47 -0500540 tcon_list);
541 atomic_set(&tcon->num_smbs_sent, 0);
Steve Frenchc281bc02018-08-01 00:56:12 -0500542 spin_lock(&tcon->stat_lock);
543 tcon->bytes_read = 0;
544 tcon->bytes_written = 0;
545 spin_unlock(&tcon->stat_lock);
Pavel Shilovsky44c58182012-05-28 14:16:31 +0400546 if (server->ops->clear_stats)
547 server->ops->clear_stats(tcon);
Jeff Laytonf1987b42008-11-15 11:12:47 -0500548 }
549 }
Steve French1047abc2005-10-11 19:58:06 -0700550 }
Suresh Jayaraman3f9bcca2010-10-18 23:29:37 +0530551 spin_unlock(&cifs_tcp_ses_lock);
Kees Cook14042972016-03-17 14:22:54 -0700552 } else {
553 return rc;
Steve French1047abc2005-10-11 19:58:06 -0700554 }
555
Steve French221601c2007-06-05 20:35:06 +0000556 return count;
Steve French1047abc2005-10-11 19:58:06 -0700557}
558
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000559static int cifs_stats_proc_show(struct seq_file *m, void *v)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700560{
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000561 int i;
Steve French468d6772018-08-04 05:24:34 -0500562#ifdef CONFIG_CIFS_STATS2
563 int j;
564#endif /* STATS2 */
Baokun Lia506ccb2021-06-17 19:36:40 +0800565 struct list_head *tmp2, *tmp3;
Jeff Laytonf1987b42008-11-15 11:12:47 -0500566 struct TCP_Server_Info *server;
Steve French96daf2b2011-05-27 04:34:02 +0000567 struct cifs_ses *ses;
568 struct cifs_tcon *tcon;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700569
Steve French468d6772018-08-04 05:24:34 -0500570 seq_printf(m, "Resources in use\nCIFS Session: %d\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700571 sesInfoAllocCount.counter);
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000572 seq_printf(m, "Share (unique mount targets): %d\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700573 tconInfoAllocCount.counter);
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000574 seq_printf(m, "SMB Request/Response Buffer: %d Pool size: %d\n",
Steve Frenchb8643e12005-04-28 22:41:07 -0700575 bufAllocCount.counter,
576 cifs_min_rcv + tcpSesAllocCount.counter);
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000577 seq_printf(m, "SMB Small Req/Resp Buffer: %d Pool size: %d\n",
Steve French221601c2007-06-05 20:35:06 +0000578 smBufAllocCount.counter, cifs_min_small);
Steve French07475ff2005-12-03 14:11:37 -0800579#ifdef CONFIG_CIFS_STATS2
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000580 seq_printf(m, "Total Large %d Small %d Allocations\n",
Steve French07475ff2005-12-03 14:11:37 -0800581 atomic_read(&totBufAllocCount),
Steve French221601c2007-06-05 20:35:06 +0000582 atomic_read(&totSmBufAllocCount));
Steve French07475ff2005-12-03 14:11:37 -0800583#endif /* CONFIG_CIFS_STATS2 */
584
Jeff Layton80975312011-01-11 07:24:02 -0500585 seq_printf(m, "Operations (MIDs): %d\n", atomic_read(&midCount));
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000586 seq_printf(m,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700587 "\n%d session %d share reconnects\n",
Steve French221601c2007-06-05 20:35:06 +0000588 tcpSesReconnectCount.counter, tconInfoReconnectCount.counter);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700589
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000590 seq_printf(m,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700591 "Total vfs operations: %d maximum at one time: %d\n",
Steve French221601c2007-06-05 20:35:06 +0000592 GlobalCurrentXid, GlobalMaxActiveXid);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700593
594 i = 0;
Suresh Jayaraman3f9bcca2010-10-18 23:29:37 +0530595 spin_lock(&cifs_tcp_ses_lock);
Baokun Lia506ccb2021-06-17 19:36:40 +0800596 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
Steve French1b63f182019-09-09 22:57:11 -0500597 seq_printf(m, "\nMax requests in flight: %d", server->max_in_flight);
Steve French468d6772018-08-04 05:24:34 -0500598#ifdef CONFIG_CIFS_STATS2
Steve French433b8dd2019-03-26 13:53:21 -0500599 seq_puts(m, "\nTotal time spent processing by command. Time ");
600 seq_printf(m, "units are jiffies (%d per second)\n", HZ);
601 seq_puts(m, " SMB3 CMD\tNumber\tTotal Time\tFastest\tSlowest\n");
602 seq_puts(m, " --------\t------\t----------\t-------\t-------\n");
603 for (j = 0; j < NUMBER_OF_SMB2_COMMANDS; j++)
604 seq_printf(m, " %d\t\t%d\t%llu\t\t%u\t%u\n", j,
605 atomic_read(&server->num_cmds[j]),
606 server->time_per_cmd[j],
607 server->fastest_cmd[j],
608 server->slowest_cmd[j]);
Steve French468d6772018-08-04 05:24:34 -0500609 for (j = 0; j < NUMBER_OF_SMB2_COMMANDS; j++)
610 if (atomic_read(&server->smb2slowcmd[j]))
Steve French433b8dd2019-03-26 13:53:21 -0500611 seq_printf(m, " %d slow responses from %s for command %d\n",
Steve French468d6772018-08-04 05:24:34 -0500612 atomic_read(&server->smb2slowcmd[j]),
613 server->hostname, j);
614#endif /* STATS2 */
Jeff Laytonf1987b42008-11-15 11:12:47 -0500615 list_for_each(tmp2, &server->smb_ses_list) {
Steve French96daf2b2011-05-27 04:34:02 +0000616 ses = list_entry(tmp2, struct cifs_ses,
Jeff Laytonf1987b42008-11-15 11:12:47 -0500617 smb_ses_list);
618 list_for_each(tmp3, &ses->tcon_list) {
619 tcon = list_entry(tmp3,
Steve French96daf2b2011-05-27 04:34:02 +0000620 struct cifs_tcon,
Jeff Laytonf1987b42008-11-15 11:12:47 -0500621 tcon_list);
622 i++;
623 seq_printf(m, "\n%d) %s", i, tcon->treeName);
624 if (tcon->need_reconnect)
625 seq_puts(m, "\tDISCONNECTED ");
Pavel Shilovsky44c58182012-05-28 14:16:31 +0400626 seq_printf(m, "\nSMBs: %d",
627 atomic_read(&tcon->num_smbs_sent));
628 if (server->ops->print_stats)
629 server->ops->print_stats(m, tcon);
Jeff Laytonf1987b42008-11-15 11:12:47 -0500630 }
631 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700632 }
Suresh Jayaraman3f9bcca2010-10-18 23:29:37 +0530633 spin_unlock(&cifs_tcp_ses_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700634
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000635 seq_putc(m, '\n');
636 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700637}
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000638
639static int cifs_stats_proc_open(struct inode *inode, struct file *file)
640{
641 return single_open(file, cifs_stats_proc_show, NULL);
642}
643
Alexey Dobriyan97a32532020-02-03 17:37:17 -0800644static const struct proc_ops cifs_stats_proc_ops = {
645 .proc_open = cifs_stats_proc_open,
646 .proc_read = seq_read,
647 .proc_lseek = seq_lseek,
648 .proc_release = single_release,
649 .proc_write = cifs_stats_proc_write,
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000650};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700651
Long Lid8ec9132017-11-07 01:54:58 -0700652#ifdef CONFIG_CIFS_SMB_DIRECT
653#define PROC_FILE_DEFINE(name) \
654static ssize_t name##_write(struct file *file, const char __user *buffer, \
655 size_t count, loff_t *ppos) \
656{ \
657 int rc; \
658 rc = kstrtoint_from_user(buffer, count, 10, & name); \
659 if (rc) \
660 return rc; \
661 return count; \
662} \
663static int name##_proc_show(struct seq_file *m, void *v) \
664{ \
665 seq_printf(m, "%d\n", name ); \
666 return 0; \
667} \
668static int name##_open(struct inode *inode, struct file *file) \
669{ \
670 return single_open(file, name##_proc_show, NULL); \
671} \
672\
Alexey Dobriyan97a32532020-02-03 17:37:17 -0800673static const struct proc_ops cifs_##name##_proc_fops = { \
674 .proc_open = name##_open, \
675 .proc_read = seq_read, \
676 .proc_lseek = seq_lseek, \
677 .proc_release = single_release, \
678 .proc_write = name##_write, \
Long Lid8ec9132017-11-07 01:54:58 -0700679}
680
Long Lid8ec9132017-11-07 01:54:58 -0700681PROC_FILE_DEFINE(rdma_readwrite_threshold);
682PROC_FILE_DEFINE(smbd_max_frmr_depth);
683PROC_FILE_DEFINE(smbd_keep_alive_interval);
684PROC_FILE_DEFINE(smbd_max_receive_size);
685PROC_FILE_DEFINE(smbd_max_fragmented_recv_size);
686PROC_FILE_DEFINE(smbd_max_send_size);
687PROC_FILE_DEFINE(smbd_send_credit_target);
688PROC_FILE_DEFINE(smbd_receive_credit_max);
689#endif
690
Linus Torvalds1da177e2005-04-16 15:20:36 -0700691static struct proc_dir_entry *proc_fs_cifs;
Alexey Dobriyan97a32532020-02-03 17:37:17 -0800692static const struct proc_ops cifsFYI_proc_ops;
693static const struct proc_ops cifs_lookup_cache_proc_ops;
694static const struct proc_ops traceSMB_proc_ops;
695static const struct proc_ops cifs_security_flags_proc_ops;
696static const struct proc_ops cifs_linux_ext_proc_ops;
Aurelien Aptel94b0595a2021-03-18 13:52:59 +0100697static const struct proc_ops cifs_mount_params_proc_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700698
699void
700cifs_proc_init(void)
701{
Alexey Dobriyan36a5aeb2008-04-29 01:01:42 -0700702 proc_fs_cifs = proc_mkdir("fs/cifs", NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700703 if (proc_fs_cifs == NULL)
704 return;
705
Christoph Hellwig3f3942a2018-05-15 15:57:23 +0200706 proc_create_single("DebugData", 0, proc_fs_cifs,
707 cifs_debug_data_proc_show);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700708
Steve Frenchdfe33f92018-10-30 19:50:31 -0500709 proc_create_single("open_files", 0400, proc_fs_cifs,
710 cifs_debug_files_proc_show);
711
Alexey Dobriyan97a32532020-02-03 17:37:17 -0800712 proc_create("Stats", 0644, proc_fs_cifs, &cifs_stats_proc_ops);
713 proc_create("cifsFYI", 0644, proc_fs_cifs, &cifsFYI_proc_ops);
714 proc_create("traceSMB", 0644, proc_fs_cifs, &traceSMB_proc_ops);
Ronnie Sahlberg6539e7f2018-05-24 14:18:05 +1000715 proc_create("LinuxExtensionsEnabled", 0644, proc_fs_cifs,
Alexey Dobriyan97a32532020-02-03 17:37:17 -0800716 &cifs_linux_ext_proc_ops);
Ronnie Sahlberg6539e7f2018-05-24 14:18:05 +1000717 proc_create("SecurityFlags", 0644, proc_fs_cifs,
Alexey Dobriyan97a32532020-02-03 17:37:17 -0800718 &cifs_security_flags_proc_ops);
Ronnie Sahlberg6539e7f2018-05-24 14:18:05 +1000719 proc_create("LookupCacheEnabled", 0644, proc_fs_cifs,
Alexey Dobriyan97a32532020-02-03 17:37:17 -0800720 &cifs_lookup_cache_proc_ops);
Paulo Alcantara54be1f62018-11-14 16:01:21 -0200721
Aurelien Aptel94b0595a2021-03-18 13:52:59 +0100722 proc_create("mount_params", 0444, proc_fs_cifs, &cifs_mount_params_proc_ops);
723
Paulo Alcantara54be1f62018-11-14 16:01:21 -0200724#ifdef CONFIG_CIFS_DFS_UPCALL
Alexey Dobriyan97a32532020-02-03 17:37:17 -0800725 proc_create("dfscache", 0644, proc_fs_cifs, &dfscache_proc_ops);
Paulo Alcantara54be1f62018-11-14 16:01:21 -0200726#endif
727
Long Lid8ec9132017-11-07 01:54:58 -0700728#ifdef CONFIG_CIFS_SMB_DIRECT
Ronnie Sahlberg6539e7f2018-05-24 14:18:05 +1000729 proc_create("rdma_readwrite_threshold", 0644, proc_fs_cifs,
Long Lid8ec9132017-11-07 01:54:58 -0700730 &cifs_rdma_readwrite_threshold_proc_fops);
Ronnie Sahlberg6539e7f2018-05-24 14:18:05 +1000731 proc_create("smbd_max_frmr_depth", 0644, proc_fs_cifs,
Long Lid8ec9132017-11-07 01:54:58 -0700732 &cifs_smbd_max_frmr_depth_proc_fops);
Ronnie Sahlberg6539e7f2018-05-24 14:18:05 +1000733 proc_create("smbd_keep_alive_interval", 0644, proc_fs_cifs,
Long Lid8ec9132017-11-07 01:54:58 -0700734 &cifs_smbd_keep_alive_interval_proc_fops);
Ronnie Sahlberg6539e7f2018-05-24 14:18:05 +1000735 proc_create("smbd_max_receive_size", 0644, proc_fs_cifs,
Long Lid8ec9132017-11-07 01:54:58 -0700736 &cifs_smbd_max_receive_size_proc_fops);
Ronnie Sahlberg6539e7f2018-05-24 14:18:05 +1000737 proc_create("smbd_max_fragmented_recv_size", 0644, proc_fs_cifs,
Long Lid8ec9132017-11-07 01:54:58 -0700738 &cifs_smbd_max_fragmented_recv_size_proc_fops);
Ronnie Sahlberg6539e7f2018-05-24 14:18:05 +1000739 proc_create("smbd_max_send_size", 0644, proc_fs_cifs,
Long Lid8ec9132017-11-07 01:54:58 -0700740 &cifs_smbd_max_send_size_proc_fops);
Ronnie Sahlberg6539e7f2018-05-24 14:18:05 +1000741 proc_create("smbd_send_credit_target", 0644, proc_fs_cifs,
Long Lid8ec9132017-11-07 01:54:58 -0700742 &cifs_smbd_send_credit_target_proc_fops);
Ronnie Sahlberg6539e7f2018-05-24 14:18:05 +1000743 proc_create("smbd_receive_credit_max", 0644, proc_fs_cifs,
Long Lid8ec9132017-11-07 01:54:58 -0700744 &cifs_smbd_receive_credit_max_proc_fops);
745#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700746}
747
748void
749cifs_proc_clean(void)
750{
751 if (proc_fs_cifs == NULL)
752 return;
753
754 remove_proc_entry("DebugData", proc_fs_cifs);
Steve Frenchdfe33f92018-10-30 19:50:31 -0500755 remove_proc_entry("open_files", proc_fs_cifs);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700756 remove_proc_entry("cifsFYI", proc_fs_cifs);
757 remove_proc_entry("traceSMB", proc_fs_cifs);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700758 remove_proc_entry("Stats", proc_fs_cifs);
Steve French221601c2007-06-05 20:35:06 +0000759 remove_proc_entry("SecurityFlags", proc_fs_cifs);
Steve French221601c2007-06-05 20:35:06 +0000760 remove_proc_entry("LinuxExtensionsEnabled", proc_fs_cifs);
Steve French221601c2007-06-05 20:35:06 +0000761 remove_proc_entry("LookupCacheEnabled", proc_fs_cifs);
Aurelien Aptel94b0595a2021-03-18 13:52:59 +0100762 remove_proc_entry("mount_params", proc_fs_cifs);
Paulo Alcantara54be1f62018-11-14 16:01:21 -0200763
764#ifdef CONFIG_CIFS_DFS_UPCALL
765 remove_proc_entry("dfscache", proc_fs_cifs);
766#endif
Long Lid8ec9132017-11-07 01:54:58 -0700767#ifdef CONFIG_CIFS_SMB_DIRECT
768 remove_proc_entry("rdma_readwrite_threshold", proc_fs_cifs);
769 remove_proc_entry("smbd_max_frmr_depth", proc_fs_cifs);
770 remove_proc_entry("smbd_keep_alive_interval", proc_fs_cifs);
771 remove_proc_entry("smbd_max_receive_size", proc_fs_cifs);
772 remove_proc_entry("smbd_max_fragmented_recv_size", proc_fs_cifs);
773 remove_proc_entry("smbd_max_send_size", proc_fs_cifs);
774 remove_proc_entry("smbd_send_credit_target", proc_fs_cifs);
775 remove_proc_entry("smbd_receive_credit_max", proc_fs_cifs);
776#endif
Alexey Dobriyan36a5aeb2008-04-29 01:01:42 -0700777 remove_proc_entry("fs/cifs", NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700778}
779
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000780static int cifsFYI_proc_show(struct seq_file *m, void *v)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700781{
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000782 seq_printf(m, "%d\n", cifsFYI);
783 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700784}
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000785
786static int cifsFYI_proc_open(struct inode *inode, struct file *file)
787{
788 return single_open(file, cifsFYI_proc_show, NULL);
789}
790
791static ssize_t cifsFYI_proc_write(struct file *file, const char __user *buffer,
792 size_t count, loff_t *ppos)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700793{
Kees Cook14042972016-03-17 14:22:54 -0700794 char c[2] = { '\0' };
Andy Shevchenko28e2aed2014-08-27 16:49:42 +0300795 bool bv;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700796 int rc;
797
Kees Cook14042972016-03-17 14:22:54 -0700798 rc = get_user(c[0], buffer);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700799 if (rc)
800 return rc;
Kees Cook14042972016-03-17 14:22:54 -0700801 if (strtobool(c, &bv) == 0)
Andy Shevchenko28e2aed2014-08-27 16:49:42 +0300802 cifsFYI = bv;
Kees Cook14042972016-03-17 14:22:54 -0700803 else if ((c[0] > '1') && (c[0] <= '9'))
804 cifsFYI = (int) (c[0] - '0'); /* see cifs_debug.h for meanings */
Ronnie Sahlberg25ad1cb2018-05-24 09:53:39 +1000805 else
806 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700807
808 return count;
809}
810
Alexey Dobriyan97a32532020-02-03 17:37:17 -0800811static const struct proc_ops cifsFYI_proc_ops = {
812 .proc_open = cifsFYI_proc_open,
813 .proc_read = seq_read,
814 .proc_lseek = seq_lseek,
815 .proc_release = single_release,
816 .proc_write = cifsFYI_proc_write,
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000817};
818
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000819static int cifs_linux_ext_proc_show(struct seq_file *m, void *v)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700820{
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000821 seq_printf(m, "%d\n", linuxExtEnabled);
822 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700823}
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000824
825static int cifs_linux_ext_proc_open(struct inode *inode, struct file *file)
826{
827 return single_open(file, cifs_linux_ext_proc_show, NULL);
828}
829
830static ssize_t cifs_linux_ext_proc_write(struct file *file,
831 const char __user *buffer, size_t count, loff_t *ppos)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700832{
Steve French221601c2007-06-05 20:35:06 +0000833 int rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700834
Kees Cook14042972016-03-17 14:22:54 -0700835 rc = kstrtobool_from_user(buffer, count, &linuxExtEnabled);
Steve French221601c2007-06-05 20:35:06 +0000836 if (rc)
837 return rc;
Andy Shevchenko28e2aed2014-08-27 16:49:42 +0300838
Steve French221601c2007-06-05 20:35:06 +0000839 return count;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700840}
841
Alexey Dobriyan97a32532020-02-03 17:37:17 -0800842static const struct proc_ops cifs_linux_ext_proc_ops = {
843 .proc_open = cifs_linux_ext_proc_open,
844 .proc_read = seq_read,
845 .proc_lseek = seq_lseek,
846 .proc_release = single_release,
847 .proc_write = cifs_linux_ext_proc_write,
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000848};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700849
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000850static int cifs_lookup_cache_proc_show(struct seq_file *m, void *v)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700851{
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000852 seq_printf(m, "%d\n", lookupCacheEnabled);
853 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700854}
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000855
856static int cifs_lookup_cache_proc_open(struct inode *inode, struct file *file)
857{
858 return single_open(file, cifs_lookup_cache_proc_show, NULL);
859}
860
861static ssize_t cifs_lookup_cache_proc_write(struct file *file,
862 const char __user *buffer, size_t count, loff_t *ppos)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700863{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700864 int rc;
865
Kees Cook14042972016-03-17 14:22:54 -0700866 rc = kstrtobool_from_user(buffer, count, &lookupCacheEnabled);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700867 if (rc)
868 return rc;
Andy Shevchenko28e2aed2014-08-27 16:49:42 +0300869
Linus Torvalds1da177e2005-04-16 15:20:36 -0700870 return count;
871}
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000872
Alexey Dobriyan97a32532020-02-03 17:37:17 -0800873static const struct proc_ops cifs_lookup_cache_proc_ops = {
874 .proc_open = cifs_lookup_cache_proc_open,
875 .proc_read = seq_read,
876 .proc_lseek = seq_lseek,
877 .proc_release = single_release,
878 .proc_write = cifs_lookup_cache_proc_write,
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000879};
880
881static int traceSMB_proc_show(struct seq_file *m, void *v)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700882{
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000883 seq_printf(m, "%d\n", traceSMB);
884 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700885}
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000886
887static int traceSMB_proc_open(struct inode *inode, struct file *file)
888{
889 return single_open(file, traceSMB_proc_show, NULL);
890}
891
892static ssize_t traceSMB_proc_write(struct file *file, const char __user *buffer,
893 size_t count, loff_t *ppos)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700894{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700895 int rc;
896
Kees Cook14042972016-03-17 14:22:54 -0700897 rc = kstrtobool_from_user(buffer, count, &traceSMB);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700898 if (rc)
899 return rc;
Andy Shevchenko28e2aed2014-08-27 16:49:42 +0300900
Linus Torvalds1da177e2005-04-16 15:20:36 -0700901 return count;
902}
903
Alexey Dobriyan97a32532020-02-03 17:37:17 -0800904static const struct proc_ops traceSMB_proc_ops = {
905 .proc_open = traceSMB_proc_open,
906 .proc_read = seq_read,
907 .proc_lseek = seq_lseek,
908 .proc_release = single_release,
909 .proc_write = traceSMB_proc_write,
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000910};
911
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000912static int cifs_security_flags_proc_show(struct seq_file *m, void *v)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700913{
Jeff Layton04912d62010-04-24 07:57:45 -0400914 seq_printf(m, "0x%x\n", global_secflags);
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000915 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700916}
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000917
918static int cifs_security_flags_proc_open(struct inode *inode, struct file *file)
919{
920 return single_open(file, cifs_security_flags_proc_show, NULL);
921}
922
Jeff Layton52dfb442013-05-26 07:01:02 -0400923/*
924 * Ensure that if someone sets a MUST flag, that we disable all other MAY
925 * flags except for the ones corresponding to the given MUST flag. If there are
926 * multiple MUST flags, then try to prefer more secure ones.
927 */
928static void
929cifs_security_flags_handle_must_flags(unsigned int *flags)
930{
931 unsigned int signflags = *flags & CIFSSEC_MUST_SIGN;
932
933 if ((*flags & CIFSSEC_MUST_KRB5) == CIFSSEC_MUST_KRB5)
934 *flags = CIFSSEC_MUST_KRB5;
935 else if ((*flags & CIFSSEC_MUST_NTLMSSP) == CIFSSEC_MUST_NTLMSSP)
936 *flags = CIFSSEC_MUST_NTLMSSP;
937 else if ((*flags & CIFSSEC_MUST_NTLMV2) == CIFSSEC_MUST_NTLMV2)
938 *flags = CIFSSEC_MUST_NTLMV2;
Jeff Layton52dfb442013-05-26 07:01:02 -0400939
940 *flags |= signflags;
941}
942
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +0000943static ssize_t cifs_security_flags_proc_write(struct file *file,
944 const char __user *buffer, size_t count, loff_t *ppos)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700945{
Jeff Layton7715dad2013-05-26 07:01:01 -0400946 int rc;
Steve Frenchbdc4bf6e2006-06-02 22:57:13 +0000947 unsigned int flags;
948 char flags_string[12];
Andy Shevchenko28e2aed2014-08-27 16:49:42 +0300949 bool bv;
Steve Frenchbdc4bf6e2006-06-02 22:57:13 +0000950
Steve French221601c2007-06-05 20:35:06 +0000951 if ((count < 1) || (count > 11))
Steve French39798772006-05-31 22:40:51 +0000952 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700953
Steve Frenchbdc4bf6e2006-06-02 22:57:13 +0000954 memset(flags_string, 0, 12);
Steve French39798772006-05-31 22:40:51 +0000955
Steve French221601c2007-06-05 20:35:06 +0000956 if (copy_from_user(flags_string, buffer, count))
Steve Frenchbdc4bf6e2006-06-02 22:57:13 +0000957 return -EFAULT;
Steve French39798772006-05-31 22:40:51 +0000958
Steve French221601c2007-06-05 20:35:06 +0000959 if (count < 3) {
Steve Frenchbdc4bf6e2006-06-02 22:57:13 +0000960 /* single char or single char followed by null */
Kees Cook14042972016-03-17 14:22:54 -0700961 if (strtobool(flags_string, &bv) == 0) {
Andy Shevchenko28e2aed2014-08-27 16:49:42 +0300962 global_secflags = bv ? CIFSSEC_MAX : CIFSSEC_DEF;
Steve Frencha0136892007-10-04 20:05:09 +0000963 return count;
Kees Cook14042972016-03-17 14:22:54 -0700964 } else if (!isdigit(flags_string[0])) {
Jeff Layton7715dad2013-05-26 07:01:01 -0400965 cifs_dbg(VFS, "Invalid SecurityFlags: %s\n",
966 flags_string);
Steve Frencha0136892007-10-04 20:05:09 +0000967 return -EINVAL;
968 }
Steve Frenchbdc4bf6e2006-06-02 22:57:13 +0000969 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700970
Jeff Layton7715dad2013-05-26 07:01:01 -0400971 /* else we have a number */
972 rc = kstrtouint(flags_string, 0, &flags);
973 if (rc) {
974 cifs_dbg(VFS, "Invalid SecurityFlags: %s\n",
975 flags_string);
976 return rc;
977 }
Steve Frenchbdc4bf6e2006-06-02 22:57:13 +0000978
Joe Perchesf96637b2013-05-04 22:12:25 -0500979 cifs_dbg(FYI, "sec flags 0x%x\n", flags);
Steve Frenchbdc4bf6e2006-06-02 22:57:13 +0000980
Jeff Layton7715dad2013-05-26 07:01:01 -0400981 if (flags == 0) {
982 cifs_dbg(VFS, "Invalid SecurityFlags: %s\n", flags_string);
Steve Frenchbdc4bf6e2006-06-02 22:57:13 +0000983 return -EINVAL;
984 }
985
Steve French221601c2007-06-05 20:35:06 +0000986 if (flags & ~CIFSSEC_MASK) {
Jeff Layton7715dad2013-05-26 07:01:01 -0400987 cifs_dbg(VFS, "Unsupported security flags: 0x%x\n",
Joe Perchesf96637b2013-05-04 22:12:25 -0500988 flags & ~CIFSSEC_MASK);
Steve Frenchbdc4bf6e2006-06-02 22:57:13 +0000989 return -EINVAL;
990 }
Jeff Layton7715dad2013-05-26 07:01:01 -0400991
Jeff Layton52dfb442013-05-26 07:01:02 -0400992 cifs_security_flags_handle_must_flags(&flags);
993
Steve Frenchbdc4bf6e2006-06-02 22:57:13 +0000994 /* flags look ok - update the global security flags for cifs module */
Jeff Layton04912d62010-04-24 07:57:45 -0400995 global_secflags = flags;
996 if (global_secflags & CIFSSEC_MUST_SIGN) {
Steve French762e5ab2007-06-28 18:41:42 +0000997 /* requiring signing implies signing is allowed */
Jeff Layton04912d62010-04-24 07:57:45 -0400998 global_secflags |= CIFSSEC_MAY_SIGN;
Joe Perchesf96637b2013-05-04 22:12:25 -0500999 cifs_dbg(FYI, "packet signing now required\n");
Jeff Layton04912d62010-04-24 07:57:45 -04001000 } else if ((global_secflags & CIFSSEC_MAY_SIGN) == 0) {
Joe Perchesf96637b2013-05-04 22:12:25 -05001001 cifs_dbg(FYI, "packet signing disabled\n");
Steve French762e5ab2007-06-28 18:41:42 +00001002 }
1003 /* BB should we turn on MAY flags for other MUST options? */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001004 return count;
1005}
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +00001006
Alexey Dobriyan97a32532020-02-03 17:37:17 -08001007static const struct proc_ops cifs_security_flags_proc_ops = {
1008 .proc_open = cifs_security_flags_proc_open,
1009 .proc_read = seq_read,
1010 .proc_lseek = seq_lseek,
1011 .proc_release = single_release,
1012 .proc_write = cifs_security_flags_proc_write,
Alexey Dobriyanf984c7b2008-07-24 02:34:24 +00001013};
Aurelien Aptel94b0595a2021-03-18 13:52:59 +01001014
1015/* To make it easier to debug, can help to show mount params */
1016static int cifs_mount_params_proc_show(struct seq_file *m, void *v)
1017{
1018 const struct fs_parameter_spec *p;
1019 const char *type;
1020
1021 for (p = smb3_fs_parameters; p->name; p++) {
1022 /* cannot use switch with pointers... */
1023 if (!p->type) {
1024 if (p->flags == fs_param_neg_with_no)
1025 type = "noflag";
1026 else
1027 type = "flag";
1028 } else if (p->type == fs_param_is_bool)
1029 type = "bool";
1030 else if (p->type == fs_param_is_u32)
1031 type = "u32";
1032 else if (p->type == fs_param_is_u64)
1033 type = "u64";
1034 else if (p->type == fs_param_is_string)
1035 type = "string";
1036 else
1037 type = "unknown";
1038
1039 seq_printf(m, "%s:%s\n", p->name, type);
1040 }
1041
1042 return 0;
1043}
1044
1045static int cifs_mount_params_proc_open(struct inode *inode, struct file *file)
1046{
1047 return single_open(file, cifs_mount_params_proc_show, NULL);
1048}
1049
1050static const struct proc_ops cifs_mount_params_proc_ops = {
1051 .proc_open = cifs_mount_params_proc_open,
1052 .proc_read = seq_read,
1053 .proc_lseek = seq_lseek,
1054 .proc_release = single_release,
1055 /* No need for write for now */
1056 /* .proc_write = cifs_mount_params_proc_write, */
1057};
1058
Steve French90c81e02008-02-12 20:32:36 +00001059#else
Steve Frenche086fce2008-02-18 04:03:58 +00001060inline void cifs_proc_init(void)
Steve French90c81e02008-02-12 20:32:36 +00001061{
1062}
1063
Steve Frenche086fce2008-02-18 04:03:58 +00001064inline void cifs_proc_clean(void)
Steve French90c81e02008-02-12 20:32:36 +00001065{
1066}
1067#endif /* PROC_FS */