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