~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/cifs/cifsfs.c

Version: ~ [ linux-5.11-rc3 ] ~ [ linux-5.10.7 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.89 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.167 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.215 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.251 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.251 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.85 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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/namei.h>
 39 #include <linux/random.h>
 40 #include <linux/uuid.h>
 41 #include <linux/xattr.h>
 42 #include <net/ipv6.h>
 43 #include "cifsfs.h"
 44 #include "cifspdu.h"
 45 #define DECLARE_GLOBALS_HERE
 46 #include "cifsglob.h"
 47 #include "cifsproto.h"
 48 #include "cifs_debug.h"
 49 #include "cifs_fs_sb.h"
 50 #include <linux/mm.h>
 51 #include <linux/key-type.h>
 52 #include "cifs_spnego.h"
 53 #include "fscache.h"
 54 #include "smb2pdu.h"
 55 
 56 int cifsFYI = 0;
 57 bool traceSMB;
 58 bool enable_oplocks = true;
 59 bool linuxExtEnabled = true;
 60 bool lookupCacheEnabled = true;
 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, uint, 0444);
 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, uint, 0444);
 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, uint, 0444);
 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, uint, 0444);
 79 MODULE_PARM_DESC(cifs_max_pending, "Simultaneous requests to server. "
 80                                    "Default: 32767 Range: 2 to 32767.");
 81 module_param(enable_oplocks, bool, 0644);
 82 MODULE_PARM_DESC(enable_oplocks, "Enable or disable oplocks. Default: y/Y/1");
 83 
 84 extern mempool_t *cifs_sm_req_poolp;
 85 extern mempool_t *cifs_req_poolp;
 86 extern mempool_t *cifs_mid_poolp;
 87 
 88 struct workqueue_struct *cifsiod_wq;
 89 struct workqueue_struct *cifsoplockd_wq;
 90 __u32 cifs_lock_secret;
 91 
 92 /*
 93  * Bumps refcount for cifs super block.
 94  * Note that it should be only called if a referece to VFS super block is
 95  * already held, e.g. in open-type syscalls context. Otherwise it can race with
 96  * atomic_dec_and_test in deactivate_locked_super.
 97  */
 98 void
 99 cifs_sb_active(struct super_block *sb)
100 {
101         struct cifs_sb_info *server = CIFS_SB(sb);
102 
103         if (atomic_inc_return(&server->active) == 1)
104                 atomic_inc(&sb->s_active);
105 }
106 
107 void
108 cifs_sb_deactive(struct super_block *sb)
109 {
110         struct cifs_sb_info *server = CIFS_SB(sb);
111 
112         if (atomic_dec_and_test(&server->active))
113                 deactivate_super(sb);
114 }
115 
116 static int
117 cifs_read_super(struct super_block *sb)
118 {
119         struct inode *inode;
120         struct cifs_sb_info *cifs_sb;
121         struct cifs_tcon *tcon;
122         int rc = 0;
123 
124         cifs_sb = CIFS_SB(sb);
125         tcon = cifs_sb_master_tcon(cifs_sb);
126 
127         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIXACL)
128                 sb->s_flags |= SB_POSIXACL;
129 
130         if (tcon->ses->capabilities & tcon->ses->server->vals->cap_large_files)
131                 sb->s_maxbytes = MAX_LFS_FILESIZE;
132         else
133                 sb->s_maxbytes = MAX_NON_LFS;
134 
135         /* BB FIXME fix time_gran to be larger for LANMAN sessions */
136         sb->s_time_gran = 100;
137 
138         sb->s_magic = CIFS_MAGIC_NUMBER;
139         sb->s_op = &cifs_super_ops;
140         sb->s_xattr = cifs_xattr_handlers;
141         rc = super_setup_bdi(sb);
142         if (rc)
143                 goto out_no_root;
144         /* tune readahead according to rsize */
145         sb->s_bdi->ra_pages = cifs_sb->rsize / PAGE_SIZE;
146 
147         sb->s_blocksize = CIFS_MAX_MSGSIZE;
148         sb->s_blocksize_bits = 14;      /* default 2**14 = CIFS_MAX_MSGSIZE */
149         inode = cifs_root_iget(sb);
150 
151         if (IS_ERR(inode)) {
152                 rc = PTR_ERR(inode);
153                 goto out_no_root;
154         }
155 
156         if (tcon->nocase)
157                 sb->s_d_op = &cifs_ci_dentry_ops;
158         else
159                 sb->s_d_op = &cifs_dentry_ops;
160 
161         sb->s_root = d_make_root(inode);
162         if (!sb->s_root) {
163                 rc = -ENOMEM;
164                 goto out_no_root;
165         }
166 
167 #ifdef CONFIG_CIFS_NFSD_EXPORT
168         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
169                 cifs_dbg(FYI, "export ops supported\n");
170                 sb->s_export_op = &cifs_export_ops;
171         }
172 #endif /* CONFIG_CIFS_NFSD_EXPORT */
173 
174         return 0;
175 
176 out_no_root:
177         cifs_dbg(VFS, "%s: get root inode failed\n", __func__);
178         return rc;
179 }
180 
181 static void cifs_kill_sb(struct super_block *sb)
182 {
183         struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
184         kill_anon_super(sb);
185         cifs_umount(cifs_sb);
186 }
187 
188 static int
189 cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
190 {
191         struct super_block *sb = dentry->d_sb;
192         struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
193         struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
194         struct TCP_Server_Info *server = tcon->ses->server;
195         unsigned int xid;
196         int rc = 0;
197 
198         xid = get_xid();
199 
200         /*
201          * PATH_MAX may be too long - it would presumably be total path,
202          * but note that some servers (includinng Samba 3) have a shorter
203          * maximum path.
204          *
205          * Instead could get the real value via SMB_QUERY_FS_ATTRIBUTE_INFO.
206          */
207         buf->f_namelen = PATH_MAX;
208         buf->f_files = 0;       /* undefined */
209         buf->f_ffree = 0;       /* unlimited */
210 
211         if (server->ops->queryfs)
212                 rc = server->ops->queryfs(xid, tcon, buf);
213 
214         free_xid(xid);
215         return 0;
216 }
217 
218 static long cifs_fallocate(struct file *file, int mode, loff_t off, loff_t len)
219 {
220         struct cifs_sb_info *cifs_sb = CIFS_FILE_SB(file);
221         struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
222         struct TCP_Server_Info *server = tcon->ses->server;
223 
224         if (server->ops->fallocate)
225                 return server->ops->fallocate(file, tcon, mode, off, len);
226 
227         return -EOPNOTSUPP;
228 }
229 
230 static int cifs_permission(struct inode *inode, int mask)
231 {
232         struct cifs_sb_info *cifs_sb;
233 
234         cifs_sb = CIFS_SB(inode->i_sb);
235 
236         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM) {
237                 if ((mask & MAY_EXEC) && !execute_ok(inode))
238                         return -EACCES;
239                 else
240                         return 0;
241         } else /* file mode might have been restricted at mount time
242                 on the client (above and beyond ACL on servers) for
243                 servers which do not support setting and viewing mode bits,
244                 so allowing client to check permissions is useful */
245                 return generic_permission(inode, mask);
246 }
247 
248 static struct kmem_cache *cifs_inode_cachep;
249 static struct kmem_cache *cifs_req_cachep;
250 static struct kmem_cache *cifs_mid_cachep;
251 static struct kmem_cache *cifs_sm_req_cachep;
252 mempool_t *cifs_sm_req_poolp;
253 mempool_t *cifs_req_poolp;
254 mempool_t *cifs_mid_poolp;
255 
256 static struct inode *
257 cifs_alloc_inode(struct super_block *sb)
258 {
259         struct cifsInodeInfo *cifs_inode;
260         cifs_inode = kmem_cache_alloc(cifs_inode_cachep, GFP_KERNEL);
261         if (!cifs_inode)
262                 return NULL;
263         cifs_inode->cifsAttrs = 0x20;   /* default */
264         cifs_inode->time = 0;
265         /*
266          * Until the file is open and we have gotten oplock info back from the
267          * server, can not assume caching of file data or metadata.
268          */
269         cifs_set_oplock_level(cifs_inode, 0);
270         cifs_inode->flags = 0;
271         spin_lock_init(&cifs_inode->writers_lock);
272         cifs_inode->writers = 0;
273         cifs_inode->vfs_inode.i_blkbits = 14;  /* 2**14 = CIFS_MAX_MSGSIZE */
274         cifs_inode->server_eof = 0;
275         cifs_inode->uniqueid = 0;
276         cifs_inode->createtime = 0;
277         cifs_inode->epoch = 0;
278         generate_random_uuid(cifs_inode->lease_key);
279 
280         /*
281          * Can not set i_flags here - they get immediately overwritten to zero
282          * by the VFS.
283          */
284         /* cifs_inode->vfs_inode.i_flags = S_NOATIME | S_NOCMTIME; */
285         INIT_LIST_HEAD(&cifs_inode->openFileList);
286         INIT_LIST_HEAD(&cifs_inode->llist);
287         return &cifs_inode->vfs_inode;
288 }
289 
290 static void cifs_i_callback(struct rcu_head *head)
291 {
292         struct inode *inode = container_of(head, struct inode, i_rcu);
293         kmem_cache_free(cifs_inode_cachep, CIFS_I(inode));
294 }
295 
296 static void
297 cifs_destroy_inode(struct inode *inode)
298 {
299         call_rcu(&inode->i_rcu, cifs_i_callback);
300 }
301 
302 static void
303 cifs_evict_inode(struct inode *inode)
304 {
305         truncate_inode_pages_final(&inode->i_data);
306         clear_inode(inode);
307         cifs_fscache_release_inode_cookie(inode);
308 }
309 
310 static void
311 cifs_show_address(struct seq_file *s, struct TCP_Server_Info *server)
312 {
313         struct sockaddr_in *sa = (struct sockaddr_in *) &server->dstaddr;
314         struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *) &server->dstaddr;
315 
316         seq_puts(s, ",addr=");
317 
318         switch (server->dstaddr.ss_family) {
319         case AF_INET:
320                 seq_printf(s, "%pI4", &sa->sin_addr.s_addr);
321                 break;
322         case AF_INET6:
323                 seq_printf(s, "%pI6", &sa6->sin6_addr.s6_addr);
324                 if (sa6->sin6_scope_id)
325                         seq_printf(s, "%%%u", sa6->sin6_scope_id);
326                 break;
327         default:
328                 seq_puts(s, "(unknown)");
329         }
330         if (server->rdma)
331                 seq_puts(s, ",rdma");
332 }
333 
334 static void
335 cifs_show_security(struct seq_file *s, struct cifs_ses *ses)
336 {
337         if (ses->sectype == Unspecified) {
338                 if (ses->user_name == NULL)
339                         seq_puts(s, ",sec=none");
340                 return;
341         }
342 
343         seq_puts(s, ",sec=");
344 
345         switch (ses->sectype) {
346         case LANMAN:
347                 seq_puts(s, "lanman");
348                 break;
349         case NTLMv2:
350                 seq_puts(s, "ntlmv2");
351                 break;
352         case NTLM:
353                 seq_puts(s, "ntlm");
354                 break;
355         case Kerberos:
356                 seq_puts(s, "krb5");
357                 break;
358         case RawNTLMSSP:
359                 seq_puts(s, "ntlmssp");
360                 break;
361         default:
362                 /* shouldn't ever happen */
363                 seq_puts(s, "unknown");
364                 break;
365         }
366 
367         if (ses->sign)
368                 seq_puts(s, "i");
369 }
370 
371 static void
372 cifs_show_cache_flavor(struct seq_file *s, struct cifs_sb_info *cifs_sb)
373 {
374         seq_puts(s, ",cache=");
375 
376         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO)
377                 seq_puts(s, "strict");
378         else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO)
379                 seq_puts(s, "none");
380         else
381                 seq_puts(s, "loose");
382 }
383 
384 static void
385 cifs_show_nls(struct seq_file *s, struct nls_table *cur)
386 {
387         struct nls_table *def;
388 
389         /* Display iocharset= option if it's not default charset */
390         def = load_nls_default();
391         if (def != cur)
392                 seq_printf(s, ",iocharset=%s", cur->charset);
393         unload_nls(def);
394 }
395 
396 /*
397  * cifs_show_options() is for displaying mount options in /proc/mounts.
398  * Not all settable options are displayed but most of the important
399  * ones are.
400  */
401 static int
402 cifs_show_options(struct seq_file *s, struct dentry *root)
403 {
404         struct cifs_sb_info *cifs_sb = CIFS_SB(root->d_sb);
405         struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
406         struct sockaddr *srcaddr;
407         srcaddr = (struct sockaddr *)&tcon->ses->server->srcaddr;
408 
409         seq_show_option(s, "vers", tcon->ses->server->vals->version_string);
410         cifs_show_security(s, tcon->ses);
411         cifs_show_cache_flavor(s, cifs_sb);
412 
413         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER)
414                 seq_puts(s, ",multiuser");
415         else if (tcon->ses->user_name)
416                 seq_show_option(s, "username", tcon->ses->user_name);
417 
418         if (tcon->ses->domainName)
419                 seq_show_option(s, "domain", tcon->ses->domainName);
420 
421         if (srcaddr->sa_family != AF_UNSPEC) {
422                 struct sockaddr_in *saddr4;
423                 struct sockaddr_in6 *saddr6;
424                 saddr4 = (struct sockaddr_in *)srcaddr;
425                 saddr6 = (struct sockaddr_in6 *)srcaddr;
426                 if (srcaddr->sa_family == AF_INET6)
427                         seq_printf(s, ",srcaddr=%pI6c",
428                                    &saddr6->sin6_addr);
429                 else if (srcaddr->sa_family == AF_INET)
430                         seq_printf(s, ",srcaddr=%pI4",
431                                    &saddr4->sin_addr.s_addr);
432                 else
433                         seq_printf(s, ",srcaddr=BAD-AF:%i",
434                                    (int)(srcaddr->sa_family));
435         }
436 
437         seq_printf(s, ",uid=%u",
438                    from_kuid_munged(&init_user_ns, cifs_sb->mnt_uid));
439         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)
440                 seq_puts(s, ",forceuid");
441         else
442                 seq_puts(s, ",noforceuid");
443 
444         seq_printf(s, ",gid=%u",
445                    from_kgid_munged(&init_user_ns, cifs_sb->mnt_gid));
446         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)
447                 seq_puts(s, ",forcegid");
448         else
449                 seq_puts(s, ",noforcegid");
450 
451         cifs_show_address(s, tcon->ses->server);
452 
453         if (!tcon->unix_ext)
454                 seq_printf(s, ",file_mode=0%ho,dir_mode=0%ho",
455                                            cifs_sb->mnt_file_mode,
456                                            cifs_sb->mnt_dir_mode);
457 
458         cifs_show_nls(s, cifs_sb->local_nls);
459 
460         if (tcon->seal)
461                 seq_puts(s, ",seal");
462         if (tcon->nocase)
463                 seq_puts(s, ",nocase");
464         if (tcon->retry)
465                 seq_puts(s, ",hard");
466         else
467                 seq_puts(s, ",soft");
468         if (tcon->use_persistent)
469                 seq_puts(s, ",persistenthandles");
470         else if (tcon->use_resilient)
471                 seq_puts(s, ",resilienthandles");
472         if (tcon->unix_ext)
473                 seq_puts(s, ",unix");
474         else
475                 seq_puts(s, ",nounix");
476         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS)
477                 seq_puts(s, ",posixpaths");
478         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID)
479                 seq_puts(s, ",setuids");
480         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UID_FROM_ACL)
481                 seq_puts(s, ",idsfromsid");
482         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
483                 seq_puts(s, ",serverino");
484         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD)
485                 seq_puts(s, ",rwpidforward");
486         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL)
487                 seq_puts(s, ",forcemand");
488         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR)
489                 seq_puts(s, ",nouser_xattr");
490         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR)
491                 seq_puts(s, ",mapchars");
492         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SFM_CHR)
493                 seq_puts(s, ",mapposix");
494         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
495                 seq_puts(s, ",sfu");
496         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
497                 seq_puts(s, ",nobrl");
498         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL)
499                 seq_puts(s, ",cifsacl");
500         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
501                 seq_puts(s, ",dynperm");
502         if (root->d_sb->s_flags & SB_POSIXACL)
503                 seq_puts(s, ",acl");
504         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS)
505                 seq_puts(s, ",mfsymlinks");
506         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_FSCACHE)
507                 seq_puts(s, ",fsc");
508         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)
509                 seq_puts(s, ",nostrictsync");
510         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
511                 seq_puts(s, ",noperm");
512         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_BACKUPUID)
513                 seq_printf(s, ",backupuid=%u",
514                            from_kuid_munged(&init_user_ns,
515                                             cifs_sb->mnt_backupuid));
516         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_BACKUPGID)
517                 seq_printf(s, ",backupgid=%u",
518                            from_kgid_munged(&init_user_ns,
519                                             cifs_sb->mnt_backupgid));
520 
521         seq_printf(s, ",rsize=%u", cifs_sb->rsize);
522         seq_printf(s, ",wsize=%u", cifs_sb->wsize);
523         seq_printf(s, ",echo_interval=%lu",
524                         tcon->ses->server->echo_interval / HZ);
525         /* convert actimeo and display it in seconds */
526         seq_printf(s, ",actimeo=%lu", cifs_sb->actimeo / HZ);
527 
528         return 0;
529 }
530 
531 static void cifs_umount_begin(struct super_block *sb)
532 {
533         struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
534         struct cifs_tcon *tcon;
535 
536         if (cifs_sb == NULL)
537                 return;
538 
539         tcon = cifs_sb_master_tcon(cifs_sb);
540 
541         spin_lock(&cifs_tcp_ses_lock);
542         if ((tcon->tc_count > 1) || (tcon->tidStatus == CifsExiting)) {
543                 /* we have other mounts to same share or we have
544                    already tried to force umount this and woken up
545                    all waiting network requests, nothing to do */
546                 spin_unlock(&cifs_tcp_ses_lock);
547                 return;
548         } else if (tcon->tc_count == 1)
549                 tcon->tidStatus = CifsExiting;
550         spin_unlock(&cifs_tcp_ses_lock);
551 
552         /* cancel_brl_requests(tcon); */ /* BB mark all brl mids as exiting */
553         /* cancel_notify_requests(tcon); */
554         if (tcon->ses && tcon->ses->server) {
555                 cifs_dbg(FYI, "wake up tasks now - umount begin not complete\n");
556                 wake_up_all(&tcon->ses->server->request_q);
557                 wake_up_all(&tcon->ses->server->response_q);
558                 msleep(1); /* yield */
559                 /* we have to kick the requests once more */
560                 wake_up_all(&tcon->ses->server->response_q);
561                 msleep(1);
562         }
563 
564         return;
565 }
566 
567 #ifdef CONFIG_CIFS_STATS2
568 static int cifs_show_stats(struct seq_file *s, struct dentry *root)
569 {
570         /* BB FIXME */
571         return 0;
572 }
573 #endif
574 
575 static int cifs_remount(struct super_block *sb, int *flags, char *data)
576 {
577         sync_filesystem(sb);
578         *flags |= SB_NODIRATIME;
579         return 0;
580 }
581 
582 static int cifs_drop_inode(struct inode *inode)
583 {
584         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
585 
586         /* no serverino => unconditional eviction */
587         return !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) ||
588                 generic_drop_inode(inode);
589 }
590 
591 static const struct super_operations cifs_super_ops = {
592         .statfs = cifs_statfs,
593         .alloc_inode = cifs_alloc_inode,
594         .destroy_inode = cifs_destroy_inode,
595         .drop_inode     = cifs_drop_inode,
596         .evict_inode    = cifs_evict_inode,
597 /*      .delete_inode   = cifs_delete_inode,  */  /* Do not need above
598         function unless later we add lazy close of inodes or unless the
599         kernel forgets to call us with the same number of releases (closes)
600         as opens */
601         .show_options = cifs_show_options,
602         .umount_begin   = cifs_umount_begin,
603         .remount_fs = cifs_remount,
604 #ifdef CONFIG_CIFS_STATS2
605         .show_stats = cifs_show_stats,
606 #endif
607 };
608 
609 /*
610  * Get root dentry from superblock according to prefix path mount option.
611  * Return dentry with refcount + 1 on success and NULL otherwise.
612  */
613 static struct dentry *
614 cifs_get_root(struct smb_vol *vol, struct super_block *sb)
615 {
616         struct dentry *dentry;
617         struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
618         char *full_path = NULL;
619         char *s, *p;
620         char sep;
621 
622         if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH)
623                 return dget(sb->s_root);
624 
625         full_path = cifs_build_path_to_root(vol, cifs_sb,
626                                 cifs_sb_master_tcon(cifs_sb), 0);
627         if (full_path == NULL)
628                 return ERR_PTR(-ENOMEM);
629 
630         cifs_dbg(FYI, "Get root dentry for %s\n", full_path);
631 
632         sep = CIFS_DIR_SEP(cifs_sb);
633         dentry = dget(sb->s_root);
634         p = s = full_path;
635 
636         do {
637                 struct inode *dir = d_inode(dentry);
638                 struct dentry *child;
639 
640                 if (!dir) {
641                         dput(dentry);
642                         dentry = ERR_PTR(-ENOENT);
643                         break;
644                 }
645                 if (!S_ISDIR(dir->i_mode)) {
646                         dput(dentry);
647                         dentry = ERR_PTR(-ENOTDIR);
648                         break;
649                 }
650 
651                 /* skip separators */
652                 while (*s == sep)
653                         s++;
654                 if (!*s)
655                         break;
656                 p = s++;
657                 /* next separator */
658                 while (*s && *s != sep)
659                         s++;
660 
661                 child = lookup_one_len_unlocked(p, dentry, s - p);
662                 dput(dentry);
663                 dentry = child;
664         } while (!IS_ERR(dentry));
665         kfree(full_path);
666         return dentry;
667 }
668 
669 static int cifs_set_super(struct super_block *sb, void *data)
670 {
671         struct cifs_mnt_data *mnt_data = data;
672         sb->s_fs_info = mnt_data->cifs_sb;
673         return set_anon_super(sb, NULL);
674 }
675 
676 static struct dentry *
677 cifs_do_mount(struct file_system_type *fs_type,
678               int flags, const char *dev_name, void *data)
679 {
680         int rc;
681         struct super_block *sb;
682         struct cifs_sb_info *cifs_sb;
683         struct smb_vol *volume_info;
684         struct cifs_mnt_data mnt_data;
685         struct dentry *root;
686 
687         cifs_dbg(FYI, "Devname: %s flags: %d\n", dev_name, flags);
688 
689         volume_info = cifs_get_volume_info((char *)data, dev_name);
690         if (IS_ERR(volume_info))
691                 return ERR_CAST(volume_info);
692 
693         cifs_sb = kzalloc(sizeof(struct cifs_sb_info), GFP_KERNEL);
694         if (cifs_sb == NULL) {
695                 root = ERR_PTR(-ENOMEM);
696                 goto out_nls;
697         }
698 
699         cifs_sb->mountdata = kstrndup(data, PAGE_SIZE, GFP_KERNEL);
700         if (cifs_sb->mountdata == NULL) {
701                 root = ERR_PTR(-ENOMEM);
702                 goto out_free;
703         }
704 
705         rc = cifs_setup_cifs_sb(volume_info, cifs_sb);
706         if (rc) {
707                 root = ERR_PTR(rc);
708                 goto out_free;
709         }
710 
711         rc = cifs_mount(cifs_sb, volume_info);
712         if (rc) {
713                 if (!(flags & SB_SILENT))
714                         cifs_dbg(VFS, "cifs_mount failed w/return code = %d\n",
715                                  rc);
716                 root = ERR_PTR(rc);
717                 goto out_free;
718         }
719 
720         mnt_data.vol = volume_info;
721         mnt_data.cifs_sb = cifs_sb;
722         mnt_data.flags = flags;
723 
724         /* BB should we make this contingent on mount parm? */
725         flags |= SB_NODIRATIME | SB_NOATIME;
726 
727         sb = sget(fs_type, cifs_match_super, cifs_set_super, flags, &mnt_data);
728         if (IS_ERR(sb)) {
729                 root = ERR_CAST(sb);
730                 cifs_umount(cifs_sb);
731                 goto out;
732         }
733 
734         if (sb->s_root) {
735                 cifs_dbg(FYI, "Use existing superblock\n");
736                 cifs_umount(cifs_sb);
737         } else {
738                 rc = cifs_read_super(sb);
739                 if (rc) {
740                         root = ERR_PTR(rc);
741                         goto out_super;
742                 }
743 
744                 sb->s_flags |= SB_ACTIVE;
745         }
746 
747         root = cifs_get_root(volume_info, sb);
748         if (IS_ERR(root))
749                 goto out_super;
750 
751         cifs_dbg(FYI, "dentry root is: %p\n", root);
752         goto out;
753 
754 out_super:
755         deactivate_locked_super(sb);
756 out:
757         cifs_cleanup_volume_info(volume_info);
758         return root;
759 
760 out_free:
761         kfree(cifs_sb->prepath);
762         kfree(cifs_sb->mountdata);
763         kfree(cifs_sb);
764 out_nls:
765         unload_nls(volume_info->local_nls);
766         goto out;
767 }
768 
769 static ssize_t
770 cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter)
771 {
772         ssize_t rc;
773         struct inode *inode = file_inode(iocb->ki_filp);
774 
775         if (iocb->ki_filp->f_flags & O_DIRECT)
776                 return cifs_user_readv(iocb, iter);
777 
778         rc = cifs_revalidate_mapping(inode);
779         if (rc)
780                 return rc;
781 
782         return generic_file_read_iter(iocb, iter);
783 }
784 
785 static ssize_t cifs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
786 {
787         struct inode *inode = file_inode(iocb->ki_filp);
788         struct cifsInodeInfo *cinode = CIFS_I(inode);
789         ssize_t written;
790         int rc;
791 
792         if (iocb->ki_filp->f_flags & O_DIRECT) {
793                 written = cifs_user_writev(iocb, from);
794                 if (written > 0 && CIFS_CACHE_READ(cinode)) {
795                         cifs_zap_mapping(inode);
796                         cifs_dbg(FYI,
797                                  "Set no oplock for inode=%p after a write operation\n",
798                                  inode);
799                         cinode->oplock = 0;
800                 }
801                 return written;
802         }
803 
804         written = cifs_get_writer(cinode);
805         if (written)
806                 return written;
807 
808         written = generic_file_write_iter(iocb, from);
809 
810         if (CIFS_CACHE_WRITE(CIFS_I(inode)))
811                 goto out;
812 
813         rc = filemap_fdatawrite(inode->i_mapping);
814         if (rc)
815                 cifs_dbg(FYI, "cifs_file_write_iter: %d rc on %p inode\n",
816                          rc, inode);
817 
818 out:
819         cifs_put_writer(cinode);
820         return written;
821 }
822 
823 static loff_t cifs_llseek(struct file *file, loff_t offset, int whence)
824 {
825         /*
826          * whence == SEEK_END || SEEK_DATA || SEEK_HOLE => we must revalidate
827          * the cached file length
828          */
829         if (whence != SEEK_SET && whence != SEEK_CUR) {
830                 int rc;
831                 struct inode *inode = file_inode(file);
832 
833                 /*
834                  * We need to be sure that all dirty pages are written and the
835                  * server has the newest file length.
836                  */
837                 if (!CIFS_CACHE_READ(CIFS_I(inode)) && inode->i_mapping &&
838                     inode->i_mapping->nrpages != 0) {
839                         rc = filemap_fdatawait(inode->i_mapping);
840                         if (rc) {
841                                 mapping_set_error(inode->i_mapping, rc);
842                                 return rc;
843                         }
844                 }
845                 /*
846                  * Some applications poll for the file length in this strange
847                  * way so we must seek to end on non-oplocked files by
848                  * setting the revalidate time to zero.
849                  */
850                 CIFS_I(inode)->time = 0;
851 
852                 rc = cifs_revalidate_file_attr(file);
853                 if (rc < 0)
854                         return (loff_t)rc;
855         }
856         return generic_file_llseek(file, offset, whence);
857 }
858 
859 static int
860 cifs_setlease(struct file *file, long arg, struct file_lock **lease, void **priv)
861 {
862         /*
863          * Note that this is called by vfs setlease with i_lock held to
864          * protect *lease from going away.
865          */
866         struct inode *inode = file_inode(file);
867         struct cifsFileInfo *cfile = file->private_data;
868 
869         if (!(S_ISREG(inode->i_mode)))
870                 return -EINVAL;
871 
872         /* Check if file is oplocked if this is request for new lease */
873         if (arg == F_UNLCK ||
874             ((arg == F_RDLCK) && CIFS_CACHE_READ(CIFS_I(inode))) ||
875             ((arg == F_WRLCK) && CIFS_CACHE_WRITE(CIFS_I(inode))))
876                 return generic_setlease(file, arg, lease, priv);
877         else if (tlink_tcon(cfile->tlink)->local_lease &&
878                  !CIFS_CACHE_READ(CIFS_I(inode)))
879                 /*
880                  * If the server claims to support oplock on this file, then we
881                  * still need to check oplock even if the local_lease mount
882                  * option is set, but there are servers which do not support
883                  * oplock for which this mount option may be useful if the user
884                  * knows that the file won't be changed on the server by anyone
885                  * else.
886                  */
887                 return generic_setlease(file, arg, lease, priv);
888         else
889                 return -EAGAIN;
890 }
891 
892 struct file_system_type cifs_fs_type = {
893         .owner = THIS_MODULE,
894         .name = "cifs",
895         .mount = cifs_do_mount,
896         .kill_sb = cifs_kill_sb,
897         /*  .fs_flags */
898 };
899 MODULE_ALIAS_FS("cifs");
900 const struct inode_operations cifs_dir_inode_ops = {
901         .create = cifs_create,
902         .atomic_open = cifs_atomic_open,
903         .lookup = cifs_lookup,
904         .getattr = cifs_getattr,
905         .unlink = cifs_unlink,
906         .link = cifs_hardlink,
907         .mkdir = cifs_mkdir,
908         .rmdir = cifs_rmdir,
909         .rename = cifs_rename2,
910         .permission = cifs_permission,
911         .setattr = cifs_setattr,
912         .symlink = cifs_symlink,
913         .mknod   = cifs_mknod,
914         .listxattr = cifs_listxattr,
915 };
916 
917 const struct inode_operations cifs_file_inode_ops = {
918         .setattr = cifs_setattr,
919         .getattr = cifs_getattr,
920         .permission = cifs_permission,
921         .listxattr = cifs_listxattr,
922 };
923 
924 const struct inode_operations cifs_symlink_inode_ops = {
925         .get_link = cifs_get_link,
926         .permission = cifs_permission,
927         .listxattr = cifs_listxattr,
928 };
929 
930 static int cifs_clone_file_range(struct file *src_file, loff_t off,
931                 struct file *dst_file, loff_t destoff, u64 len)
932 {
933         struct inode *src_inode = file_inode(src_file);
934         struct inode *target_inode = file_inode(dst_file);
935         struct cifsFileInfo *smb_file_src = src_file->private_data;
936         struct cifsFileInfo *smb_file_target = dst_file->private_data;
937         struct cifs_tcon *target_tcon = tlink_tcon(smb_file_target->tlink);
938         unsigned int xid;
939         int rc;
940 
941         cifs_dbg(FYI, "clone range\n");
942 
943         xid = get_xid();
944 
945         if (!src_file->private_data || !dst_file->private_data) {
946                 rc = -EBADF;
947                 cifs_dbg(VFS, "missing cifsFileInfo on copy range src file\n");
948                 goto out;
949         }
950 
951         /*
952          * Note: cifs case is easier than btrfs since server responsible for
953          * checks for proper open modes and file type and if it wants
954          * server could even support copy of range where source = target
955          */
956         lock_two_nondirectories(target_inode, src_inode);
957 
958         if (len == 0)
959                 len = src_inode->i_size - off;
960 
961         cifs_dbg(FYI, "about to flush pages\n");
962         /* should we flush first and last page first */
963         truncate_inode_pages_range(&target_inode->i_data, destoff,
964                                    PAGE_ALIGN(destoff + len)-1);
965 
966         if (target_tcon->ses->server->ops->duplicate_extents)
967                 rc = target_tcon->ses->server->ops->duplicate_extents(xid,
968                         smb_file_src, smb_file_target, off, len, destoff);
969         else
970                 rc = -EOPNOTSUPP;
971 
972         /* force revalidate of size and timestamps of target file now
973            that target is updated on the server */
974         CIFS_I(target_inode)->time = 0;
975         /* although unlocking in the reverse order from locking is not
976            strictly necessary here it is a little cleaner to be consistent */
977         unlock_two_nondirectories(src_inode, target_inode);
978 out:
979         free_xid(xid);
980         return rc;
981 }
982 
983 ssize_t cifs_file_copychunk_range(unsigned int xid,
984                                 struct file *src_file, loff_t off,
985                                 struct file *dst_file, loff_t destoff,
986                                 size_t len, unsigned int flags)
987 {
988         struct inode *src_inode = file_inode(src_file);
989         struct inode *target_inode = file_inode(dst_file);
990         struct cifsFileInfo *smb_file_src;
991         struct cifsFileInfo *smb_file_target;
992         struct cifs_tcon *src_tcon;
993         struct cifs_tcon *target_tcon;
994         ssize_t rc;
995 
996         cifs_dbg(FYI, "copychunk range\n");
997 
998         if (src_inode == target_inode) {
999                 rc = -EINVAL;
1000                 goto out;
1001         }
1002 
1003         if (!src_file->private_data || !dst_file->private_data) {
1004                 rc = -EBADF;
1005                 cifs_dbg(VFS, "missing cifsFileInfo on copy range src file\n");
1006                 goto out;
1007         }
1008 
1009         rc = -EXDEV;
1010         smb_file_target = dst_file->private_data;
1011         smb_file_src = src_file->private_data;
1012         src_tcon = tlink_tcon(smb_file_src->tlink);
1013         target_tcon = tlink_tcon(smb_file_target->tlink);
1014 
1015         if (src_tcon->ses != target_tcon->ses) {
1016                 cifs_dbg(VFS, "source and target of copy not on same server\n");
1017                 goto out;
1018         }
1019 
1020         /*
1021          * Note: cifs case is easier than btrfs since server responsible for
1022          * checks for proper open modes and file type and if it wants
1023          * server could even support copy of range where source = target
1024          */
1025         lock_two_nondirectories(target_inode, src_inode);
1026 
1027         cifs_dbg(FYI, "about to flush pages\n");
1028         /* should we flush first and last page first */
1029         truncate_inode_pages(&target_inode->i_data, 0);
1030 
1031         if (target_tcon->ses->server->ops->copychunk_range)
1032                 rc = target_tcon->ses->server->ops->copychunk_range(xid,
1033                         smb_file_src, smb_file_target, off, len, destoff);
1034         else
1035                 rc = -EOPNOTSUPP;
1036 
1037         /* force revalidate of size and timestamps of target file now
1038          * that target is updated on the server
1039          */
1040         CIFS_I(target_inode)->time = 0;
1041         /* although unlocking in the reverse order from locking is not
1042          * strictly necessary here it is a little cleaner to be consistent
1043          */
1044         unlock_two_nondirectories(src_inode, target_inode);
1045 
1046 out:
1047         return rc;
1048 }
1049 
1050 /*
1051  * Directory operations under CIFS/SMB2/SMB3 are synchronous, so fsync()
1052  * is a dummy operation.
1053  */
1054 static int cifs_dir_fsync(struct file *file, loff_t start, loff_t end, int datasync)
1055 {
1056         cifs_dbg(FYI, "Sync directory - name: %pD datasync: 0x%x\n",
1057                  file, datasync);
1058 
1059         return 0;
1060 }
1061 
1062 static ssize_t cifs_copy_file_range(struct file *src_file, loff_t off,
1063                                 struct file *dst_file, loff_t destoff,
1064                                 size_t len, unsigned int flags)
1065 {
1066         unsigned int xid = get_xid();
1067         ssize_t rc;
1068 
1069         rc = cifs_file_copychunk_range(xid, src_file, off, dst_file, destoff,
1070                                         len, flags);
1071         free_xid(xid);
1072         return rc;
1073 }
1074 
1075 const struct file_operations cifs_file_ops = {
1076         .read_iter = cifs_loose_read_iter,
1077         .write_iter = cifs_file_write_iter,
1078         .open = cifs_open,
1079         .release = cifs_close,
1080         .lock = cifs_lock,
1081         .fsync = cifs_fsync,
1082         .flush = cifs_flush,
1083         .mmap  = cifs_file_mmap,
1084         .splice_read = generic_file_splice_read,
1085         .splice_write = iter_file_splice_write,
1086         .llseek = cifs_llseek,
1087         .unlocked_ioctl = cifs_ioctl,
1088         .copy_file_range = cifs_copy_file_range,
1089         .clone_file_range = cifs_clone_file_range,
1090         .setlease = cifs_setlease,
1091         .fallocate = cifs_fallocate,
1092 };
1093 
1094 const struct file_operations cifs_file_strict_ops = {
1095         .read_iter = cifs_strict_readv,
1096         .write_iter = cifs_strict_writev,
1097         .open = cifs_open,
1098         .release = cifs_close,
1099         .lock = cifs_lock,
1100         .fsync = cifs_strict_fsync,
1101         .flush = cifs_flush,
1102         .mmap = cifs_file_strict_mmap,
1103         .splice_read = generic_file_splice_read,
1104         .splice_write = iter_file_splice_write,
1105         .llseek = cifs_llseek,
1106         .unlocked_ioctl = cifs_ioctl,
1107         .copy_file_range = cifs_copy_file_range,
1108         .clone_file_range = cifs_clone_file_range,
1109         .setlease = cifs_setlease,
1110         .fallocate = cifs_fallocate,
1111 };
1112 
1113 const struct file_operations cifs_file_direct_ops = {
1114         /* BB reevaluate whether they can be done with directio, no cache */
1115         .read_iter = cifs_user_readv,
1116         .write_iter = cifs_user_writev,
1117         .open = cifs_open,
1118         .release = cifs_close,
1119         .lock = cifs_lock,
1120         .fsync = cifs_fsync,
1121         .flush = cifs_flush,
1122         .mmap = cifs_file_mmap,
1123         .splice_read = generic_file_splice_read,
1124         .splice_write = iter_file_splice_write,
1125         .unlocked_ioctl  = cifs_ioctl,
1126         .copy_file_range = cifs_copy_file_range,
1127         .clone_file_range = cifs_clone_file_range,
1128         .llseek = cifs_llseek,
1129         .setlease = cifs_setlease,
1130         .fallocate = cifs_fallocate,
1131 };
1132 
1133 const struct file_operations cifs_file_nobrl_ops = {
1134         .read_iter = cifs_loose_read_iter,
1135         .write_iter = cifs_file_write_iter,
1136         .open = cifs_open,
1137         .release = cifs_close,
1138         .fsync = cifs_fsync,
1139         .flush = cifs_flush,
1140         .mmap  = cifs_file_mmap,
1141         .splice_read = generic_file_splice_read,
1142         .splice_write = iter_file_splice_write,
1143         .llseek = cifs_llseek,
1144         .unlocked_ioctl = cifs_ioctl,
1145         .copy_file_range = cifs_copy_file_range,
1146         .clone_file_range = cifs_clone_file_range,
1147         .setlease = cifs_setlease,
1148         .fallocate = cifs_fallocate,
1149 };
1150 
1151 const struct file_operations cifs_file_strict_nobrl_ops = {
1152         .read_iter = cifs_strict_readv,
1153         .write_iter = cifs_strict_writev,
1154         .open = cifs_open,
1155         .release = cifs_close,
1156         .fsync = cifs_strict_fsync,
1157         .flush = cifs_flush,
1158         .mmap = cifs_file_strict_mmap,
1159         .splice_read = generic_file_splice_read,
1160         .splice_write = iter_file_splice_write,
1161         .llseek = cifs_llseek,
1162         .unlocked_ioctl = cifs_ioctl,
1163         .copy_file_range = cifs_copy_file_range,
1164         .clone_file_range = cifs_clone_file_range,
1165         .setlease = cifs_setlease,
1166         .fallocate = cifs_fallocate,
1167 };
1168 
1169 const struct file_operations cifs_file_direct_nobrl_ops = {
1170         /* BB reevaluate whether they can be done with directio, no cache */
1171         .read_iter = cifs_user_readv,
1172         .write_iter = cifs_user_writev,
1173         .open = cifs_open,
1174         .release = cifs_close,
1175         .fsync = cifs_fsync,
1176         .flush = cifs_flush,
1177         .mmap = cifs_file_mmap,
1178         .splice_read = generic_file_splice_read,
1179         .splice_write = iter_file_splice_write,
1180         .unlocked_ioctl  = cifs_ioctl,
1181         .copy_file_range = cifs_copy_file_range,
1182         .clone_file_range = cifs_clone_file_range,
1183         .llseek = cifs_llseek,
1184         .setlease = cifs_setlease,
1185         .fallocate = cifs_fallocate,
1186 };
1187 
1188 const struct file_operations cifs_dir_ops = {
1189         .iterate_shared = cifs_readdir,
1190         .release = cifs_closedir,
1191         .read    = generic_read_dir,
1192         .unlocked_ioctl  = cifs_ioctl,
1193         .copy_file_range = cifs_copy_file_range,
1194         .clone_file_range = cifs_clone_file_range,
1195         .llseek = generic_file_llseek,
1196         .fsync = cifs_dir_fsync,
1197 };
1198 
1199 static void
1200 cifs_init_once(void *inode)
1201 {
1202         struct cifsInodeInfo *cifsi = inode;
1203 
1204         inode_init_once(&cifsi->vfs_inode);
1205         init_rwsem(&cifsi->lock_sem);
1206 }
1207 
1208 static int __init
1209 cifs_init_inodecache(void)
1210 {
1211         cifs_inode_cachep = kmem_cache_create("cifs_inode_cache",
1212                                               sizeof(struct cifsInodeInfo),
1213                                               0, (SLAB_RECLAIM_ACCOUNT|
1214                                                 SLAB_MEM_SPREAD|SLAB_ACCOUNT),
1215                                               cifs_init_once);
1216         if (cifs_inode_cachep == NULL)
1217                 return -ENOMEM;
1218 
1219         return 0;
1220 }
1221 
1222 static void
1223 cifs_destroy_inodecache(void)
1224 {
1225         /*
1226          * Make sure all delayed rcu free inodes are flushed before we
1227          * destroy cache.
1228          */
1229         rcu_barrier();
1230         kmem_cache_destroy(cifs_inode_cachep);
1231 }
1232 
1233 static int
1234 cifs_init_request_bufs(void)
1235 {
1236         /*
1237          * SMB2 maximum header size is bigger than CIFS one - no problems to
1238          * allocate some more bytes for CIFS.
1239          */
1240         size_t max_hdr_size = MAX_SMB2_HDR_SIZE;
1241 
1242         if (CIFSMaxBufSize < 8192) {
1243         /* Buffer size can not be smaller than 2 * PATH_MAX since maximum
1244         Unicode path name has to fit in any SMB/CIFS path based frames */
1245                 CIFSMaxBufSize = 8192;
1246         } else if (CIFSMaxBufSize > 1024*127) {
1247                 CIFSMaxBufSize = 1024 * 127;
1248         } else {
1249                 CIFSMaxBufSize &= 0x1FE00; /* Round size to even 512 byte mult*/
1250         }
1251 /*
1252         cifs_dbg(VFS, "CIFSMaxBufSize %d 0x%x\n",
1253                  CIFSMaxBufSize, CIFSMaxBufSize);
1254 */
1255         cifs_req_cachep = kmem_cache_create_usercopy("cifs_request",
1256                                             CIFSMaxBufSize + max_hdr_size, 0,
1257                                             SLAB_HWCACHE_ALIGN, 0,
1258                                             CIFSMaxBufSize + max_hdr_size,
1259                                             NULL);
1260         if (cifs_req_cachep == NULL)
1261                 return -ENOMEM;
1262 
1263         if (cifs_min_rcv < 1)
1264                 cifs_min_rcv = 1;
1265         else if (cifs_min_rcv > 64) {
1266                 cifs_min_rcv = 64;
1267                 cifs_dbg(VFS, "cifs_min_rcv set to maximum (64)\n");
1268         }
1269 
1270         cifs_req_poolp = mempool_create_slab_pool(cifs_min_rcv,
1271                                                   cifs_req_cachep);
1272 
1273         if (cifs_req_poolp == NULL) {
1274                 kmem_cache_destroy(cifs_req_cachep);
1275                 return -ENOMEM;
1276         }
1277         /* MAX_CIFS_SMALL_BUFFER_SIZE bytes is enough for most SMB responses and
1278         almost all handle based requests (but not write response, nor is it
1279         sufficient for path based requests).  A smaller size would have
1280         been more efficient (compacting multiple slab items on one 4k page)
1281         for the case in which debug was on, but this larger size allows
1282         more SMBs to use small buffer alloc and is still much more
1283         efficient to alloc 1 per page off the slab compared to 17K (5page)
1284         alloc of large cifs buffers even when page debugging is on */
1285         cifs_sm_req_cachep = kmem_cache_create_usercopy("cifs_small_rq",
1286                         MAX_CIFS_SMALL_BUFFER_SIZE, 0, SLAB_HWCACHE_ALIGN,
1287                         0, MAX_CIFS_SMALL_BUFFER_SIZE, NULL);
1288         if (cifs_sm_req_cachep == NULL) {
1289                 mempool_destroy(cifs_req_poolp);
1290                 kmem_cache_destroy(cifs_req_cachep);
1291                 return -ENOMEM;
1292         }
1293 
1294         if (cifs_min_small < 2)
1295                 cifs_min_small = 2;
1296         else if (cifs_min_small > 256) {
1297                 cifs_min_small = 256;
1298                 cifs_dbg(FYI, "cifs_min_small set to maximum (256)\n");
1299         }
1300 
1301         cifs_sm_req_poolp = mempool_create_slab_pool(cifs_min_small,
1302                                                      cifs_sm_req_cachep);
1303 
1304         if (cifs_sm_req_poolp == NULL) {
1305                 mempool_destroy(cifs_req_poolp);
1306                 kmem_cache_destroy(cifs_req_cachep);
1307                 kmem_cache_destroy(cifs_sm_req_cachep);
1308                 return -ENOMEM;
1309         }
1310 
1311         return 0;
1312 }
1313 
1314 static void
1315 cifs_destroy_request_bufs(void)
1316 {
1317         mempool_destroy(cifs_req_poolp);
1318         kmem_cache_destroy(cifs_req_cachep);
1319         mempool_destroy(cifs_sm_req_poolp);
1320         kmem_cache_destroy(cifs_sm_req_cachep);
1321 }
1322 
1323 static int
1324 cifs_init_mids(void)
1325 {
1326         cifs_mid_cachep = kmem_cache_create("cifs_mpx_ids",
1327                                             sizeof(struct mid_q_entry), 0,
1328                                             SLAB_HWCACHE_ALIGN, NULL);
1329         if (cifs_mid_cachep == NULL)
1330                 return -ENOMEM;
1331 
1332         /* 3 is a reasonable minimum number of simultaneous operations */
1333         cifs_mid_poolp = mempool_create_slab_pool(3, cifs_mid_cachep);
1334         if (cifs_mid_poolp == NULL) {
1335                 kmem_cache_destroy(cifs_mid_cachep);
1336                 return -ENOMEM;
1337         }
1338 
1339         return 0;
1340 }
1341 
1342 static void
1343 cifs_destroy_mids(void)
1344 {
1345         mempool_destroy(cifs_mid_poolp);
1346         kmem_cache_destroy(cifs_mid_cachep);
1347 }
1348 
1349 static int __init
1350 init_cifs(void)
1351 {
1352         int rc = 0;
1353         cifs_proc_init();
1354         INIT_LIST_HEAD(&cifs_tcp_ses_list);
1355 #ifdef CONFIG_CIFS_DNOTIFY_EXPERIMENTAL /* unused temporarily */
1356         INIT_LIST_HEAD(&GlobalDnotifyReqList);
1357         INIT_LIST_HEAD(&GlobalDnotifyRsp_Q);
1358 #endif /* was needed for dnotify, and will be needed for inotify when VFS fix */
1359 /*
1360  *  Initialize Global counters
1361  */
1362         atomic_set(&sesInfoAllocCount, 0);
1363         atomic_set(&tconInfoAllocCount, 0);
1364         atomic_set(&tcpSesAllocCount, 0);
1365         atomic_set(&tcpSesReconnectCount, 0);
1366         atomic_set(&tconInfoReconnectCount, 0);
1367 
1368         atomic_set(&bufAllocCount, 0);
1369         atomic_set(&smBufAllocCount, 0);
1370 #ifdef CONFIG_CIFS_STATS2
1371         atomic_set(&totBufAllocCount, 0);
1372         atomic_set(&totSmBufAllocCount, 0);
1373 #endif /* CONFIG_CIFS_STATS2 */
1374 
1375         atomic_set(&midCount, 0);
1376         GlobalCurrentXid = 0;
1377         GlobalTotalActiveXid = 0;
1378         GlobalMaxActiveXid = 0;
1379         spin_lock_init(&cifs_tcp_ses_lock);
1380         spin_lock_init(&GlobalMid_Lock);
1381 
1382         cifs_lock_secret = get_random_u32();
1383 
1384         if (cifs_max_pending < 2) {
1385                 cifs_max_pending = 2;
1386                 cifs_dbg(FYI, "cifs_max_pending set to min of 2\n");
1387         } else if (cifs_max_pending > CIFS_MAX_REQ) {
1388                 cifs_max_pending = CIFS_MAX_REQ;
1389                 cifs_dbg(FYI, "cifs_max_pending set to max of %u\n",
1390                          CIFS_MAX_REQ);
1391         }
1392 
1393         cifsiod_wq = alloc_workqueue("cifsiod", WQ_FREEZABLE|WQ_MEM_RECLAIM, 0);
1394         if (!cifsiod_wq) {
1395                 rc = -ENOMEM;
1396                 goto out_clean_proc;
1397         }
1398 
1399         cifsoplockd_wq = alloc_workqueue("cifsoplockd",
1400                                          WQ_FREEZABLE|WQ_MEM_RECLAIM, 0);
1401         if (!cifsoplockd_wq) {
1402                 rc = -ENOMEM;
1403                 goto out_destroy_cifsiod_wq;
1404         }
1405 
1406         rc = cifs_fscache_register();
1407         if (rc)
1408                 goto out_destroy_cifsoplockd_wq;
1409 
1410         rc = cifs_init_inodecache();
1411         if (rc)
1412                 goto out_unreg_fscache;
1413 
1414         rc = cifs_init_mids();
1415         if (rc)
1416                 goto out_destroy_inodecache;
1417 
1418         rc = cifs_init_request_bufs();
1419         if (rc)
1420                 goto out_destroy_mids;
1421 
1422 #ifdef CONFIG_CIFS_UPCALL
1423         rc = init_cifs_spnego();
1424         if (rc)
1425                 goto out_destroy_request_bufs;
1426 #endif /* CONFIG_CIFS_UPCALL */
1427 
1428 #ifdef CONFIG_CIFS_ACL
1429         rc = init_cifs_idmap();
1430         if (rc)
1431                 goto out_register_key_type;
1432 #endif /* CONFIG_CIFS_ACL */
1433 
1434         rc = register_filesystem(&cifs_fs_type);
1435         if (rc)
1436                 goto out_init_cifs_idmap;
1437 
1438         return 0;
1439 
1440 out_init_cifs_idmap:
1441 #ifdef CONFIG_CIFS_ACL
1442         exit_cifs_idmap();
1443 out_register_key_type:
1444 #endif
1445 #ifdef CONFIG_CIFS_UPCALL
1446         exit_cifs_spnego();
1447 out_destroy_request_bufs:
1448 #endif
1449         cifs_destroy_request_bufs();
1450 out_destroy_mids:
1451         cifs_destroy_mids();
1452 out_destroy_inodecache:
1453         cifs_destroy_inodecache();
1454 out_unreg_fscache:
1455         cifs_fscache_unregister();
1456 out_destroy_cifsoplockd_wq:
1457         destroy_workqueue(cifsoplockd_wq);
1458 out_destroy_cifsiod_wq:
1459         destroy_workqueue(cifsiod_wq);
1460 out_clean_proc:
1461         cifs_proc_clean();
1462         return rc;
1463 }
1464 
1465 static void __exit
1466 exit_cifs(void)
1467 {
1468         cifs_dbg(NOISY, "exit_cifs\n");
1469         unregister_filesystem(&cifs_fs_type);
1470         cifs_dfs_release_automount_timer();
1471 #ifdef CONFIG_CIFS_ACL
1472         exit_cifs_idmap();
1473 #endif
1474 #ifdef CONFIG_CIFS_UPCALL
1475         exit_cifs_spnego();
1476 #endif
1477         cifs_destroy_request_bufs();
1478         cifs_destroy_mids();
1479         cifs_destroy_inodecache();
1480         cifs_fscache_unregister();
1481         destroy_workqueue(cifsoplockd_wq);
1482         destroy_workqueue(cifsiod_wq);
1483         cifs_proc_clean();
1484 }
1485 
1486 MODULE_AUTHOR("Steve French <sfrench@us.ibm.com>");
1487 MODULE_LICENSE("GPL");  /* combination of LGPL + GPL source behaves as GPL */
1488 MODULE_DESCRIPTION
1489     ("VFS to access servers complying with the SNIA CIFS Specification "
1490      "e.g. Samba and Windows");
1491 MODULE_VERSION(CIFS_VERSION);
1492 MODULE_SOFTDEP("pre: arc4");
1493 MODULE_SOFTDEP("pre: des");
1494 MODULE_SOFTDEP("pre: ecb");
1495 MODULE_SOFTDEP("pre: hmac");
1496 MODULE_SOFTDEP("pre: md4");
1497 MODULE_SOFTDEP("pre: md5");
1498 MODULE_SOFTDEP("pre: nls");
1499 MODULE_SOFTDEP("pre: aes");
1500 MODULE_SOFTDEP("pre: cmac");
1501 MODULE_SOFTDEP("pre: sha256");
1502 MODULE_SOFTDEP("pre: sha512");
1503 MODULE_SOFTDEP("pre: aead2");
1504 MODULE_SOFTDEP("pre: ccm");
1505 module_init(init_cifs)
1506 module_exit(exit_cifs)
1507 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp