1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#include <linux/module.h>
27#include <linux/fs.h>
28#include <linux/mount.h>
29#include <linux/slab.h>
30#include <linux/init.h>
31#include <linux/list.h>
32#include <linux/seq_file.h>
33#include <linux/vfs.h>
34#include <linux/mempool.h>
35#include <linux/delay.h>
36#include <linux/kthread.h>
37#include <linux/freezer.h>
38#include <linux/namei.h>
39#include <linux/random.h>
40#include <linux/uuid.h>
41#include <linux/xattr.h>
42#include <net/ipv6.h>
43#include "cifsfs.h"
44#include "cifspdu.h"
45#define DECLARE_GLOBALS_HERE
46#include "cifsglob.h"
47#include "cifsproto.h"
48#include "cifs_debug.h"
49#include "cifs_fs_sb.h"
50#include <linux/mm.h>
51#include <linux/key-type.h>
52#include "cifs_spnego.h"
53#include "fscache.h"
54#include "smb2pdu.h"
55#ifdef CONFIG_CIFS_DFS_UPCALL
56#include "dfs_cache.h"
57#endif
58
59
60
61
62
63
64#define SMB_DATE_MAX (127<<9 | 12<<5 | 31)
65#define SMB_DATE_MIN (0<<9 | 1<<5 | 1)
66#define SMB_TIME_MAX (23<<11 | 59<<5 | 29)
67
68int cifsFYI = 0;
69bool traceSMB;
70bool enable_oplocks = true;
71bool linuxExtEnabled = true;
72bool lookupCacheEnabled = true;
73bool disable_legacy_dialects;
74unsigned int global_secflags = CIFSSEC_DEF;
75
76unsigned int sign_CIFS_PDUs = 1;
77static const struct super_operations cifs_super_ops;
78unsigned int CIFSMaxBufSize = CIFS_MAX_MSGSIZE;
79module_param(CIFSMaxBufSize, uint, 0444);
80MODULE_PARM_DESC(CIFSMaxBufSize, "Network buffer size (not including header) "
81 "for CIFS requests. "
82 "Default: 16384 Range: 8192 to 130048");
83unsigned int cifs_min_rcv = CIFS_MIN_RCV_POOL;
84module_param(cifs_min_rcv, uint, 0444);
85MODULE_PARM_DESC(cifs_min_rcv, "Network buffers in pool. Default: 4 Range: "
86 "1 to 64");
87unsigned int cifs_min_small = 30;
88module_param(cifs_min_small, uint, 0444);
89MODULE_PARM_DESC(cifs_min_small, "Small network buffers in pool. Default: 30 "
90 "Range: 2 to 256");
91unsigned int cifs_max_pending = CIFS_MAX_REQ;
92module_param(cifs_max_pending, uint, 0444);
93MODULE_PARM_DESC(cifs_max_pending, "Simultaneous requests to server for "
94 "CIFS/SMB1 dialect (N/A for SMB3) "
95 "Default: 32767 Range: 2 to 32767.");
96#ifdef CONFIG_CIFS_STATS2
97unsigned int slow_rsp_threshold = 1;
98module_param(slow_rsp_threshold, uint, 0644);
99MODULE_PARM_DESC(slow_rsp_threshold, "Amount of time (in seconds) to wait "
100 "before logging that a response is delayed. "
101 "Default: 1 (if set to 0 disables msg).");
102#endif
103
104module_param(enable_oplocks, bool, 0644);
105MODULE_PARM_DESC(enable_oplocks, "Enable or disable oplocks. Default: y/Y/1");
106
107module_param(disable_legacy_dialects, bool, 0644);
108MODULE_PARM_DESC(disable_legacy_dialects, "To improve security it may be "
109 "helpful to restrict the ability to "
110 "override the default dialects (SMB2.1, "
111 "SMB3 and SMB3.02) on mount with old "
112 "dialects (CIFS/SMB1 and SMB2) since "
113 "vers=1.0 (CIFS/SMB1) and vers=2.0 are weaker"
114 " and less secure. Default: n/N/0");
115
116extern mempool_t *cifs_sm_req_poolp;
117extern mempool_t *cifs_req_poolp;
118extern mempool_t *cifs_mid_poolp;
119
120struct workqueue_struct *cifsiod_wq;
121struct workqueue_struct *decrypt_wq;
122struct workqueue_struct *fileinfo_put_wq;
123struct workqueue_struct *cifsoplockd_wq;
124__u32 cifs_lock_secret;
125
126
127
128
129
130
131
132void
133cifs_sb_active(struct super_block *sb)
134{
135 struct cifs_sb_info *server = CIFS_SB(sb);
136
137 if (atomic_inc_return(&server->active) == 1)
138 atomic_inc(&sb->s_active);
139}
140
141void
142cifs_sb_deactive(struct super_block *sb)
143{
144 struct cifs_sb_info *server = CIFS_SB(sb);
145
146 if (atomic_dec_and_test(&server->active))
147 deactivate_super(sb);
148}
149
150static int
151cifs_read_super(struct super_block *sb)
152{
153 struct inode *inode;
154 struct cifs_sb_info *cifs_sb;
155 struct cifs_tcon *tcon;
156 struct timespec64 ts;
157 int rc = 0;
158
159 cifs_sb = CIFS_SB(sb);
160 tcon = cifs_sb_master_tcon(cifs_sb);
161
162 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIXACL)
163 sb->s_flags |= SB_POSIXACL;
164
165 if (tcon->snapshot_time)
166 sb->s_flags |= SB_RDONLY;
167
168 if (tcon->ses->capabilities & tcon->ses->server->vals->cap_large_files)
169 sb->s_maxbytes = MAX_LFS_FILESIZE;
170 else
171 sb->s_maxbytes = MAX_NON_LFS;
172
173
174
175
176
177
178
179
180 if ((tcon->ses->server->vals->protocol_id == SMB10_PROT_ID) &&
181 ((tcon->ses->capabilities &
182 tcon->ses->server->vals->cap_nt_find) == 0) &&
183 !tcon->unix_ext) {
184 sb->s_time_gran = 1000000000;
185 ts = cnvrtDosUnixTm(cpu_to_le16(SMB_DATE_MIN), 0, 0);
186 sb->s_time_min = ts.tv_sec;
187 ts = cnvrtDosUnixTm(cpu_to_le16(SMB_DATE_MAX),
188 cpu_to_le16(SMB_TIME_MAX), 0);
189 sb->s_time_max = ts.tv_sec;
190 } else {
191
192
193
194
195 sb->s_time_gran = 100;
196 ts = cifs_NTtimeToUnix(0);
197 sb->s_time_min = ts.tv_sec;
198 ts = cifs_NTtimeToUnix(cpu_to_le64(S64_MAX));
199 sb->s_time_max = ts.tv_sec;
200 }
201
202 sb->s_magic = CIFS_MAGIC_NUMBER;
203 sb->s_op = &cifs_super_ops;
204 sb->s_xattr = cifs_xattr_handlers;
205 rc = super_setup_bdi(sb);
206 if (rc)
207 goto out_no_root;
208
209 sb->s_bdi->ra_pages = cifs_sb->rsize / PAGE_SIZE;
210
211 sb->s_blocksize = CIFS_MAX_MSGSIZE;
212 sb->s_blocksize_bits = 14;
213 inode = cifs_root_iget(sb);
214
215 if (IS_ERR(inode)) {
216 rc = PTR_ERR(inode);
217 goto out_no_root;
218 }
219
220 if (tcon->nocase)
221 sb->s_d_op = &cifs_ci_dentry_ops;
222 else
223 sb->s_d_op = &cifs_dentry_ops;
224
225 sb->s_root = d_make_root(inode);
226 if (!sb->s_root) {
227 rc = -ENOMEM;
228 goto out_no_root;
229 }
230
231#ifdef CONFIG_CIFS_NFSD_EXPORT
232 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
233 cifs_dbg(FYI, "export ops supported\n");
234 sb->s_export_op = &cifs_export_ops;
235 }
236#endif
237
238 return 0;
239
240out_no_root:
241 cifs_dbg(VFS, "%s: get root inode failed\n", __func__);
242 return rc;
243}
244
245static void cifs_kill_sb(struct super_block *sb)
246{
247 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
248 kill_anon_super(sb);
249 cifs_umount(cifs_sb);
250}
251
252static int
253cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
254{
255 struct super_block *sb = dentry->d_sb;
256 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
257 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
258 struct TCP_Server_Info *server = tcon->ses->server;
259 unsigned int xid;
260 int rc = 0;
261
262 xid = get_xid();
263
264 if (le32_to_cpu(tcon->fsAttrInfo.MaxPathNameComponentLength) > 0)
265 buf->f_namelen =
266 le32_to_cpu(tcon->fsAttrInfo.MaxPathNameComponentLength);
267 else
268 buf->f_namelen = PATH_MAX;
269
270 buf->f_fsid.val[0] = tcon->vol_serial_number;
271
272 buf->f_fsid.val[1] = (int)le64_to_cpu(tcon->vol_create_time);
273
274 buf->f_files = 0;
275 buf->f_ffree = 0;
276
277 if (server->ops->queryfs)
278 rc = server->ops->queryfs(xid, tcon, buf);
279
280 free_xid(xid);
281 return 0;
282}
283
284static long cifs_fallocate(struct file *file, int mode, loff_t off, loff_t len)
285{
286 struct cifs_sb_info *cifs_sb = CIFS_FILE_SB(file);
287 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
288 struct TCP_Server_Info *server = tcon->ses->server;
289
290 if (server->ops->fallocate)
291 return server->ops->fallocate(file, tcon, mode, off, len);
292
293 return -EOPNOTSUPP;
294}
295
296static int cifs_permission(struct inode *inode, int mask)
297{
298 struct cifs_sb_info *cifs_sb;
299
300 cifs_sb = CIFS_SB(inode->i_sb);
301
302 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM) {
303 if ((mask & MAY_EXEC) && !execute_ok(inode))
304 return -EACCES;
305 else
306 return 0;
307 } else
308
309
310
311 return generic_permission(inode, mask);
312}
313
314static struct kmem_cache *cifs_inode_cachep;
315static struct kmem_cache *cifs_req_cachep;
316static struct kmem_cache *cifs_mid_cachep;
317static struct kmem_cache *cifs_sm_req_cachep;
318mempool_t *cifs_sm_req_poolp;
319mempool_t *cifs_req_poolp;
320mempool_t *cifs_mid_poolp;
321
322static struct inode *
323cifs_alloc_inode(struct super_block *sb)
324{
325 struct cifsInodeInfo *cifs_inode;
326 cifs_inode = kmem_cache_alloc(cifs_inode_cachep, GFP_KERNEL);
327 if (!cifs_inode)
328 return NULL;
329 cifs_inode->cifsAttrs = 0x20;
330 cifs_inode->time = 0;
331
332
333
334
335 cifs_set_oplock_level(cifs_inode, 0);
336 cifs_inode->flags = 0;
337 spin_lock_init(&cifs_inode->writers_lock);
338 cifs_inode->writers = 0;
339 cifs_inode->vfs_inode.i_blkbits = 14;
340 cifs_inode->server_eof = 0;
341 cifs_inode->uniqueid = 0;
342 cifs_inode->createtime = 0;
343 cifs_inode->epoch = 0;
344 spin_lock_init(&cifs_inode->open_file_lock);
345 generate_random_uuid(cifs_inode->lease_key);
346
347
348
349
350
351
352 INIT_LIST_HEAD(&cifs_inode->openFileList);
353 INIT_LIST_HEAD(&cifs_inode->llist);
354 return &cifs_inode->vfs_inode;
355}
356
357static void
358cifs_free_inode(struct inode *inode)
359{
360 kmem_cache_free(cifs_inode_cachep, CIFS_I(inode));
361}
362
363static void
364cifs_evict_inode(struct inode *inode)
365{
366 truncate_inode_pages_final(&inode->i_data);
367 clear_inode(inode);
368 cifs_fscache_release_inode_cookie(inode);
369}
370
371static void
372cifs_show_address(struct seq_file *s, struct TCP_Server_Info *server)
373{
374 struct sockaddr_in *sa = (struct sockaddr_in *) &server->dstaddr;
375 struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *) &server->dstaddr;
376
377 seq_puts(s, ",addr=");
378
379 switch (server->dstaddr.ss_family) {
380 case AF_INET:
381 seq_printf(s, "%pI4", &sa->sin_addr.s_addr);
382 break;
383 case AF_INET6:
384 seq_printf(s, "%pI6", &sa6->sin6_addr.s6_addr);
385 if (sa6->sin6_scope_id)
386 seq_printf(s, "%%%u", sa6->sin6_scope_id);
387 break;
388 default:
389 seq_puts(s, "(unknown)");
390 }
391 if (server->rdma)
392 seq_puts(s, ",rdma");
393}
394
395static void
396cifs_show_security(struct seq_file *s, struct cifs_ses *ses)
397{
398 if (ses->sectype == Unspecified) {
399 if (ses->user_name == NULL)
400 seq_puts(s, ",sec=none");
401 return;
402 }
403
404 seq_puts(s, ",sec=");
405
406 switch (ses->sectype) {
407 case LANMAN:
408 seq_puts(s, "lanman");
409 break;
410 case NTLMv2:
411 seq_puts(s, "ntlmv2");
412 break;
413 case NTLM:
414 seq_puts(s, "ntlm");
415 break;
416 case Kerberos:
417 seq_printf(s, "krb5,cruid=%u", from_kuid_munged(&init_user_ns,ses->cred_uid));
418 break;
419 case RawNTLMSSP:
420 seq_puts(s, "ntlmssp");
421 break;
422 default:
423
424 seq_puts(s, "unknown");
425 break;
426 }
427
428 if (ses->sign)
429 seq_puts(s, "i");
430}
431
432static void
433cifs_show_cache_flavor(struct seq_file *s, struct cifs_sb_info *cifs_sb)
434{
435 seq_puts(s, ",cache=");
436
437 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO)
438 seq_puts(s, "strict");
439 else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO)
440 seq_puts(s, "none");
441 else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RW_CACHE)
442 seq_puts(s, "singleclient");
443 else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE)
444 seq_puts(s, "ro");
445 else
446 seq_puts(s, "loose");
447}
448
449static void
450cifs_show_nls(struct seq_file *s, struct nls_table *cur)
451{
452 struct nls_table *def;
453
454
455 def = load_nls_default();
456 if (def != cur)
457 seq_printf(s, ",iocharset=%s", cur->charset);
458 unload_nls(def);
459}
460
461
462
463
464
465
466static int
467cifs_show_options(struct seq_file *s, struct dentry *root)
468{
469 struct cifs_sb_info *cifs_sb = CIFS_SB(root->d_sb);
470 struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
471 struct sockaddr *srcaddr;
472 srcaddr = (struct sockaddr *)&tcon->ses->server->srcaddr;
473
474 seq_show_option(s, "vers", tcon->ses->server->vals->version_string);
475 cifs_show_security(s, tcon->ses);
476 cifs_show_cache_flavor(s, cifs_sb);
477
478 if (tcon->no_lease)
479 seq_puts(s, ",nolease");
480 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER)
481 seq_puts(s, ",multiuser");
482 else if (tcon->ses->user_name)
483 seq_show_option(s, "username", tcon->ses->user_name);
484
485 if (tcon->ses->domainName && tcon->ses->domainName[0] != 0)
486 seq_show_option(s, "domain", tcon->ses->domainName);
487
488 if (srcaddr->sa_family != AF_UNSPEC) {
489 struct sockaddr_in *saddr4;
490 struct sockaddr_in6 *saddr6;
491 saddr4 = (struct sockaddr_in *)srcaddr;
492 saddr6 = (struct sockaddr_in6 *)srcaddr;
493 if (srcaddr->sa_family == AF_INET6)
494 seq_printf(s, ",srcaddr=%pI6c",
495 &saddr6->sin6_addr);
496 else if (srcaddr->sa_family == AF_INET)
497 seq_printf(s, ",srcaddr=%pI4",
498 &saddr4->sin_addr.s_addr);
499 else
500 seq_printf(s, ",srcaddr=BAD-AF:%i",
501 (int)(srcaddr->sa_family));
502 }
503
504 seq_printf(s, ",uid=%u",
505 from_kuid_munged(&init_user_ns, cifs_sb->mnt_uid));
506 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)
507 seq_puts(s, ",forceuid");
508 else
509 seq_puts(s, ",noforceuid");
510
511 seq_printf(s, ",gid=%u",
512 from_kgid_munged(&init_user_ns, cifs_sb->mnt_gid));
513 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)
514 seq_puts(s, ",forcegid");
515 else
516 seq_puts(s, ",noforcegid");
517
518 cifs_show_address(s, tcon->ses->server);
519
520 if (!tcon->unix_ext)
521 seq_printf(s, ",file_mode=0%ho,dir_mode=0%ho",
522 cifs_sb->mnt_file_mode,
523 cifs_sb->mnt_dir_mode);
524
525 cifs_show_nls(s, cifs_sb->local_nls);
526
527 if (tcon->seal)
528 seq_puts(s, ",seal");
529 if (tcon->nocase)
530 seq_puts(s, ",nocase");
531 if (tcon->local_lease)
532 seq_puts(s, ",locallease");
533 if (tcon->retry)
534 seq_puts(s, ",hard");
535 else
536 seq_puts(s, ",soft");
537 if (tcon->use_persistent)
538 seq_puts(s, ",persistenthandles");
539 else if (tcon->use_resilient)
540 seq_puts(s, ",resilienthandles");
541 if (tcon->posix_extensions)
542 seq_puts(s, ",posix");
543 else if (tcon->unix_ext)
544 seq_puts(s, ",unix");
545 else
546 seq_puts(s, ",nounix");
547 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
548 seq_puts(s, ",nodfs");
549 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS)
550 seq_puts(s, ",posixpaths");
551 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID)
552 seq_puts(s, ",setuids");
553 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UID_FROM_ACL)
554 seq_puts(s, ",idsfromsid");
555 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
556 seq_puts(s, ",serverino");
557 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD)
558 seq_puts(s, ",rwpidforward");
559 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL)
560 seq_puts(s, ",forcemand");
561 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR)
562 seq_puts(s, ",nouser_xattr");
563 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR)
564 seq_puts(s, ",mapchars");
565 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SFM_CHR)
566 seq_puts(s, ",mapposix");
567 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
568 seq_puts(s, ",sfu");
569 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
570 seq_puts(s, ",nobrl");
571 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_HANDLE_CACHE)
572 seq_puts(s, ",nohandlecache");
573 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)
574 seq_puts(s, ",modefromsid");
575 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL)
576 seq_puts(s, ",cifsacl");
577 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
578 seq_puts(s, ",dynperm");
579 if (root->d_sb->s_flags & SB_POSIXACL)
580 seq_puts(s, ",acl");
581 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS)
582 seq_puts(s, ",mfsymlinks");
583 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_FSCACHE)
584 seq_puts(s, ",fsc");
585 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)
586 seq_puts(s, ",nostrictsync");
587 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
588 seq_puts(s, ",noperm");
589 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_BACKUPUID)
590 seq_printf(s, ",backupuid=%u",
591 from_kuid_munged(&init_user_ns,
592 cifs_sb->mnt_backupuid));
593 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_BACKUPGID)
594 seq_printf(s, ",backupgid=%u",
595 from_kgid_munged(&init_user_ns,
596 cifs_sb->mnt_backupgid));
597
598 seq_printf(s, ",rsize=%u", cifs_sb->rsize);
599 seq_printf(s, ",wsize=%u", cifs_sb->wsize);
600 seq_printf(s, ",bsize=%u", cifs_sb->bsize);
601 if (tcon->ses->server->min_offload)
602 seq_printf(s, ",esize=%u", tcon->ses->server->min_offload);
603 seq_printf(s, ",echo_interval=%lu",
604 tcon->ses->server->echo_interval / HZ);
605
606
607 if (tcon->ses->server->max_credits != SMB2_MAX_CREDITS_AVAILABLE)
608 seq_printf(s, ",max_credits=%u", tcon->ses->server->max_credits);
609
610 if (tcon->snapshot_time)
611 seq_printf(s, ",snapshot=%llu", tcon->snapshot_time);
612 if (tcon->handle_timeout)
613 seq_printf(s, ",handletimeout=%u", tcon->handle_timeout);
614
615 seq_printf(s, ",actimeo=%lu", cifs_sb->actimeo / HZ);
616
617 if (tcon->ses->chan_max > 1)
618 seq_printf(s, ",multichannel,max_channel=%zu",
619 tcon->ses->chan_max);
620
621 return 0;
622}
623
624static void cifs_umount_begin(struct super_block *sb)
625{
626 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
627 struct cifs_tcon *tcon;
628
629 if (cifs_sb == NULL)
630 return;
631
632 tcon = cifs_sb_master_tcon(cifs_sb);
633
634 spin_lock(&cifs_tcp_ses_lock);
635 if ((tcon->tc_count > 1) || (tcon->tidStatus == CifsExiting)) {
636
637
638
639 spin_unlock(&cifs_tcp_ses_lock);
640 return;
641 } else if (tcon->tc_count == 1)
642 tcon->tidStatus = CifsExiting;
643 spin_unlock(&cifs_tcp_ses_lock);
644
645
646
647 if (tcon->ses && tcon->ses->server) {
648 cifs_dbg(FYI, "wake up tasks now - umount begin not complete\n");
649 wake_up_all(&tcon->ses->server->request_q);
650 wake_up_all(&tcon->ses->server->response_q);
651 msleep(1);
652
653 wake_up_all(&tcon->ses->server->response_q);
654 msleep(1);
655 }
656
657 return;
658}
659
660#ifdef CONFIG_CIFS_STATS2
661static int cifs_show_stats(struct seq_file *s, struct dentry *root)
662{
663
664 return 0;
665}
666#endif
667
668static int cifs_remount(struct super_block *sb, int *flags, char *data)
669{
670 sync_filesystem(sb);
671 *flags |= SB_NODIRATIME;
672 return 0;
673}
674
675static int cifs_drop_inode(struct inode *inode)
676{
677 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
678
679
680 return !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) ||
681 generic_drop_inode(inode);
682}
683
684static const struct super_operations cifs_super_ops = {
685 .statfs = cifs_statfs,
686 .alloc_inode = cifs_alloc_inode,
687 .free_inode = cifs_free_inode,
688 .drop_inode = cifs_drop_inode,
689 .evict_inode = cifs_evict_inode,
690
691
692
693
694 .show_options = cifs_show_options,
695 .umount_begin = cifs_umount_begin,
696 .remount_fs = cifs_remount,
697#ifdef CONFIG_CIFS_STATS2
698 .show_stats = cifs_show_stats,
699#endif
700};
701
702
703
704
705
706static struct dentry *
707cifs_get_root(struct smb_vol *vol, struct super_block *sb)
708{
709 struct dentry *dentry;
710 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
711 char *full_path = NULL;
712 char *s, *p;
713 char sep;
714
715 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH)
716 return dget(sb->s_root);
717
718 full_path = cifs_build_path_to_root(vol, cifs_sb,
719 cifs_sb_master_tcon(cifs_sb), 0);
720 if (full_path == NULL)
721 return ERR_PTR(-ENOMEM);
722
723 cifs_dbg(FYI, "Get root dentry for %s\n", full_path);
724
725 sep = CIFS_DIR_SEP(cifs_sb);
726 dentry = dget(sb->s_root);
727 p = s = full_path;
728
729 do {
730 struct inode *dir = d_inode(dentry);
731 struct dentry *child;
732
733 if (!S_ISDIR(dir->i_mode)) {
734 dput(dentry);
735 dentry = ERR_PTR(-ENOTDIR);
736 break;
737 }
738
739
740 while (*s == sep)
741 s++;
742 if (!*s)
743 break;
744 p = s++;
745
746 while (*s && *s != sep)
747 s++;
748
749 child = lookup_positive_unlocked(p, dentry, s - p);
750 dput(dentry);
751 dentry = child;
752 } while (!IS_ERR(dentry));
753 kfree(full_path);
754 return dentry;
755}
756
757static int cifs_set_super(struct super_block *sb, void *data)
758{
759 struct cifs_mnt_data *mnt_data = data;
760 sb->s_fs_info = mnt_data->cifs_sb;
761 return set_anon_super(sb, NULL);
762}
763
764static struct dentry *
765cifs_smb3_do_mount(struct file_system_type *fs_type,
766 int flags, const char *dev_name, void *data, bool is_smb3)
767{
768 int rc;
769 struct super_block *sb;
770 struct cifs_sb_info *cifs_sb;
771 struct smb_vol *volume_info;
772 struct cifs_mnt_data mnt_data;
773 struct dentry *root;
774
775
776
777
778
779 if (cifsFYI)
780 cifs_dbg(FYI, "Devname: %s flags: %d\n", dev_name, flags);
781 else
782 cifs_info("Attempting to mount %s\n", dev_name);
783
784 volume_info = cifs_get_volume_info((char *)data, dev_name, is_smb3);
785 if (IS_ERR(volume_info))
786 return ERR_CAST(volume_info);
787
788 cifs_sb = kzalloc(sizeof(struct cifs_sb_info), GFP_KERNEL);
789 if (cifs_sb == NULL) {
790 root = ERR_PTR(-ENOMEM);
791 goto out_nls;
792 }
793
794 cifs_sb->mountdata = kstrndup(data, PAGE_SIZE, GFP_KERNEL);
795 if (cifs_sb->mountdata == NULL) {
796 root = ERR_PTR(-ENOMEM);
797 goto out_free;
798 }
799
800 rc = cifs_setup_cifs_sb(volume_info, cifs_sb);
801 if (rc) {
802 root = ERR_PTR(rc);
803 goto out_free;
804 }
805
806 rc = cifs_mount(cifs_sb, volume_info);
807 if (rc) {
808 if (!(flags & SB_SILENT))
809 cifs_dbg(VFS, "cifs_mount failed w/return code = %d\n",
810 rc);
811 root = ERR_PTR(rc);
812 goto out_free;
813 }
814
815 mnt_data.vol = volume_info;
816 mnt_data.cifs_sb = cifs_sb;
817 mnt_data.flags = flags;
818
819
820 flags |= SB_NODIRATIME | SB_NOATIME;
821
822 sb = sget(fs_type, cifs_match_super, cifs_set_super, flags, &mnt_data);
823 if (IS_ERR(sb)) {
824 root = ERR_CAST(sb);
825 cifs_umount(cifs_sb);
826 goto out;
827 }
828
829 if (sb->s_root) {
830 cifs_dbg(FYI, "Use existing superblock\n");
831 cifs_umount(cifs_sb);
832 } else {
833 rc = cifs_read_super(sb);
834 if (rc) {
835 root = ERR_PTR(rc);
836 goto out_super;
837 }
838
839 sb->s_flags |= SB_ACTIVE;
840 }
841
842 root = cifs_get_root(volume_info, sb);
843 if (IS_ERR(root))
844 goto out_super;
845
846 cifs_dbg(FYI, "dentry root is: %p\n", root);
847 goto out;
848
849out_super:
850 deactivate_locked_super(sb);
851out:
852 cifs_cleanup_volume_info(volume_info);
853 return root;
854
855out_free:
856 kfree(cifs_sb->prepath);
857 kfree(cifs_sb->mountdata);
858 kfree(cifs_sb);
859out_nls:
860 unload_nls(volume_info->local_nls);
861 goto out;
862}
863
864static struct dentry *
865smb3_do_mount(struct file_system_type *fs_type,
866 int flags, const char *dev_name, void *data)
867{
868 return cifs_smb3_do_mount(fs_type, flags, dev_name, data, true);
869}
870
871static struct dentry *
872cifs_do_mount(struct file_system_type *fs_type,
873 int flags, const char *dev_name, void *data)
874{
875 return cifs_smb3_do_mount(fs_type, flags, dev_name, data, false);
876}
877
878static ssize_t
879cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter)
880{
881 ssize_t rc;
882 struct inode *inode = file_inode(iocb->ki_filp);
883
884 if (iocb->ki_filp->f_flags & O_DIRECT)
885 return cifs_user_readv(iocb, iter);
886
887 rc = cifs_revalidate_mapping(inode);
888 if (rc)
889 return rc;
890
891 return generic_file_read_iter(iocb, iter);
892}
893
894static ssize_t cifs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
895{
896 struct inode *inode = file_inode(iocb->ki_filp);
897 struct cifsInodeInfo *cinode = CIFS_I(inode);
898 ssize_t written;
899 int rc;
900
901 if (iocb->ki_filp->f_flags & O_DIRECT) {
902 written = cifs_user_writev(iocb, from);
903 if (written > 0 && CIFS_CACHE_READ(cinode)) {
904 cifs_zap_mapping(inode);
905 cifs_dbg(FYI,
906 "Set no oplock for inode=%p after a write operation\n",
907 inode);
908 cinode->oplock = 0;
909 }
910 return written;
911 }
912
913 written = cifs_get_writer(cinode);
914 if (written)
915 return written;
916
917 written = generic_file_write_iter(iocb, from);
918
919 if (CIFS_CACHE_WRITE(CIFS_I(inode)))
920 goto out;
921
922 rc = filemap_fdatawrite(inode->i_mapping);
923 if (rc)
924 cifs_dbg(FYI, "cifs_file_write_iter: %d rc on %p inode\n",
925 rc, inode);
926
927out:
928 cifs_put_writer(cinode);
929 return written;
930}
931
932static loff_t cifs_llseek(struct file *file, loff_t offset, int whence)
933{
934 struct cifsFileInfo *cfile = file->private_data;
935 struct cifs_tcon *tcon;
936
937
938
939
940
941 if (whence != SEEK_SET && whence != SEEK_CUR) {
942 int rc;
943 struct inode *inode = file_inode(file);
944
945
946
947
948
949 if (!CIFS_CACHE_READ(CIFS_I(inode)) && inode->i_mapping &&
950 inode->i_mapping->nrpages != 0) {
951 rc = filemap_fdatawait(inode->i_mapping);
952 if (rc) {
953 mapping_set_error(inode->i_mapping, rc);
954 return rc;
955 }
956 }
957
958
959
960
961
962 CIFS_I(inode)->time = 0;
963
964 rc = cifs_revalidate_file_attr(file);
965 if (rc < 0)
966 return (loff_t)rc;
967 }
968 if (cfile && cfile->tlink) {
969 tcon = tlink_tcon(cfile->tlink);
970 if (tcon->ses->server->ops->llseek)
971 return tcon->ses->server->ops->llseek(file, tcon,
972 offset, whence);
973 }
974 return generic_file_llseek(file, offset, whence);
975}
976
977static int
978cifs_setlease(struct file *file, long arg, struct file_lock **lease, void **priv)
979{
980
981
982
983
984 struct inode *inode = file_inode(file);
985 struct cifsFileInfo *cfile = file->private_data;
986
987 if (!(S_ISREG(inode->i_mode)))
988 return -EINVAL;
989
990
991 if (arg == F_UNLCK ||
992 ((arg == F_RDLCK) && CIFS_CACHE_READ(CIFS_I(inode))) ||
993 ((arg == F_WRLCK) && CIFS_CACHE_WRITE(CIFS_I(inode))))
994 return generic_setlease(file, arg, lease, priv);
995 else if (tlink_tcon(cfile->tlink)->local_lease &&
996 !CIFS_CACHE_READ(CIFS_I(inode)))
997
998
999
1000
1001
1002
1003
1004
1005 return generic_setlease(file, arg, lease, priv);
1006 else
1007 return -EAGAIN;
1008}
1009
1010struct file_system_type cifs_fs_type = {
1011 .owner = THIS_MODULE,
1012 .name = "cifs",
1013 .mount = cifs_do_mount,
1014 .kill_sb = cifs_kill_sb,
1015
1016};
1017MODULE_ALIAS_FS("cifs");
1018
1019static struct file_system_type smb3_fs_type = {
1020 .owner = THIS_MODULE,
1021 .name = "smb3",
1022 .mount = smb3_do_mount,
1023 .kill_sb = cifs_kill_sb,
1024
1025};
1026MODULE_ALIAS_FS("smb3");
1027MODULE_ALIAS("smb3");
1028
1029const struct inode_operations cifs_dir_inode_ops = {
1030 .create = cifs_create,
1031 .atomic_open = cifs_atomic_open,
1032 .lookup = cifs_lookup,
1033 .getattr = cifs_getattr,
1034 .unlink = cifs_unlink,
1035 .link = cifs_hardlink,
1036 .mkdir = cifs_mkdir,
1037 .rmdir = cifs_rmdir,
1038 .rename = cifs_rename2,
1039 .permission = cifs_permission,
1040 .setattr = cifs_setattr,
1041 .symlink = cifs_symlink,
1042 .mknod = cifs_mknod,
1043 .listxattr = cifs_listxattr,
1044};
1045
1046const struct inode_operations cifs_file_inode_ops = {
1047 .setattr = cifs_setattr,
1048 .getattr = cifs_getattr,
1049 .permission = cifs_permission,
1050 .listxattr = cifs_listxattr,
1051 .fiemap = cifs_fiemap,
1052};
1053
1054const struct inode_operations cifs_symlink_inode_ops = {
1055 .get_link = cifs_get_link,
1056 .permission = cifs_permission,
1057 .listxattr = cifs_listxattr,
1058};
1059
1060static loff_t cifs_remap_file_range(struct file *src_file, loff_t off,
1061 struct file *dst_file, loff_t destoff, loff_t len,
1062 unsigned int remap_flags)
1063{
1064 struct inode *src_inode = file_inode(src_file);
1065 struct inode *target_inode = file_inode(dst_file);
1066 struct cifsFileInfo *smb_file_src = src_file->private_data;
1067 struct cifsFileInfo *smb_file_target;
1068 struct cifs_tcon *target_tcon;
1069 unsigned int xid;
1070 int rc;
1071
1072 if (remap_flags & ~(REMAP_FILE_DEDUP | REMAP_FILE_ADVISORY))
1073 return -EINVAL;
1074
1075 cifs_dbg(FYI, "clone range\n");
1076
1077 xid = get_xid();
1078
1079 if (!src_file->private_data || !dst_file->private_data) {
1080 rc = -EBADF;
1081 cifs_dbg(VFS, "missing cifsFileInfo on copy range src file\n");
1082 goto out;
1083 }
1084
1085 smb_file_target = dst_file->private_data;
1086 target_tcon = tlink_tcon(smb_file_target->tlink);
1087
1088
1089
1090
1091
1092
1093 lock_two_nondirectories(target_inode, src_inode);
1094
1095 if (len == 0)
1096 len = src_inode->i_size - off;
1097
1098 cifs_dbg(FYI, "about to flush pages\n");
1099
1100 truncate_inode_pages_range(&target_inode->i_data, destoff,
1101 PAGE_ALIGN(destoff + len)-1);
1102
1103 if (target_tcon->ses->server->ops->duplicate_extents)
1104 rc = target_tcon->ses->server->ops->duplicate_extents(xid,
1105 smb_file_src, smb_file_target, off, len, destoff);
1106 else
1107 rc = -EOPNOTSUPP;
1108
1109
1110
1111 CIFS_I(target_inode)->time = 0;
1112
1113
1114 unlock_two_nondirectories(src_inode, target_inode);
1115out:
1116 free_xid(xid);
1117 return rc < 0 ? rc : len;
1118}
1119
1120ssize_t cifs_file_copychunk_range(unsigned int xid,
1121 struct file *src_file, loff_t off,
1122 struct file *dst_file, loff_t destoff,
1123 size_t len, unsigned int flags)
1124{
1125 struct inode *src_inode = file_inode(src_file);
1126 struct inode *target_inode = file_inode(dst_file);
1127 struct cifsFileInfo *smb_file_src;
1128 struct cifsFileInfo *smb_file_target;
1129 struct cifs_tcon *src_tcon;
1130 struct cifs_tcon *target_tcon;
1131 ssize_t rc;
1132
1133 cifs_dbg(FYI, "copychunk range\n");
1134
1135 if (!src_file->private_data || !dst_file->private_data) {
1136 rc = -EBADF;
1137 cifs_dbg(VFS, "missing cifsFileInfo on copy range src file\n");
1138 goto out;
1139 }
1140
1141 rc = -EXDEV;
1142 smb_file_target = dst_file->private_data;
1143 smb_file_src = src_file->private_data;
1144 src_tcon = tlink_tcon(smb_file_src->tlink);
1145 target_tcon = tlink_tcon(smb_file_target->tlink);
1146
1147 if (src_tcon->ses != target_tcon->ses) {
1148 cifs_dbg(VFS, "source and target of copy not on same server\n");
1149 goto out;
1150 }
1151
1152 rc = -EOPNOTSUPP;
1153 if (!target_tcon->ses->server->ops->copychunk_range)
1154 goto out;
1155
1156
1157
1158
1159
1160
1161 lock_two_nondirectories(target_inode, src_inode);
1162
1163 cifs_dbg(FYI, "about to flush pages\n");
1164
1165 truncate_inode_pages(&target_inode->i_data, 0);
1166
1167 rc = file_modified(dst_file);
1168 if (!rc)
1169 rc = target_tcon->ses->server->ops->copychunk_range(xid,
1170 smb_file_src, smb_file_target, off, len, destoff);
1171
1172 file_accessed(src_file);
1173
1174
1175
1176
1177 CIFS_I(target_inode)->time = 0;
1178
1179
1180
1181 unlock_two_nondirectories(src_inode, target_inode);
1182
1183out:
1184 return rc;
1185}
1186
1187
1188
1189
1190
1191static int cifs_dir_fsync(struct file *file, loff_t start, loff_t end, int datasync)
1192{
1193 cifs_dbg(FYI, "Sync directory - name: %pD datasync: 0x%x\n",
1194 file, datasync);
1195
1196 return 0;
1197}
1198
1199static ssize_t cifs_copy_file_range(struct file *src_file, loff_t off,
1200 struct file *dst_file, loff_t destoff,
1201 size_t len, unsigned int flags)
1202{
1203 unsigned int xid = get_xid();
1204 ssize_t rc;
1205
1206 rc = cifs_file_copychunk_range(xid, src_file, off, dst_file, destoff,
1207 len, flags);
1208 free_xid(xid);
1209
1210 if (rc == -EOPNOTSUPP || rc == -EXDEV)
1211 rc = generic_copy_file_range(src_file, off, dst_file,
1212 destoff, len, flags);
1213 return rc;
1214}
1215
1216const struct file_operations cifs_file_ops = {
1217 .read_iter = cifs_loose_read_iter,
1218 .write_iter = cifs_file_write_iter,
1219 .open = cifs_open,
1220 .release = cifs_close,
1221 .lock = cifs_lock,
1222 .flock = cifs_flock,
1223 .fsync = cifs_fsync,
1224 .flush = cifs_flush,
1225 .mmap = cifs_file_mmap,
1226 .splice_read = generic_file_splice_read,
1227 .splice_write = iter_file_splice_write,
1228 .llseek = cifs_llseek,
1229 .unlocked_ioctl = cifs_ioctl,
1230 .copy_file_range = cifs_copy_file_range,
1231 .remap_file_range = cifs_remap_file_range,
1232 .setlease = cifs_setlease,
1233 .fallocate = cifs_fallocate,
1234};
1235
1236const struct file_operations cifs_file_strict_ops = {
1237 .read_iter = cifs_strict_readv,
1238 .write_iter = cifs_strict_writev,
1239 .open = cifs_open,
1240 .release = cifs_close,
1241 .lock = cifs_lock,
1242 .flock = cifs_flock,
1243 .fsync = cifs_strict_fsync,
1244 .flush = cifs_flush,
1245 .mmap = cifs_file_strict_mmap,
1246 .splice_read = generic_file_splice_read,
1247 .splice_write = iter_file_splice_write,
1248 .llseek = cifs_llseek,
1249 .unlocked_ioctl = cifs_ioctl,
1250 .copy_file_range = cifs_copy_file_range,
1251 .remap_file_range = cifs_remap_file_range,
1252 .setlease = cifs_setlease,
1253 .fallocate = cifs_fallocate,
1254};
1255
1256const struct file_operations cifs_file_direct_ops = {
1257 .read_iter = cifs_direct_readv,
1258 .write_iter = cifs_direct_writev,
1259 .open = cifs_open,
1260 .release = cifs_close,
1261 .lock = cifs_lock,
1262 .flock = cifs_flock,
1263 .fsync = cifs_fsync,
1264 .flush = cifs_flush,
1265 .mmap = cifs_file_mmap,
1266 .splice_read = generic_file_splice_read,
1267 .splice_write = iter_file_splice_write,
1268 .unlocked_ioctl = cifs_ioctl,
1269 .copy_file_range = cifs_copy_file_range,
1270 .remap_file_range = cifs_remap_file_range,
1271 .llseek = cifs_llseek,
1272 .setlease = cifs_setlease,
1273 .fallocate = cifs_fallocate,
1274};
1275
1276const struct file_operations cifs_file_nobrl_ops = {
1277 .read_iter = cifs_loose_read_iter,
1278 .write_iter = cifs_file_write_iter,
1279 .open = cifs_open,
1280 .release = cifs_close,
1281 .fsync = cifs_fsync,
1282 .flush = cifs_flush,
1283 .mmap = cifs_file_mmap,
1284 .splice_read = generic_file_splice_read,
1285 .splice_write = iter_file_splice_write,
1286 .llseek = cifs_llseek,
1287 .unlocked_ioctl = cifs_ioctl,
1288 .copy_file_range = cifs_copy_file_range,
1289 .remap_file_range = cifs_remap_file_range,
1290 .setlease = cifs_setlease,
1291 .fallocate = cifs_fallocate,
1292};
1293
1294const struct file_operations cifs_file_strict_nobrl_ops = {
1295 .read_iter = cifs_strict_readv,
1296 .write_iter = cifs_strict_writev,
1297 .open = cifs_open,
1298 .release = cifs_close,
1299 .fsync = cifs_strict_fsync,
1300 .flush = cifs_flush,
1301 .mmap = cifs_file_strict_mmap,
1302 .splice_read = generic_file_splice_read,
1303 .splice_write = iter_file_splice_write,
1304 .llseek = cifs_llseek,
1305 .unlocked_ioctl = cifs_ioctl,
1306 .copy_file_range = cifs_copy_file_range,
1307 .remap_file_range = cifs_remap_file_range,
1308 .setlease = cifs_setlease,
1309 .fallocate = cifs_fallocate,
1310};
1311
1312const struct file_operations cifs_file_direct_nobrl_ops = {
1313 .read_iter = cifs_direct_readv,
1314 .write_iter = cifs_direct_writev,
1315 .open = cifs_open,
1316 .release = cifs_close,
1317 .fsync = cifs_fsync,
1318 .flush = cifs_flush,
1319 .mmap = cifs_file_mmap,
1320 .splice_read = generic_file_splice_read,
1321 .splice_write = iter_file_splice_write,
1322 .unlocked_ioctl = cifs_ioctl,
1323 .copy_file_range = cifs_copy_file_range,
1324 .remap_file_range = cifs_remap_file_range,
1325 .llseek = cifs_llseek,
1326 .setlease = cifs_setlease,
1327 .fallocate = cifs_fallocate,
1328};
1329
1330const struct file_operations cifs_dir_ops = {
1331 .iterate_shared = cifs_readdir,
1332 .release = cifs_closedir,
1333 .read = generic_read_dir,
1334 .unlocked_ioctl = cifs_ioctl,
1335 .copy_file_range = cifs_copy_file_range,
1336 .remap_file_range = cifs_remap_file_range,
1337 .llseek = generic_file_llseek,
1338 .fsync = cifs_dir_fsync,
1339};
1340
1341static void
1342cifs_init_once(void *inode)
1343{
1344 struct cifsInodeInfo *cifsi = inode;
1345
1346 inode_init_once(&cifsi->vfs_inode);
1347 init_rwsem(&cifsi->lock_sem);
1348}
1349
1350static int __init
1351cifs_init_inodecache(void)
1352{
1353 cifs_inode_cachep = kmem_cache_create("cifs_inode_cache",
1354 sizeof(struct cifsInodeInfo),
1355 0, (SLAB_RECLAIM_ACCOUNT|
1356 SLAB_MEM_SPREAD|SLAB_ACCOUNT),
1357 cifs_init_once);
1358 if (cifs_inode_cachep == NULL)
1359 return -ENOMEM;
1360
1361 return 0;
1362}
1363
1364static void
1365cifs_destroy_inodecache(void)
1366{
1367
1368
1369
1370
1371 rcu_barrier();
1372 kmem_cache_destroy(cifs_inode_cachep);
1373}
1374
1375static int
1376cifs_init_request_bufs(void)
1377{
1378
1379
1380
1381
1382 size_t max_hdr_size = MAX_SMB2_HDR_SIZE;
1383
1384 if (CIFSMaxBufSize < 8192) {
1385
1386
1387 CIFSMaxBufSize = 8192;
1388 } else if (CIFSMaxBufSize > 1024*127) {
1389 CIFSMaxBufSize = 1024 * 127;
1390 } else {
1391 CIFSMaxBufSize &= 0x1FE00;
1392 }
1393
1394
1395
1396
1397 cifs_req_cachep = kmem_cache_create_usercopy("cifs_request",
1398 CIFSMaxBufSize + max_hdr_size, 0,
1399 SLAB_HWCACHE_ALIGN, 0,
1400 CIFSMaxBufSize + max_hdr_size,
1401 NULL);
1402 if (cifs_req_cachep == NULL)
1403 return -ENOMEM;
1404
1405 if (cifs_min_rcv < 1)
1406 cifs_min_rcv = 1;
1407 else if (cifs_min_rcv > 64) {
1408 cifs_min_rcv = 64;
1409 cifs_dbg(VFS, "cifs_min_rcv set to maximum (64)\n");
1410 }
1411
1412 cifs_req_poolp = mempool_create_slab_pool(cifs_min_rcv,
1413 cifs_req_cachep);
1414
1415 if (cifs_req_poolp == NULL) {
1416 kmem_cache_destroy(cifs_req_cachep);
1417 return -ENOMEM;
1418 }
1419
1420
1421
1422
1423
1424
1425
1426
1427 cifs_sm_req_cachep = kmem_cache_create_usercopy("cifs_small_rq",
1428 MAX_CIFS_SMALL_BUFFER_SIZE, 0, SLAB_HWCACHE_ALIGN,
1429 0, MAX_CIFS_SMALL_BUFFER_SIZE, NULL);
1430 if (cifs_sm_req_cachep == NULL) {
1431 mempool_destroy(cifs_req_poolp);
1432 kmem_cache_destroy(cifs_req_cachep);
1433 return -ENOMEM;
1434 }
1435
1436 if (cifs_min_small < 2)
1437 cifs_min_small = 2;
1438 else if (cifs_min_small > 256) {
1439 cifs_min_small = 256;
1440 cifs_dbg(FYI, "cifs_min_small set to maximum (256)\n");
1441 }
1442
1443 cifs_sm_req_poolp = mempool_create_slab_pool(cifs_min_small,
1444 cifs_sm_req_cachep);
1445
1446 if (cifs_sm_req_poolp == NULL) {
1447 mempool_destroy(cifs_req_poolp);
1448 kmem_cache_destroy(cifs_req_cachep);
1449 kmem_cache_destroy(cifs_sm_req_cachep);
1450 return -ENOMEM;
1451 }
1452
1453 return 0;
1454}
1455
1456static void
1457cifs_destroy_request_bufs(void)
1458{
1459 mempool_destroy(cifs_req_poolp);
1460 kmem_cache_destroy(cifs_req_cachep);
1461 mempool_destroy(cifs_sm_req_poolp);
1462 kmem_cache_destroy(cifs_sm_req_cachep);
1463}
1464
1465static int
1466cifs_init_mids(void)
1467{
1468 cifs_mid_cachep = kmem_cache_create("cifs_mpx_ids",
1469 sizeof(struct mid_q_entry), 0,
1470 SLAB_HWCACHE_ALIGN, NULL);
1471 if (cifs_mid_cachep == NULL)
1472 return -ENOMEM;
1473
1474
1475 cifs_mid_poolp = mempool_create_slab_pool(3, cifs_mid_cachep);
1476 if (cifs_mid_poolp == NULL) {
1477 kmem_cache_destroy(cifs_mid_cachep);
1478 return -ENOMEM;
1479 }
1480
1481 return 0;
1482}
1483
1484static void
1485cifs_destroy_mids(void)
1486{
1487 mempool_destroy(cifs_mid_poolp);
1488 kmem_cache_destroy(cifs_mid_cachep);
1489}
1490
1491static int __init
1492init_cifs(void)
1493{
1494 int rc = 0;
1495 cifs_proc_init();
1496 INIT_LIST_HEAD(&cifs_tcp_ses_list);
1497#ifdef CONFIG_CIFS_DNOTIFY_EXPERIMENTAL
1498 INIT_LIST_HEAD(&GlobalDnotifyReqList);
1499 INIT_LIST_HEAD(&GlobalDnotifyRsp_Q);
1500#endif
1501
1502
1503
1504 atomic_set(&sesInfoAllocCount, 0);
1505 atomic_set(&tconInfoAllocCount, 0);
1506 atomic_set(&tcpSesAllocCount, 0);
1507 atomic_set(&tcpSesReconnectCount, 0);
1508 atomic_set(&tconInfoReconnectCount, 0);
1509
1510 atomic_set(&bufAllocCount, 0);
1511 atomic_set(&smBufAllocCount, 0);
1512#ifdef CONFIG_CIFS_STATS2
1513 atomic_set(&totBufAllocCount, 0);
1514 atomic_set(&totSmBufAllocCount, 0);
1515 if (slow_rsp_threshold < 1)
1516 cifs_dbg(FYI, "slow_response_threshold msgs disabled\n");
1517 else if (slow_rsp_threshold > 32767)
1518 cifs_dbg(VFS,
1519 "slow response threshold set higher than recommended (0 to 32767)\n");
1520#endif
1521
1522 atomic_set(&midCount, 0);
1523 GlobalCurrentXid = 0;
1524 GlobalTotalActiveXid = 0;
1525 GlobalMaxActiveXid = 0;
1526 spin_lock_init(&cifs_tcp_ses_lock);
1527 spin_lock_init(&GlobalMid_Lock);
1528
1529 cifs_lock_secret = get_random_u32();
1530
1531 if (cifs_max_pending < 2) {
1532 cifs_max_pending = 2;
1533 cifs_dbg(FYI, "cifs_max_pending set to min of 2\n");
1534 } else if (cifs_max_pending > CIFS_MAX_REQ) {
1535 cifs_max_pending = CIFS_MAX_REQ;
1536 cifs_dbg(FYI, "cifs_max_pending set to max of %u\n",
1537 CIFS_MAX_REQ);
1538 }
1539
1540 cifsiod_wq = alloc_workqueue("cifsiod", WQ_FREEZABLE|WQ_MEM_RECLAIM, 0);
1541 if (!cifsiod_wq) {
1542 rc = -ENOMEM;
1543 goto out_clean_proc;
1544 }
1545
1546
1547
1548
1549
1550
1551
1552
1553 decrypt_wq = alloc_workqueue("smb3decryptd",
1554 WQ_UNBOUND|WQ_FREEZABLE|WQ_MEM_RECLAIM, 0);
1555 if (!decrypt_wq) {
1556 rc = -ENOMEM;
1557 goto out_destroy_cifsiod_wq;
1558 }
1559
1560 fileinfo_put_wq = alloc_workqueue("cifsfileinfoput",
1561 WQ_UNBOUND|WQ_FREEZABLE|WQ_MEM_RECLAIM, 0);
1562 if (!fileinfo_put_wq) {
1563 rc = -ENOMEM;
1564 goto out_destroy_decrypt_wq;
1565 }
1566
1567 cifsoplockd_wq = alloc_workqueue("cifsoplockd",
1568 WQ_FREEZABLE|WQ_MEM_RECLAIM, 0);
1569 if (!cifsoplockd_wq) {
1570 rc = -ENOMEM;
1571 goto out_destroy_fileinfo_put_wq;
1572 }
1573
1574 rc = cifs_fscache_register();
1575 if (rc)
1576 goto out_destroy_cifsoplockd_wq;
1577
1578 rc = cifs_init_inodecache();
1579 if (rc)
1580 goto out_unreg_fscache;
1581
1582 rc = cifs_init_mids();
1583 if (rc)
1584 goto out_destroy_inodecache;
1585
1586 rc = cifs_init_request_bufs();
1587 if (rc)
1588 goto out_destroy_mids;
1589
1590#ifdef CONFIG_CIFS_DFS_UPCALL
1591 rc = dfs_cache_init();
1592 if (rc)
1593 goto out_destroy_request_bufs;
1594#endif
1595#ifdef CONFIG_CIFS_UPCALL
1596 rc = init_cifs_spnego();
1597 if (rc)
1598 goto out_destroy_dfs_cache;
1599#endif
1600
1601 rc = init_cifs_idmap();
1602 if (rc)
1603 goto out_register_key_type;
1604
1605 rc = register_filesystem(&cifs_fs_type);
1606 if (rc)
1607 goto out_init_cifs_idmap;
1608
1609 rc = register_filesystem(&smb3_fs_type);
1610 if (rc) {
1611 unregister_filesystem(&cifs_fs_type);
1612 goto out_init_cifs_idmap;
1613 }
1614
1615 return 0;
1616
1617out_init_cifs_idmap:
1618 exit_cifs_idmap();
1619out_register_key_type:
1620#ifdef CONFIG_CIFS_UPCALL
1621 exit_cifs_spnego();
1622out_destroy_dfs_cache:
1623#endif
1624#ifdef CONFIG_CIFS_DFS_UPCALL
1625 dfs_cache_destroy();
1626out_destroy_request_bufs:
1627#endif
1628 cifs_destroy_request_bufs();
1629out_destroy_mids:
1630 cifs_destroy_mids();
1631out_destroy_inodecache:
1632 cifs_destroy_inodecache();
1633out_unreg_fscache:
1634 cifs_fscache_unregister();
1635out_destroy_cifsoplockd_wq:
1636 destroy_workqueue(cifsoplockd_wq);
1637out_destroy_fileinfo_put_wq:
1638 destroy_workqueue(fileinfo_put_wq);
1639out_destroy_decrypt_wq:
1640 destroy_workqueue(decrypt_wq);
1641out_destroy_cifsiod_wq:
1642 destroy_workqueue(cifsiod_wq);
1643out_clean_proc:
1644 cifs_proc_clean();
1645 return rc;
1646}
1647
1648static void __exit
1649exit_cifs(void)
1650{
1651 cifs_dbg(NOISY, "exit_smb3\n");
1652 unregister_filesystem(&cifs_fs_type);
1653 unregister_filesystem(&smb3_fs_type);
1654 cifs_dfs_release_automount_timer();
1655 exit_cifs_idmap();
1656#ifdef CONFIG_CIFS_UPCALL
1657 exit_cifs_spnego();
1658#endif
1659#ifdef CONFIG_CIFS_DFS_UPCALL
1660 dfs_cache_destroy();
1661#endif
1662 cifs_destroy_request_bufs();
1663 cifs_destroy_mids();
1664 cifs_destroy_inodecache();
1665 cifs_fscache_unregister();
1666 destroy_workqueue(cifsoplockd_wq);
1667 destroy_workqueue(decrypt_wq);
1668 destroy_workqueue(fileinfo_put_wq);
1669 destroy_workqueue(cifsiod_wq);
1670 cifs_proc_clean();
1671}
1672
1673MODULE_AUTHOR("Steve French");
1674MODULE_LICENSE("GPL");
1675MODULE_DESCRIPTION
1676 ("VFS to access SMB3 servers e.g. Samba, Macs, Azure and Windows (and "
1677 "also older servers complying with the SNIA CIFS Specification)");
1678MODULE_VERSION(CIFS_VERSION);
1679MODULE_SOFTDEP("ecb");
1680MODULE_SOFTDEP("hmac");
1681MODULE_SOFTDEP("md4");
1682MODULE_SOFTDEP("md5");
1683MODULE_SOFTDEP("nls");
1684MODULE_SOFTDEP("aes");
1685MODULE_SOFTDEP("cmac");
1686MODULE_SOFTDEP("sha256");
1687MODULE_SOFTDEP("sha512");
1688MODULE_SOFTDEP("aead2");
1689MODULE_SOFTDEP("ccm");
1690MODULE_SOFTDEP("gcm");
1691module_init(init_cifs)
1692module_exit(exit_cifs)
1693