Merge branch 'akpm' (patches from Andrew)
[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:
571d5972 384 seq_puts(s, "krb5");
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);
adfeb3e0
SF
557 seq_printf(s, ",echo_interval=%lu",
558 tcon->ses->server->echo_interval / HZ);
8a69e96e
SF
559 if (tcon->snapshot_time)
560 seq_printf(s, ",snapshot=%llu", tcon->snapshot_time);
6d20e840 561 /* convert actimeo and display it in seconds */
156d1790 562 seq_printf(s, ",actimeo=%lu", cifs_sb->actimeo / HZ);
8616e0fc 563
1da177e4
LT
564 return 0;
565}
566
42faad99 567static void cifs_umount_begin(struct super_block *sb)
68058e75 568{
42faad99 569 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
96daf2b0 570 struct cifs_tcon *tcon;
68058e75 571
4523cc30 572 if (cifs_sb == NULL)
9e2e85f8
SF
573 return;
574
0d424ad0 575 tcon = cifs_sb_master_tcon(cifs_sb);
f1987b44 576
3f9bcca7 577 spin_lock(&cifs_tcp_ses_lock);
ad8034f1
SF
578 if ((tcon->tc_count > 1) || (tcon->tidStatus == CifsExiting)) {
579 /* we have other mounts to same share or we have
580 already tried to force umount this and woken up
581 all waiting network requests, nothing to do */
3f9bcca7 582 spin_unlock(&cifs_tcp_ses_lock);
ad8034f1
SF
583 return;
584 } else if (tcon->tc_count == 1)
5e1253b5 585 tcon->tidStatus = CifsExiting;
3f9bcca7 586 spin_unlock(&cifs_tcp_ses_lock);
5e1253b5 587
3a5ff61c 588 /* cancel_brl_requests(tcon); */ /* BB mark all brl mids as exiting */
7b7abfe3 589 /* cancel_notify_requests(tcon); */
50c2f753 590 if (tcon->ses && tcon->ses->server) {
f96637be 591 cifs_dbg(FYI, "wake up tasks now - umount begin not complete\n");
9e2e85f8 592 wake_up_all(&tcon->ses->server->request_q);
6ab16d24
SF
593 wake_up_all(&tcon->ses->server->response_q);
594 msleep(1); /* yield */
595 /* we have to kick the requests once more */
596 wake_up_all(&tcon->ses->server->response_q);
597 msleep(1);
5e1253b5 598 }
68058e75
SF
599
600 return;
601}
68058e75 602
bf97d287 603#ifdef CONFIG_CIFS_STATS2
64132379 604static int cifs_show_stats(struct seq_file *s, struct dentry *root)
bf97d287
SF
605{
606 /* BB FIXME */
607 return 0;
608}
609#endif
610
1da177e4
LT
611static int cifs_remount(struct super_block *sb, int *flags, char *data)
612{
02b9984d 613 sync_filesystem(sb);
1751e8a6 614 *flags |= SB_NODIRATIME;
1da177e4
LT
615 return 0;
616}
617
45321ac5 618static int cifs_drop_inode(struct inode *inode)
12420ac3
JL
619{
620 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
621
45321ac5
AV
622 /* no serverino => unconditional eviction */
623 return !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) ||
624 generic_drop_inode(inode);
12420ac3
JL
625}
626
ee9b6d61 627static const struct super_operations cifs_super_ops = {
1da177e4
LT
628 .statfs = cifs_statfs,
629 .alloc_inode = cifs_alloc_inode,
630 .destroy_inode = cifs_destroy_inode,
12420ac3 631 .drop_inode = cifs_drop_inode,
b57922d9 632 .evict_inode = cifs_evict_inode,
12420ac3
JL
633/* .delete_inode = cifs_delete_inode, */ /* Do not need above
634 function unless later we add lazy close of inodes or unless the
50c2f753
SF
635 kernel forgets to call us with the same number of releases (closes)
636 as opens */
1da177e4 637 .show_options = cifs_show_options,
7b7abfe3 638 .umount_begin = cifs_umount_begin,
1da177e4 639 .remount_fs = cifs_remount,
bf97d287 640#ifdef CONFIG_CIFS_STATS2
f46d3e11 641 .show_stats = cifs_show_stats,
bf97d287 642#endif
1da177e4
LT
643};
644
f87d39d9
SF
645/*
646 * Get root dentry from superblock according to prefix path mount option.
647 * Return dentry with refcount + 1 on success and NULL otherwise.
648 */
649static struct dentry *
650cifs_get_root(struct smb_vol *vol, struct super_block *sb)
651{
fec11dd9 652 struct dentry *dentry;
f87d39d9 653 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
fec11dd9
AV
654 char *full_path = NULL;
655 char *s, *p;
f87d39d9
SF
656 char sep;
657
348c1bfa
SP
658 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH)
659 return dget(sb->s_root);
660
6d3ea7e4 661 full_path = cifs_build_path_to_root(vol, cifs_sb,
374402a2 662 cifs_sb_master_tcon(cifs_sb), 0);
f87d39d9 663 if (full_path == NULL)
9403c9c5 664 return ERR_PTR(-ENOMEM);
f87d39d9 665
f96637be 666 cifs_dbg(FYI, "Get root dentry for %s\n", full_path);
f87d39d9 667
f87d39d9 668 sep = CIFS_DIR_SEP(cifs_sb);
fec11dd9
AV
669 dentry = dget(sb->s_root);
670 p = s = full_path;
671
672 do {
2b0143b5 673 struct inode *dir = d_inode(dentry);
fec11dd9
AV
674 struct dentry *child;
675
5b980b01
PS
676 if (!dir) {
677 dput(dentry);
678 dentry = ERR_PTR(-ENOENT);
679 break;
680 }
ce2ac521
JL
681 if (!S_ISDIR(dir->i_mode)) {
682 dput(dentry);
683 dentry = ERR_PTR(-ENOTDIR);
684 break;
685 }
5b980b01 686
fec11dd9
AV
687 /* skip separators */
688 while (*s == sep)
689 s++;
690 if (!*s)
691 break;
692 p = s++;
693 /* next separator */
694 while (*s && *s != sep)
695 s++;
696
85f40482 697 child = lookup_one_len_unlocked(p, dentry, s - p);
fec11dd9
AV
698 dput(dentry);
699 dentry = child;
700 } while (!IS_ERR(dentry));
f87d39d9 701 kfree(full_path);
fec11dd9 702 return dentry;
f87d39d9
SF
703}
704
ee01a14d
AV
705static int cifs_set_super(struct super_block *sb, void *data)
706{
707 struct cifs_mnt_data *mnt_data = data;
708 sb->s_fs_info = mnt_data->cifs_sb;
709 return set_anon_super(sb, NULL);
710}
711
d753ed97 712static struct dentry *
c7c137b9
SF
713cifs_smb3_do_mount(struct file_system_type *fs_type,
714 int flags, const char *dev_name, void *data, bool is_smb3)
1da177e4
LT
715{
716 int rc;
db719222 717 struct super_block *sb;
724d9f1c
PS
718 struct cifs_sb_info *cifs_sb;
719 struct smb_vol *volume_info;
25c7f41e 720 struct cifs_mnt_data mnt_data;
724d9f1c 721 struct dentry *root;
1da177e4 722
8c1beb98
SF
723 /*
724 * Prints in Kernel / CIFS log the attempted mount operation
725 * If CIFS_DEBUG && cifs_FYI
726 */
f80eaedd
RF
727 if (cifsFYI)
728 cifs_dbg(FYI, "Devname: %s flags: %d\n", dev_name, flags);
729 else
730 cifs_info("Attempting to mount %s\n", dev_name);
1da177e4 731
c7c137b9 732 volume_info = cifs_get_volume_info((char *)data, dev_name, is_smb3);
04db79b0
JL
733 if (IS_ERR(volume_info))
734 return ERR_CAST(volume_info);
724d9f1c
PS
735
736 cifs_sb = kzalloc(sizeof(struct cifs_sb_info), GFP_KERNEL);
737 if (cifs_sb == NULL) {
738 root = ERR_PTR(-ENOMEM);
5c4f1ad7 739 goto out_nls;
724d9f1c
PS
740 }
741
5d3bc605
AV
742 cifs_sb->mountdata = kstrndup(data, PAGE_SIZE, GFP_KERNEL);
743 if (cifs_sb->mountdata == NULL) {
744 root = ERR_PTR(-ENOMEM);
4214ebf4 745 goto out_free;
5d3bc605
AV
746 }
747
4214ebf4
SP
748 rc = cifs_setup_cifs_sb(volume_info, cifs_sb);
749 if (rc) {
750 root = ERR_PTR(rc);
751 goto out_free;
a6b5058f
AA
752 }
753
97d1152a
AV
754 rc = cifs_mount(cifs_sb, volume_info);
755 if (rc) {
1751e8a6 756 if (!(flags & SB_SILENT))
f96637be
JP
757 cifs_dbg(VFS, "cifs_mount failed w/return code = %d\n",
758 rc);
97d1152a 759 root = ERR_PTR(rc);
4214ebf4 760 goto out_free;
97d1152a
AV
761 }
762
25c7f41e
PS
763 mnt_data.vol = volume_info;
764 mnt_data.cifs_sb = cifs_sb;
765 mnt_data.flags = flags;
766
9249e17f 767 /* BB should we make this contingent on mount parm? */
1751e8a6 768 flags |= SB_NODIRATIME | SB_NOATIME;
9249e17f
DH
769
770 sb = sget(fs_type, cifs_match_super, cifs_set_super, flags, &mnt_data);
724d9f1c 771 if (IS_ERR(sb)) {
724d9f1c 772 root = ERR_CAST(sb);
97d1152a 773 cifs_umount(cifs_sb);
d757d71b 774 goto out;
724d9f1c 775 }
1da177e4 776
ee01a14d 777 if (sb->s_root) {
f96637be 778 cifs_dbg(FYI, "Use existing superblock\n");
97d1152a 779 cifs_umount(cifs_sb);
5c4f1ad7 780 } else {
5c4f1ad7
AV
781 rc = cifs_read_super(sb);
782 if (rc) {
783 root = ERR_PTR(rc);
784 goto out_super;
785 }
b2e5cd33 786
1751e8a6 787 sb->s_flags |= SB_ACTIVE;
1da177e4 788 }
724d9f1c 789
348c1bfa 790 root = cifs_get_root(volume_info, sb);
9403c9c5 791 if (IS_ERR(root))
f87d39d9 792 goto out_super;
25c7f41e 793
f96637be 794 cifs_dbg(FYI, "dentry root is: %p\n", root);
641a58d6 795 goto out;
724d9f1c 796
641a58d6 797out_super:
641a58d6 798 deactivate_locked_super(sb);
641a58d6 799out:
f9e59bcb 800 cifs_cleanup_volume_info(volume_info);
724d9f1c 801 return root;
5c4f1ad7 802
4214ebf4
SP
803out_free:
804 kfree(cifs_sb->prepath);
5c4f1ad7 805 kfree(cifs_sb->mountdata);
5c4f1ad7
AV
806 kfree(cifs_sb);
807out_nls:
808 unload_nls(volume_info->local_nls);
809 goto out;
1da177e4
LT
810}
811
c7c137b9
SF
812static struct dentry *
813smb3_do_mount(struct file_system_type *fs_type,
814 int flags, const char *dev_name, void *data)
815{
816 return cifs_smb3_do_mount(fs_type, flags, dev_name, data, true);
817}
818
819static struct dentry *
820cifs_do_mount(struct file_system_type *fs_type,
821 int flags, const char *dev_name, void *data)
822{
823 return cifs_smb3_do_mount(fs_type, flags, dev_name, data, false);
824}
825
08bc0353
JL
826static ssize_t
827cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter)
828{
829 ssize_t rc;
830 struct inode *inode = file_inode(iocb->ki_filp);
831
882137c4
RL
832 if (iocb->ki_filp->f_flags & O_DIRECT)
833 return cifs_user_readv(iocb, iter);
834
08bc0353
JL
835 rc = cifs_revalidate_mapping(inode);
836 if (rc)
837 return rc;
838
839 return generic_file_read_iter(iocb, iter);
840}
841
3dae8750 842static ssize_t cifs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
1da177e4 843{
496ad9aa 844 struct inode *inode = file_inode(iocb->ki_filp);
c11f1df5 845 struct cifsInodeInfo *cinode = CIFS_I(inode);
1da177e4 846 ssize_t written;
72432ffc 847 int rc;
1da177e4 848
882137c4
RL
849 if (iocb->ki_filp->f_flags & O_DIRECT) {
850 written = cifs_user_writev(iocb, from);
851 if (written > 0 && CIFS_CACHE_READ(cinode)) {
852 cifs_zap_mapping(inode);
853 cifs_dbg(FYI,
854 "Set no oplock for inode=%p after a write operation\n",
855 inode);
856 cinode->oplock = 0;
857 }
858 return written;
859 }
860
c11f1df5
SP
861 written = cifs_get_writer(cinode);
862 if (written)
863 return written;
864
3dae8750 865 written = generic_file_write_iter(iocb, from);
72432ffc 866
18cceb6a 867 if (CIFS_CACHE_WRITE(CIFS_I(inode)))
c11f1df5 868 goto out;
72432ffc
PS
869
870 rc = filemap_fdatawrite(inode->i_mapping);
871 if (rc)
3dae8750 872 cifs_dbg(FYI, "cifs_file_write_iter: %d rc on %p inode\n",
f96637be 873 rc, inode);
72432ffc 874
c11f1df5
SP
875out:
876 cifs_put_writer(cinode);
1da177e4
LT
877 return written;
878}
879
965c8e59 880static loff_t cifs_llseek(struct file *file, loff_t offset, int whence)
c32a0b68 881{
06222e49 882 /*
965c8e59 883 * whence == SEEK_END || SEEK_DATA || SEEK_HOLE => we must revalidate
06222e49
JB
884 * the cached file length
885 */
965c8e59 886 if (whence != SEEK_SET && whence != SEEK_CUR) {
6feb9891 887 int rc;
496ad9aa 888 struct inode *inode = file_inode(file);
6feb9891
PS
889
890 /*
891 * We need to be sure that all dirty pages are written and the
892 * server has the newest file length.
893 */
18cceb6a 894 if (!CIFS_CACHE_READ(CIFS_I(inode)) && inode->i_mapping &&
6feb9891
PS
895 inode->i_mapping->nrpages != 0) {
896 rc = filemap_fdatawait(inode->i_mapping);
156ecb2d
SF
897 if (rc) {
898 mapping_set_error(inode->i_mapping, rc);
899 return rc;
900 }
6feb9891
PS
901 }
902 /*
903 * Some applications poll for the file length in this strange
904 * way so we must seek to end on non-oplocked files by
905 * setting the revalidate time to zero.
906 */
907 CIFS_I(inode)->time = 0;
908
909 rc = cifs_revalidate_file_attr(file);
910 if (rc < 0)
911 return (loff_t)rc;
c32a0b68 912 }
965c8e59 913 return generic_file_llseek(file, offset, whence);
c32a0b68
SF
914}
915
e6f5c789
JL
916static int
917cifs_setlease(struct file *file, long arg, struct file_lock **lease, void **priv)
84210e91 918{
18cceb6a
PS
919 /*
920 * Note that this is called by vfs setlease with i_lock held to
921 * protect *lease from going away.
922 */
496ad9aa 923 struct inode *inode = file_inode(file);
ba00ba64 924 struct cifsFileInfo *cfile = file->private_data;
84210e91
SF
925
926 if (!(S_ISREG(inode->i_mode)))
927 return -EINVAL;
928
02440806
JL
929 /* Check if file is oplocked if this is request for new lease */
930 if (arg == F_UNLCK ||
931 ((arg == F_RDLCK) && CIFS_CACHE_READ(CIFS_I(inode))) ||
18cceb6a 932 ((arg == F_WRLCK) && CIFS_CACHE_WRITE(CIFS_I(inode))))
e6f5c789 933 return generic_setlease(file, arg, lease, priv);
13cfb733 934 else if (tlink_tcon(cfile->tlink)->local_lease &&
18cceb6a
PS
935 !CIFS_CACHE_READ(CIFS_I(inode)))
936 /*
937 * If the server claims to support oplock on this file, then we
938 * still need to check oplock even if the local_lease mount
939 * option is set, but there are servers which do not support
940 * oplock for which this mount option may be useful if the user
941 * knows that the file won't be changed on the server by anyone
942 * else.
943 */
e6f5c789 944 return generic_setlease(file, arg, lease, priv);
51ee4b84 945 else
84210e91
SF
946 return -EAGAIN;
947}
84210e91 948
e6ab1582 949struct file_system_type cifs_fs_type = {
1da177e4
LT
950 .owner = THIS_MODULE,
951 .name = "cifs",
d753ed97 952 .mount = cifs_do_mount,
6d686175 953 .kill_sb = cifs_kill_sb,
1da177e4
LT
954 /* .fs_flags */
955};
3e64fe5b 956MODULE_ALIAS_FS("cifs");
49218b4f
SF
957
958static struct file_system_type smb3_fs_type = {
959 .owner = THIS_MODULE,
960 .name = "smb3",
c7c137b9 961 .mount = smb3_do_mount,
49218b4f
SF
962 .kill_sb = cifs_kill_sb,
963 /* .fs_flags */
964};
965MODULE_ALIAS_FS("smb3");
966MODULE_ALIAS("smb3");
967
754661f1 968const struct inode_operations cifs_dir_inode_ops = {
1da177e4 969 .create = cifs_create,
d2c12719 970 .atomic_open = cifs_atomic_open,
1da177e4
LT
971 .lookup = cifs_lookup,
972 .getattr = cifs_getattr,
973 .unlink = cifs_unlink,
974 .link = cifs_hardlink,
975 .mkdir = cifs_mkdir,
976 .rmdir = cifs_rmdir,
2773bf00 977 .rename = cifs_rename2,
1da177e4 978 .permission = cifs_permission,
1da177e4
LT
979 .setattr = cifs_setattr,
980 .symlink = cifs_symlink,
981 .mknod = cifs_mknod,
1da177e4 982 .listxattr = cifs_listxattr,
1da177e4
LT
983};
984
754661f1 985const struct inode_operations cifs_file_inode_ops = {
1da177e4 986 .setattr = cifs_setattr,
48a77aa7 987 .getattr = cifs_getattr,
1da177e4 988 .permission = cifs_permission,
1da177e4 989 .listxattr = cifs_listxattr,
1da177e4
LT
990};
991
754661f1 992const struct inode_operations cifs_symlink_inode_ops = {
6b255391 993 .get_link = cifs_get_link,
1da177e4 994 .permission = cifs_permission,
1da177e4 995 .listxattr = cifs_listxattr,
1da177e4
LT
996};
997
42ec3d4c
DW
998static loff_t cifs_remap_file_range(struct file *src_file, loff_t off,
999 struct file *dst_file, loff_t destoff, loff_t len,
2e5dfc99 1000 unsigned int remap_flags)
04b38d60
CH
1001{
1002 struct inode *src_inode = file_inode(src_file);
1003 struct inode *target_inode = file_inode(dst_file);
1004 struct cifsFileInfo *smb_file_src = src_file->private_data;
8c6c9bed
CIK
1005 struct cifsFileInfo *smb_file_target;
1006 struct cifs_tcon *target_tcon;
04b38d60
CH
1007 unsigned int xid;
1008 int rc;
1009
2e5dfc99
DW
1010 if (remap_flags & ~REMAP_FILE_ADVISORY)
1011 return -EINVAL;
1012
04b38d60
CH
1013 cifs_dbg(FYI, "clone range\n");
1014
1015 xid = get_xid();
1016
1017 if (!src_file->private_data || !dst_file->private_data) {
1018 rc = -EBADF;
1019 cifs_dbg(VFS, "missing cifsFileInfo on copy range src file\n");
1020 goto out;
1021 }
1022
8c6c9bed
CIK
1023 smb_file_target = dst_file->private_data;
1024 target_tcon = tlink_tcon(smb_file_target->tlink);
1025
04b38d60
CH
1026 /*
1027 * Note: cifs case is easier than btrfs since server responsible for
1028 * checks for proper open modes and file type and if it wants
1029 * server could even support copy of range where source = target
1030 */
1031 lock_two_nondirectories(target_inode, src_inode);
1032
1033 if (len == 0)
1034 len = src_inode->i_size - off;
1035
1036 cifs_dbg(FYI, "about to flush pages\n");
1037 /* should we flush first and last page first */
1038 truncate_inode_pages_range(&target_inode->i_data, destoff,
09cbfeaf 1039 PAGE_ALIGN(destoff + len)-1);
04b38d60
CH
1040
1041 if (target_tcon->ses->server->ops->duplicate_extents)
1042 rc = target_tcon->ses->server->ops->duplicate_extents(xid,
1043 smb_file_src, smb_file_target, off, len, destoff);
1044 else
1045 rc = -EOPNOTSUPP;
1046
1047 /* force revalidate of size and timestamps of target file now
1048 that target is updated on the server */
1049 CIFS_I(target_inode)->time = 0;
04b38d60
CH
1050 /* although unlocking in the reverse order from locking is not
1051 strictly necessary here it is a little cleaner to be consistent */
1052 unlock_two_nondirectories(src_inode, target_inode);
1053out:
1054 free_xid(xid);
42ec3d4c 1055 return rc < 0 ? rc : len;
04b38d60
CH
1056}
1057
620d8745
SP
1058ssize_t cifs_file_copychunk_range(unsigned int xid,
1059 struct file *src_file, loff_t off,
1060 struct file *dst_file, loff_t destoff,
1061 size_t len, unsigned int flags)
1062{
1063 struct inode *src_inode = file_inode(src_file);
1064 struct inode *target_inode = file_inode(dst_file);
1065 struct cifsFileInfo *smb_file_src;
1066 struct cifsFileInfo *smb_file_target;
1067 struct cifs_tcon *src_tcon;
1068 struct cifs_tcon *target_tcon;
1069 ssize_t rc;
1070
1071 cifs_dbg(FYI, "copychunk range\n");
1072
1073 if (src_inode == target_inode) {
1074 rc = -EINVAL;
1075 goto out;
1076 }
1077
1078 if (!src_file->private_data || !dst_file->private_data) {
1079 rc = -EBADF;
1080 cifs_dbg(VFS, "missing cifsFileInfo on copy range src file\n");
1081 goto out;
1082 }
1083
1084 rc = -EXDEV;
1085 smb_file_target = dst_file->private_data;
1086 smb_file_src = src_file->private_data;
1087 src_tcon = tlink_tcon(smb_file_src->tlink);
1088 target_tcon = tlink_tcon(smb_file_target->tlink);
1089
1090 if (src_tcon->ses != target_tcon->ses) {
1091 cifs_dbg(VFS, "source and target of copy not on same server\n");
1092 goto out;
1093 }
1094
1095 /*
1096 * Note: cifs case is easier than btrfs since server responsible for
1097 * checks for proper open modes and file type and if it wants
1098 * server could even support copy of range where source = target
1099 */
1100 lock_two_nondirectories(target_inode, src_inode);
1101
1102 cifs_dbg(FYI, "about to flush pages\n");
1103 /* should we flush first and last page first */
1104 truncate_inode_pages(&target_inode->i_data, 0);
1105
1106 if (target_tcon->ses->server->ops->copychunk_range)
1107 rc = target_tcon->ses->server->ops->copychunk_range(xid,
1108 smb_file_src, smb_file_target, off, len, destoff);
1109 else
1110 rc = -EOPNOTSUPP;
1111
1112 /* force revalidate of size and timestamps of target file now
1113 * that target is updated on the server
1114 */
1115 CIFS_I(target_inode)->time = 0;
1116 /* although unlocking in the reverse order from locking is not
1117 * strictly necessary here it is a little cleaner to be consistent
1118 */
1119 unlock_two_nondirectories(src_inode, target_inode);
1120
1121out:
1122 return rc;
1123}
1124
6e70c267
SF
1125/*
1126 * Directory operations under CIFS/SMB2/SMB3 are synchronous, so fsync()
1127 * is a dummy operation.
1128 */
1129static int cifs_dir_fsync(struct file *file, loff_t start, loff_t end, int datasync)
1130{
1131 cifs_dbg(FYI, "Sync directory - name: %pD datasync: 0x%x\n",
1132 file, datasync);
1133
1134 return 0;
1135}
1136
620d8745
SP
1137static ssize_t cifs_copy_file_range(struct file *src_file, loff_t off,
1138 struct file *dst_file, loff_t destoff,
1139 size_t len, unsigned int flags)
1140{
1141 unsigned int xid = get_xid();
1142 ssize_t rc;
1143
1144 rc = cifs_file_copychunk_range(xid, src_file, off, dst_file, destoff,
1145 len, flags);
1146 free_xid(xid);
1147 return rc;
1148}
1149
4b6f5d20 1150const struct file_operations cifs_file_ops = {
08bc0353 1151 .read_iter = cifs_loose_read_iter,
3dae8750 1152 .write_iter = cifs_file_write_iter,
1da177e4
LT
1153 .open = cifs_open,
1154 .release = cifs_close,
1155 .lock = cifs_lock,
1156 .fsync = cifs_fsync,
1157 .flush = cifs_flush,
1158 .mmap = cifs_file_mmap,
5ffc4ef4 1159 .splice_read = generic_file_splice_read,
cd1aca29 1160 .splice_write = iter_file_splice_write,
c32a0b68 1161 .llseek = cifs_llseek,
f9ddcca4 1162 .unlocked_ioctl = cifs_ioctl,
620d8745 1163 .copy_file_range = cifs_copy_file_range,
2e5dfc99 1164 .remap_file_range = cifs_remap_file_range,
84210e91 1165 .setlease = cifs_setlease,
31742c5a 1166 .fallocate = cifs_fallocate,
1da177e4
LT
1167};
1168
8be7e6ba 1169const struct file_operations cifs_file_strict_ops = {
e6a7bcb4 1170 .read_iter = cifs_strict_readv,
3dae8750 1171 .write_iter = cifs_strict_writev,
8be7e6ba
PS
1172 .open = cifs_open,
1173 .release = cifs_close,
1174 .lock = cifs_lock,
1175 .fsync = cifs_strict_fsync,
1176 .flush = cifs_flush,
7a6a19b1 1177 .mmap = cifs_file_strict_mmap,
8be7e6ba 1178 .splice_read = generic_file_splice_read,
cd1aca29 1179 .splice_write = iter_file_splice_write,
8be7e6ba 1180 .llseek = cifs_llseek,
8be7e6ba 1181 .unlocked_ioctl = cifs_ioctl,
620d8745 1182 .copy_file_range = cifs_copy_file_range,
2e5dfc99 1183 .remap_file_range = cifs_remap_file_range,
8be7e6ba 1184 .setlease = cifs_setlease,
31742c5a 1185 .fallocate = cifs_fallocate,
8be7e6ba
PS
1186};
1187
4b6f5d20 1188const struct file_operations cifs_file_direct_ops = {
be4eb688
LL
1189 .read_iter = cifs_direct_readv,
1190 .write_iter = cifs_direct_writev,
1da177e4
LT
1191 .open = cifs_open,
1192 .release = cifs_close,
1193 .lock = cifs_lock,
1194 .fsync = cifs_fsync,
1195 .flush = cifs_flush,
a994b8fa 1196 .mmap = cifs_file_mmap,
5ffc4ef4 1197 .splice_read = generic_file_splice_read,
cd1aca29 1198 .splice_write = iter_file_splice_write,
f9ddcca4 1199 .unlocked_ioctl = cifs_ioctl,
620d8745 1200 .copy_file_range = cifs_copy_file_range,
2e5dfc99 1201 .remap_file_range = cifs_remap_file_range,
c32a0b68 1202 .llseek = cifs_llseek,
84210e91 1203 .setlease = cifs_setlease,
31742c5a 1204 .fallocate = cifs_fallocate,
1da177e4 1205};
8be7e6ba 1206
4b6f5d20 1207const struct file_operations cifs_file_nobrl_ops = {
08bc0353 1208 .read_iter = cifs_loose_read_iter,
3dae8750 1209 .write_iter = cifs_file_write_iter,
87c89dd7
SF
1210 .open = cifs_open,
1211 .release = cifs_close,
1212 .fsync = cifs_fsync,
1213 .flush = cifs_flush,
1214 .mmap = cifs_file_mmap,
5ffc4ef4 1215 .splice_read = generic_file_splice_read,
cd1aca29 1216 .splice_write = iter_file_splice_write,
c32a0b68 1217 .llseek = cifs_llseek,
f9ddcca4 1218 .unlocked_ioctl = cifs_ioctl,
620d8745 1219 .copy_file_range = cifs_copy_file_range,
2e5dfc99 1220 .remap_file_range = cifs_remap_file_range,
84210e91 1221 .setlease = cifs_setlease,
31742c5a 1222 .fallocate = cifs_fallocate,
8b94bcb9
SF
1223};
1224
8be7e6ba 1225const struct file_operations cifs_file_strict_nobrl_ops = {
e6a7bcb4 1226 .read_iter = cifs_strict_readv,
3dae8750 1227 .write_iter = cifs_strict_writev,
8be7e6ba
PS
1228 .open = cifs_open,
1229 .release = cifs_close,
1230 .fsync = cifs_strict_fsync,
1231 .flush = cifs_flush,
7a6a19b1 1232 .mmap = cifs_file_strict_mmap,
8be7e6ba 1233 .splice_read = generic_file_splice_read,
cd1aca29 1234 .splice_write = iter_file_splice_write,
8be7e6ba 1235 .llseek = cifs_llseek,
8be7e6ba 1236 .unlocked_ioctl = cifs_ioctl,
620d8745 1237 .copy_file_range = cifs_copy_file_range,
2e5dfc99 1238 .remap_file_range = cifs_remap_file_range,
8be7e6ba 1239 .setlease = cifs_setlease,
31742c5a 1240 .fallocate = cifs_fallocate,
8be7e6ba
PS
1241};
1242
4b6f5d20 1243const struct file_operations cifs_file_direct_nobrl_ops = {
be4eb688
LL
1244 .read_iter = cifs_direct_readv,
1245 .write_iter = cifs_direct_writev,
87c89dd7
SF
1246 .open = cifs_open,
1247 .release = cifs_close,
1248 .fsync = cifs_fsync,
1249 .flush = cifs_flush,
810627a0 1250 .mmap = cifs_file_mmap,
5ffc4ef4 1251 .splice_read = generic_file_splice_read,
cd1aca29 1252 .splice_write = iter_file_splice_write,
f9ddcca4 1253 .unlocked_ioctl = cifs_ioctl,
620d8745 1254 .copy_file_range = cifs_copy_file_range,
2e5dfc99 1255 .remap_file_range = cifs_remap_file_range,
c32a0b68 1256 .llseek = cifs_llseek,
84210e91 1257 .setlease = cifs_setlease,
31742c5a 1258 .fallocate = cifs_fallocate,
8b94bcb9 1259};
1da177e4 1260
4b6f5d20 1261const struct file_operations cifs_dir_ops = {
3125d265 1262 .iterate_shared = cifs_readdir,
1da177e4
LT
1263 .release = cifs_closedir,
1264 .read = generic_read_dir,
f9ddcca4 1265 .unlocked_ioctl = cifs_ioctl,
620d8745 1266 .copy_file_range = cifs_copy_file_range,
2e5dfc99 1267 .remap_file_range = cifs_remap_file_range,
3222a3e5 1268 .llseek = generic_file_llseek,
6e70c267 1269 .fsync = cifs_dir_fsync,
1da177e4
LT
1270};
1271
1272static void
51cc5068 1273cifs_init_once(void *inode)
1da177e4
LT
1274{
1275 struct cifsInodeInfo *cifsi = inode;
1276
a35afb83 1277 inode_init_once(&cifsi->vfs_inode);
1b4b55a1 1278 init_rwsem(&cifsi->lock_sem);
1da177e4
LT
1279}
1280
9ee108b2 1281static int __init
1da177e4
LT
1282cifs_init_inodecache(void)
1283{
1284 cifs_inode_cachep = kmem_cache_create("cifs_inode_cache",
26f57364 1285 sizeof(struct cifsInodeInfo),
fffb60f9 1286 0, (SLAB_RECLAIM_ACCOUNT|
5d097056 1287 SLAB_MEM_SPREAD|SLAB_ACCOUNT),
20c2df83 1288 cifs_init_once);
1da177e4
LT
1289 if (cifs_inode_cachep == NULL)
1290 return -ENOMEM;
1291
1292 return 0;
1293}
1294
1295static void
1296cifs_destroy_inodecache(void)
1297{
8c0a8537
KS
1298 /*
1299 * Make sure all delayed rcu free inodes are flushed before we
1300 * destroy cache.
1301 */
1302 rcu_barrier();
1a1d92c1 1303 kmem_cache_destroy(cifs_inode_cachep);
1da177e4
LT
1304}
1305
1306static int
1307cifs_init_request_bufs(void)
1308{
3792c173
PS
1309 /*
1310 * SMB2 maximum header size is bigger than CIFS one - no problems to
1311 * allocate some more bytes for CIFS.
1312 */
2a38e120
SF
1313 size_t max_hdr_size = MAX_SMB2_HDR_SIZE;
1314
4523cc30 1315 if (CIFSMaxBufSize < 8192) {
1da177e4
LT
1316 /* Buffer size can not be smaller than 2 * PATH_MAX since maximum
1317 Unicode path name has to fit in any SMB/CIFS path based frames */
1318 CIFSMaxBufSize = 8192;
1319 } else if (CIFSMaxBufSize > 1024*127) {
1320 CIFSMaxBufSize = 1024 * 127;
1321 } else {
1322 CIFSMaxBufSize &= 0x1FE00; /* Round size to even 512 byte mult*/
1323 }
f96637be
JP
1324/*
1325 cifs_dbg(VFS, "CIFSMaxBufSize %d 0x%x\n",
1326 CIFSMaxBufSize, CIFSMaxBufSize);
1327*/
de046449 1328 cifs_req_cachep = kmem_cache_create_usercopy("cifs_request",
3792c173 1329 CIFSMaxBufSize + max_hdr_size, 0,
de046449
DW
1330 SLAB_HWCACHE_ALIGN, 0,
1331 CIFSMaxBufSize + max_hdr_size,
1332 NULL);
1da177e4
LT
1333 if (cifs_req_cachep == NULL)
1334 return -ENOMEM;
1335
4523cc30 1336 if (cifs_min_rcv < 1)
1da177e4
LT
1337 cifs_min_rcv = 1;
1338 else if (cifs_min_rcv > 64) {
1339 cifs_min_rcv = 64;
f96637be 1340 cifs_dbg(VFS, "cifs_min_rcv set to maximum (64)\n");
1da177e4
LT
1341 }
1342
93d2341c
MD
1343 cifs_req_poolp = mempool_create_slab_pool(cifs_min_rcv,
1344 cifs_req_cachep);
1da177e4 1345
4523cc30 1346 if (cifs_req_poolp == NULL) {
1da177e4
LT
1347 kmem_cache_destroy(cifs_req_cachep);
1348 return -ENOMEM;
1349 }
ec637e3f 1350 /* MAX_CIFS_SMALL_BUFFER_SIZE bytes is enough for most SMB responses and
1da177e4
LT
1351 almost all handle based requests (but not write response, nor is it
1352 sufficient for path based requests). A smaller size would have
50c2f753 1353 been more efficient (compacting multiple slab items on one 4k page)
1da177e4
LT
1354 for the case in which debug was on, but this larger size allows
1355 more SMBs to use small buffer alloc and is still much more
6dc0f87e 1356 efficient to alloc 1 per page off the slab compared to 17K (5page)
1da177e4 1357 alloc of large cifs buffers even when page debugging is on */
de046449 1358 cifs_sm_req_cachep = kmem_cache_create_usercopy("cifs_small_rq",
6dc0f87e 1359 MAX_CIFS_SMALL_BUFFER_SIZE, 0, SLAB_HWCACHE_ALIGN,
de046449 1360 0, MAX_CIFS_SMALL_BUFFER_SIZE, NULL);
1da177e4
LT
1361 if (cifs_sm_req_cachep == NULL) {
1362 mempool_destroy(cifs_req_poolp);
1363 kmem_cache_destroy(cifs_req_cachep);
6dc0f87e 1364 return -ENOMEM;
1da177e4
LT
1365 }
1366
4523cc30 1367 if (cifs_min_small < 2)
1da177e4
LT
1368 cifs_min_small = 2;
1369 else if (cifs_min_small > 256) {
1370 cifs_min_small = 256;
f96637be 1371 cifs_dbg(FYI, "cifs_min_small set to maximum (256)\n");
1da177e4
LT
1372 }
1373
93d2341c
MD
1374 cifs_sm_req_poolp = mempool_create_slab_pool(cifs_min_small,
1375 cifs_sm_req_cachep);
1da177e4 1376
4523cc30 1377 if (cifs_sm_req_poolp == NULL) {
1da177e4
LT
1378 mempool_destroy(cifs_req_poolp);
1379 kmem_cache_destroy(cifs_req_cachep);
1380 kmem_cache_destroy(cifs_sm_req_cachep);
1381 return -ENOMEM;
1382 }
1383
1384 return 0;
1385}
1386
1387static void
1388cifs_destroy_request_bufs(void)
1389{
1390 mempool_destroy(cifs_req_poolp);
1a1d92c1 1391 kmem_cache_destroy(cifs_req_cachep);
1da177e4 1392 mempool_destroy(cifs_sm_req_poolp);
1a1d92c1 1393 kmem_cache_destroy(cifs_sm_req_cachep);
1da177e4
LT
1394}
1395
1396static int
1397cifs_init_mids(void)
1398{
1399 cifs_mid_cachep = kmem_cache_create("cifs_mpx_ids",
26f57364
SF
1400 sizeof(struct mid_q_entry), 0,
1401 SLAB_HWCACHE_ALIGN, NULL);
1da177e4
LT
1402 if (cifs_mid_cachep == NULL)
1403 return -ENOMEM;
1404
93d2341c
MD
1405 /* 3 is a reasonable minimum number of simultaneous operations */
1406 cifs_mid_poolp = mempool_create_slab_pool(3, cifs_mid_cachep);
4523cc30 1407 if (cifs_mid_poolp == NULL) {
1da177e4
LT
1408 kmem_cache_destroy(cifs_mid_cachep);
1409 return -ENOMEM;
1410 }
1411
1da177e4
LT
1412 return 0;
1413}
1414
1415static void
1416cifs_destroy_mids(void)
1417{
1418 mempool_destroy(cifs_mid_poolp);
1a1d92c1 1419 kmem_cache_destroy(cifs_mid_cachep);
1da177e4
LT
1420}
1421
1da177e4
LT
1422static int __init
1423init_cifs(void)
1424{
1425 int rc = 0;
1da177e4 1426 cifs_proc_init();
e7ddee90 1427 INIT_LIST_HEAD(&cifs_tcp_ses_list);
0eff0e26 1428#ifdef CONFIG_CIFS_DNOTIFY_EXPERIMENTAL /* unused temporarily */
4ca9c190
SF
1429 INIT_LIST_HEAD(&GlobalDnotifyReqList);
1430 INIT_LIST_HEAD(&GlobalDnotifyRsp_Q);
0eff0e26 1431#endif /* was needed for dnotify, and will be needed for inotify when VFS fix */
1da177e4
LT
1432/*
1433 * Initialize Global counters
1434 */
1435 atomic_set(&sesInfoAllocCount, 0);
1436 atomic_set(&tconInfoAllocCount, 0);
6dc0f87e 1437 atomic_set(&tcpSesAllocCount, 0);
1da177e4
LT
1438 atomic_set(&tcpSesReconnectCount, 0);
1439 atomic_set(&tconInfoReconnectCount, 0);
1440
1441 atomic_set(&bufAllocCount, 0);
4498eed5
SF
1442 atomic_set(&smBufAllocCount, 0);
1443#ifdef CONFIG_CIFS_STATS2
1444 atomic_set(&totBufAllocCount, 0);
1445 atomic_set(&totSmBufAllocCount, 0);
00778e22
SF
1446 if (slow_rsp_threshold < 1)
1447 cifs_dbg(FYI, "slow_response_threshold msgs disabled\n");
1448 else if (slow_rsp_threshold > 32767)
1449 cifs_dbg(VFS,
1450 "slow response threshold set higher than recommended (0 to 32767)\n");
4498eed5
SF
1451#endif /* CONFIG_CIFS_STATS2 */
1452
1da177e4
LT
1453 atomic_set(&midCount, 0);
1454 GlobalCurrentXid = 0;
1455 GlobalTotalActiveXid = 0;
1456 GlobalMaxActiveXid = 0;
3f9bcca7 1457 spin_lock_init(&cifs_tcp_ses_lock);
1da177e4
LT
1458 spin_lock_init(&GlobalMid_Lock);
1459
51b0817b 1460 cifs_lock_secret = get_random_u32();
3d22462a 1461
4523cc30 1462 if (cifs_max_pending < 2) {
1da177e4 1463 cifs_max_pending = 2;
f96637be 1464 cifs_dbg(FYI, "cifs_max_pending set to min of 2\n");
10b9b98e
PS
1465 } else if (cifs_max_pending > CIFS_MAX_REQ) {
1466 cifs_max_pending = CIFS_MAX_REQ;
f96637be
JP
1467 cifs_dbg(FYI, "cifs_max_pending set to max of %u\n",
1468 CIFS_MAX_REQ);
1da177e4
LT
1469 }
1470
da472fc8
JL
1471 cifsiod_wq = alloc_workqueue("cifsiod", WQ_FREEZABLE|WQ_MEM_RECLAIM, 0);
1472 if (!cifsiod_wq) {
1473 rc = -ENOMEM;
1474 goto out_clean_proc;
1475 }
1476
3998e6b8
RV
1477 cifsoplockd_wq = alloc_workqueue("cifsoplockd",
1478 WQ_FREEZABLE|WQ_MEM_RECLAIM, 0);
1479 if (!cifsoplockd_wq) {
1480 rc = -ENOMEM;
1481 goto out_destroy_cifsiod_wq;
1482 }
1483
f579cf3c
SJ
1484 rc = cifs_fscache_register();
1485 if (rc)
3998e6b8 1486 goto out_destroy_cifsoplockd_wq;
f579cf3c 1487
1da177e4 1488 rc = cifs_init_inodecache();
45af7a0f 1489 if (rc)
d3bf5221 1490 goto out_unreg_fscache;
45af7a0f
SF
1491
1492 rc = cifs_init_mids();
1493 if (rc)
1494 goto out_destroy_inodecache;
1495
1496 rc = cifs_init_request_bufs();
1497 if (rc)
1498 goto out_destroy_mids;
1499
1c780228
PA
1500#ifdef CONFIG_CIFS_DFS_UPCALL
1501 rc = dfs_cache_init();
1502 if (rc)
1503 goto out_destroy_request_bufs;
1504#endif /* CONFIG_CIFS_DFS_UPCALL */
84a15b93 1505#ifdef CONFIG_CIFS_UPCALL
b74cb9a8 1506 rc = init_cifs_spnego();
84a15b93 1507 if (rc)
1c780228 1508 goto out_destroy_dfs_cache;
4d79dba0
SP
1509#endif /* CONFIG_CIFS_UPCALL */
1510
1511#ifdef CONFIG_CIFS_ACL
1512 rc = init_cifs_idmap();
1513 if (rc)
c4aca0c0 1514 goto out_register_key_type;
4d79dba0
SP
1515#endif /* CONFIG_CIFS_ACL */
1516
1517 rc = register_filesystem(&cifs_fs_type);
1518 if (rc)
c4aca0c0 1519 goto out_init_cifs_idmap;
45af7a0f 1520
49218b4f
SF
1521 rc = register_filesystem(&smb3_fs_type);
1522 if (rc) {
1523 unregister_filesystem(&cifs_fs_type);
1524 goto out_init_cifs_idmap;
1525 }
1526
45af7a0f
SF
1527 return 0;
1528
c4aca0c0 1529out_init_cifs_idmap:
4d79dba0
SP
1530#ifdef CONFIG_CIFS_ACL
1531 exit_cifs_idmap();
c4aca0c0 1532out_register_key_type:
4d79dba0 1533#endif
84a15b93 1534#ifdef CONFIG_CIFS_UPCALL
b74cb9a8 1535 exit_cifs_spnego();
1c780228
PA
1536out_destroy_dfs_cache:
1537#endif
1538#ifdef CONFIG_CIFS_DFS_UPCALL
1539 dfs_cache_destroy();
c4aca0c0 1540out_destroy_request_bufs:
1fc7995d 1541#endif
45af7a0f 1542 cifs_destroy_request_bufs();
d3bf5221 1543out_destroy_mids:
45af7a0f 1544 cifs_destroy_mids();
d3bf5221 1545out_destroy_inodecache:
45af7a0f 1546 cifs_destroy_inodecache();
d3bf5221 1547out_unreg_fscache:
f579cf3c 1548 cifs_fscache_unregister();
3998e6b8
RV
1549out_destroy_cifsoplockd_wq:
1550 destroy_workqueue(cifsoplockd_wq);
1551out_destroy_cifsiod_wq:
da472fc8 1552 destroy_workqueue(cifsiod_wq);
d3bf5221
SF
1553out_clean_proc:
1554 cifs_proc_clean();
1da177e4
LT
1555 return rc;
1556}
1557
1558static void __exit
1559exit_cifs(void)
1560{
49218b4f 1561 cifs_dbg(NOISY, "exit_smb3\n");
3dd93306 1562 unregister_filesystem(&cifs_fs_type);
49218b4f 1563 unregister_filesystem(&smb3_fs_type);
78d31a3a 1564 cifs_dfs_release_automount_timer();
4d79dba0 1565#ifdef CONFIG_CIFS_ACL
4d79dba0
SP
1566 exit_cifs_idmap();
1567#endif
84a15b93 1568#ifdef CONFIG_CIFS_UPCALL
94183331 1569 exit_cifs_spnego();
1c780228
PA
1570#endif
1571#ifdef CONFIG_CIFS_DFS_UPCALL
1572 dfs_cache_destroy();
1da177e4 1573#endif
1da177e4 1574 cifs_destroy_request_bufs();
3dd93306
JL
1575 cifs_destroy_mids();
1576 cifs_destroy_inodecache();
1577 cifs_fscache_unregister();
3998e6b8 1578 destroy_workqueue(cifsoplockd_wq);
da472fc8 1579 destroy_workqueue(cifsiod_wq);
3dd93306 1580 cifs_proc_clean();
1da177e4
LT
1581}
1582
1c3a13a3 1583MODULE_AUTHOR("Steve French");
6dc0f87e 1584MODULE_LICENSE("GPL"); /* combination of LGPL + GPL source behaves as GPL */
1da177e4 1585MODULE_DESCRIPTION
1c3a13a3
SF
1586 ("VFS to access SMB3 servers e.g. Samba, Macs, Azure and Windows (and "
1587 "also older servers complying with the SNIA CIFS Specification)");
1da177e4 1588MODULE_VERSION(CIFS_VERSION);
b9be76d5
JD
1589MODULE_SOFTDEP("pre: arc4");
1590MODULE_SOFTDEP("pre: des");
1591MODULE_SOFTDEP("pre: ecb");
1592MODULE_SOFTDEP("pre: hmac");
1593MODULE_SOFTDEP("pre: md4");
1594MODULE_SOFTDEP("pre: md5");
1595MODULE_SOFTDEP("pre: nls");
b9be76d5
JD
1596MODULE_SOFTDEP("pre: aes");
1597MODULE_SOFTDEP("pre: cmac");
1598MODULE_SOFTDEP("pre: sha256");
5fcd7f3f 1599MODULE_SOFTDEP("pre: sha512");
026e93dc
PS
1600MODULE_SOFTDEP("pre: aead2");
1601MODULE_SOFTDEP("pre: ccm");
1da177e4
LT
1602module_init(init_cifs)
1603module_exit(exit_cifs)