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