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