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