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