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