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 
56 int cifsFYI = 0;
57 int traceSMB = 0;
58 bool enable_oplocks = true;
59 unsigned int linuxExtEnabled = 1;
60 unsigned int lookupCacheEnabled = 1;
61 unsigned int global_secflags = CIFSSEC_DEF;
62 /* unsigned int ntlmv2_support = 0; */
63 unsigned int sign_CIFS_PDUs = 1;
64 static const struct super_operations cifs_super_ops;
65 unsigned int CIFSMaxBufSize = CIFS_MAX_MSGSIZE;
66 module_param(CIFSMaxBufSize, uint, 0);
67 MODULE_PARM_DESC(CIFSMaxBufSize, "Network buffer size (not including header). "
68 				 "Default: 16384 Range: 8192 to 130048");
69 unsigned int cifs_min_rcv = CIFS_MIN_RCV_POOL;
70 module_param(cifs_min_rcv, uint, 0);
71 MODULE_PARM_DESC(cifs_min_rcv, "Network buffers in pool. Default: 4 Range: "
72 				"1 to 64");
73 unsigned int cifs_min_small = 30;
74 module_param(cifs_min_small, uint, 0);
75 MODULE_PARM_DESC(cifs_min_small, "Small network buffers in pool. Default: 30 "
76 				 "Range: 2 to 256");
77 unsigned int cifs_max_pending = CIFS_MAX_REQ;
78 module_param(cifs_max_pending, uint, 0444);
79 MODULE_PARM_DESC(cifs_max_pending, "Simultaneous requests to server. "
80 				   "Default: 32767 Range: 2 to 32767.");
81 module_param(enable_oplocks, bool, 0644);
82 MODULE_PARM_DESC(enable_oplocks, "Enable or disable oplocks. Default: y/Y/1");
83 
84 extern mempool_t *cifs_sm_req_poolp;
85 extern mempool_t *cifs_req_poolp;
86 extern mempool_t *cifs_mid_poolp;
87 
88 struct 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  */
96 void
cifs_sb_active(struct super_block * sb)97 cifs_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 
105 void
cifs_sb_deactive(struct super_block * sb)106 cifs_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 
114 static int
cifs_read_super(struct super_block * sb)115 cifs_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 
168 out_no_root:
169 	cifs_dbg(VFS, "%s: get root inode failed\n", __func__);
170 	return rc;
171 }
172 
cifs_kill_sb(struct super_block * sb)173 static 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 
180 static int
cifs_statfs(struct dentry * dentry,struct kstatfs * buf)181 cifs_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 
cifs_fallocate(struct file * file,int mode,loff_t off,loff_t len)210 static 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 
cifs_permission(struct inode * inode,int mask)222 static 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 
240 static struct kmem_cache *cifs_inode_cachep;
241 static struct kmem_cache *cifs_req_cachep;
242 static struct kmem_cache *cifs_mid_cachep;
243 static struct kmem_cache *cifs_sm_req_cachep;
244 mempool_t *cifs_sm_req_poolp;
245 mempool_t *cifs_req_poolp;
246 mempool_t *cifs_mid_poolp;
247 
248 static struct inode *
cifs_alloc_inode(struct super_block * sb)249 cifs_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 
cifs_i_callback(struct rcu_head * head)283 static 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 
289 static void
cifs_destroy_inode(struct inode * inode)290 cifs_destroy_inode(struct inode *inode)
291 {
292 	call_rcu(&inode->i_rcu, cifs_i_callback);
293 }
294 
295 static void
cifs_evict_inode(struct inode * inode)296 cifs_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 
303 static void
cifs_show_address(struct seq_file * s,struct TCP_Server_Info * server)304 cifs_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 
325 static void
cifs_show_security(struct seq_file * s,struct cifs_ses * ses)326 cifs_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 
359 static void
cifs_show_cache_flavor(struct seq_file * s,struct cifs_sb_info * cifs_sb)360 cifs_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 
372 static void
cifs_show_nls(struct seq_file * s,struct nls_table * cur)373 cifs_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  */
389 static int
cifs_show_options(struct seq_file * s,struct dentry * root)390 cifs_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 
cifs_umount_begin(struct super_block * sb)509 static 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
cifs_show_stats(struct seq_file * s,struct dentry * root)546 static int cifs_show_stats(struct seq_file *s, struct dentry *root)
547 {
548 	/* BB FIXME */
549 	return 0;
550 }
551 #endif
552 
cifs_remount(struct super_block * sb,int * flags,char * data)553 static 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 
cifs_drop_inode(struct inode * inode)560 static 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 
569 static 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  */
591 static struct dentry *
cifs_get_root(struct smb_vol * vol,struct super_block * sb)592 cifs_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 
cifs_set_super(struct super_block * sb,void * data)646 static 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 
653 static struct dentry *
cifs_do_mount(struct file_system_type * fs_type,int flags,const char * dev_name,void * data)654 cifs_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 
727 out_super:
728 	deactivate_locked_super(sb);
729 out:
730 	cifs_cleanup_volume_info(volume_info);
731 	return root;
732 
733 out_mountdata:
734 	kfree(cifs_sb->mountdata);
735 out_cifs_sb:
736 	kfree(cifs_sb);
737 out_nls:
738 	unload_nls(volume_info->local_nls);
739 	goto out;
740 }
741 
742 static ssize_t
cifs_loose_read_iter(struct kiocb * iocb,struct iov_iter * iter)743 cifs_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 
cifs_file_write_iter(struct kiocb * iocb,struct iov_iter * from)755 static 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 
776 out:
777 	cifs_put_writer(cinode);
778 	return written;
779 }
780 
cifs_llseek(struct file * file,loff_t offset,int whence)781 static 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 
817 static int
cifs_setlease(struct file * file,long arg,struct file_lock ** lease,void ** priv)818 cifs_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 
850 struct 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 };
857 MODULE_ALIAS_FS("cifs");
858 const 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 
881 const 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 
894 const 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 
910 const 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 
928 const 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 
946 const 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 
965 const 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 
982 const 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 
999 const 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 
1017 const 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 
1025 static void
cifs_init_once(void * inode)1026 cifs_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 
1034 static int __init
cifs_init_inodecache(void)1035 cifs_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 
1048 static void
cifs_destroy_inodecache(void)1049 cifs_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 
1059 static int
cifs_init_request_bufs(void)1060 cifs_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 
1140 static void
cifs_destroy_request_bufs(void)1141 cifs_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 
1149 static int
cifs_init_mids(void)1150 cifs_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 
1168 static void
cifs_destroy_mids(void)1169 cifs_destroy_mids(void)
1170 {
1171 	mempool_destroy(cifs_mid_poolp);
1172 	kmem_cache_destroy(cifs_mid_cachep);
1173 }
1174 
1175 static int __init
init_cifs(void)1176 init_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 
1258 out_init_cifs_idmap:
1259 #ifdef CONFIG_CIFS_ACL
1260 	exit_cifs_idmap();
1261 out_register_key_type:
1262 #endif
1263 #ifdef CONFIG_CIFS_UPCALL
1264 	exit_cifs_spnego();
1265 out_destroy_request_bufs:
1266 #endif
1267 	cifs_destroy_request_bufs();
1268 out_destroy_mids:
1269 	cifs_destroy_mids();
1270 out_destroy_inodecache:
1271 	cifs_destroy_inodecache();
1272 out_unreg_fscache:
1273 	cifs_fscache_unregister();
1274 out_destroy_wq:
1275 	destroy_workqueue(cifsiod_wq);
1276 out_clean_proc:
1277 	cifs_proc_clean();
1278 	return rc;
1279 }
1280 
1281 static void __exit
exit_cifs(void)1282 exit_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 
1301 MODULE_AUTHOR("Steve French <sfrench@us.ibm.com>");
1302 MODULE_LICENSE("GPL");	/* combination of LGPL + GPL source behaves as GPL */
1303 MODULE_DESCRIPTION
1304     ("VFS to access servers complying with the SNIA CIFS Specification "
1305      "e.g. Samba and Windows");
1306 MODULE_VERSION(CIFS_VERSION);
1307 module_init(init_cifs)
1308 module_exit(exit_cifs)
1309