Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[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
6e70c267
SF
1050/*
1051 * Directory operations under CIFS/SMB2/SMB3 are synchronous, so fsync()
1052 * is a dummy operation.
1053 */
1054static int cifs_dir_fsync(struct file *file, loff_t start, loff_t end, int datasync)
1055{
1056 cifs_dbg(FYI, "Sync directory - name: %pD datasync: 0x%x\n",
1057 file, datasync);
1058
1059 return 0;
1060}
1061
620d8745
SP
1062static ssize_t cifs_copy_file_range(struct file *src_file, loff_t off,
1063 struct file *dst_file, loff_t destoff,
1064 size_t len, unsigned int flags)
1065{
1066 unsigned int xid = get_xid();
1067 ssize_t rc;
1068
1069 rc = cifs_file_copychunk_range(xid, src_file, off, dst_file, destoff,
1070 len, flags);
1071 free_xid(xid);
1072 return rc;
1073}
1074
4b6f5d20 1075const struct file_operations cifs_file_ops = {
08bc0353 1076 .read_iter = cifs_loose_read_iter,
3dae8750 1077 .write_iter = cifs_file_write_iter,
1da177e4
LT
1078 .open = cifs_open,
1079 .release = cifs_close,
1080 .lock = cifs_lock,
1081 .fsync = cifs_fsync,
1082 .flush = cifs_flush,
1083 .mmap = cifs_file_mmap,
5ffc4ef4 1084 .splice_read = generic_file_splice_read,
cd1aca29 1085 .splice_write = iter_file_splice_write,
c32a0b68 1086 .llseek = cifs_llseek,
f9ddcca4 1087 .unlocked_ioctl = cifs_ioctl,
620d8745 1088 .copy_file_range = cifs_copy_file_range,
04b38d60 1089 .clone_file_range = cifs_clone_file_range,
84210e91 1090 .setlease = cifs_setlease,
31742c5a 1091 .fallocate = cifs_fallocate,
1da177e4
LT
1092};
1093
8be7e6ba 1094const struct file_operations cifs_file_strict_ops = {
e6a7bcb4 1095 .read_iter = cifs_strict_readv,
3dae8750 1096 .write_iter = cifs_strict_writev,
8be7e6ba
PS
1097 .open = cifs_open,
1098 .release = cifs_close,
1099 .lock = cifs_lock,
1100 .fsync = cifs_strict_fsync,
1101 .flush = cifs_flush,
7a6a19b1 1102 .mmap = cifs_file_strict_mmap,
8be7e6ba 1103 .splice_read = generic_file_splice_read,
cd1aca29 1104 .splice_write = iter_file_splice_write,
8be7e6ba 1105 .llseek = cifs_llseek,
8be7e6ba 1106 .unlocked_ioctl = cifs_ioctl,
620d8745 1107 .copy_file_range = cifs_copy_file_range,
04b38d60 1108 .clone_file_range = cifs_clone_file_range,
8be7e6ba 1109 .setlease = cifs_setlease,
31742c5a 1110 .fallocate = cifs_fallocate,
8be7e6ba
PS
1111};
1112
4b6f5d20 1113const struct file_operations cifs_file_direct_ops = {
0b81c1c4 1114 /* BB reevaluate whether they can be done with directio, no cache */
e6a7bcb4 1115 .read_iter = cifs_user_readv,
3dae8750 1116 .write_iter = cifs_user_writev,
1da177e4
LT
1117 .open = cifs_open,
1118 .release = cifs_close,
1119 .lock = cifs_lock,
1120 .fsync = cifs_fsync,
1121 .flush = cifs_flush,
a994b8fa 1122 .mmap = cifs_file_mmap,
5ffc4ef4 1123 .splice_read = generic_file_splice_read,
cd1aca29 1124 .splice_write = iter_file_splice_write,
f9ddcca4 1125 .unlocked_ioctl = cifs_ioctl,
620d8745 1126 .copy_file_range = cifs_copy_file_range,
04b38d60 1127 .clone_file_range = cifs_clone_file_range,
c32a0b68 1128 .llseek = cifs_llseek,
84210e91 1129 .setlease = cifs_setlease,
31742c5a 1130 .fallocate = cifs_fallocate,
1da177e4 1131};
8be7e6ba 1132
4b6f5d20 1133const struct file_operations cifs_file_nobrl_ops = {
08bc0353 1134 .read_iter = cifs_loose_read_iter,
3dae8750 1135 .write_iter = cifs_file_write_iter,
87c89dd7
SF
1136 .open = cifs_open,
1137 .release = cifs_close,
1138 .fsync = cifs_fsync,
1139 .flush = cifs_flush,
1140 .mmap = cifs_file_mmap,
5ffc4ef4 1141 .splice_read = generic_file_splice_read,
cd1aca29 1142 .splice_write = iter_file_splice_write,
c32a0b68 1143 .llseek = cifs_llseek,
f9ddcca4 1144 .unlocked_ioctl = cifs_ioctl,
620d8745 1145 .copy_file_range = cifs_copy_file_range,
04b38d60 1146 .clone_file_range = cifs_clone_file_range,
84210e91 1147 .setlease = cifs_setlease,
31742c5a 1148 .fallocate = cifs_fallocate,
8b94bcb9
SF
1149};
1150
8be7e6ba 1151const struct file_operations cifs_file_strict_nobrl_ops = {
e6a7bcb4 1152 .read_iter = cifs_strict_readv,
3dae8750 1153 .write_iter = cifs_strict_writev,
8be7e6ba
PS
1154 .open = cifs_open,
1155 .release = cifs_close,
1156 .fsync = cifs_strict_fsync,
1157 .flush = cifs_flush,
7a6a19b1 1158 .mmap = cifs_file_strict_mmap,
8be7e6ba 1159 .splice_read = generic_file_splice_read,
cd1aca29 1160 .splice_write = iter_file_splice_write,
8be7e6ba 1161 .llseek = cifs_llseek,
8be7e6ba 1162 .unlocked_ioctl = cifs_ioctl,
620d8745 1163 .copy_file_range = cifs_copy_file_range,
04b38d60 1164 .clone_file_range = cifs_clone_file_range,
8be7e6ba 1165 .setlease = cifs_setlease,
31742c5a 1166 .fallocate = cifs_fallocate,
8be7e6ba
PS
1167};
1168
4b6f5d20 1169const struct file_operations cifs_file_direct_nobrl_ops = {
0b81c1c4 1170 /* BB reevaluate whether they can be done with directio, no cache */
e6a7bcb4 1171 .read_iter = cifs_user_readv,
3dae8750 1172 .write_iter = cifs_user_writev,
87c89dd7
SF
1173 .open = cifs_open,
1174 .release = cifs_close,
1175 .fsync = cifs_fsync,
1176 .flush = cifs_flush,
810627a0 1177 .mmap = cifs_file_mmap,
5ffc4ef4 1178 .splice_read = generic_file_splice_read,
cd1aca29 1179 .splice_write = iter_file_splice_write,
f9ddcca4 1180 .unlocked_ioctl = cifs_ioctl,
620d8745 1181 .copy_file_range = cifs_copy_file_range,
04b38d60 1182 .clone_file_range = cifs_clone_file_range,
c32a0b68 1183 .llseek = cifs_llseek,
84210e91 1184 .setlease = cifs_setlease,
31742c5a 1185 .fallocate = cifs_fallocate,
8b94bcb9 1186};
1da177e4 1187
4b6f5d20 1188const struct file_operations cifs_dir_ops = {
3125d265 1189 .iterate_shared = cifs_readdir,
1da177e4
LT
1190 .release = cifs_closedir,
1191 .read = generic_read_dir,
f9ddcca4 1192 .unlocked_ioctl = cifs_ioctl,
620d8745 1193 .copy_file_range = cifs_copy_file_range,
04b38d60 1194 .clone_file_range = cifs_clone_file_range,
3222a3e5 1195 .llseek = generic_file_llseek,
6e70c267 1196 .fsync = cifs_dir_fsync,
1da177e4
LT
1197};
1198
1199static void
51cc5068 1200cifs_init_once(void *inode)
1da177e4
LT
1201{
1202 struct cifsInodeInfo *cifsi = inode;
1203
a35afb83 1204 inode_init_once(&cifsi->vfs_inode);
1b4b55a1 1205 init_rwsem(&cifsi->lock_sem);
1da177e4
LT
1206}
1207
9ee108b2 1208static int __init
1da177e4
LT
1209cifs_init_inodecache(void)
1210{
1211 cifs_inode_cachep = kmem_cache_create("cifs_inode_cache",
26f57364 1212 sizeof(struct cifsInodeInfo),
fffb60f9 1213 0, (SLAB_RECLAIM_ACCOUNT|
5d097056 1214 SLAB_MEM_SPREAD|SLAB_ACCOUNT),
20c2df83 1215 cifs_init_once);
1da177e4
LT
1216 if (cifs_inode_cachep == NULL)
1217 return -ENOMEM;
1218
1219 return 0;
1220}
1221
1222static void
1223cifs_destroy_inodecache(void)
1224{
8c0a8537
KS
1225 /*
1226 * Make sure all delayed rcu free inodes are flushed before we
1227 * destroy cache.
1228 */
1229 rcu_barrier();
1a1d92c1 1230 kmem_cache_destroy(cifs_inode_cachep);
1da177e4
LT
1231}
1232
1233static int
1234cifs_init_request_bufs(void)
1235{
3792c173
PS
1236 /*
1237 * SMB2 maximum header size is bigger than CIFS one - no problems to
1238 * allocate some more bytes for CIFS.
1239 */
2a38e120
SF
1240 size_t max_hdr_size = MAX_SMB2_HDR_SIZE;
1241
4523cc30 1242 if (CIFSMaxBufSize < 8192) {
1da177e4
LT
1243 /* Buffer size can not be smaller than 2 * PATH_MAX since maximum
1244 Unicode path name has to fit in any SMB/CIFS path based frames */
1245 CIFSMaxBufSize = 8192;
1246 } else if (CIFSMaxBufSize > 1024*127) {
1247 CIFSMaxBufSize = 1024 * 127;
1248 } else {
1249 CIFSMaxBufSize &= 0x1FE00; /* Round size to even 512 byte mult*/
1250 }
f96637be
JP
1251/*
1252 cifs_dbg(VFS, "CIFSMaxBufSize %d 0x%x\n",
1253 CIFSMaxBufSize, CIFSMaxBufSize);
1254*/
de046449 1255 cifs_req_cachep = kmem_cache_create_usercopy("cifs_request",
3792c173 1256 CIFSMaxBufSize + max_hdr_size, 0,
de046449
DW
1257 SLAB_HWCACHE_ALIGN, 0,
1258 CIFSMaxBufSize + max_hdr_size,
1259 NULL);
1da177e4
LT
1260 if (cifs_req_cachep == NULL)
1261 return -ENOMEM;
1262
4523cc30 1263 if (cifs_min_rcv < 1)
1da177e4
LT
1264 cifs_min_rcv = 1;
1265 else if (cifs_min_rcv > 64) {
1266 cifs_min_rcv = 64;
f96637be 1267 cifs_dbg(VFS, "cifs_min_rcv set to maximum (64)\n");
1da177e4
LT
1268 }
1269
93d2341c
MD
1270 cifs_req_poolp = mempool_create_slab_pool(cifs_min_rcv,
1271 cifs_req_cachep);
1da177e4 1272
4523cc30 1273 if (cifs_req_poolp == NULL) {
1da177e4
LT
1274 kmem_cache_destroy(cifs_req_cachep);
1275 return -ENOMEM;
1276 }
ec637e3f 1277 /* MAX_CIFS_SMALL_BUFFER_SIZE bytes is enough for most SMB responses and
1da177e4
LT
1278 almost all handle based requests (but not write response, nor is it
1279 sufficient for path based requests). A smaller size would have
50c2f753 1280 been more efficient (compacting multiple slab items on one 4k page)
1da177e4
LT
1281 for the case in which debug was on, but this larger size allows
1282 more SMBs to use small buffer alloc and is still much more
6dc0f87e 1283 efficient to alloc 1 per page off the slab compared to 17K (5page)
1da177e4 1284 alloc of large cifs buffers even when page debugging is on */
de046449 1285 cifs_sm_req_cachep = kmem_cache_create_usercopy("cifs_small_rq",
6dc0f87e 1286 MAX_CIFS_SMALL_BUFFER_SIZE, 0, SLAB_HWCACHE_ALIGN,
de046449 1287 0, MAX_CIFS_SMALL_BUFFER_SIZE, NULL);
1da177e4
LT
1288 if (cifs_sm_req_cachep == NULL) {
1289 mempool_destroy(cifs_req_poolp);
1290 kmem_cache_destroy(cifs_req_cachep);
6dc0f87e 1291 return -ENOMEM;
1da177e4
LT
1292 }
1293
4523cc30 1294 if (cifs_min_small < 2)
1da177e4
LT
1295 cifs_min_small = 2;
1296 else if (cifs_min_small > 256) {
1297 cifs_min_small = 256;
f96637be 1298 cifs_dbg(FYI, "cifs_min_small set to maximum (256)\n");
1da177e4
LT
1299 }
1300
93d2341c
MD
1301 cifs_sm_req_poolp = mempool_create_slab_pool(cifs_min_small,
1302 cifs_sm_req_cachep);
1da177e4 1303
4523cc30 1304 if (cifs_sm_req_poolp == NULL) {
1da177e4
LT
1305 mempool_destroy(cifs_req_poolp);
1306 kmem_cache_destroy(cifs_req_cachep);
1307 kmem_cache_destroy(cifs_sm_req_cachep);
1308 return -ENOMEM;
1309 }
1310
1311 return 0;
1312}
1313
1314static void
1315cifs_destroy_request_bufs(void)
1316{
1317 mempool_destroy(cifs_req_poolp);
1a1d92c1 1318 kmem_cache_destroy(cifs_req_cachep);
1da177e4 1319 mempool_destroy(cifs_sm_req_poolp);
1a1d92c1 1320 kmem_cache_destroy(cifs_sm_req_cachep);
1da177e4
LT
1321}
1322
1323static int
1324cifs_init_mids(void)
1325{
1326 cifs_mid_cachep = kmem_cache_create("cifs_mpx_ids",
26f57364
SF
1327 sizeof(struct mid_q_entry), 0,
1328 SLAB_HWCACHE_ALIGN, NULL);
1da177e4
LT
1329 if (cifs_mid_cachep == NULL)
1330 return -ENOMEM;
1331
93d2341c
MD
1332 /* 3 is a reasonable minimum number of simultaneous operations */
1333 cifs_mid_poolp = mempool_create_slab_pool(3, cifs_mid_cachep);
4523cc30 1334 if (cifs_mid_poolp == NULL) {
1da177e4
LT
1335 kmem_cache_destroy(cifs_mid_cachep);
1336 return -ENOMEM;
1337 }
1338
1da177e4
LT
1339 return 0;
1340}
1341
1342static void
1343cifs_destroy_mids(void)
1344{
1345 mempool_destroy(cifs_mid_poolp);
1a1d92c1 1346 kmem_cache_destroy(cifs_mid_cachep);
1da177e4
LT
1347}
1348
1da177e4
LT
1349static int __init
1350init_cifs(void)
1351{
1352 int rc = 0;
1da177e4 1353 cifs_proc_init();
e7ddee90 1354 INIT_LIST_HEAD(&cifs_tcp_ses_list);
0eff0e26 1355#ifdef CONFIG_CIFS_DNOTIFY_EXPERIMENTAL /* unused temporarily */
4ca9c190
SF
1356 INIT_LIST_HEAD(&GlobalDnotifyReqList);
1357 INIT_LIST_HEAD(&GlobalDnotifyRsp_Q);
0eff0e26 1358#endif /* was needed for dnotify, and will be needed for inotify when VFS fix */
1da177e4
LT
1359/*
1360 * Initialize Global counters
1361 */
1362 atomic_set(&sesInfoAllocCount, 0);
1363 atomic_set(&tconInfoAllocCount, 0);
6dc0f87e 1364 atomic_set(&tcpSesAllocCount, 0);
1da177e4
LT
1365 atomic_set(&tcpSesReconnectCount, 0);
1366 atomic_set(&tconInfoReconnectCount, 0);
1367
1368 atomic_set(&bufAllocCount, 0);
4498eed5
SF
1369 atomic_set(&smBufAllocCount, 0);
1370#ifdef CONFIG_CIFS_STATS2
1371 atomic_set(&totBufAllocCount, 0);
1372 atomic_set(&totSmBufAllocCount, 0);
1373#endif /* CONFIG_CIFS_STATS2 */
1374
1da177e4
LT
1375 atomic_set(&midCount, 0);
1376 GlobalCurrentXid = 0;
1377 GlobalTotalActiveXid = 0;
1378 GlobalMaxActiveXid = 0;
3f9bcca7 1379 spin_lock_init(&cifs_tcp_ses_lock);
1da177e4
LT
1380 spin_lock_init(&GlobalMid_Lock);
1381
51b0817b 1382 cifs_lock_secret = get_random_u32();
3d22462a 1383
4523cc30 1384 if (cifs_max_pending < 2) {
1da177e4 1385 cifs_max_pending = 2;
f96637be 1386 cifs_dbg(FYI, "cifs_max_pending set to min of 2\n");
10b9b98e
PS
1387 } else if (cifs_max_pending > CIFS_MAX_REQ) {
1388 cifs_max_pending = CIFS_MAX_REQ;
f96637be
JP
1389 cifs_dbg(FYI, "cifs_max_pending set to max of %u\n",
1390 CIFS_MAX_REQ);
1da177e4
LT
1391 }
1392
da472fc8
JL
1393 cifsiod_wq = alloc_workqueue("cifsiod", WQ_FREEZABLE|WQ_MEM_RECLAIM, 0);
1394 if (!cifsiod_wq) {
1395 rc = -ENOMEM;
1396 goto out_clean_proc;
1397 }
1398
3998e6b8
RV
1399 cifsoplockd_wq = alloc_workqueue("cifsoplockd",
1400 WQ_FREEZABLE|WQ_MEM_RECLAIM, 0);
1401 if (!cifsoplockd_wq) {
1402 rc = -ENOMEM;
1403 goto out_destroy_cifsiod_wq;
1404 }
1405
f579cf3c
SJ
1406 rc = cifs_fscache_register();
1407 if (rc)
3998e6b8 1408 goto out_destroy_cifsoplockd_wq;
f579cf3c 1409
1da177e4 1410 rc = cifs_init_inodecache();
45af7a0f 1411 if (rc)
d3bf5221 1412 goto out_unreg_fscache;
45af7a0f
SF
1413
1414 rc = cifs_init_mids();
1415 if (rc)
1416 goto out_destroy_inodecache;
1417
1418 rc = cifs_init_request_bufs();
1419 if (rc)
1420 goto out_destroy_mids;
1421
84a15b93 1422#ifdef CONFIG_CIFS_UPCALL
b74cb9a8 1423 rc = init_cifs_spnego();
84a15b93 1424 if (rc)
4d79dba0
SP
1425 goto out_destroy_request_bufs;
1426#endif /* CONFIG_CIFS_UPCALL */
1427
1428#ifdef CONFIG_CIFS_ACL
1429 rc = init_cifs_idmap();
1430 if (rc)
c4aca0c0 1431 goto out_register_key_type;
4d79dba0
SP
1432#endif /* CONFIG_CIFS_ACL */
1433
1434 rc = register_filesystem(&cifs_fs_type);
1435 if (rc)
c4aca0c0 1436 goto out_init_cifs_idmap;
45af7a0f 1437
45af7a0f
SF
1438 return 0;
1439
c4aca0c0 1440out_init_cifs_idmap:
4d79dba0
SP
1441#ifdef CONFIG_CIFS_ACL
1442 exit_cifs_idmap();
c4aca0c0 1443out_register_key_type:
4d79dba0 1444#endif
84a15b93 1445#ifdef CONFIG_CIFS_UPCALL
b74cb9a8 1446 exit_cifs_spnego();
c4aca0c0 1447out_destroy_request_bufs:
1fc7995d 1448#endif
45af7a0f 1449 cifs_destroy_request_bufs();
d3bf5221 1450out_destroy_mids:
45af7a0f 1451 cifs_destroy_mids();
d3bf5221 1452out_destroy_inodecache:
45af7a0f 1453 cifs_destroy_inodecache();
d3bf5221 1454out_unreg_fscache:
f579cf3c 1455 cifs_fscache_unregister();
3998e6b8
RV
1456out_destroy_cifsoplockd_wq:
1457 destroy_workqueue(cifsoplockd_wq);
1458out_destroy_cifsiod_wq:
da472fc8 1459 destroy_workqueue(cifsiod_wq);
d3bf5221
SF
1460out_clean_proc:
1461 cifs_proc_clean();
1da177e4
LT
1462 return rc;
1463}
1464
1465static void __exit
1466exit_cifs(void)
1467{
f96637be 1468 cifs_dbg(NOISY, "exit_cifs\n");
3dd93306 1469 unregister_filesystem(&cifs_fs_type);
78d31a3a 1470 cifs_dfs_release_automount_timer();
4d79dba0 1471#ifdef CONFIG_CIFS_ACL
4d79dba0
SP
1472 exit_cifs_idmap();
1473#endif
84a15b93 1474#ifdef CONFIG_CIFS_UPCALL
94183331 1475 exit_cifs_spnego();
1da177e4 1476#endif
1da177e4 1477 cifs_destroy_request_bufs();
3dd93306
JL
1478 cifs_destroy_mids();
1479 cifs_destroy_inodecache();
1480 cifs_fscache_unregister();
3998e6b8 1481 destroy_workqueue(cifsoplockd_wq);
da472fc8 1482 destroy_workqueue(cifsiod_wq);
3dd93306 1483 cifs_proc_clean();
1da177e4
LT
1484}
1485
1486MODULE_AUTHOR("Steve French <sfrench@us.ibm.com>");
6dc0f87e 1487MODULE_LICENSE("GPL"); /* combination of LGPL + GPL source behaves as GPL */
1da177e4 1488MODULE_DESCRIPTION
63135e08
SF
1489 ("VFS to access servers complying with the SNIA CIFS Specification "
1490 "e.g. Samba and Windows");
1da177e4 1491MODULE_VERSION(CIFS_VERSION);
b9be76d5
JD
1492MODULE_SOFTDEP("pre: arc4");
1493MODULE_SOFTDEP("pre: des");
1494MODULE_SOFTDEP("pre: ecb");
1495MODULE_SOFTDEP("pre: hmac");
1496MODULE_SOFTDEP("pre: md4");
1497MODULE_SOFTDEP("pre: md5");
1498MODULE_SOFTDEP("pre: nls");
b9be76d5
JD
1499MODULE_SOFTDEP("pre: aes");
1500MODULE_SOFTDEP("pre: cmac");
1501MODULE_SOFTDEP("pre: sha256");
5fcd7f3f 1502MODULE_SOFTDEP("pre: sha512");
026e93dc
PS
1503MODULE_SOFTDEP("pre: aead2");
1504MODULE_SOFTDEP("pre: ccm");
1da177e4
LT
1505module_init(init_cifs)
1506module_exit(exit_cifs)