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