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