cifs: Fix incorrect return code being printed in cFYI messages
[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
53static 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 */
311 atomic_set(&cifs_inode->inUse, 0);
312 cifs_inode->time = 0;
cea21805 313 cifs_inode->write_behind_rc = 0;
1da177e4
LT
314 /* Until the file is open and we have gotten oplock
315 info back from the server, can not assume caching of
316 file data or metadata */
4b18f2a9
SF
317 cifs_inode->clientCanCacheRead = false;
318 cifs_inode->clientCanCacheAll = false;
9a8165fc 319 cifs_inode->delete_pending = false;
1da177e4 320 cifs_inode->vfs_inode.i_blkbits = 14; /* 2**14 = CIFS_MAX_MSGSIZE */
fbec9ab9 321 cifs_inode->server_eof = 0;
50c2f753 322
1b2b2126
SF
323 /* Can not set i_flags here - they get immediately overwritten
324 to zero by the VFS */
325/* cifs_inode->vfs_inode.i_flags = S_NOATIME | S_NOCMTIME;*/
1da177e4
LT
326 INIT_LIST_HEAD(&cifs_inode->openFileList);
327 return &cifs_inode->vfs_inode;
328}
329
330static void
331cifs_destroy_inode(struct inode *inode)
332{
333 kmem_cache_free(cifs_inode_cachep, CIFS_I(inode));
334}
335
61f98ffd
JL
336static void
337cifs_show_address(struct seq_file *s, struct TCP_Server_Info *server)
338{
339 seq_printf(s, ",addr=");
340
341 switch (server->addr.sockAddr.sin_family) {
342 case AF_INET:
343 seq_printf(s, "%pI4", &server->addr.sockAddr.sin_addr.s_addr);
344 break;
345 case AF_INET6:
346 seq_printf(s, "%pI6",
347 &server->addr.sockAddr6.sin6_addr.s6_addr);
348 if (server->addr.sockAddr6.sin6_scope_id)
349 seq_printf(s, "%%%u",
350 server->addr.sockAddr6.sin6_scope_id);
351 break;
352 default:
353 seq_printf(s, "(unknown)");
354 }
355}
356
1da177e4
LT
357/*
358 * cifs_show_options() is for displaying mount options in /proc/mounts.
359 * Not all settable options are displayed but most of the important
360 * ones are.
361 */
362static int
363cifs_show_options(struct seq_file *s, struct vfsmount *m)
364{
365 struct cifs_sb_info *cifs_sb;
80909022 366 struct cifsTconInfo *tcon;
1da177e4
LT
367
368 cifs_sb = CIFS_SB(m->mnt_sb);
8616e0fc
JL
369 tcon = cifs_sb->tcon;
370
371 seq_printf(s, ",unc=%s", cifs_sb->tcon->treeName);
372 if (tcon->ses->userName)
373 seq_printf(s, ",username=%s", tcon->ses->userName);
374 if (tcon->ses->domainName)
375 seq_printf(s, ",domain=%s", tcon->ses->domainName);
376
8616e0fc 377 seq_printf(s, ",uid=%d", cifs_sb->mnt_uid);
340481a3
JL
378 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)
379 seq_printf(s, ",forceuid");
380
8616e0fc 381 seq_printf(s, ",gid=%d", cifs_sb->mnt_gid);
340481a3
JL
382 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)
383 seq_printf(s, ",forcegid");
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
520static struct quotactl_ops cifs_quotactl_ops = {
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 539
67e55205 540 lock_kernel();
f1987b44
JL
541 read_lock(&cifs_tcp_ses_lock);
542 if (tcon->tc_count == 1)
5e1253b5 543 tcon->tidStatus = CifsExiting;
f1987b44 544 read_unlock(&cifs_tcp_ses_lock);
5e1253b5 545
3a5ff61c 546 /* cancel_brl_requests(tcon); */ /* BB mark all brl mids as exiting */
7b7abfe3 547 /* cancel_notify_requests(tcon); */
50c2f753
SF
548 if (tcon->ses && tcon->ses->server) {
549 cFYI(1, ("wake up tasks now - umount begin not complete"));
9e2e85f8 550 wake_up_all(&tcon->ses->server->request_q);
6ab16d24
SF
551 wake_up_all(&tcon->ses->server->response_q);
552 msleep(1); /* yield */
553 /* we have to kick the requests once more */
554 wake_up_all(&tcon->ses->server->response_q);
555 msleep(1);
5e1253b5
SF
556 }
557/* BB FIXME - finish add checks for tidStatus BB */
68058e75 558
67e55205 559 unlock_kernel();
68058e75
SF
560 return;
561}
68058e75 562
bf97d287
SF
563#ifdef CONFIG_CIFS_STATS2
564static int cifs_show_stats(struct seq_file *s, struct vfsmount *mnt)
565{
566 /* BB FIXME */
567 return 0;
568}
569#endif
570
1da177e4
LT
571static int cifs_remount(struct super_block *sb, int *flags, char *data)
572{
573 *flags |= MS_NODIRATIME;
574 return 0;
575}
576
ee9b6d61 577static const struct super_operations cifs_super_ops = {
1da177e4
LT
578 .put_super = cifs_put_super,
579 .statfs = cifs_statfs,
580 .alloc_inode = cifs_alloc_inode,
581 .destroy_inode = cifs_destroy_inode,
50c2f753
SF
582/* .drop_inode = generic_delete_inode,
583 .delete_inode = cifs_delete_inode, */ /* Do not need above two
584 functions unless later we add lazy close of inodes or unless the
585 kernel forgets to call us with the same number of releases (closes)
586 as opens */
1da177e4 587 .show_options = cifs_show_options,
7b7abfe3 588 .umount_begin = cifs_umount_begin,
1da177e4 589 .remount_fs = cifs_remount,
bf97d287 590#ifdef CONFIG_CIFS_STATS2
f46d3e11 591 .show_stats = cifs_show_stats,
bf97d287 592#endif
1da177e4
LT
593};
594
454e2398 595static int
1da177e4 596cifs_get_sb(struct file_system_type *fs_type,
454e2398 597 int flags, const char *dev_name, void *data, struct vfsmount *mnt)
1da177e4
LT
598{
599 int rc;
600 struct super_block *sb = sget(fs_type, NULL, set_anon_super, NULL);
601
602 cFYI(1, ("Devname: %s flags: %d ", dev_name, flags));
603
604 if (IS_ERR(sb))
454e2398 605 return PTR_ERR(sb);
1da177e4
LT
606
607 sb->s_flags = flags;
608
9b04c997 609 rc = cifs_read_super(sb, data, dev_name, flags & MS_SILENT ? 1 : 0);
1da177e4 610 if (rc) {
6f5bbff9 611 deactivate_locked_super(sb);
454e2398 612 return rc;
1da177e4
LT
613 }
614 sb->s_flags |= MS_ACTIVE;
a3ec947c
SB
615 simple_set_mnt(mnt, sb);
616 return 0;
1da177e4
LT
617}
618
027445c3
BP
619static ssize_t cifs_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
620 unsigned long nr_segs, loff_t pos)
1da177e4 621{
e6a00296 622 struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode;
1da177e4
LT
623 ssize_t written;
624
027445c3 625 written = generic_file_aio_write(iocb, iov, nr_segs, pos);
87c89dd7
SF
626 if (!CIFS_I(inode)->clientCanCacheAll)
627 filemap_fdatawrite(inode->i_mapping);
1da177e4
LT
628 return written;
629}
630
c32a0b68
SF
631static loff_t cifs_llseek(struct file *file, loff_t offset, int origin)
632{
633 /* origin == SEEK_END => we must revalidate the cached file length */
0889a944 634 if (origin == SEEK_END) {
030e9d81
SF
635 int retval;
636
637 /* some applications poll for the file length in this strange
638 way so we must seek to end on non-oplocked files by
639 setting the revalidate time to zero */
c33f8d32 640 CIFS_I(file->f_path.dentry->d_inode)->time = 0;
030e9d81
SF
641
642 retval = cifs_revalidate(file->f_path.dentry);
c32a0b68
SF
643 if (retval < 0)
644 return (loff_t)retval;
645 }
9465efc9 646 return generic_file_llseek_unlocked(file, offset, origin);
c32a0b68
SF
647}
648
84210e91
SF
649#ifdef CONFIG_CIFS_EXPERIMENTAL
650static int cifs_setlease(struct file *file, long arg, struct file_lock **lease)
651{
652 /* note that this is called by vfs setlease with the BKL held
653 although I doubt that BKL is needed here in cifs */
654 struct inode *inode = file->f_path.dentry->d_inode;
655
656 if (!(S_ISREG(inode->i_mode)))
657 return -EINVAL;
658
659 /* check if file is oplocked */
660 if (((arg == F_RDLCK) &&
661 (CIFS_I(inode)->clientCanCacheRead)) ||
662 ((arg == F_WRLCK) &&
663 (CIFS_I(inode)->clientCanCacheAll)))
664 return generic_setlease(file, arg, lease);
665 else if (CIFS_SB(inode->i_sb)->tcon->local_lease &&
666 !CIFS_I(inode)->clientCanCacheRead)
667 /* If the server claims to support oplock on this
668 file, then we still need to check oplock even
669 if the local_lease mount option is set, but there
670 are servers which do not support oplock for which
671 this mount option may be useful if the user
672 knows that the file won't be changed on the server
673 by anyone else */
674 return generic_setlease(file, arg, lease);
675 else
676 return -EAGAIN;
677}
678#endif
679
e6ab1582 680struct file_system_type cifs_fs_type = {
1da177e4
LT
681 .owner = THIS_MODULE,
682 .name = "cifs",
683 .get_sb = cifs_get_sb,
684 .kill_sb = kill_anon_super,
685 /* .fs_flags */
686};
754661f1 687const struct inode_operations cifs_dir_inode_ops = {
1da177e4
LT
688 .create = cifs_create,
689 .lookup = cifs_lookup,
690 .getattr = cifs_getattr,
691 .unlink = cifs_unlink,
692 .link = cifs_hardlink,
693 .mkdir = cifs_mkdir,
694 .rmdir = cifs_rmdir,
695 .rename = cifs_rename,
696 .permission = cifs_permission,
697/* revalidate:cifs_revalidate, */
698 .setattr = cifs_setattr,
699 .symlink = cifs_symlink,
700 .mknod = cifs_mknod,
701#ifdef CONFIG_CIFS_XATTR
702 .setxattr = cifs_setxattr,
703 .getxattr = cifs_getxattr,
704 .listxattr = cifs_listxattr,
705 .removexattr = cifs_removexattr,
706#endif
707};
708
754661f1 709const struct inode_operations cifs_file_inode_ops = {
1da177e4
LT
710/* revalidate:cifs_revalidate, */
711 .setattr = cifs_setattr,
712 .getattr = cifs_getattr, /* do we need this anymore? */
713 .rename = cifs_rename,
714 .permission = cifs_permission,
715#ifdef CONFIG_CIFS_XATTR
716 .setxattr = cifs_setxattr,
717 .getxattr = cifs_getxattr,
718 .listxattr = cifs_listxattr,
719 .removexattr = cifs_removexattr,
50c2f753 720#endif
1da177e4
LT
721};
722
754661f1 723const struct inode_operations cifs_symlink_inode_ops = {
50c2f753 724 .readlink = generic_readlink,
1da177e4
LT
725 .follow_link = cifs_follow_link,
726 .put_link = cifs_put_link,
727 .permission = cifs_permission,
728 /* BB add the following two eventually */
729 /* revalidate: cifs_revalidate,
730 setattr: cifs_notify_change, *//* BB do we need notify change */
731#ifdef CONFIG_CIFS_XATTR
732 .setxattr = cifs_setxattr,
733 .getxattr = cifs_getxattr,
734 .listxattr = cifs_listxattr,
735 .removexattr = cifs_removexattr,
50c2f753 736#endif
1da177e4
LT
737};
738
4b6f5d20 739const struct file_operations cifs_file_ops = {
87c89dd7
SF
740 .read = do_sync_read,
741 .write = do_sync_write,
87c89dd7
SF
742 .aio_read = generic_file_aio_read,
743 .aio_write = cifs_file_aio_write,
1da177e4
LT
744 .open = cifs_open,
745 .release = cifs_close,
746 .lock = cifs_lock,
747 .fsync = cifs_fsync,
748 .flush = cifs_flush,
749 .mmap = cifs_file_mmap,
5ffc4ef4 750 .splice_read = generic_file_splice_read,
c32a0b68 751 .llseek = cifs_llseek,
c67593a0 752#ifdef CONFIG_CIFS_POSIX
f9ddcca4 753 .unlocked_ioctl = cifs_ioctl,
c67593a0
SF
754#endif /* CONFIG_CIFS_POSIX */
755
1da177e4 756#ifdef CONFIG_CIFS_EXPERIMENTAL
84210e91 757 .setlease = cifs_setlease,
1da177e4
LT
758#endif /* CONFIG_CIFS_EXPERIMENTAL */
759};
760
4b6f5d20 761const struct file_operations cifs_file_direct_ops = {
50c2f753 762 /* no mmap, no aio, no readv -
1da177e4
LT
763 BB reevaluate whether they can be done with directio, no cache */
764 .read = cifs_user_read,
765 .write = cifs_user_write,
766 .open = cifs_open,
767 .release = cifs_close,
768 .lock = cifs_lock,
769 .fsync = cifs_fsync,
770 .flush = cifs_flush,
5ffc4ef4 771 .splice_read = generic_file_splice_read,
c67593a0 772#ifdef CONFIG_CIFS_POSIX
f9ddcca4 773 .unlocked_ioctl = cifs_ioctl,
c67593a0 774#endif /* CONFIG_CIFS_POSIX */
c32a0b68 775 .llseek = cifs_llseek,
1da177e4 776#ifdef CONFIG_CIFS_EXPERIMENTAL
84210e91 777 .setlease = cifs_setlease,
1da177e4
LT
778#endif /* CONFIG_CIFS_EXPERIMENTAL */
779};
4b6f5d20 780const struct file_operations cifs_file_nobrl_ops = {
87c89dd7
SF
781 .read = do_sync_read,
782 .write = do_sync_write,
87c89dd7
SF
783 .aio_read = generic_file_aio_read,
784 .aio_write = cifs_file_aio_write,
785 .open = cifs_open,
786 .release = cifs_close,
787 .fsync = cifs_fsync,
788 .flush = cifs_flush,
789 .mmap = cifs_file_mmap,
5ffc4ef4 790 .splice_read = generic_file_splice_read,
c32a0b68 791 .llseek = cifs_llseek,
8b94bcb9 792#ifdef CONFIG_CIFS_POSIX
f9ddcca4 793 .unlocked_ioctl = cifs_ioctl,
8b94bcb9
SF
794#endif /* CONFIG_CIFS_POSIX */
795
796#ifdef CONFIG_CIFS_EXPERIMENTAL
84210e91 797 .setlease = cifs_setlease,
8b94bcb9
SF
798#endif /* CONFIG_CIFS_EXPERIMENTAL */
799};
800
4b6f5d20 801const struct file_operations cifs_file_direct_nobrl_ops = {
50c2f753 802 /* no mmap, no aio, no readv -
87c89dd7
SF
803 BB reevaluate whether they can be done with directio, no cache */
804 .read = cifs_user_read,
805 .write = cifs_user_write,
806 .open = cifs_open,
807 .release = cifs_close,
808 .fsync = cifs_fsync,
809 .flush = cifs_flush,
5ffc4ef4 810 .splice_read = generic_file_splice_read,
8b94bcb9 811#ifdef CONFIG_CIFS_POSIX
f9ddcca4 812 .unlocked_ioctl = cifs_ioctl,
8b94bcb9 813#endif /* CONFIG_CIFS_POSIX */
c32a0b68 814 .llseek = cifs_llseek,
8b94bcb9 815#ifdef CONFIG_CIFS_EXPERIMENTAL
84210e91 816 .setlease = cifs_setlease,
8b94bcb9
SF
817#endif /* CONFIG_CIFS_EXPERIMENTAL */
818};
1da177e4 819
4b6f5d20 820const struct file_operations cifs_dir_ops = {
1da177e4
LT
821 .readdir = cifs_readdir,
822 .release = cifs_closedir,
823 .read = generic_read_dir,
f9ddcca4 824 .unlocked_ioctl = cifs_ioctl,
3222a3e5 825 .llseek = generic_file_llseek,
1da177e4
LT
826};
827
828static void
51cc5068 829cifs_init_once(void *inode)
1da177e4
LT
830{
831 struct cifsInodeInfo *cifsi = inode;
832
a35afb83
CL
833 inode_init_once(&cifsi->vfs_inode);
834 INIT_LIST_HEAD(&cifsi->lockList);
1da177e4
LT
835}
836
837static int
838cifs_init_inodecache(void)
839{
840 cifs_inode_cachep = kmem_cache_create("cifs_inode_cache",
26f57364 841 sizeof(struct cifsInodeInfo),
fffb60f9
PJ
842 0, (SLAB_RECLAIM_ACCOUNT|
843 SLAB_MEM_SPREAD),
20c2df83 844 cifs_init_once);
1da177e4
LT
845 if (cifs_inode_cachep == NULL)
846 return -ENOMEM;
847
848 return 0;
849}
850
851static void
852cifs_destroy_inodecache(void)
853{
1a1d92c1 854 kmem_cache_destroy(cifs_inode_cachep);
1da177e4
LT
855}
856
857static int
858cifs_init_request_bufs(void)
859{
4523cc30 860 if (CIFSMaxBufSize < 8192) {
1da177e4
LT
861 /* Buffer size can not be smaller than 2 * PATH_MAX since maximum
862 Unicode path name has to fit in any SMB/CIFS path based frames */
863 CIFSMaxBufSize = 8192;
864 } else if (CIFSMaxBufSize > 1024*127) {
865 CIFSMaxBufSize = 1024 * 127;
866 } else {
867 CIFSMaxBufSize &= 0x1FE00; /* Round size to even 512 byte mult*/
868 }
869/* cERROR(1,("CIFSMaxBufSize %d 0x%x",CIFSMaxBufSize,CIFSMaxBufSize)); */
870 cifs_req_cachep = kmem_cache_create("cifs_request",
871 CIFSMaxBufSize +
872 MAX_CIFS_HDR_SIZE, 0,
20c2df83 873 SLAB_HWCACHE_ALIGN, NULL);
1da177e4
LT
874 if (cifs_req_cachep == NULL)
875 return -ENOMEM;
876
4523cc30 877 if (cifs_min_rcv < 1)
1da177e4
LT
878 cifs_min_rcv = 1;
879 else if (cifs_min_rcv > 64) {
880 cifs_min_rcv = 64;
50c2f753 881 cERROR(1, ("cifs_min_rcv set to maximum (64)"));
1da177e4
LT
882 }
883
93d2341c
MD
884 cifs_req_poolp = mempool_create_slab_pool(cifs_min_rcv,
885 cifs_req_cachep);
1da177e4 886
4523cc30 887 if (cifs_req_poolp == NULL) {
1da177e4
LT
888 kmem_cache_destroy(cifs_req_cachep);
889 return -ENOMEM;
890 }
ec637e3f 891 /* MAX_CIFS_SMALL_BUFFER_SIZE bytes is enough for most SMB responses and
1da177e4
LT
892 almost all handle based requests (but not write response, nor is it
893 sufficient for path based requests). A smaller size would have
50c2f753 894 been more efficient (compacting multiple slab items on one 4k page)
1da177e4
LT
895 for the case in which debug was on, but this larger size allows
896 more SMBs to use small buffer alloc and is still much more
6dc0f87e 897 efficient to alloc 1 per page off the slab compared to 17K (5page)
1da177e4
LT
898 alloc of large cifs buffers even when page debugging is on */
899 cifs_sm_req_cachep = kmem_cache_create("cifs_small_rq",
6dc0f87e 900 MAX_CIFS_SMALL_BUFFER_SIZE, 0, SLAB_HWCACHE_ALIGN,
20c2df83 901 NULL);
1da177e4
LT
902 if (cifs_sm_req_cachep == NULL) {
903 mempool_destroy(cifs_req_poolp);
904 kmem_cache_destroy(cifs_req_cachep);
6dc0f87e 905 return -ENOMEM;
1da177e4
LT
906 }
907
4523cc30 908 if (cifs_min_small < 2)
1da177e4
LT
909 cifs_min_small = 2;
910 else if (cifs_min_small > 256) {
911 cifs_min_small = 256;
6dc0f87e 912 cFYI(1, ("cifs_min_small set to maximum (256)"));
1da177e4
LT
913 }
914
93d2341c
MD
915 cifs_sm_req_poolp = mempool_create_slab_pool(cifs_min_small,
916 cifs_sm_req_cachep);
1da177e4 917
4523cc30 918 if (cifs_sm_req_poolp == NULL) {
1da177e4
LT
919 mempool_destroy(cifs_req_poolp);
920 kmem_cache_destroy(cifs_req_cachep);
921 kmem_cache_destroy(cifs_sm_req_cachep);
922 return -ENOMEM;
923 }
924
925 return 0;
926}
927
928static void
929cifs_destroy_request_bufs(void)
930{
931 mempool_destroy(cifs_req_poolp);
1a1d92c1 932 kmem_cache_destroy(cifs_req_cachep);
1da177e4 933 mempool_destroy(cifs_sm_req_poolp);
1a1d92c1 934 kmem_cache_destroy(cifs_sm_req_cachep);
1da177e4
LT
935}
936
937static int
938cifs_init_mids(void)
939{
940 cifs_mid_cachep = kmem_cache_create("cifs_mpx_ids",
26f57364
SF
941 sizeof(struct mid_q_entry), 0,
942 SLAB_HWCACHE_ALIGN, NULL);
1da177e4
LT
943 if (cifs_mid_cachep == NULL)
944 return -ENOMEM;
945
93d2341c
MD
946 /* 3 is a reasonable minimum number of simultaneous operations */
947 cifs_mid_poolp = mempool_create_slab_pool(3, cifs_mid_cachep);
4523cc30 948 if (cifs_mid_poolp == NULL) {
1da177e4
LT
949 kmem_cache_destroy(cifs_mid_cachep);
950 return -ENOMEM;
951 }
952
953 cifs_oplock_cachep = kmem_cache_create("cifs_oplock_structs",
26f57364
SF
954 sizeof(struct oplock_q_entry), 0,
955 SLAB_HWCACHE_ALIGN, NULL);
1da177e4 956 if (cifs_oplock_cachep == NULL) {
1da177e4 957 mempool_destroy(cifs_mid_poolp);
e6985c7f 958 kmem_cache_destroy(cifs_mid_cachep);
1da177e4
LT
959 return -ENOMEM;
960 }
961
962 return 0;
963}
964
965static void
966cifs_destroy_mids(void)
967{
968 mempool_destroy(cifs_mid_poolp);
1a1d92c1
AD
969 kmem_cache_destroy(cifs_mid_cachep);
970 kmem_cache_destroy(cifs_oplock_cachep);
1da177e4
LT
971}
972
50c2f753 973static int cifs_oplock_thread(void *dummyarg)
1da177e4 974{
6dc0f87e 975 struct oplock_q_entry *oplock_item;
1da177e4 976 struct cifsTconInfo *pTcon;
6dc0f87e 977 struct inode *inode;
1da177e4 978 __u16 netfid;
cea21805 979 int rc, waitrc = 0;
1da177e4 980
83144186 981 set_freezable();
1da177e4 982 do {
6dc0f87e 983 if (try_to_freeze())
ede1327e 984 continue;
50c2f753 985
1da177e4 986 spin_lock(&GlobalMid_Lock);
4523cc30 987 if (list_empty(&GlobalOplock_Q)) {
1da177e4
LT
988 spin_unlock(&GlobalMid_Lock);
989 set_current_state(TASK_INTERRUPTIBLE);
990 schedule_timeout(39*HZ);
991 } else {
6dc0f87e 992 oplock_item = list_entry(GlobalOplock_Q.next,
ad8b15f0
SF
993 struct oplock_q_entry, qhead);
994 cFYI(1, ("found oplock item to write out"));
995 pTcon = oplock_item->tcon;
996 inode = oplock_item->pinode;
997 netfid = oplock_item->netfid;
998 spin_unlock(&GlobalMid_Lock);
999 DeleteOplockQEntry(oplock_item);
1000 /* can not grab inode sem here since it would
6dc0f87e 1001 deadlock when oplock received on delete
1b1dcc1b 1002 since vfs_unlink holds the i_mutex across
1da177e4 1003 the call */
ad8b15f0
SF
1004 /* mutex_lock(&inode->i_mutex);*/
1005 if (S_ISREG(inode->i_mode)) {
84210e91
SF
1006#ifdef CONFIG_CIFS_EXPERIMENTAL
1007 if (CIFS_I(inode)->clientCanCacheAll == 0)
1008 break_lease(inode, FMODE_READ);
1009 else if (CIFS_I(inode)->clientCanCacheRead == 0)
1010 break_lease(inode, FMODE_WRITE);
1011#endif
ad8b15f0
SF
1012 rc = filemap_fdatawrite(inode->i_mapping);
1013 if (CIFS_I(inode)->clientCanCacheRead == 0) {
1014 waitrc = filemap_fdatawait(
1015 inode->i_mapping);
1016 invalidate_remote_inode(inode);
1017 }
1018 if (rc == 0)
1019 rc = waitrc;
1020 } else
1021 rc = 0;
1022 /* mutex_unlock(&inode->i_mutex);*/
1023 if (rc)
1024 CIFS_I(inode)->write_behind_rc = rc;
1025 cFYI(1, ("Oplock flush inode %p rc %d",
1026 inode, rc));
6dc0f87e
SF
1027
1028 /* releasing stale oplock after recent reconnect
1029 of smb session using a now incorrect file
1030 handle is not a data integrity issue but do
1031 not bother sending an oplock release if session
1032 to server still is disconnected since oplock
1da177e4 1033 already released by the server in that case */
3b795210 1034 if (!pTcon->need_reconnect) {
ad8b15f0
SF
1035 rc = CIFSSMBLock(0, pTcon, netfid,
1036 0 /* len */ , 0 /* offset */, 0,
1037 0, LOCKING_ANDX_OPLOCK_RELEASE,
1038 false /* wait flag */);
1039 cFYI(1, ("Oplock release rc = %d", rc));
1040 }
68058e75
SF
1041 set_current_state(TASK_INTERRUPTIBLE);
1042 schedule_timeout(1); /* yield in case q were corrupt */
1da177e4 1043 }
45af7a0f
SF
1044 } while (!kthread_should_stop());
1045
1046 return 0;
1da177e4
LT
1047}
1048
1049static int __init
1050init_cifs(void)
1051{
1052 int rc = 0;
1da177e4 1053 cifs_proc_init();
e7ddee90 1054 INIT_LIST_HEAD(&cifs_tcp_ses_list);
1da177e4 1055 INIT_LIST_HEAD(&GlobalOplock_Q);
4ca9c190
SF
1056#ifdef CONFIG_CIFS_EXPERIMENTAL
1057 INIT_LIST_HEAD(&GlobalDnotifyReqList);
1058 INIT_LIST_HEAD(&GlobalDnotifyRsp_Q);
6dc0f87e 1059#endif
1da177e4
LT
1060/*
1061 * Initialize Global counters
1062 */
1063 atomic_set(&sesInfoAllocCount, 0);
1064 atomic_set(&tconInfoAllocCount, 0);
6dc0f87e 1065 atomic_set(&tcpSesAllocCount, 0);
1da177e4
LT
1066 atomic_set(&tcpSesReconnectCount, 0);
1067 atomic_set(&tconInfoReconnectCount, 0);
1068
1069 atomic_set(&bufAllocCount, 0);
4498eed5
SF
1070 atomic_set(&smBufAllocCount, 0);
1071#ifdef CONFIG_CIFS_STATS2
1072 atomic_set(&totBufAllocCount, 0);
1073 atomic_set(&totSmBufAllocCount, 0);
1074#endif /* CONFIG_CIFS_STATS2 */
1075
1da177e4
LT
1076 atomic_set(&midCount, 0);
1077 GlobalCurrentXid = 0;
1078 GlobalTotalActiveXid = 0;
1079 GlobalMaxActiveXid = 0;
2cd646a2 1080 memset(Local_System_Name, 0, 15);
1da177e4 1081 rwlock_init(&GlobalSMBSeslock);
e7ddee90 1082 rwlock_init(&cifs_tcp_ses_lock);
1da177e4
LT
1083 spin_lock_init(&GlobalMid_Lock);
1084
4523cc30 1085 if (cifs_max_pending < 2) {
1da177e4 1086 cifs_max_pending = 2;
6dc0f87e 1087 cFYI(1, ("cifs_max_pending set to min of 2"));
4523cc30 1088 } else if (cifs_max_pending > 256) {
1da177e4 1089 cifs_max_pending = 256;
6dc0f87e 1090 cFYI(1, ("cifs_max_pending set to max of 256"));
1da177e4
LT
1091 }
1092
1093 rc = cifs_init_inodecache();
45af7a0f
SF
1094 if (rc)
1095 goto out_clean_proc;
1096
1097 rc = cifs_init_mids();
1098 if (rc)
1099 goto out_destroy_inodecache;
1100
1101 rc = cifs_init_request_bufs();
1102 if (rc)
1103 goto out_destroy_mids;
1104
1105 rc = register_filesystem(&cifs_fs_type);
1106 if (rc)
1107 goto out_destroy_request_bufs;
84a15b93
JL
1108#ifdef CONFIG_CIFS_UPCALL
1109 rc = register_key_type(&cifs_spnego_key_type);
1110 if (rc)
1111 goto out_unregister_filesystem;
6103335d
SF
1112#endif
1113#ifdef CONFIG_CIFS_DFS_UPCALL
1114 rc = register_key_type(&key_type_dns_resolver);
1115 if (rc)
1116 goto out_unregister_key_type;
84a15b93 1117#endif
45af7a0f
SF
1118 oplockThread = kthread_run(cifs_oplock_thread, NULL, "cifsoplockd");
1119 if (IS_ERR(oplockThread)) {
1120 rc = PTR_ERR(oplockThread);
6dc0f87e 1121 cERROR(1, ("error %d create oplock thread", rc));
6103335d 1122 goto out_unregister_dfs_key_type;
1da177e4 1123 }
45af7a0f 1124
45af7a0f
SF
1125 return 0;
1126
6103335d
SF
1127 out_unregister_dfs_key_type:
1128#ifdef CONFIG_CIFS_DFS_UPCALL
1129 unregister_key_type(&key_type_dns_resolver);
84a15b93 1130 out_unregister_key_type:
6103335d 1131#endif
84a15b93
JL
1132#ifdef CONFIG_CIFS_UPCALL
1133 unregister_key_type(&cifs_spnego_key_type);
45af7a0f 1134 out_unregister_filesystem:
84a15b93 1135#endif
45af7a0f
SF
1136 unregister_filesystem(&cifs_fs_type);
1137 out_destroy_request_bufs:
1138 cifs_destroy_request_bufs();
1139 out_destroy_mids:
1140 cifs_destroy_mids();
1141 out_destroy_inodecache:
1142 cifs_destroy_inodecache();
1143 out_clean_proc:
1da177e4 1144 cifs_proc_clean();
1da177e4
LT
1145 return rc;
1146}
1147
1148static void __exit
1149exit_cifs(void)
1150{
90c81e0b 1151 cFYI(DBG2, ("exit_cifs"));
1da177e4 1152 cifs_proc_clean();
6103335d 1153#ifdef CONFIG_CIFS_DFS_UPCALL
78d31a3a 1154 cifs_dfs_release_automount_timer();
6103335d
SF
1155 unregister_key_type(&key_type_dns_resolver);
1156#endif
84a15b93
JL
1157#ifdef CONFIG_CIFS_UPCALL
1158 unregister_key_type(&cifs_spnego_key_type);
1da177e4
LT
1159#endif
1160 unregister_filesystem(&cifs_fs_type);
1161 cifs_destroy_inodecache();
1162 cifs_destroy_mids();
1163 cifs_destroy_request_bufs();
954d7a1c 1164 kthread_stop(oplockThread);
1da177e4
LT
1165}
1166
1167MODULE_AUTHOR("Steve French <sfrench@us.ibm.com>");
6dc0f87e 1168MODULE_LICENSE("GPL"); /* combination of LGPL + GPL source behaves as GPL */
1da177e4 1169MODULE_DESCRIPTION
63135e08
SF
1170 ("VFS to access servers complying with the SNIA CIFS Specification "
1171 "e.g. Samba and Windows");
1da177e4
LT
1172MODULE_VERSION(CIFS_VERSION);
1173module_init(init_cifs)
1174module_exit(exit_cifs)