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