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