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