1/*
2 *   fs/cifs/cifsfs.c
3 *
4 *   Copyright (C) International Business Machines  Corp., 2002,2008
5 *   Author(s): Steve French (sfrench@us.ibm.com)
6 *
7 *   Common Internet FileSystem (CIFS) client
8 *
9 *   This library is free software; you can redistribute it and/or modify
10 *   it under the terms of the GNU Lesser General Public License as published
11 *   by the Free Software Foundation; either version 2.1 of the License, or
12 *   (at your option) any later version.
13 *
14 *   This library is distributed in the hope that it will be useful,
15 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
17 *   the GNU Lesser General Public License for more details.
18 *
19 *   You should have received a copy of the GNU Lesser General Public License
20 *   along with this library; if not, write to the Free Software
21 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 */
23
24/* Note that BB means BUGBUG (ie something to fix eventually) */
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 <net/ipv6.h>
41#include "cifsfs.h"
42#include "cifspdu.h"
43#define DECLARE_GLOBALS_HERE
44#include "cifsglob.h"
45#include "cifsproto.h"
46#include "cifs_debug.h"
47#include "cifs_fs_sb.h"
48#include <linux/mm.h>
49#include <linux/key-type.h>
50#include "cifs_spnego.h"
51#include "fscache.h"
52#ifdef CONFIG_CIFS_SMB2
53#include "smb2pdu.h"
54#endif
55
56int cifsFYI = 0;
57int traceSMB = 0;
58bool enable_oplocks = true;
59unsigned int linuxExtEnabled = 1;
60unsigned int lookupCacheEnabled = 1;
61unsigned int global_secflags = CIFSSEC_DEF;
62/* unsigned int ntlmv2_support = 0; */
63unsigned int sign_CIFS_PDUs = 1;
64static const struct super_operations cifs_super_ops;
65unsigned int CIFSMaxBufSize = CIFS_MAX_MSGSIZE;
66module_param(CIFSMaxBufSize, uint, 0);
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, 0);
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, 0);
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;
89
90/*
91 * Bumps refcount for cifs super block.
92 * Note that it should be only called if a referece to VFS super block is
93 * already held, e.g. in open-type syscalls context. Otherwise it can race with
94 * atomic_dec_and_test in deactivate_locked_super.
95 */
96void
97cifs_sb_active(struct super_block *sb)
98{
99	struct cifs_sb_info *server = CIFS_SB(sb);
100
101	if (atomic_inc_return(&server->active) == 1)
102		atomic_inc(&sb->s_active);
103}
104
105void
106cifs_sb_deactive(struct super_block *sb)
107{
108	struct cifs_sb_info *server = CIFS_SB(sb);
109
110	if (atomic_dec_and_test(&server->active))
111		deactivate_super(sb);
112}
113
114static int
115cifs_read_super(struct super_block *sb)
116{
117	struct inode *inode;
118	struct cifs_sb_info *cifs_sb;
119	struct cifs_tcon *tcon;
120	int rc = 0;
121
122	cifs_sb = CIFS_SB(sb);
123	tcon = cifs_sb_master_tcon(cifs_sb);
124
125	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIXACL)
126		sb->s_flags |= MS_POSIXACL;
127
128	if (tcon->ses->capabilities & tcon->ses->server->vals->cap_large_files)
129		sb->s_maxbytes = MAX_LFS_FILESIZE;
130	else
131		sb->s_maxbytes = MAX_NON_LFS;
132
133	/* BB FIXME fix time_gran to be larger for LANMAN sessions */
134	sb->s_time_gran = 100;
135
136	sb->s_magic = CIFS_MAGIC_NUMBER;
137	sb->s_op = &cifs_super_ops;
138	sb->s_bdi = &cifs_sb->bdi;
139	sb->s_blocksize = CIFS_MAX_MSGSIZE;
140	sb->s_blocksize_bits = 14;	/* default 2**14 = CIFS_MAX_MSGSIZE */
141	inode = cifs_root_iget(sb);
142
143	if (IS_ERR(inode)) {
144		rc = PTR_ERR(inode);
145		goto out_no_root;
146	}
147
148	if (tcon->nocase)
149		sb->s_d_op = &cifs_ci_dentry_ops;
150	else
151		sb->s_d_op = &cifs_dentry_ops;
152
153	sb->s_root = d_make_root(inode);
154	if (!sb->s_root) {
155		rc = -ENOMEM;
156		goto out_no_root;
157	}
158
159#ifdef CONFIG_CIFS_NFSD_EXPORT
160	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
161		cifs_dbg(FYI, "export ops supported\n");
162		sb->s_export_op = &cifs_export_ops;
163	}
164#endif /* CONFIG_CIFS_NFSD_EXPORT */
165
166	return 0;
167
168out_no_root:
169	cifs_dbg(VFS, "%s: get root inode failed\n", __func__);
170	return rc;
171}
172
173static void cifs_kill_sb(struct super_block *sb)
174{
175	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
176	kill_anon_super(sb);
177	cifs_umount(cifs_sb);
178}
179
180static int
181cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
182{
183	struct super_block *sb = dentry->d_sb;
184	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
185	struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
186	struct TCP_Server_Info *server = tcon->ses->server;
187	unsigned int xid;
188	int rc = 0;
189
190	xid = get_xid();
191
192	/*
193	 * PATH_MAX may be too long - it would presumably be total path,
194	 * but note that some servers (includinng Samba 3) have a shorter
195	 * maximum path.
196	 *
197	 * Instead could get the real value via SMB_QUERY_FS_ATTRIBUTE_INFO.
198	 */
199	buf->f_namelen = PATH_MAX;
200	buf->f_files = 0;	/* undefined */
201	buf->f_ffree = 0;	/* unlimited */
202
203	if (server->ops->queryfs)
204		rc = server->ops->queryfs(xid, tcon, buf);
205
206	free_xid(xid);
207	return 0;
208}
209
210static long cifs_fallocate(struct file *file, int mode, loff_t off, loff_t len)
211{
212	struct cifs_sb_info *cifs_sb = CIFS_FILE_SB(file);
213	struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
214	struct TCP_Server_Info *server = tcon->ses->server;
215
216	if (server->ops->fallocate)
217		return server->ops->fallocate(file, tcon, mode, off, len);
218
219	return -EOPNOTSUPP;
220}
221
222static int cifs_permission(struct inode *inode, int mask)
223{
224	struct cifs_sb_info *cifs_sb;
225
226	cifs_sb = CIFS_SB(inode->i_sb);
227
228	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM) {
229		if ((mask & MAY_EXEC) && !execute_ok(inode))
230			return -EACCES;
231		else
232			return 0;
233	} else /* file mode might have been restricted at mount time
234		on the client (above and beyond ACL on servers) for
235		servers which do not support setting and viewing mode bits,
236		so allowing client to check permissions is useful */
237		return generic_permission(inode, mask);
238}
239
240static struct kmem_cache *cifs_inode_cachep;
241static struct kmem_cache *cifs_req_cachep;
242static struct kmem_cache *cifs_mid_cachep;
243static struct kmem_cache *cifs_sm_req_cachep;
244mempool_t *cifs_sm_req_poolp;
245mempool_t *cifs_req_poolp;
246mempool_t *cifs_mid_poolp;
247
248static struct inode *
249cifs_alloc_inode(struct super_block *sb)
250{
251	struct cifsInodeInfo *cifs_inode;
252	cifs_inode = kmem_cache_alloc(cifs_inode_cachep, GFP_KERNEL);
253	if (!cifs_inode)
254		return NULL;
255	cifs_inode->cifsAttrs = 0x20;	/* default */
256	cifs_inode->time = 0;
257	/*
258	 * Until the file is open and we have gotten oplock info back from the
259	 * server, can not assume caching of file data or metadata.
260	 */
261	cifs_set_oplock_level(cifs_inode, 0);
262	cifs_inode->flags = 0;
263	spin_lock_init(&cifs_inode->writers_lock);
264	cifs_inode->writers = 0;
265	cifs_inode->vfs_inode.i_blkbits = 14;  /* 2**14 = CIFS_MAX_MSGSIZE */
266	cifs_inode->server_eof = 0;
267	cifs_inode->uniqueid = 0;
268	cifs_inode->createtime = 0;
269	cifs_inode->epoch = 0;
270#ifdef CONFIG_CIFS_SMB2
271	get_random_bytes(cifs_inode->lease_key, SMB2_LEASE_KEY_SIZE);
272#endif
273	/*
274	 * Can not set i_flags here - they get immediately overwritten to zero
275	 * by the VFS.
276	 */
277	/* cifs_inode->vfs_inode.i_flags = S_NOATIME | S_NOCMTIME; */
278	INIT_LIST_HEAD(&cifs_inode->openFileList);
279	INIT_LIST_HEAD(&cifs_inode->llist);
280	return &cifs_inode->vfs_inode;
281}
282
283static void cifs_i_callback(struct rcu_head *head)
284{
285	struct inode *inode = container_of(head, struct inode, i_rcu);
286	kmem_cache_free(cifs_inode_cachep, CIFS_I(inode));
287}
288
289static void
290cifs_destroy_inode(struct inode *inode)
291{
292	call_rcu(&inode->i_rcu, cifs_i_callback);
293}
294
295static void
296cifs_evict_inode(struct inode *inode)
297{
298	truncate_inode_pages_final(&inode->i_data);
299	clear_inode(inode);
300	cifs_fscache_release_inode_cookie(inode);
301}
302
303static void
304cifs_show_address(struct seq_file *s, struct TCP_Server_Info *server)
305{
306	struct sockaddr_in *sa = (struct sockaddr_in *) &server->dstaddr;
307	struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *) &server->dstaddr;
308
309	seq_puts(s, ",addr=");
310
311	switch (server->dstaddr.ss_family) {
312	case AF_INET:
313		seq_printf(s, "%pI4", &sa->sin_addr.s_addr);
314		break;
315	case AF_INET6:
316		seq_printf(s, "%pI6", &sa6->sin6_addr.s6_addr);
317		if (sa6->sin6_scope_id)
318			seq_printf(s, "%%%u", sa6->sin6_scope_id);
319		break;
320	default:
321		seq_puts(s, "(unknown)");
322	}
323}
324
325static void
326cifs_show_security(struct seq_file *s, struct cifs_ses *ses)
327{
328	if (ses->sectype == Unspecified)
329		return;
330
331	seq_puts(s, ",sec=");
332
333	switch (ses->sectype) {
334	case LANMAN:
335		seq_puts(s, "lanman");
336		break;
337	case NTLMv2:
338		seq_puts(s, "ntlmv2");
339		break;
340	case NTLM:
341		seq_puts(s, "ntlm");
342		break;
343	case Kerberos:
344		seq_puts(s, "krb5");
345		break;
346	case RawNTLMSSP:
347		seq_puts(s, "ntlmssp");
348		break;
349	default:
350		/* shouldn't ever happen */
351		seq_puts(s, "unknown");
352		break;
353	}
354
355	if (ses->sign)
356		seq_puts(s, "i");
357}
358
359static void
360cifs_show_cache_flavor(struct seq_file *s, struct cifs_sb_info *cifs_sb)
361{
362	seq_puts(s, ",cache=");
363
364	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO)
365		seq_puts(s, "strict");
366	else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO)
367		seq_puts(s, "none");
368	else
369		seq_puts(s, "loose");
370}
371
372static void
373cifs_show_nls(struct seq_file *s, struct nls_table *cur)
374{
375	struct nls_table *def;
376
377	/* Display iocharset= option if it's not default charset */
378	def = load_nls_default();
379	if (def != cur)
380		seq_printf(s, ",iocharset=%s", cur->charset);
381	unload_nls(def);
382}
383
384/*
385 * cifs_show_options() is for displaying mount options in /proc/mounts.
386 * Not all settable options are displayed but most of the important
387 * ones are.
388 */
389static int
390cifs_show_options(struct seq_file *s, struct dentry *root)
391{
392	struct cifs_sb_info *cifs_sb = CIFS_SB(root->d_sb);
393	struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
394	struct sockaddr *srcaddr;
395	srcaddr = (struct sockaddr *)&tcon->ses->server->srcaddr;
396
397	seq_show_option(s, "vers", tcon->ses->server->vals->version_string);
398	cifs_show_security(s, tcon->ses);
399	cifs_show_cache_flavor(s, cifs_sb);
400
401	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER)
402		seq_puts(s, ",multiuser");
403	else if (tcon->ses->user_name)
404		seq_show_option(s, "username", tcon->ses->user_name);
405
406	if (tcon->ses->domainName)
407		seq_show_option(s, "domain", tcon->ses->domainName);
408
409	if (srcaddr->sa_family != AF_UNSPEC) {
410		struct sockaddr_in *saddr4;
411		struct sockaddr_in6 *saddr6;
412		saddr4 = (struct sockaddr_in *)srcaddr;
413		saddr6 = (struct sockaddr_in6 *)srcaddr;
414		if (srcaddr->sa_family == AF_INET6)
415			seq_printf(s, ",srcaddr=%pI6c",
416				   &saddr6->sin6_addr);
417		else if (srcaddr->sa_family == AF_INET)
418			seq_printf(s, ",srcaddr=%pI4",
419				   &saddr4->sin_addr.s_addr);
420		else
421			seq_printf(s, ",srcaddr=BAD-AF:%i",
422				   (int)(srcaddr->sa_family));
423	}
424
425	seq_printf(s, ",uid=%u",
426		   from_kuid_munged(&init_user_ns, cifs_sb->mnt_uid));
427	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)
428		seq_puts(s, ",forceuid");
429	else
430		seq_puts(s, ",noforceuid");
431
432	seq_printf(s, ",gid=%u",
433		   from_kgid_munged(&init_user_ns, cifs_sb->mnt_gid));
434	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)
435		seq_puts(s, ",forcegid");
436	else
437		seq_puts(s, ",noforcegid");
438
439	cifs_show_address(s, tcon->ses->server);
440
441	if (!tcon->unix_ext)
442		seq_printf(s, ",file_mode=0%ho,dir_mode=0%ho",
443					   cifs_sb->mnt_file_mode,
444					   cifs_sb->mnt_dir_mode);
445
446	cifs_show_nls(s, cifs_sb->local_nls);
447
448	if (tcon->seal)
449		seq_puts(s, ",seal");
450	if (tcon->nocase)
451		seq_puts(s, ",nocase");
452	if (tcon->retry)
453		seq_puts(s, ",hard");
454	if (tcon->unix_ext)
455		seq_puts(s, ",unix");
456	else
457		seq_puts(s, ",nounix");
458	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS)
459		seq_puts(s, ",posixpaths");
460	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID)
461		seq_puts(s, ",setuids");
462	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
463		seq_puts(s, ",serverino");
464	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD)
465		seq_puts(s, ",rwpidforward");
466	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL)
467		seq_puts(s, ",forcemand");
468	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR)
469		seq_puts(s, ",nouser_xattr");
470	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR)
471		seq_puts(s, ",mapchars");
472	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SFM_CHR)
473		seq_puts(s, ",mapposix");
474	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
475		seq_puts(s, ",sfu");
476	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
477		seq_puts(s, ",nobrl");
478	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL)
479		seq_puts(s, ",cifsacl");
480	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
481		seq_puts(s, ",dynperm");
482	if (root->d_sb->s_flags & MS_POSIXACL)
483		seq_puts(s, ",acl");
484	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS)
485		seq_puts(s, ",mfsymlinks");
486	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_FSCACHE)
487		seq_puts(s, ",fsc");
488	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)
489		seq_puts(s, ",nostrictsync");
490	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
491		seq_puts(s, ",noperm");
492	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_BACKUPUID)
493		seq_printf(s, ",backupuid=%u",
494			   from_kuid_munged(&init_user_ns,
495					    cifs_sb->mnt_backupuid));
496	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_BACKUPGID)
497		seq_printf(s, ",backupgid=%u",
498			   from_kgid_munged(&init_user_ns,
499					    cifs_sb->mnt_backupgid));
500
501	seq_printf(s, ",rsize=%u", cifs_sb->rsize);
502	seq_printf(s, ",wsize=%u", cifs_sb->wsize);
503	/* convert actimeo and display it in seconds */
504	seq_printf(s, ",actimeo=%lu", cifs_sb->actimeo / HZ);
505
506	return 0;
507}
508
509static void cifs_umount_begin(struct super_block *sb)
510{
511	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
512	struct cifs_tcon *tcon;
513
514	if (cifs_sb == NULL)
515		return;
516
517	tcon = cifs_sb_master_tcon(cifs_sb);
518
519	spin_lock(&cifs_tcp_ses_lock);
520	if ((tcon->tc_count > 1) || (tcon->tidStatus == CifsExiting)) {
521		/* we have other mounts to same share or we have
522		   already tried to force umount this and woken up
523		   all waiting network requests, nothing to do */
524		spin_unlock(&cifs_tcp_ses_lock);
525		return;
526	} else if (tcon->tc_count == 1)
527		tcon->tidStatus = CifsExiting;
528	spin_unlock(&cifs_tcp_ses_lock);
529
530	/* cancel_brl_requests(tcon); */ /* BB mark all brl mids as exiting */
531	/* cancel_notify_requests(tcon); */
532	if (tcon->ses && tcon->ses->server) {
533		cifs_dbg(FYI, "wake up tasks now - umount begin not complete\n");
534		wake_up_all(&tcon->ses->server->request_q);
535		wake_up_all(&tcon->ses->server->response_q);
536		msleep(1); /* yield */
537		/* we have to kick the requests once more */
538		wake_up_all(&tcon->ses->server->response_q);
539		msleep(1);
540	}
541
542	return;
543}
544
545#ifdef CONFIG_CIFS_STATS2
546static int cifs_show_stats(struct seq_file *s, struct dentry *root)
547{
548	/* BB FIXME */
549	return 0;
550}
551#endif
552
553static int cifs_remount(struct super_block *sb, int *flags, char *data)
554{
555	sync_filesystem(sb);
556	*flags |= MS_NODIRATIME;
557	return 0;
558}
559
560static int cifs_drop_inode(struct inode *inode)
561{
562	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
563
564	/* no serverino => unconditional eviction */
565	return !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) ||
566		generic_drop_inode(inode);
567}
568
569static const struct super_operations cifs_super_ops = {
570	.statfs = cifs_statfs,
571	.alloc_inode = cifs_alloc_inode,
572	.destroy_inode = cifs_destroy_inode,
573	.drop_inode	= cifs_drop_inode,
574	.evict_inode	= cifs_evict_inode,
575/*	.delete_inode	= cifs_delete_inode,  */  /* Do not need above
576	function unless later we add lazy close of inodes or unless the
577	kernel forgets to call us with the same number of releases (closes)
578	as opens */
579	.show_options = cifs_show_options,
580	.umount_begin   = cifs_umount_begin,
581	.remount_fs = cifs_remount,
582#ifdef CONFIG_CIFS_STATS2
583	.show_stats = cifs_show_stats,
584#endif
585};
586
587/*
588 * Get root dentry from superblock according to prefix path mount option.
589 * Return dentry with refcount + 1 on success and NULL otherwise.
590 */
591static struct dentry *
592cifs_get_root(struct smb_vol *vol, struct super_block *sb)
593{
594	struct dentry *dentry;
595	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
596	char *full_path = NULL;
597	char *s, *p;
598	char sep;
599
600	full_path = cifs_build_path_to_root(vol, cifs_sb,
601					    cifs_sb_master_tcon(cifs_sb));
602	if (full_path == NULL)
603		return ERR_PTR(-ENOMEM);
604
605	cifs_dbg(FYI, "Get root dentry for %s\n", full_path);
606
607	sep = CIFS_DIR_SEP(cifs_sb);
608	dentry = dget(sb->s_root);
609	p = s = full_path;
610
611	do {
612		struct inode *dir = d_inode(dentry);
613		struct dentry *child;
614
615		if (!dir) {
616			dput(dentry);
617			dentry = ERR_PTR(-ENOENT);
618			break;
619		}
620		if (!S_ISDIR(dir->i_mode)) {
621			dput(dentry);
622			dentry = ERR_PTR(-ENOTDIR);
623			break;
624		}
625
626		/* skip separators */
627		while (*s == sep)
628			s++;
629		if (!*s)
630			break;
631		p = s++;
632		/* next separator */
633		while (*s && *s != sep)
634			s++;
635
636		mutex_lock(&dir->i_mutex);
637		child = lookup_one_len(p, dentry, s - p);
638		mutex_unlock(&dir->i_mutex);
639		dput(dentry);
640		dentry = child;
641	} while (!IS_ERR(dentry));
642	kfree(full_path);
643	return dentry;
644}
645
646static int cifs_set_super(struct super_block *sb, void *data)
647{
648	struct cifs_mnt_data *mnt_data = data;
649	sb->s_fs_info = mnt_data->cifs_sb;
650	return set_anon_super(sb, NULL);
651}
652
653static struct dentry *
654cifs_do_mount(struct file_system_type *fs_type,
655	      int flags, const char *dev_name, void *data)
656{
657	int rc;
658	struct super_block *sb;
659	struct cifs_sb_info *cifs_sb;
660	struct smb_vol *volume_info;
661	struct cifs_mnt_data mnt_data;
662	struct dentry *root;
663
664	cifs_dbg(FYI, "Devname: %s flags: %d\n", dev_name, flags);
665
666	volume_info = cifs_get_volume_info((char *)data, dev_name);
667	if (IS_ERR(volume_info))
668		return ERR_CAST(volume_info);
669
670	cifs_sb = kzalloc(sizeof(struct cifs_sb_info), GFP_KERNEL);
671	if (cifs_sb == NULL) {
672		root = ERR_PTR(-ENOMEM);
673		goto out_nls;
674	}
675
676	cifs_sb->mountdata = kstrndup(data, PAGE_SIZE, GFP_KERNEL);
677	if (cifs_sb->mountdata == NULL) {
678		root = ERR_PTR(-ENOMEM);
679		goto out_cifs_sb;
680	}
681
682	cifs_setup_cifs_sb(volume_info, cifs_sb);
683
684	rc = cifs_mount(cifs_sb, volume_info);
685	if (rc) {
686		if (!(flags & MS_SILENT))
687			cifs_dbg(VFS, "cifs_mount failed w/return code = %d\n",
688				 rc);
689		root = ERR_PTR(rc);
690		goto out_mountdata;
691	}
692
693	mnt_data.vol = volume_info;
694	mnt_data.cifs_sb = cifs_sb;
695	mnt_data.flags = flags;
696
697	/* BB should we make this contingent on mount parm? */
698	flags |= MS_NODIRATIME | MS_NOATIME;
699
700	sb = sget(fs_type, cifs_match_super, cifs_set_super, flags, &mnt_data);
701	if (IS_ERR(sb)) {
702		root = ERR_CAST(sb);
703		cifs_umount(cifs_sb);
704		goto out;
705	}
706
707	if (sb->s_root) {
708		cifs_dbg(FYI, "Use existing superblock\n");
709		cifs_umount(cifs_sb);
710	} else {
711		rc = cifs_read_super(sb);
712		if (rc) {
713			root = ERR_PTR(rc);
714			goto out_super;
715		}
716
717		sb->s_flags |= MS_ACTIVE;
718	}
719
720	root = cifs_get_root(volume_info, sb);
721	if (IS_ERR(root))
722		goto out_super;
723
724	cifs_dbg(FYI, "dentry root is: %p\n", root);
725	goto out;
726
727out_super:
728	deactivate_locked_super(sb);
729out:
730	cifs_cleanup_volume_info(volume_info);
731	return root;
732
733out_mountdata:
734	kfree(cifs_sb->mountdata);
735out_cifs_sb:
736	kfree(cifs_sb);
737out_nls:
738	unload_nls(volume_info->local_nls);
739	goto out;
740}
741
742static ssize_t
743cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter)
744{
745	ssize_t rc;
746	struct inode *inode = file_inode(iocb->ki_filp);
747
748	rc = cifs_revalidate_mapping(inode);
749	if (rc)
750		return rc;
751
752	return generic_file_read_iter(iocb, iter);
753}
754
755static ssize_t cifs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
756{
757	struct inode *inode = file_inode(iocb->ki_filp);
758	struct cifsInodeInfo *cinode = CIFS_I(inode);
759	ssize_t written;
760	int rc;
761
762	written = cifs_get_writer(cinode);
763	if (written)
764		return written;
765
766	written = generic_file_write_iter(iocb, from);
767
768	if (CIFS_CACHE_WRITE(CIFS_I(inode)))
769		goto out;
770
771	rc = filemap_fdatawrite(inode->i_mapping);
772	if (rc)
773		cifs_dbg(FYI, "cifs_file_write_iter: %d rc on %p inode\n",
774			 rc, inode);
775
776out:
777	cifs_put_writer(cinode);
778	return written;
779}
780
781static loff_t cifs_llseek(struct file *file, loff_t offset, int whence)
782{
783	/*
784	 * whence == SEEK_END || SEEK_DATA || SEEK_HOLE => we must revalidate
785	 * the cached file length
786	 */
787	if (whence != SEEK_SET && whence != SEEK_CUR) {
788		int rc;
789		struct inode *inode = file_inode(file);
790
791		/*
792		 * We need to be sure that all dirty pages are written and the
793		 * server has the newest file length.
794		 */
795		if (!CIFS_CACHE_READ(CIFS_I(inode)) && inode->i_mapping &&
796		    inode->i_mapping->nrpages != 0) {
797			rc = filemap_fdatawait(inode->i_mapping);
798			if (rc) {
799				mapping_set_error(inode->i_mapping, rc);
800				return rc;
801			}
802		}
803		/*
804		 * Some applications poll for the file length in this strange
805		 * way so we must seek to end on non-oplocked files by
806		 * setting the revalidate time to zero.
807		 */
808		CIFS_I(inode)->time = 0;
809
810		rc = cifs_revalidate_file_attr(file);
811		if (rc < 0)
812			return (loff_t)rc;
813	}
814	return generic_file_llseek(file, offset, whence);
815}
816
817static int
818cifs_setlease(struct file *file, long arg, struct file_lock **lease, void **priv)
819{
820	/*
821	 * Note that this is called by vfs setlease with i_lock held to
822	 * protect *lease from going away.
823	 */
824	struct inode *inode = file_inode(file);
825	struct cifsFileInfo *cfile = file->private_data;
826
827	if (!(S_ISREG(inode->i_mode)))
828		return -EINVAL;
829
830	/* Check if file is oplocked if this is request for new lease */
831	if (arg == F_UNLCK ||
832	    ((arg == F_RDLCK) && CIFS_CACHE_READ(CIFS_I(inode))) ||
833	    ((arg == F_WRLCK) && CIFS_CACHE_WRITE(CIFS_I(inode))))
834		return generic_setlease(file, arg, lease, priv);
835	else if (tlink_tcon(cfile->tlink)->local_lease &&
836		 !CIFS_CACHE_READ(CIFS_I(inode)))
837		/*
838		 * If the server claims to support oplock on this file, then we
839		 * still need to check oplock even if the local_lease mount
840		 * option is set, but there are servers which do not support
841		 * oplock for which this mount option may be useful if the user
842		 * knows that the file won't be changed on the server by anyone
843		 * else.
844		 */
845		return generic_setlease(file, arg, lease, priv);
846	else
847		return -EAGAIN;
848}
849
850struct file_system_type cifs_fs_type = {
851	.owner = THIS_MODULE,
852	.name = "cifs",
853	.mount = cifs_do_mount,
854	.kill_sb = cifs_kill_sb,
855	/*  .fs_flags */
856};
857MODULE_ALIAS_FS("cifs");
858const struct inode_operations cifs_dir_inode_ops = {
859	.create = cifs_create,
860	.atomic_open = cifs_atomic_open,
861	.lookup = cifs_lookup,
862	.getattr = cifs_getattr,
863	.unlink = cifs_unlink,
864	.link = cifs_hardlink,
865	.mkdir = cifs_mkdir,
866	.rmdir = cifs_rmdir,
867	.rename2 = cifs_rename2,
868	.permission = cifs_permission,
869/*	revalidate:cifs_revalidate,   */
870	.setattr = cifs_setattr,
871	.symlink = cifs_symlink,
872	.mknod   = cifs_mknod,
873#ifdef CONFIG_CIFS_XATTR
874	.setxattr = cifs_setxattr,
875	.getxattr = cifs_getxattr,
876	.listxattr = cifs_listxattr,
877	.removexattr = cifs_removexattr,
878#endif
879};
880
881const struct inode_operations cifs_file_inode_ops = {
882/*	revalidate:cifs_revalidate, */
883	.setattr = cifs_setattr,
884	.getattr = cifs_getattr, /* do we need this anymore? */
885	.permission = cifs_permission,
886#ifdef CONFIG_CIFS_XATTR
887	.setxattr = cifs_setxattr,
888	.getxattr = cifs_getxattr,
889	.listxattr = cifs_listxattr,
890	.removexattr = cifs_removexattr,
891#endif
892};
893
894const struct inode_operations cifs_symlink_inode_ops = {
895	.readlink = generic_readlink,
896	.follow_link = cifs_follow_link,
897	.put_link = kfree_put_link,
898	.permission = cifs_permission,
899	/* BB add the following two eventually */
900	/* revalidate: cifs_revalidate,
901	   setattr:    cifs_notify_change, *//* BB do we need notify change */
902#ifdef CONFIG_CIFS_XATTR
903	.setxattr = cifs_setxattr,
904	.getxattr = cifs_getxattr,
905	.listxattr = cifs_listxattr,
906	.removexattr = cifs_removexattr,
907#endif
908};
909
910const struct file_operations cifs_file_ops = {
911	.read_iter = cifs_loose_read_iter,
912	.write_iter = cifs_file_write_iter,
913	.open = cifs_open,
914	.release = cifs_close,
915	.lock = cifs_lock,
916	.fsync = cifs_fsync,
917	.flush = cifs_flush,
918	.mmap  = cifs_file_mmap,
919	.splice_read = generic_file_splice_read,
920	.llseek = cifs_llseek,
921#ifdef CONFIG_CIFS_POSIX
922	.unlocked_ioctl	= cifs_ioctl,
923#endif /* CONFIG_CIFS_POSIX */
924	.setlease = cifs_setlease,
925	.fallocate = cifs_fallocate,
926};
927
928const struct file_operations cifs_file_strict_ops = {
929	.read_iter = cifs_strict_readv,
930	.write_iter = cifs_strict_writev,
931	.open = cifs_open,
932	.release = cifs_close,
933	.lock = cifs_lock,
934	.fsync = cifs_strict_fsync,
935	.flush = cifs_flush,
936	.mmap = cifs_file_strict_mmap,
937	.splice_read = generic_file_splice_read,
938	.llseek = cifs_llseek,
939#ifdef CONFIG_CIFS_POSIX
940	.unlocked_ioctl	= cifs_ioctl,
941#endif /* CONFIG_CIFS_POSIX */
942	.setlease = cifs_setlease,
943	.fallocate = cifs_fallocate,
944};
945
946const struct file_operations cifs_file_direct_ops = {
947	/* BB reevaluate whether they can be done with directio, no cache */
948	.read_iter = cifs_user_readv,
949	.write_iter = cifs_user_writev,
950	.open = cifs_open,
951	.release = cifs_close,
952	.lock = cifs_lock,
953	.fsync = cifs_fsync,
954	.flush = cifs_flush,
955	.mmap = cifs_file_mmap,
956	.splice_read = generic_file_splice_read,
957#ifdef CONFIG_CIFS_POSIX
958	.unlocked_ioctl  = cifs_ioctl,
959#endif /* CONFIG_CIFS_POSIX */
960	.llseek = cifs_llseek,
961	.setlease = cifs_setlease,
962	.fallocate = cifs_fallocate,
963};
964
965const struct file_operations cifs_file_nobrl_ops = {
966	.read_iter = cifs_loose_read_iter,
967	.write_iter = cifs_file_write_iter,
968	.open = cifs_open,
969	.release = cifs_close,
970	.fsync = cifs_fsync,
971	.flush = cifs_flush,
972	.mmap  = cifs_file_mmap,
973	.splice_read = generic_file_splice_read,
974	.llseek = cifs_llseek,
975#ifdef CONFIG_CIFS_POSIX
976	.unlocked_ioctl	= cifs_ioctl,
977#endif /* CONFIG_CIFS_POSIX */
978	.setlease = cifs_setlease,
979	.fallocate = cifs_fallocate,
980};
981
982const struct file_operations cifs_file_strict_nobrl_ops = {
983	.read_iter = cifs_strict_readv,
984	.write_iter = cifs_strict_writev,
985	.open = cifs_open,
986	.release = cifs_close,
987	.fsync = cifs_strict_fsync,
988	.flush = cifs_flush,
989	.mmap = cifs_file_strict_mmap,
990	.splice_read = generic_file_splice_read,
991	.llseek = cifs_llseek,
992#ifdef CONFIG_CIFS_POSIX
993	.unlocked_ioctl	= cifs_ioctl,
994#endif /* CONFIG_CIFS_POSIX */
995	.setlease = cifs_setlease,
996	.fallocate = cifs_fallocate,
997};
998
999const struct file_operations cifs_file_direct_nobrl_ops = {
1000	/* BB reevaluate whether they can be done with directio, no cache */
1001	.read_iter = cifs_user_readv,
1002	.write_iter = cifs_user_writev,
1003	.open = cifs_open,
1004	.release = cifs_close,
1005	.fsync = cifs_fsync,
1006	.flush = cifs_flush,
1007	.mmap = cifs_file_mmap,
1008	.splice_read = generic_file_splice_read,
1009#ifdef CONFIG_CIFS_POSIX
1010	.unlocked_ioctl  = cifs_ioctl,
1011#endif /* CONFIG_CIFS_POSIX */
1012	.llseek = cifs_llseek,
1013	.setlease = cifs_setlease,
1014	.fallocate = cifs_fallocate,
1015};
1016
1017const struct file_operations cifs_dir_ops = {
1018	.iterate = cifs_readdir,
1019	.release = cifs_closedir,
1020	.read    = generic_read_dir,
1021	.unlocked_ioctl  = cifs_ioctl,
1022	.llseek = generic_file_llseek,
1023};
1024
1025static void
1026cifs_init_once(void *inode)
1027{
1028	struct cifsInodeInfo *cifsi = inode;
1029
1030	inode_init_once(&cifsi->vfs_inode);
1031	init_rwsem(&cifsi->lock_sem);
1032}
1033
1034static int __init
1035cifs_init_inodecache(void)
1036{
1037	cifs_inode_cachep = kmem_cache_create("cifs_inode_cache",
1038					      sizeof(struct cifsInodeInfo),
1039					      0, (SLAB_RECLAIM_ACCOUNT|
1040						SLAB_MEM_SPREAD),
1041					      cifs_init_once);
1042	if (cifs_inode_cachep == NULL)
1043		return -ENOMEM;
1044
1045	return 0;
1046}
1047
1048static void
1049cifs_destroy_inodecache(void)
1050{
1051	/*
1052	 * Make sure all delayed rcu free inodes are flushed before we
1053	 * destroy cache.
1054	 */
1055	rcu_barrier();
1056	kmem_cache_destroy(cifs_inode_cachep);
1057}
1058
1059static int
1060cifs_init_request_bufs(void)
1061{
1062	size_t max_hdr_size = MAX_CIFS_HDR_SIZE;
1063#ifdef CONFIG_CIFS_SMB2
1064	/*
1065	 * SMB2 maximum header size is bigger than CIFS one - no problems to
1066	 * allocate some more bytes for CIFS.
1067	 */
1068	max_hdr_size = MAX_SMB2_HDR_SIZE;
1069#endif
1070	if (CIFSMaxBufSize < 8192) {
1071	/* Buffer size can not be smaller than 2 * PATH_MAX since maximum
1072	Unicode path name has to fit in any SMB/CIFS path based frames */
1073		CIFSMaxBufSize = 8192;
1074	} else if (CIFSMaxBufSize > 1024*127) {
1075		CIFSMaxBufSize = 1024 * 127;
1076	} else {
1077		CIFSMaxBufSize &= 0x1FE00; /* Round size to even 512 byte mult*/
1078	}
1079/*
1080	cifs_dbg(VFS, "CIFSMaxBufSize %d 0x%x\n",
1081		 CIFSMaxBufSize, CIFSMaxBufSize);
1082*/
1083	cifs_req_cachep = kmem_cache_create("cifs_request",
1084					    CIFSMaxBufSize + max_hdr_size, 0,
1085					    SLAB_HWCACHE_ALIGN, NULL);
1086	if (cifs_req_cachep == NULL)
1087		return -ENOMEM;
1088
1089	if (cifs_min_rcv < 1)
1090		cifs_min_rcv = 1;
1091	else if (cifs_min_rcv > 64) {
1092		cifs_min_rcv = 64;
1093		cifs_dbg(VFS, "cifs_min_rcv set to maximum (64)\n");
1094	}
1095
1096	cifs_req_poolp = mempool_create_slab_pool(cifs_min_rcv,
1097						  cifs_req_cachep);
1098
1099	if (cifs_req_poolp == NULL) {
1100		kmem_cache_destroy(cifs_req_cachep);
1101		return -ENOMEM;
1102	}
1103	/* MAX_CIFS_SMALL_BUFFER_SIZE bytes is enough for most SMB responses and
1104	almost all handle based requests (but not write response, nor is it
1105	sufficient for path based requests).  A smaller size would have
1106	been more efficient (compacting multiple slab items on one 4k page)
1107	for the case in which debug was on, but this larger size allows
1108	more SMBs to use small buffer alloc and is still much more
1109	efficient to alloc 1 per page off the slab compared to 17K (5page)
1110	alloc of large cifs buffers even when page debugging is on */
1111	cifs_sm_req_cachep = kmem_cache_create("cifs_small_rq",
1112			MAX_CIFS_SMALL_BUFFER_SIZE, 0, SLAB_HWCACHE_ALIGN,
1113			NULL);
1114	if (cifs_sm_req_cachep == NULL) {
1115		mempool_destroy(cifs_req_poolp);
1116		kmem_cache_destroy(cifs_req_cachep);
1117		return -ENOMEM;
1118	}
1119
1120	if (cifs_min_small < 2)
1121		cifs_min_small = 2;
1122	else if (cifs_min_small > 256) {
1123		cifs_min_small = 256;
1124		cifs_dbg(FYI, "cifs_min_small set to maximum (256)\n");
1125	}
1126
1127	cifs_sm_req_poolp = mempool_create_slab_pool(cifs_min_small,
1128						     cifs_sm_req_cachep);
1129
1130	if (cifs_sm_req_poolp == NULL) {
1131		mempool_destroy(cifs_req_poolp);
1132		kmem_cache_destroy(cifs_req_cachep);
1133		kmem_cache_destroy(cifs_sm_req_cachep);
1134		return -ENOMEM;
1135	}
1136
1137	return 0;
1138}
1139
1140static void
1141cifs_destroy_request_bufs(void)
1142{
1143	mempool_destroy(cifs_req_poolp);
1144	kmem_cache_destroy(cifs_req_cachep);
1145	mempool_destroy(cifs_sm_req_poolp);
1146	kmem_cache_destroy(cifs_sm_req_cachep);
1147}
1148
1149static int
1150cifs_init_mids(void)
1151{
1152	cifs_mid_cachep = kmem_cache_create("cifs_mpx_ids",
1153					    sizeof(struct mid_q_entry), 0,
1154					    SLAB_HWCACHE_ALIGN, NULL);
1155	if (cifs_mid_cachep == NULL)
1156		return -ENOMEM;
1157
1158	/* 3 is a reasonable minimum number of simultaneous operations */
1159	cifs_mid_poolp = mempool_create_slab_pool(3, cifs_mid_cachep);
1160	if (cifs_mid_poolp == NULL) {
1161		kmem_cache_destroy(cifs_mid_cachep);
1162		return -ENOMEM;
1163	}
1164
1165	return 0;
1166}
1167
1168static void
1169cifs_destroy_mids(void)
1170{
1171	mempool_destroy(cifs_mid_poolp);
1172	kmem_cache_destroy(cifs_mid_cachep);
1173}
1174
1175static int __init
1176init_cifs(void)
1177{
1178	int rc = 0;
1179	cifs_proc_init();
1180	INIT_LIST_HEAD(&cifs_tcp_ses_list);
1181#ifdef CONFIG_CIFS_DNOTIFY_EXPERIMENTAL /* unused temporarily */
1182	INIT_LIST_HEAD(&GlobalDnotifyReqList);
1183	INIT_LIST_HEAD(&GlobalDnotifyRsp_Q);
1184#endif /* was needed for dnotify, and will be needed for inotify when VFS fix */
1185/*
1186 *  Initialize Global counters
1187 */
1188	atomic_set(&sesInfoAllocCount, 0);
1189	atomic_set(&tconInfoAllocCount, 0);
1190	atomic_set(&tcpSesAllocCount, 0);
1191	atomic_set(&tcpSesReconnectCount, 0);
1192	atomic_set(&tconInfoReconnectCount, 0);
1193
1194	atomic_set(&bufAllocCount, 0);
1195	atomic_set(&smBufAllocCount, 0);
1196#ifdef CONFIG_CIFS_STATS2
1197	atomic_set(&totBufAllocCount, 0);
1198	atomic_set(&totSmBufAllocCount, 0);
1199#endif /* CONFIG_CIFS_STATS2 */
1200
1201	atomic_set(&midCount, 0);
1202	GlobalCurrentXid = 0;
1203	GlobalTotalActiveXid = 0;
1204	GlobalMaxActiveXid = 0;
1205	spin_lock_init(&cifs_tcp_ses_lock);
1206	spin_lock_init(&cifs_file_list_lock);
1207	spin_lock_init(&GlobalMid_Lock);
1208
1209	if (cifs_max_pending < 2) {
1210		cifs_max_pending = 2;
1211		cifs_dbg(FYI, "cifs_max_pending set to min of 2\n");
1212	} else if (cifs_max_pending > CIFS_MAX_REQ) {
1213		cifs_max_pending = CIFS_MAX_REQ;
1214		cifs_dbg(FYI, "cifs_max_pending set to max of %u\n",
1215			 CIFS_MAX_REQ);
1216	}
1217
1218	cifsiod_wq = alloc_workqueue("cifsiod", WQ_FREEZABLE|WQ_MEM_RECLAIM, 0);
1219	if (!cifsiod_wq) {
1220		rc = -ENOMEM;
1221		goto out_clean_proc;
1222	}
1223
1224	rc = cifs_fscache_register();
1225	if (rc)
1226		goto out_destroy_wq;
1227
1228	rc = cifs_init_inodecache();
1229	if (rc)
1230		goto out_unreg_fscache;
1231
1232	rc = cifs_init_mids();
1233	if (rc)
1234		goto out_destroy_inodecache;
1235
1236	rc = cifs_init_request_bufs();
1237	if (rc)
1238		goto out_destroy_mids;
1239
1240#ifdef CONFIG_CIFS_UPCALL
1241	rc = init_cifs_spnego();
1242	if (rc)
1243		goto out_destroy_request_bufs;
1244#endif /* CONFIG_CIFS_UPCALL */
1245
1246#ifdef CONFIG_CIFS_ACL
1247	rc = init_cifs_idmap();
1248	if (rc)
1249		goto out_register_key_type;
1250#endif /* CONFIG_CIFS_ACL */
1251
1252	rc = register_filesystem(&cifs_fs_type);
1253	if (rc)
1254		goto out_init_cifs_idmap;
1255
1256	return 0;
1257
1258out_init_cifs_idmap:
1259#ifdef CONFIG_CIFS_ACL
1260	exit_cifs_idmap();
1261out_register_key_type:
1262#endif
1263#ifdef CONFIG_CIFS_UPCALL
1264	exit_cifs_spnego();
1265out_destroy_request_bufs:
1266#endif
1267	cifs_destroy_request_bufs();
1268out_destroy_mids:
1269	cifs_destroy_mids();
1270out_destroy_inodecache:
1271	cifs_destroy_inodecache();
1272out_unreg_fscache:
1273	cifs_fscache_unregister();
1274out_destroy_wq:
1275	destroy_workqueue(cifsiod_wq);
1276out_clean_proc:
1277	cifs_proc_clean();
1278	return rc;
1279}
1280
1281static void __exit
1282exit_cifs(void)
1283{
1284	cifs_dbg(NOISY, "exit_cifs\n");
1285	unregister_filesystem(&cifs_fs_type);
1286	cifs_dfs_release_automount_timer();
1287#ifdef CONFIG_CIFS_ACL
1288	exit_cifs_idmap();
1289#endif
1290#ifdef CONFIG_CIFS_UPCALL
1291	unregister_key_type(&cifs_spnego_key_type);
1292#endif
1293	cifs_destroy_request_bufs();
1294	cifs_destroy_mids();
1295	cifs_destroy_inodecache();
1296	cifs_fscache_unregister();
1297	destroy_workqueue(cifsiod_wq);
1298	cifs_proc_clean();
1299}
1300
1301MODULE_AUTHOR("Steve French <sfrench@us.ibm.com>");
1302MODULE_LICENSE("GPL");	/* combination of LGPL + GPL source behaves as GPL */
1303MODULE_DESCRIPTION
1304    ("VFS to access servers complying with the SNIA CIFS Specification "
1305     "e.g. Samba and Windows");
1306MODULE_VERSION(CIFS_VERSION);
1307module_init(init_cifs)
1308module_exit(exit_cifs)
1309