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