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