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