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