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