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