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