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