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