freeze_bdev: grab active reference to frozen superblocks
[linux-2.6-block.git] / fs / cifs / cifsfs.c
CommitLineData
1da177e4
LT
1/*
2 * fs/cifs/cifsfs.c
3 *
2b280fab 4 * Copyright (C) International Business Machines Corp., 2002,2008
1da177e4
LT
5 * Author(s): Steve French (sfrench@us.ibm.com)
6 *
7 * Common Internet FileSystem (CIFS) client
8 *
9 * This library is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU Lesser General Public License as published
11 * by the Free Software Foundation; either version 2.1 of the License, or
12 * (at your option) any later version.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
17 * the GNU Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public License
20 * along with this library; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 */
23
24/* Note that BB means BUGBUG (ie something to fix eventually) */
25
26#include <linux/module.h>
27#include <linux/fs.h>
28#include <linux/mount.h>
29#include <linux/slab.h>
30#include <linux/init.h>
31#include <linux/list.h>
32#include <linux/seq_file.h>
33#include <linux/vfs.h>
34#include <linux/mempool.h>
6ab16d24 35#include <linux/delay.h>
45af7a0f 36#include <linux/kthread.h>
7dfb7103 37#include <linux/freezer.h>
67e55205 38#include <linux/smp_lock.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>
6103335d 48#include "dns_resolve.h"
e545937a 49#include "cifs_spnego.h"
1da177e4
LT
50#define CIFS_MAGIC_NUMBER 0xFF534D42 /* the first four bytes of SMB PDUs */
51
52#ifdef CONFIG_CIFS_QUOTA
0d54b217 53static const struct quotactl_ops cifs_quotactl_ops;
35c11fdd
SF
54#endif /* QUOTA */
55
1da177e4
LT
56int cifsFYI = 0;
57int cifsERROR = 1;
58int traceSMB = 0;
59unsigned int oplockEnabled = 1;
60unsigned int experimEnabled = 0;
61unsigned int linuxExtEnabled = 1;
62unsigned int lookupCacheEnabled = 1;
63unsigned int multiuser_mount = 0;
3979877e
SF
64unsigned int extended_security = CIFSSEC_DEF;
65/* unsigned int ntlmv2_support = 0; */
1da177e4 66unsigned int sign_CIFS_PDUs = 1;
6dc0f87e
SF
67extern struct task_struct *oplockThread; /* remove sparse warning */
68struct task_struct *oplockThread = NULL;
99ee4dbd 69/* extern struct task_struct * dnotifyThread; remove sparse warning */
ee9b6d61 70static const struct super_operations cifs_super_ops;
1da177e4
LT
71unsigned int CIFSMaxBufSize = CIFS_MAX_MSGSIZE;
72module_param(CIFSMaxBufSize, int, 0);
63135e08
SF
73MODULE_PARM_DESC(CIFSMaxBufSize, "Network buffer size (not including header). "
74 "Default: 16384 Range: 8192 to 130048");
1da177e4
LT
75unsigned int cifs_min_rcv = CIFS_MIN_RCV_POOL;
76module_param(cifs_min_rcv, int, 0);
63135e08
SF
77MODULE_PARM_DESC(cifs_min_rcv, "Network buffers in pool. Default: 4 Range: "
78 "1 to 64");
1da177e4
LT
79unsigned int cifs_min_small = 30;
80module_param(cifs_min_small, int, 0);
63135e08
SF
81MODULE_PARM_DESC(cifs_min_small, "Small network buffers in pool. Default: 30 "
82 "Range: 2 to 256");
1da177e4
LT
83unsigned int cifs_max_pending = CIFS_MAX_REQ;
84module_param(cifs_max_pending, int, 0);
63135e08
SF
85MODULE_PARM_DESC(cifs_max_pending, "Simultaneous requests to server. "
86 "Default: 50 Range: 2 to 256");
1da177e4 87
1da177e4
LT
88extern mempool_t *cifs_sm_req_poolp;
89extern mempool_t *cifs_req_poolp;
90extern mempool_t *cifs_mid_poolp;
91
e18b890b 92extern struct kmem_cache *cifs_oplock_cachep;
1da177e4
LT
93
94static int
95cifs_read_super(struct super_block *sb, void *data,
96 const char *devname, int silent)
97{
98 struct inode *inode;
99 struct cifs_sb_info *cifs_sb;
100 int rc = 0;
50c2f753 101
1b2b2126
SF
102 /* BB should we make this contingent on mount parm? */
103 sb->s_flags |= MS_NODIRATIME | MS_NOATIME;
790fe579 104 sb->s_fs_info = kzalloc(sizeof(struct cifs_sb_info), GFP_KERNEL);
1da177e4 105 cifs_sb = CIFS_SB(sb);
4523cc30 106 if (cifs_sb == NULL)
1da177e4 107 return -ENOMEM;
1da177e4 108
e6ab1582
IM
109#ifdef CONFIG_CIFS_DFS_UPCALL
110 /* copy mount params to sb for use in submounts */
111 /* BB: should we move this after the mount so we
112 * do not have to do the copy on failed mounts?
113 * BB: May be it is better to do simple copy before
114 * complex operation (mount), and in case of fail
115 * just exit instead of doing mount and attempting
116 * undo it if this copy fails?*/
79ee9a8b
SF
117 if (data) {
118 int len = strlen(data);
119 cifs_sb->mountdata = kzalloc(len + 1, GFP_KERNEL);
120 if (cifs_sb->mountdata == NULL) {
121 kfree(sb->s_fs_info);
122 sb->s_fs_info = NULL;
123 return -ENOMEM;
124 }
125 strncpy(cifs_sb->mountdata, data, len + 1);
126 cifs_sb->mountdata[len] = '\0';
e6ab1582 127 }
e6ab1582
IM
128#endif
129
1da177e4
LT
130 rc = cifs_mount(sb, cifs_sb, data, devname);
131
132 if (rc) {
133 if (!silent)
134 cERROR(1,
135 ("cifs_mount failed w/return code = %d", rc));
136 goto out_mount_failed;
137 }
138
139 sb->s_magic = CIFS_MAGIC_NUMBER;
140 sb->s_op = &cifs_super_ops;
4523cc30 141/* if (cifs_sb->tcon->ses->server->maxBuf > MAX_CIFS_HDR_SIZE + 512)
790fe579
SF
142 sb->s_blocksize =
143 cifs_sb->tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE; */
1da177e4
LT
144#ifdef CONFIG_CIFS_QUOTA
145 sb->s_qcop = &cifs_quotactl_ops;
146#endif
147 sb->s_blocksize = CIFS_MAX_MSGSIZE;
148 sb->s_blocksize_bits = 14; /* default 2**14 = CIFS_MAX_MSGSIZE */
bd433d4c 149 inode = cifs_root_iget(sb, ROOT_I);
1da177e4 150
ce634ab2
DH
151 if (IS_ERR(inode)) {
152 rc = PTR_ERR(inode);
153 inode = NULL;
1da177e4
LT
154 goto out_no_root;
155 }
156
157 sb->s_root = d_alloc_root(inode);
158
159 if (!sb->s_root) {
160 rc = -ENOMEM;
161 goto out_no_root;
162 }
50c2f753 163
7521a3c5
SF
164#ifdef CONFIG_CIFS_EXPERIMENTAL
165 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
166 cFYI(1, ("export ops supported"));
167 sb->s_export_op = &cifs_export_ops;
168 }
169#endif /* EXPERIMENTAL */
1da177e4
LT
170
171 return 0;
172
173out_no_root:
174 cERROR(1, ("cifs_read_super: get root inode failed"));
175 if (inode)
176 iput(inode);
54b4602d 177
2c731afb 178 cifs_umount(sb, cifs_sb);
1da177e4
LT
179
180out_mount_failed:
4523cc30 181 if (cifs_sb) {
e6ab1582
IM
182#ifdef CONFIG_CIFS_DFS_UPCALL
183 if (cifs_sb->mountdata) {
184 kfree(cifs_sb->mountdata);
185 cifs_sb->mountdata = NULL;
186 }
187#endif
4523cc30 188 if (cifs_sb->local_nls)
50c2f753 189 unload_nls(cifs_sb->local_nls);
1da177e4
LT
190 kfree(cifs_sb);
191 }
192 return rc;
193}
194
195static void
196cifs_put_super(struct super_block *sb)
197{
198 int rc = 0;
199 struct cifs_sb_info *cifs_sb;
200
201 cFYI(1, ("In cifs_put_super"));
202 cifs_sb = CIFS_SB(sb);
4523cc30 203 if (cifs_sb == NULL) {
790fe579 204 cFYI(1, ("Empty cifs superblock info passed to unmount"));
1da177e4
LT
205 return;
206 }
6cfd0148
CH
207
208 lock_kernel();
209
790fe579 210 rc = cifs_umount(sb, cifs_sb);
ad7a2926 211 if (rc)
1da177e4 212 cERROR(1, ("cifs_umount failed with return code %d", rc));
e6ab1582
IM
213#ifdef CONFIG_CIFS_DFS_UPCALL
214 if (cifs_sb->mountdata) {
215 kfree(cifs_sb->mountdata);
216 cifs_sb->mountdata = NULL;
217 }
218#endif
219
1da177e4
LT
220 unload_nls(cifs_sb->local_nls);
221 kfree(cifs_sb);
6cfd0148
CH
222
223 unlock_kernel();
1da177e4
LT
224}
225
226static int
726c3342 227cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
1da177e4 228{
726c3342 229 struct super_block *sb = dentry->d_sb;
39da9847
SF
230 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
231 struct cifsTconInfo *tcon = cifs_sb->tcon;
c81156dd 232 int rc = -EOPNOTSUPP;
39da9847 233 int xid;
1da177e4
LT
234
235 xid = GetXid();
236
1da177e4
LT
237 buf->f_type = CIFS_MAGIC_NUMBER;
238
39da9847
SF
239 /*
240 * PATH_MAX may be too long - it would presumably be total path,
241 * but note that some servers (includinng Samba 3) have a shorter
242 * maximum path.
243 *
244 * Instead could get the real value via SMB_QUERY_FS_ATTRIBUTE_INFO.
245 */
246 buf->f_namelen = PATH_MAX;
1da177e4
LT
247 buf->f_files = 0; /* undefined */
248 buf->f_ffree = 0; /* unlimited */
249
39da9847
SF
250 /*
251 * We could add a second check for a QFS Unix capability bit
252 */
253 if ((tcon->ses->capabilities & CAP_UNIX) &&
254 (CIFS_POSIX_EXTENSIONS & le64_to_cpu(tcon->fsUnixInfo.Capability)))
255 rc = CIFSSMBQFSPosixInfo(xid, tcon, buf);
256
257 /*
258 * Only need to call the old QFSInfo if failed on newer one,
259 * e.g. by OS/2.
260 **/
261 if (rc && (tcon->ses->capabilities & CAP_NT_SMBS))
262 rc = CIFSSMBQFSInfo(xid, tcon, buf);
263
264 /*
265 * Some old Windows servers also do not support level 103, retry with
266 * older level one if old server failed the previous call or we
267 * bypassed it because we detected that this was an older LANMAN sess
268 */
4523cc30 269 if (rc)
39da9847
SF
270 rc = SMBOldQFSInfo(xid, tcon, buf);
271
1da177e4 272 FreeXid(xid);
39da9847 273 return 0;
1da177e4
LT
274}
275
e6305c43 276static int cifs_permission(struct inode *inode, int mask)
1da177e4
LT
277{
278 struct cifs_sb_info *cifs_sb;
279
280 cifs_sb = CIFS_SB(inode->i_sb);
281
f696a365
MS
282 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM) {
283 if ((mask & MAY_EXEC) && !execute_ok(inode))
284 return -EACCES;
285 else
286 return 0;
287 } else /* file mode might have been restricted at mount time
50c2f753 288 on the client (above and beyond ACL on servers) for
1da177e4 289 servers which do not support setting and viewing mode bits,
50c2f753 290 so allowing client to check permissions is useful */
1da177e4
LT
291 return generic_permission(inode, mask, NULL);
292}
293
e18b890b
CL
294static struct kmem_cache *cifs_inode_cachep;
295static struct kmem_cache *cifs_req_cachep;
296static struct kmem_cache *cifs_mid_cachep;
297struct kmem_cache *cifs_oplock_cachep;
298static struct kmem_cache *cifs_sm_req_cachep;
1da177e4
LT
299mempool_t *cifs_sm_req_poolp;
300mempool_t *cifs_req_poolp;
301mempool_t *cifs_mid_poolp;
302
303static struct inode *
304cifs_alloc_inode(struct super_block *sb)
305{
306 struct cifsInodeInfo *cifs_inode;
e94b1766 307 cifs_inode = kmem_cache_alloc(cifs_inode_cachep, GFP_KERNEL);
1da177e4
LT
308 if (!cifs_inode)
309 return NULL;
310 cifs_inode->cifsAttrs = 0x20; /* default */
1da177e4 311 cifs_inode->time = 0;
cea21805 312 cifs_inode->write_behind_rc = 0;
1da177e4
LT
313 /* Until the file is open and we have gotten oplock
314 info back from the server, can not assume caching of
315 file data or metadata */
4b18f2a9
SF
316 cifs_inode->clientCanCacheRead = false;
317 cifs_inode->clientCanCacheAll = false;
9a8165fc 318 cifs_inode->delete_pending = false;
1da177e4 319 cifs_inode->vfs_inode.i_blkbits = 14; /* 2**14 = CIFS_MAX_MSGSIZE */
fbec9ab9 320 cifs_inode->server_eof = 0;
50c2f753 321
1b2b2126
SF
322 /* Can not set i_flags here - they get immediately overwritten
323 to zero by the VFS */
324/* cifs_inode->vfs_inode.i_flags = S_NOATIME | S_NOCMTIME;*/
1da177e4
LT
325 INIT_LIST_HEAD(&cifs_inode->openFileList);
326 return &cifs_inode->vfs_inode;
327}
328
329static void
330cifs_destroy_inode(struct inode *inode)
331{
332 kmem_cache_free(cifs_inode_cachep, CIFS_I(inode));
333}
334
61f98ffd
JL
335static void
336cifs_show_address(struct seq_file *s, struct TCP_Server_Info *server)
337{
338 seq_printf(s, ",addr=");
339
340 switch (server->addr.sockAddr.sin_family) {
341 case AF_INET:
342 seq_printf(s, "%pI4", &server->addr.sockAddr.sin_addr.s_addr);
343 break;
344 case AF_INET6:
345 seq_printf(s, "%pI6",
346 &server->addr.sockAddr6.sin6_addr.s6_addr);
347 if (server->addr.sockAddr6.sin6_scope_id)
348 seq_printf(s, "%%%u",
349 server->addr.sockAddr6.sin6_scope_id);
350 break;
351 default:
352 seq_printf(s, "(unknown)");
353 }
354}
355
1da177e4
LT
356/*
357 * cifs_show_options() is for displaying mount options in /proc/mounts.
358 * Not all settable options are displayed but most of the important
359 * ones are.
360 */
361static int
362cifs_show_options(struct seq_file *s, struct vfsmount *m)
363{
8e047d09
JL
364 struct cifs_sb_info *cifs_sb = CIFS_SB(m->mnt_sb);
365 struct cifsTconInfo *tcon = cifs_sb->tcon;
8616e0fc 366
8e047d09 367 seq_printf(s, ",unc=%s", tcon->treeName);
8616e0fc
JL
368 if (tcon->ses->userName)
369 seq_printf(s, ",username=%s", tcon->ses->userName);
370 if (tcon->ses->domainName)
371 seq_printf(s, ",domain=%s", tcon->ses->domainName);
372
8616e0fc 373 seq_printf(s, ",uid=%d", cifs_sb->mnt_uid);
340481a3
JL
374 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)
375 seq_printf(s, ",forceuid");
4486d6ed
JL
376 else
377 seq_printf(s, ",noforceuid");
340481a3 378
8616e0fc 379 seq_printf(s, ",gid=%d", cifs_sb->mnt_gid);
340481a3
JL
380 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)
381 seq_printf(s, ",forcegid");
4486d6ed
JL
382 else
383 seq_printf(s, ",noforcegid");
8616e0fc 384
61f98ffd 385 cifs_show_address(s, tcon->ses->server);
1da177e4 386
8616e0fc
JL
387 if (!tcon->unix_ext)
388 seq_printf(s, ",file_mode=0%o,dir_mode=0%o",
2b280fab
SF
389 cifs_sb->mnt_file_mode,
390 cifs_sb->mnt_dir_mode);
8616e0fc
JL
391 if (tcon->seal)
392 seq_printf(s, ",seal");
393 if (tcon->nocase)
394 seq_printf(s, ",nocase");
395 if (tcon->retry)
396 seq_printf(s, ",hard");
397 if (cifs_sb->prepath)
398 seq_printf(s, ",prepath=%s", cifs_sb->prepath);
399 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS)
400 seq_printf(s, ",posixpaths");
401 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID)
402 seq_printf(s, ",setuids");
403 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
404 seq_printf(s, ",serverino");
405 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO)
406 seq_printf(s, ",directio");
407 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR)
408 seq_printf(s, ",nouser_xattr");
409 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR)
410 seq_printf(s, ",mapchars");
411 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
412 seq_printf(s, ",sfu");
413 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
414 seq_printf(s, ",nobrl");
415 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL)
416 seq_printf(s, ",cifsacl");
417 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
418 seq_printf(s, ",dynperm");
419 if (m->mnt_sb->s_flags & MS_POSIXACL)
420 seq_printf(s, ",acl");
421
422 seq_printf(s, ",rsize=%d", cifs_sb->rsize);
423 seq_printf(s, ",wsize=%d", cifs_sb->wsize);
424
1da177e4
LT
425 return 0;
426}
427
428#ifdef CONFIG_CIFS_QUOTA
50c2f753
SF
429int cifs_xquota_set(struct super_block *sb, int quota_type, qid_t qid,
430 struct fs_disk_quota *pdquota)
1da177e4
LT
431{
432 int xid;
433 int rc = 0;
434 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
435 struct cifsTconInfo *pTcon;
50c2f753 436
4523cc30 437 if (cifs_sb)
1da177e4
LT
438 pTcon = cifs_sb->tcon;
439 else
440 return -EIO;
441
442
443 xid = GetXid();
4523cc30 444 if (pTcon) {
50c2f753 445 cFYI(1, ("set type: 0x%x id: %d", quota_type, qid));
61e74801 446 } else
95ba7362 447 rc = -EIO;
1da177e4
LT
448
449 FreeXid(xid);
450 return rc;
451}
452
50c2f753
SF
453int cifs_xquota_get(struct super_block *sb, int quota_type, qid_t qid,
454 struct fs_disk_quota *pdquota)
1da177e4
LT
455{
456 int xid;
457 int rc = 0;
458 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
459 struct cifsTconInfo *pTcon;
460
4523cc30 461 if (cifs_sb)
1da177e4
LT
462 pTcon = cifs_sb->tcon;
463 else
464 return -EIO;
465
466 xid = GetXid();
4523cc30 467 if (pTcon) {
50c2f753 468 cFYI(1, ("set type: 0x%x id: %d", quota_type, qid));
61e74801 469 } else
1da177e4 470 rc = -EIO;
1da177e4
LT
471
472 FreeXid(xid);
473 return rc;
474}
475
50c2f753 476int cifs_xstate_set(struct super_block *sb, unsigned int flags, int operation)
1da177e4 477{
50c2f753 478 int xid;
1da177e4
LT
479 int rc = 0;
480 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
481 struct cifsTconInfo *pTcon;
482
4523cc30 483 if (cifs_sb)
1da177e4
LT
484 pTcon = cifs_sb->tcon;
485 else
486 return -EIO;
487
488 xid = GetXid();
4523cc30 489 if (pTcon) {
50c2f753 490 cFYI(1, ("flags: 0x%x operation: 0x%x", flags, operation));
61e74801 491 } else
1da177e4 492 rc = -EIO;
1da177e4
LT
493
494 FreeXid(xid);
495 return rc;
496}
497
50c2f753 498int cifs_xstate_get(struct super_block *sb, struct fs_quota_stat *qstats)
1da177e4
LT
499{
500 int xid;
501 int rc = 0;
502 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
503 struct cifsTconInfo *pTcon;
504
61e74801 505 if (cifs_sb)
1da177e4 506 pTcon = cifs_sb->tcon;
61e74801 507 else
1da177e4 508 return -EIO;
61e74801 509
1da177e4 510 xid = GetXid();
4523cc30 511 if (pTcon) {
50c2f753 512 cFYI(1, ("pqstats %p", qstats));
61e74801 513 } else
1da177e4 514 rc = -EIO;
1da177e4
LT
515
516 FreeXid(xid);
517 return rc;
518}
519
0d54b217 520static const struct quotactl_ops cifs_quotactl_ops = {
1da177e4 521 .set_xquota = cifs_xquota_set,
6f7e8f37 522 .get_xquota = cifs_xquota_get,
1da177e4
LT
523 .set_xstate = cifs_xstate_set,
524 .get_xstate = cifs_xstate_get,
525};
526#endif
527
42faad99 528static void cifs_umount_begin(struct super_block *sb)
68058e75 529{
42faad99 530 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
50c2f753 531 struct cifsTconInfo *tcon;
68058e75 532
4523cc30 533 if (cifs_sb == NULL)
9e2e85f8
SF
534 return;
535
536 tcon = cifs_sb->tcon;
4523cc30 537 if (tcon == NULL)
9e2e85f8 538 return;
f1987b44
JL
539
540 read_lock(&cifs_tcp_ses_lock);
ad8034f1
SF
541 if ((tcon->tc_count > 1) || (tcon->tidStatus == CifsExiting)) {
542 /* we have other mounts to same share or we have
543 already tried to force umount this and woken up
544 all waiting network requests, nothing to do */
545 read_unlock(&cifs_tcp_ses_lock);
546 return;
547 } else if (tcon->tc_count == 1)
5e1253b5 548 tcon->tidStatus = CifsExiting;
f1987b44 549 read_unlock(&cifs_tcp_ses_lock);
5e1253b5 550
3a5ff61c 551 /* cancel_brl_requests(tcon); */ /* BB mark all brl mids as exiting */
7b7abfe3 552 /* cancel_notify_requests(tcon); */
50c2f753
SF
553 if (tcon->ses && tcon->ses->server) {
554 cFYI(1, ("wake up tasks now - umount begin not complete"));
9e2e85f8 555 wake_up_all(&tcon->ses->server->request_q);
6ab16d24
SF
556 wake_up_all(&tcon->ses->server->response_q);
557 msleep(1); /* yield */
558 /* we have to kick the requests once more */
559 wake_up_all(&tcon->ses->server->response_q);
560 msleep(1);
5e1253b5 561 }
68058e75
SF
562
563 return;
564}
68058e75 565
bf97d287
SF
566#ifdef CONFIG_CIFS_STATS2
567static int cifs_show_stats(struct seq_file *s, struct vfsmount *mnt)
568{
569 /* BB FIXME */
570 return 0;
571}
572#endif
573
1da177e4
LT
574static int cifs_remount(struct super_block *sb, int *flags, char *data)
575{
576 *flags |= MS_NODIRATIME;
577 return 0;
578}
579
ee9b6d61 580static const struct super_operations cifs_super_ops = {
1da177e4
LT
581 .put_super = cifs_put_super,
582 .statfs = cifs_statfs,
583 .alloc_inode = cifs_alloc_inode,
584 .destroy_inode = cifs_destroy_inode,
50c2f753
SF
585/* .drop_inode = generic_delete_inode,
586 .delete_inode = cifs_delete_inode, */ /* Do not need above two
587 functions unless later we add lazy close of inodes or unless the
588 kernel forgets to call us with the same number of releases (closes)
589 as opens */
1da177e4 590 .show_options = cifs_show_options,
7b7abfe3 591 .umount_begin = cifs_umount_begin,
1da177e4 592 .remount_fs = cifs_remount,
bf97d287 593#ifdef CONFIG_CIFS_STATS2
f46d3e11 594 .show_stats = cifs_show_stats,
bf97d287 595#endif
1da177e4
LT
596};
597
454e2398 598static int
1da177e4 599cifs_get_sb(struct file_system_type *fs_type,
454e2398 600 int flags, const char *dev_name, void *data, struct vfsmount *mnt)
1da177e4
LT
601{
602 int rc;
603 struct super_block *sb = sget(fs_type, NULL, set_anon_super, NULL);
604
605 cFYI(1, ("Devname: %s flags: %d ", dev_name, flags));
606
607 if (IS_ERR(sb))
454e2398 608 return PTR_ERR(sb);
1da177e4
LT
609
610 sb->s_flags = flags;
611
9b04c997 612 rc = cifs_read_super(sb, data, dev_name, flags & MS_SILENT ? 1 : 0);
1da177e4 613 if (rc) {
6f5bbff9 614 deactivate_locked_super(sb);
454e2398 615 return rc;
1da177e4
LT
616 }
617 sb->s_flags |= MS_ACTIVE;
a3ec947c
SB
618 simple_set_mnt(mnt, sb);
619 return 0;
1da177e4
LT
620}
621
027445c3
BP
622static ssize_t cifs_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
623 unsigned long nr_segs, loff_t pos)
1da177e4 624{
e6a00296 625 struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode;
1da177e4
LT
626 ssize_t written;
627
027445c3 628 written = generic_file_aio_write(iocb, iov, nr_segs, pos);
87c89dd7
SF
629 if (!CIFS_I(inode)->clientCanCacheAll)
630 filemap_fdatawrite(inode->i_mapping);
1da177e4
LT
631 return written;
632}
633
c32a0b68
SF
634static loff_t cifs_llseek(struct file *file, loff_t offset, int origin)
635{
636 /* origin == SEEK_END => we must revalidate the cached file length */
0889a944 637 if (origin == SEEK_END) {
030e9d81
SF
638 int retval;
639
640 /* some applications poll for the file length in this strange
641 way so we must seek to end on non-oplocked files by
642 setting the revalidate time to zero */
c33f8d32 643 CIFS_I(file->f_path.dentry->d_inode)->time = 0;
030e9d81
SF
644
645 retval = cifs_revalidate(file->f_path.dentry);
c32a0b68
SF
646 if (retval < 0)
647 return (loff_t)retval;
648 }
9465efc9 649 return generic_file_llseek_unlocked(file, offset, origin);
c32a0b68
SF
650}
651
84210e91
SF
652#ifdef CONFIG_CIFS_EXPERIMENTAL
653static int cifs_setlease(struct file *file, long arg, struct file_lock **lease)
654{
655 /* note that this is called by vfs setlease with the BKL held
656 although I doubt that BKL is needed here in cifs */
657 struct inode *inode = file->f_path.dentry->d_inode;
658
659 if (!(S_ISREG(inode->i_mode)))
660 return -EINVAL;
661
662 /* check if file is oplocked */
663 if (((arg == F_RDLCK) &&
664 (CIFS_I(inode)->clientCanCacheRead)) ||
665 ((arg == F_WRLCK) &&
666 (CIFS_I(inode)->clientCanCacheAll)))
667 return generic_setlease(file, arg, lease);
668 else if (CIFS_SB(inode->i_sb)->tcon->local_lease &&
669 !CIFS_I(inode)->clientCanCacheRead)
670 /* If the server claims to support oplock on this
671 file, then we still need to check oplock even
672 if the local_lease mount option is set, but there
673 are servers which do not support oplock for which
674 this mount option may be useful if the user
675 knows that the file won't be changed on the server
676 by anyone else */
677 return generic_setlease(file, arg, lease);
678 else
679 return -EAGAIN;
680}
681#endif
682
e6ab1582 683struct file_system_type cifs_fs_type = {
1da177e4
LT
684 .owner = THIS_MODULE,
685 .name = "cifs",
686 .get_sb = cifs_get_sb,
687 .kill_sb = kill_anon_super,
688 /* .fs_flags */
689};
754661f1 690const struct inode_operations cifs_dir_inode_ops = {
1da177e4
LT
691 .create = cifs_create,
692 .lookup = cifs_lookup,
693 .getattr = cifs_getattr,
694 .unlink = cifs_unlink,
695 .link = cifs_hardlink,
696 .mkdir = cifs_mkdir,
697 .rmdir = cifs_rmdir,
698 .rename = cifs_rename,
699 .permission = cifs_permission,
700/* revalidate:cifs_revalidate, */
701 .setattr = cifs_setattr,
702 .symlink = cifs_symlink,
703 .mknod = cifs_mknod,
704#ifdef CONFIG_CIFS_XATTR
705 .setxattr = cifs_setxattr,
706 .getxattr = cifs_getxattr,
707 .listxattr = cifs_listxattr,
708 .removexattr = cifs_removexattr,
709#endif
710};
711
754661f1 712const struct inode_operations cifs_file_inode_ops = {
1da177e4
LT
713/* revalidate:cifs_revalidate, */
714 .setattr = cifs_setattr,
715 .getattr = cifs_getattr, /* do we need this anymore? */
716 .rename = cifs_rename,
717 .permission = cifs_permission,
718#ifdef CONFIG_CIFS_XATTR
719 .setxattr = cifs_setxattr,
720 .getxattr = cifs_getxattr,
721 .listxattr = cifs_listxattr,
722 .removexattr = cifs_removexattr,
50c2f753 723#endif
1da177e4
LT
724};
725
754661f1 726const struct inode_operations cifs_symlink_inode_ops = {
50c2f753 727 .readlink = generic_readlink,
1da177e4
LT
728 .follow_link = cifs_follow_link,
729 .put_link = cifs_put_link,
730 .permission = cifs_permission,
731 /* BB add the following two eventually */
732 /* revalidate: cifs_revalidate,
733 setattr: cifs_notify_change, *//* BB do we need notify change */
734#ifdef CONFIG_CIFS_XATTR
735 .setxattr = cifs_setxattr,
736 .getxattr = cifs_getxattr,
737 .listxattr = cifs_listxattr,
738 .removexattr = cifs_removexattr,
50c2f753 739#endif
1da177e4
LT
740};
741
4b6f5d20 742const struct file_operations cifs_file_ops = {
87c89dd7
SF
743 .read = do_sync_read,
744 .write = do_sync_write,
87c89dd7
SF
745 .aio_read = generic_file_aio_read,
746 .aio_write = cifs_file_aio_write,
1da177e4
LT
747 .open = cifs_open,
748 .release = cifs_close,
749 .lock = cifs_lock,
750 .fsync = cifs_fsync,
751 .flush = cifs_flush,
752 .mmap = cifs_file_mmap,
5ffc4ef4 753 .splice_read = generic_file_splice_read,
c32a0b68 754 .llseek = cifs_llseek,
c67593a0 755#ifdef CONFIG_CIFS_POSIX
f9ddcca4 756 .unlocked_ioctl = cifs_ioctl,
c67593a0
SF
757#endif /* CONFIG_CIFS_POSIX */
758
1da177e4 759#ifdef CONFIG_CIFS_EXPERIMENTAL
84210e91 760 .setlease = cifs_setlease,
1da177e4
LT
761#endif /* CONFIG_CIFS_EXPERIMENTAL */
762};
763
4b6f5d20 764const struct file_operations cifs_file_direct_ops = {
50c2f753 765 /* no mmap, no aio, no readv -
1da177e4
LT
766 BB reevaluate whether they can be done with directio, no cache */
767 .read = cifs_user_read,
768 .write = cifs_user_write,
769 .open = cifs_open,
770 .release = cifs_close,
771 .lock = cifs_lock,
772 .fsync = cifs_fsync,
773 .flush = cifs_flush,
5ffc4ef4 774 .splice_read = generic_file_splice_read,
c67593a0 775#ifdef CONFIG_CIFS_POSIX
f9ddcca4 776 .unlocked_ioctl = cifs_ioctl,
c67593a0 777#endif /* CONFIG_CIFS_POSIX */
c32a0b68 778 .llseek = cifs_llseek,
1da177e4 779#ifdef CONFIG_CIFS_EXPERIMENTAL
84210e91 780 .setlease = cifs_setlease,
1da177e4
LT
781#endif /* CONFIG_CIFS_EXPERIMENTAL */
782};
4b6f5d20 783const struct file_operations cifs_file_nobrl_ops = {
87c89dd7
SF
784 .read = do_sync_read,
785 .write = do_sync_write,
87c89dd7
SF
786 .aio_read = generic_file_aio_read,
787 .aio_write = cifs_file_aio_write,
788 .open = cifs_open,
789 .release = cifs_close,
790 .fsync = cifs_fsync,
791 .flush = cifs_flush,
792 .mmap = cifs_file_mmap,
5ffc4ef4 793 .splice_read = generic_file_splice_read,
c32a0b68 794 .llseek = cifs_llseek,
8b94bcb9 795#ifdef CONFIG_CIFS_POSIX
f9ddcca4 796 .unlocked_ioctl = cifs_ioctl,
8b94bcb9
SF
797#endif /* CONFIG_CIFS_POSIX */
798
799#ifdef CONFIG_CIFS_EXPERIMENTAL
84210e91 800 .setlease = cifs_setlease,
8b94bcb9
SF
801#endif /* CONFIG_CIFS_EXPERIMENTAL */
802};
803
4b6f5d20 804const struct file_operations cifs_file_direct_nobrl_ops = {
50c2f753 805 /* no mmap, no aio, no readv -
87c89dd7
SF
806 BB reevaluate whether they can be done with directio, no cache */
807 .read = cifs_user_read,
808 .write = cifs_user_write,
809 .open = cifs_open,
810 .release = cifs_close,
811 .fsync = cifs_fsync,
812 .flush = cifs_flush,
5ffc4ef4 813 .splice_read = generic_file_splice_read,
8b94bcb9 814#ifdef CONFIG_CIFS_POSIX
f9ddcca4 815 .unlocked_ioctl = cifs_ioctl,
8b94bcb9 816#endif /* CONFIG_CIFS_POSIX */
c32a0b68 817 .llseek = cifs_llseek,
8b94bcb9 818#ifdef CONFIG_CIFS_EXPERIMENTAL
84210e91 819 .setlease = cifs_setlease,
8b94bcb9
SF
820#endif /* CONFIG_CIFS_EXPERIMENTAL */
821};
1da177e4 822
4b6f5d20 823const struct file_operations cifs_dir_ops = {
1da177e4
LT
824 .readdir = cifs_readdir,
825 .release = cifs_closedir,
826 .read = generic_read_dir,
f9ddcca4 827 .unlocked_ioctl = cifs_ioctl,
3222a3e5 828 .llseek = generic_file_llseek,
1da177e4
LT
829};
830
831static void
51cc5068 832cifs_init_once(void *inode)
1da177e4
LT
833{
834 struct cifsInodeInfo *cifsi = inode;
835
a35afb83
CL
836 inode_init_once(&cifsi->vfs_inode);
837 INIT_LIST_HEAD(&cifsi->lockList);
1da177e4
LT
838}
839
840static int
841cifs_init_inodecache(void)
842{
843 cifs_inode_cachep = kmem_cache_create("cifs_inode_cache",
26f57364 844 sizeof(struct cifsInodeInfo),
fffb60f9
PJ
845 0, (SLAB_RECLAIM_ACCOUNT|
846 SLAB_MEM_SPREAD),
20c2df83 847 cifs_init_once);
1da177e4
LT
848 if (cifs_inode_cachep == NULL)
849 return -ENOMEM;
850
851 return 0;
852}
853
854static void
855cifs_destroy_inodecache(void)
856{
1a1d92c1 857 kmem_cache_destroy(cifs_inode_cachep);
1da177e4
LT
858}
859
860static int
861cifs_init_request_bufs(void)
862{
4523cc30 863 if (CIFSMaxBufSize < 8192) {
1da177e4
LT
864 /* Buffer size can not be smaller than 2 * PATH_MAX since maximum
865 Unicode path name has to fit in any SMB/CIFS path based frames */
866 CIFSMaxBufSize = 8192;
867 } else if (CIFSMaxBufSize > 1024*127) {
868 CIFSMaxBufSize = 1024 * 127;
869 } else {
870 CIFSMaxBufSize &= 0x1FE00; /* Round size to even 512 byte mult*/
871 }
872/* cERROR(1,("CIFSMaxBufSize %d 0x%x",CIFSMaxBufSize,CIFSMaxBufSize)); */
873 cifs_req_cachep = kmem_cache_create("cifs_request",
874 CIFSMaxBufSize +
875 MAX_CIFS_HDR_SIZE, 0,
20c2df83 876 SLAB_HWCACHE_ALIGN, NULL);
1da177e4
LT
877 if (cifs_req_cachep == NULL)
878 return -ENOMEM;
879
4523cc30 880 if (cifs_min_rcv < 1)
1da177e4
LT
881 cifs_min_rcv = 1;
882 else if (cifs_min_rcv > 64) {
883 cifs_min_rcv = 64;
50c2f753 884 cERROR(1, ("cifs_min_rcv set to maximum (64)"));
1da177e4
LT
885 }
886
93d2341c
MD
887 cifs_req_poolp = mempool_create_slab_pool(cifs_min_rcv,
888 cifs_req_cachep);
1da177e4 889
4523cc30 890 if (cifs_req_poolp == NULL) {
1da177e4
LT
891 kmem_cache_destroy(cifs_req_cachep);
892 return -ENOMEM;
893 }
ec637e3f 894 /* MAX_CIFS_SMALL_BUFFER_SIZE bytes is enough for most SMB responses and
1da177e4
LT
895 almost all handle based requests (but not write response, nor is it
896 sufficient for path based requests). A smaller size would have
50c2f753 897 been more efficient (compacting multiple slab items on one 4k page)
1da177e4
LT
898 for the case in which debug was on, but this larger size allows
899 more SMBs to use small buffer alloc and is still much more
6dc0f87e 900 efficient to alloc 1 per page off the slab compared to 17K (5page)
1da177e4
LT
901 alloc of large cifs buffers even when page debugging is on */
902 cifs_sm_req_cachep = kmem_cache_create("cifs_small_rq",
6dc0f87e 903 MAX_CIFS_SMALL_BUFFER_SIZE, 0, SLAB_HWCACHE_ALIGN,
20c2df83 904 NULL);
1da177e4
LT
905 if (cifs_sm_req_cachep == NULL) {
906 mempool_destroy(cifs_req_poolp);
907 kmem_cache_destroy(cifs_req_cachep);
6dc0f87e 908 return -ENOMEM;
1da177e4
LT
909 }
910
4523cc30 911 if (cifs_min_small < 2)
1da177e4
LT
912 cifs_min_small = 2;
913 else if (cifs_min_small > 256) {
914 cifs_min_small = 256;
6dc0f87e 915 cFYI(1, ("cifs_min_small set to maximum (256)"));
1da177e4
LT
916 }
917
93d2341c
MD
918 cifs_sm_req_poolp = mempool_create_slab_pool(cifs_min_small,
919 cifs_sm_req_cachep);
1da177e4 920
4523cc30 921 if (cifs_sm_req_poolp == NULL) {
1da177e4
LT
922 mempool_destroy(cifs_req_poolp);
923 kmem_cache_destroy(cifs_req_cachep);
924 kmem_cache_destroy(cifs_sm_req_cachep);
925 return -ENOMEM;
926 }
927
928 return 0;
929}
930
931static void
932cifs_destroy_request_bufs(void)
933{
934 mempool_destroy(cifs_req_poolp);
1a1d92c1 935 kmem_cache_destroy(cifs_req_cachep);
1da177e4 936 mempool_destroy(cifs_sm_req_poolp);
1a1d92c1 937 kmem_cache_destroy(cifs_sm_req_cachep);
1da177e4
LT
938}
939
940static int
941cifs_init_mids(void)
942{
943 cifs_mid_cachep = kmem_cache_create("cifs_mpx_ids",
26f57364
SF
944 sizeof(struct mid_q_entry), 0,
945 SLAB_HWCACHE_ALIGN, NULL);
1da177e4
LT
946 if (cifs_mid_cachep == NULL)
947 return -ENOMEM;
948
93d2341c
MD
949 /* 3 is a reasonable minimum number of simultaneous operations */
950 cifs_mid_poolp = mempool_create_slab_pool(3, cifs_mid_cachep);
4523cc30 951 if (cifs_mid_poolp == NULL) {
1da177e4
LT
952 kmem_cache_destroy(cifs_mid_cachep);
953 return -ENOMEM;
954 }
955
956 cifs_oplock_cachep = kmem_cache_create("cifs_oplock_structs",
26f57364
SF
957 sizeof(struct oplock_q_entry), 0,
958 SLAB_HWCACHE_ALIGN, NULL);
1da177e4 959 if (cifs_oplock_cachep == NULL) {
1da177e4 960 mempool_destroy(cifs_mid_poolp);
e6985c7f 961 kmem_cache_destroy(cifs_mid_cachep);
1da177e4
LT
962 return -ENOMEM;
963 }
964
965 return 0;
966}
967
968static void
969cifs_destroy_mids(void)
970{
971 mempool_destroy(cifs_mid_poolp);
1a1d92c1
AD
972 kmem_cache_destroy(cifs_mid_cachep);
973 kmem_cache_destroy(cifs_oplock_cachep);
1da177e4
LT
974}
975
50c2f753 976static int cifs_oplock_thread(void *dummyarg)
1da177e4 977{
6dc0f87e 978 struct oplock_q_entry *oplock_item;
1da177e4 979 struct cifsTconInfo *pTcon;
6dc0f87e 980 struct inode *inode;
1da177e4 981 __u16 netfid;
cea21805 982 int rc, waitrc = 0;
1da177e4 983
83144186 984 set_freezable();
1da177e4 985 do {
6dc0f87e 986 if (try_to_freeze())
ede1327e 987 continue;
50c2f753 988
1b49c556
JL
989 spin_lock(&cifs_oplock_lock);
990 if (list_empty(&cifs_oplock_list)) {
991 spin_unlock(&cifs_oplock_lock);
1da177e4
LT
992 set_current_state(TASK_INTERRUPTIBLE);
993 schedule_timeout(39*HZ);
994 } else {
1b49c556 995 oplock_item = list_entry(cifs_oplock_list.next,
ad8b15f0
SF
996 struct oplock_q_entry, qhead);
997 cFYI(1, ("found oplock item to write out"));
998 pTcon = oplock_item->tcon;
999 inode = oplock_item->pinode;
1000 netfid = oplock_item->netfid;
1b49c556 1001 spin_unlock(&cifs_oplock_lock);
ad8b15f0
SF
1002 DeleteOplockQEntry(oplock_item);
1003 /* can not grab inode sem here since it would
6dc0f87e 1004 deadlock when oplock received on delete
1b1dcc1b 1005 since vfs_unlink holds the i_mutex across
1da177e4 1006 the call */
ad8b15f0
SF
1007 /* mutex_lock(&inode->i_mutex);*/
1008 if (S_ISREG(inode->i_mode)) {
84210e91
SF
1009#ifdef CONFIG_CIFS_EXPERIMENTAL
1010 if (CIFS_I(inode)->clientCanCacheAll == 0)
1011 break_lease(inode, FMODE_READ);
1012 else if (CIFS_I(inode)->clientCanCacheRead == 0)
1013 break_lease(inode, FMODE_WRITE);
1014#endif
ad8b15f0
SF
1015 rc = filemap_fdatawrite(inode->i_mapping);
1016 if (CIFS_I(inode)->clientCanCacheRead == 0) {
1017 waitrc = filemap_fdatawait(
1018 inode->i_mapping);
1019 invalidate_remote_inode(inode);
1020 }
1021 if (rc == 0)
1022 rc = waitrc;
1023 } else
1024 rc = 0;
1025 /* mutex_unlock(&inode->i_mutex);*/
1026 if (rc)
1027 CIFS_I(inode)->write_behind_rc = rc;
1028 cFYI(1, ("Oplock flush inode %p rc %d",
1029 inode, rc));
6dc0f87e
SF
1030
1031 /* releasing stale oplock after recent reconnect
1032 of smb session using a now incorrect file
1033 handle is not a data integrity issue but do
1034 not bother sending an oplock release if session
1035 to server still is disconnected since oplock
1da177e4 1036 already released by the server in that case */
3b795210 1037 if (!pTcon->need_reconnect) {
ad8b15f0
SF
1038 rc = CIFSSMBLock(0, pTcon, netfid,
1039 0 /* len */ , 0 /* offset */, 0,
1040 0, LOCKING_ANDX_OPLOCK_RELEASE,
1041 false /* wait flag */);
1042 cFYI(1, ("Oplock release rc = %d", rc));
1043 }
68058e75
SF
1044 set_current_state(TASK_INTERRUPTIBLE);
1045 schedule_timeout(1); /* yield in case q were corrupt */
1da177e4 1046 }
45af7a0f
SF
1047 } while (!kthread_should_stop());
1048
1049 return 0;
1da177e4
LT
1050}
1051
1052static int __init
1053init_cifs(void)
1054{
1055 int rc = 0;
1da177e4 1056 cifs_proc_init();
e7ddee90 1057 INIT_LIST_HEAD(&cifs_tcp_ses_list);
1b49c556 1058 INIT_LIST_HEAD(&cifs_oplock_list);
4ca9c190
SF
1059#ifdef CONFIG_CIFS_EXPERIMENTAL
1060 INIT_LIST_HEAD(&GlobalDnotifyReqList);
1061 INIT_LIST_HEAD(&GlobalDnotifyRsp_Q);
6dc0f87e 1062#endif
1da177e4
LT
1063/*
1064 * Initialize Global counters
1065 */
1066 atomic_set(&sesInfoAllocCount, 0);
1067 atomic_set(&tconInfoAllocCount, 0);
6dc0f87e 1068 atomic_set(&tcpSesAllocCount, 0);
1da177e4
LT
1069 atomic_set(&tcpSesReconnectCount, 0);
1070 atomic_set(&tconInfoReconnectCount, 0);
1071
1072 atomic_set(&bufAllocCount, 0);
4498eed5
SF
1073 atomic_set(&smBufAllocCount, 0);
1074#ifdef CONFIG_CIFS_STATS2
1075 atomic_set(&totBufAllocCount, 0);
1076 atomic_set(&totSmBufAllocCount, 0);
1077#endif /* CONFIG_CIFS_STATS2 */
1078
1da177e4
LT
1079 atomic_set(&midCount, 0);
1080 GlobalCurrentXid = 0;
1081 GlobalTotalActiveXid = 0;
1082 GlobalMaxActiveXid = 0;
2cd646a2 1083 memset(Local_System_Name, 0, 15);
1da177e4 1084 rwlock_init(&GlobalSMBSeslock);
e7ddee90 1085 rwlock_init(&cifs_tcp_ses_lock);
1da177e4 1086 spin_lock_init(&GlobalMid_Lock);
1b49c556 1087 spin_lock_init(&cifs_oplock_lock);
1da177e4 1088
4523cc30 1089 if (cifs_max_pending < 2) {
1da177e4 1090 cifs_max_pending = 2;
6dc0f87e 1091 cFYI(1, ("cifs_max_pending set to min of 2"));
4523cc30 1092 } else if (cifs_max_pending > 256) {
1da177e4 1093 cifs_max_pending = 256;
6dc0f87e 1094 cFYI(1, ("cifs_max_pending set to max of 256"));
1da177e4
LT
1095 }
1096
1097 rc = cifs_init_inodecache();
45af7a0f
SF
1098 if (rc)
1099 goto out_clean_proc;
1100
1101 rc = cifs_init_mids();
1102 if (rc)
1103 goto out_destroy_inodecache;
1104
1105 rc = cifs_init_request_bufs();
1106 if (rc)
1107 goto out_destroy_mids;
1108
1109 rc = register_filesystem(&cifs_fs_type);
1110 if (rc)
1111 goto out_destroy_request_bufs;
84a15b93
JL
1112#ifdef CONFIG_CIFS_UPCALL
1113 rc = register_key_type(&cifs_spnego_key_type);
1114 if (rc)
1115 goto out_unregister_filesystem;
6103335d
SF
1116#endif
1117#ifdef CONFIG_CIFS_DFS_UPCALL
1118 rc = register_key_type(&key_type_dns_resolver);
1119 if (rc)
1120 goto out_unregister_key_type;
84a15b93 1121#endif
45af7a0f
SF
1122 oplockThread = kthread_run(cifs_oplock_thread, NULL, "cifsoplockd");
1123 if (IS_ERR(oplockThread)) {
1124 rc = PTR_ERR(oplockThread);
6dc0f87e 1125 cERROR(1, ("error %d create oplock thread", rc));
6103335d 1126 goto out_unregister_dfs_key_type;
1da177e4 1127 }
45af7a0f 1128
45af7a0f
SF
1129 return 0;
1130
6103335d
SF
1131 out_unregister_dfs_key_type:
1132#ifdef CONFIG_CIFS_DFS_UPCALL
1133 unregister_key_type(&key_type_dns_resolver);
84a15b93 1134 out_unregister_key_type:
6103335d 1135#endif
84a15b93
JL
1136#ifdef CONFIG_CIFS_UPCALL
1137 unregister_key_type(&cifs_spnego_key_type);
45af7a0f 1138 out_unregister_filesystem:
84a15b93 1139#endif
45af7a0f
SF
1140 unregister_filesystem(&cifs_fs_type);
1141 out_destroy_request_bufs:
1142 cifs_destroy_request_bufs();
1143 out_destroy_mids:
1144 cifs_destroy_mids();
1145 out_destroy_inodecache:
1146 cifs_destroy_inodecache();
1147 out_clean_proc:
1da177e4 1148 cifs_proc_clean();
1da177e4
LT
1149 return rc;
1150}
1151
1152static void __exit
1153exit_cifs(void)
1154{
90c81e0b 1155 cFYI(DBG2, ("exit_cifs"));
1da177e4 1156 cifs_proc_clean();
6103335d 1157#ifdef CONFIG_CIFS_DFS_UPCALL
78d31a3a 1158 cifs_dfs_release_automount_timer();
6103335d
SF
1159 unregister_key_type(&key_type_dns_resolver);
1160#endif
84a15b93
JL
1161#ifdef CONFIG_CIFS_UPCALL
1162 unregister_key_type(&cifs_spnego_key_type);
1da177e4
LT
1163#endif
1164 unregister_filesystem(&cifs_fs_type);
1165 cifs_destroy_inodecache();
1166 cifs_destroy_mids();
1167 cifs_destroy_request_bufs();
954d7a1c 1168 kthread_stop(oplockThread);
1da177e4
LT
1169}
1170
1171MODULE_AUTHOR("Steve French <sfrench@us.ibm.com>");
6dc0f87e 1172MODULE_LICENSE("GPL"); /* combination of LGPL + GPL source behaves as GPL */
1da177e4 1173MODULE_DESCRIPTION
63135e08
SF
1174 ("VFS to access servers complying with the SNIA CIFS Specification "
1175 "e.g. Samba and Windows");
1da177e4
LT
1176MODULE_VERSION(CIFS_VERSION);
1177module_init(init_cifs)
1178module_exit(exit_cifs)