cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

cifsfs.c (48902B)


      1// SPDX-License-Identifier: LGPL-2.1
      2/*
      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 */
     10
     11/* Note that BB means BUGBUG (ie something to fix eventually) */
     12
     13#include <linux/module.h>
     14#include <linux/fs.h>
     15#include <linux/mount.h>
     16#include <linux/slab.h>
     17#include <linux/init.h>
     18#include <linux/list.h>
     19#include <linux/seq_file.h>
     20#include <linux/vfs.h>
     21#include <linux/mempool.h>
     22#include <linux/delay.h>
     23#include <linux/kthread.h>
     24#include <linux/freezer.h>
     25#include <linux/namei.h>
     26#include <linux/random.h>
     27#include <linux/uuid.h>
     28#include <linux/xattr.h>
     29#include <uapi/linux/magic.h>
     30#include <net/ipv6.h>
     31#include "cifsfs.h"
     32#include "cifspdu.h"
     33#define DECLARE_GLOBALS_HERE
     34#include "cifsglob.h"
     35#include "cifsproto.h"
     36#include "cifs_debug.h"
     37#include "cifs_fs_sb.h"
     38#include <linux/mm.h>
     39#include <linux/key-type.h>
     40#include "cifs_spnego.h"
     41#include "fscache.h"
     42#ifdef CONFIG_CIFS_DFS_UPCALL
     43#include "dfs_cache.h"
     44#endif
     45#ifdef CONFIG_CIFS_SWN_UPCALL
     46#include "netlink.h"
     47#endif
     48#include "fs_context.h"
     49
     50/*
     51 * DOS dates from 1980/1/1 through 2107/12/31
     52 * Protocol specifications indicate the range should be to 119, which
     53 * limits maximum year to 2099. But this range has not been checked.
     54 */
     55#define SMB_DATE_MAX (127<<9 | 12<<5 | 31)
     56#define SMB_DATE_MIN (0<<9 | 1<<5 | 1)
     57#define SMB_TIME_MAX (23<<11 | 59<<5 | 29)
     58
     59int cifsFYI = 0;
     60bool traceSMB;
     61bool enable_oplocks = true;
     62bool linuxExtEnabled = true;
     63bool lookupCacheEnabled = true;
     64bool disable_legacy_dialects; /* false by default */
     65bool enable_gcm_256 = true;
     66bool require_gcm_256; /* false by default */
     67bool enable_negotiate_signing; /* false by default */
     68unsigned int global_secflags = CIFSSEC_DEF;
     69/* unsigned int ntlmv2_support = 0; */
     70unsigned int sign_CIFS_PDUs = 1;
     71static const struct super_operations cifs_super_ops;
     72unsigned int CIFSMaxBufSize = CIFS_MAX_MSGSIZE;
     73module_param(CIFSMaxBufSize, uint, 0444);
     74MODULE_PARM_DESC(CIFSMaxBufSize, "Network buffer size (not including header) "
     75				 "for CIFS requests. "
     76				 "Default: 16384 Range: 8192 to 130048");
     77unsigned int cifs_min_rcv = CIFS_MIN_RCV_POOL;
     78module_param(cifs_min_rcv, uint, 0444);
     79MODULE_PARM_DESC(cifs_min_rcv, "Network buffers in pool. Default: 4 Range: "
     80				"1 to 64");
     81unsigned int cifs_min_small = 30;
     82module_param(cifs_min_small, uint, 0444);
     83MODULE_PARM_DESC(cifs_min_small, "Small network buffers in pool. Default: 30 "
     84				 "Range: 2 to 256");
     85unsigned int cifs_max_pending = CIFS_MAX_REQ;
     86module_param(cifs_max_pending, uint, 0444);
     87MODULE_PARM_DESC(cifs_max_pending, "Simultaneous requests to server for "
     88				   "CIFS/SMB1 dialect (N/A for SMB3) "
     89				   "Default: 32767 Range: 2 to 32767.");
     90#ifdef CONFIG_CIFS_STATS2
     91unsigned int slow_rsp_threshold = 1;
     92module_param(slow_rsp_threshold, uint, 0644);
     93MODULE_PARM_DESC(slow_rsp_threshold, "Amount of time (in seconds) to wait "
     94				   "before logging that a response is delayed. "
     95				   "Default: 1 (if set to 0 disables msg).");
     96#endif /* STATS2 */
     97
     98module_param(enable_oplocks, bool, 0644);
     99MODULE_PARM_DESC(enable_oplocks, "Enable or disable oplocks. Default: y/Y/1");
    100
    101module_param(enable_gcm_256, bool, 0644);
    102MODULE_PARM_DESC(enable_gcm_256, "Enable requesting strongest (256 bit) GCM encryption. Default: n/N/0");
    103
    104module_param(require_gcm_256, bool, 0644);
    105MODULE_PARM_DESC(require_gcm_256, "Require strongest (256 bit) GCM encryption. Default: n/N/0");
    106
    107module_param(enable_negotiate_signing, bool, 0644);
    108MODULE_PARM_DESC(enable_negotiate_signing, "Enable negotiating packet signing algorithm with server. Default: n/N/0");
    109
    110module_param(disable_legacy_dialects, bool, 0644);
    111MODULE_PARM_DESC(disable_legacy_dialects, "To improve security it may be "
    112				  "helpful to restrict the ability to "
    113				  "override the default dialects (SMB2.1, "
    114				  "SMB3 and SMB3.02) on mount with old "
    115				  "dialects (CIFS/SMB1 and SMB2) since "
    116				  "vers=1.0 (CIFS/SMB1) and vers=2.0 are weaker"
    117				  " and less secure. Default: n/N/0");
    118
    119extern mempool_t *cifs_sm_req_poolp;
    120extern mempool_t *cifs_req_poolp;
    121extern mempool_t *cifs_mid_poolp;
    122
    123struct workqueue_struct	*cifsiod_wq;
    124struct workqueue_struct	*decrypt_wq;
    125struct workqueue_struct	*fileinfo_put_wq;
    126struct workqueue_struct	*cifsoplockd_wq;
    127struct workqueue_struct	*deferredclose_wq;
    128__u32 cifs_lock_secret;
    129
    130/*
    131 * Bumps refcount for cifs super block.
    132 * Note that it should be only called if a referece to VFS super block is
    133 * already held, e.g. in open-type syscalls context. Otherwise it can race with
    134 * atomic_dec_and_test in deactivate_locked_super.
    135 */
    136void
    137cifs_sb_active(struct super_block *sb)
    138{
    139	struct cifs_sb_info *server = CIFS_SB(sb);
    140
    141	if (atomic_inc_return(&server->active) == 1)
    142		atomic_inc(&sb->s_active);
    143}
    144
    145void
    146cifs_sb_deactive(struct super_block *sb)
    147{
    148	struct cifs_sb_info *server = CIFS_SB(sb);
    149
    150	if (atomic_dec_and_test(&server->active))
    151		deactivate_super(sb);
    152}
    153
    154static int
    155cifs_read_super(struct super_block *sb)
    156{
    157	struct inode *inode;
    158	struct cifs_sb_info *cifs_sb;
    159	struct cifs_tcon *tcon;
    160	struct timespec64 ts;
    161	int rc = 0;
    162
    163	cifs_sb = CIFS_SB(sb);
    164	tcon = cifs_sb_master_tcon(cifs_sb);
    165
    166	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIXACL)
    167		sb->s_flags |= SB_POSIXACL;
    168
    169	if (tcon->snapshot_time)
    170		sb->s_flags |= SB_RDONLY;
    171
    172	if (tcon->ses->capabilities & tcon->ses->server->vals->cap_large_files)
    173		sb->s_maxbytes = MAX_LFS_FILESIZE;
    174	else
    175		sb->s_maxbytes = MAX_NON_LFS;
    176
    177	/*
    178	 * Some very old servers like DOS and OS/2 used 2 second granularity
    179	 * (while all current servers use 100ns granularity - see MS-DTYP)
    180	 * but 1 second is the maximum allowed granularity for the VFS
    181	 * so for old servers set time granularity to 1 second while for
    182	 * everything else (current servers) set it to 100ns.
    183	 */
    184	if ((tcon->ses->server->vals->protocol_id == SMB10_PROT_ID) &&
    185	    ((tcon->ses->capabilities &
    186	      tcon->ses->server->vals->cap_nt_find) == 0) &&
    187	    !tcon->unix_ext) {
    188		sb->s_time_gran = 1000000000; /* 1 second is max allowed gran */
    189		ts = cnvrtDosUnixTm(cpu_to_le16(SMB_DATE_MIN), 0, 0);
    190		sb->s_time_min = ts.tv_sec;
    191		ts = cnvrtDosUnixTm(cpu_to_le16(SMB_DATE_MAX),
    192				    cpu_to_le16(SMB_TIME_MAX), 0);
    193		sb->s_time_max = ts.tv_sec;
    194	} else {
    195		/*
    196		 * Almost every server, including all SMB2+, uses DCE TIME
    197		 * ie 100 nanosecond units, since 1601.  See MS-DTYP and MS-FSCC
    198		 */
    199		sb->s_time_gran = 100;
    200		ts = cifs_NTtimeToUnix(0);
    201		sb->s_time_min = ts.tv_sec;
    202		ts = cifs_NTtimeToUnix(cpu_to_le64(S64_MAX));
    203		sb->s_time_max = ts.tv_sec;
    204	}
    205
    206	sb->s_magic = CIFS_SUPER_MAGIC;
    207	sb->s_op = &cifs_super_ops;
    208	sb->s_xattr = cifs_xattr_handlers;
    209	rc = super_setup_bdi(sb);
    210	if (rc)
    211		goto out_no_root;
    212	/* tune readahead according to rsize if readahead size not set on mount */
    213	if (cifs_sb->ctx->rsize == 0)
    214		cifs_sb->ctx->rsize =
    215			tcon->ses->server->ops->negotiate_rsize(tcon, cifs_sb->ctx);
    216	if (cifs_sb->ctx->rasize)
    217		sb->s_bdi->ra_pages = cifs_sb->ctx->rasize / PAGE_SIZE;
    218	else
    219		sb->s_bdi->ra_pages = cifs_sb->ctx->rsize / PAGE_SIZE;
    220
    221	sb->s_blocksize = CIFS_MAX_MSGSIZE;
    222	sb->s_blocksize_bits = 14;	/* default 2**14 = CIFS_MAX_MSGSIZE */
    223	inode = cifs_root_iget(sb);
    224
    225	if (IS_ERR(inode)) {
    226		rc = PTR_ERR(inode);
    227		goto out_no_root;
    228	}
    229
    230	if (tcon->nocase)
    231		sb->s_d_op = &cifs_ci_dentry_ops;
    232	else
    233		sb->s_d_op = &cifs_dentry_ops;
    234
    235	sb->s_root = d_make_root(inode);
    236	if (!sb->s_root) {
    237		rc = -ENOMEM;
    238		goto out_no_root;
    239	}
    240
    241#ifdef CONFIG_CIFS_NFSD_EXPORT
    242	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
    243		cifs_dbg(FYI, "export ops supported\n");
    244		sb->s_export_op = &cifs_export_ops;
    245	}
    246#endif /* CONFIG_CIFS_NFSD_EXPORT */
    247
    248	return 0;
    249
    250out_no_root:
    251	cifs_dbg(VFS, "%s: get root inode failed\n", __func__);
    252	return rc;
    253}
    254
    255static void cifs_kill_sb(struct super_block *sb)
    256{
    257	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
    258	struct cifs_tcon *tcon;
    259	struct cached_fid *cfid;
    260	struct rb_root *root = &cifs_sb->tlink_tree;
    261	struct rb_node *node;
    262	struct tcon_link *tlink;
    263
    264	/*
    265	 * We ned to release all dentries for the cached directories
    266	 * before we kill the sb.
    267	 */
    268	if (cifs_sb->root) {
    269		for (node = rb_first(root); node; node = rb_next(node)) {
    270			tlink = rb_entry(node, struct tcon_link, tl_rbnode);
    271			tcon = tlink_tcon(tlink);
    272			if (IS_ERR(tcon))
    273				continue;
    274			cfid = &tcon->crfid;
    275			mutex_lock(&cfid->fid_mutex);
    276			if (cfid->dentry) {
    277				dput(cfid->dentry);
    278				cfid->dentry = NULL;
    279			}
    280			mutex_unlock(&cfid->fid_mutex);
    281		}
    282
    283		/* finally release root dentry */
    284		dput(cifs_sb->root);
    285		cifs_sb->root = NULL;
    286	}
    287
    288	kill_anon_super(sb);
    289	cifs_umount(cifs_sb);
    290}
    291
    292static int
    293cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
    294{
    295	struct super_block *sb = dentry->d_sb;
    296	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
    297	struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
    298	struct TCP_Server_Info *server = tcon->ses->server;
    299	unsigned int xid;
    300	int rc = 0;
    301
    302	xid = get_xid();
    303
    304	if (le32_to_cpu(tcon->fsAttrInfo.MaxPathNameComponentLength) > 0)
    305		buf->f_namelen =
    306		       le32_to_cpu(tcon->fsAttrInfo.MaxPathNameComponentLength);
    307	else
    308		buf->f_namelen = PATH_MAX;
    309
    310	buf->f_fsid.val[0] = tcon->vol_serial_number;
    311	/* are using part of create time for more randomness, see man statfs */
    312	buf->f_fsid.val[1] =  (int)le64_to_cpu(tcon->vol_create_time);
    313
    314	buf->f_files = 0;	/* undefined */
    315	buf->f_ffree = 0;	/* unlimited */
    316
    317	if (server->ops->queryfs)
    318		rc = server->ops->queryfs(xid, tcon, cifs_sb, buf);
    319
    320	free_xid(xid);
    321	return rc;
    322}
    323
    324static long cifs_fallocate(struct file *file, int mode, loff_t off, loff_t len)
    325{
    326	struct cifs_sb_info *cifs_sb = CIFS_FILE_SB(file);
    327	struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
    328	struct TCP_Server_Info *server = tcon->ses->server;
    329
    330	if (server->ops->fallocate)
    331		return server->ops->fallocate(file, tcon, mode, off, len);
    332
    333	return -EOPNOTSUPP;
    334}
    335
    336static int cifs_permission(struct user_namespace *mnt_userns,
    337			   struct inode *inode, int mask)
    338{
    339	struct cifs_sb_info *cifs_sb;
    340
    341	cifs_sb = CIFS_SB(inode->i_sb);
    342
    343	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM) {
    344		if ((mask & MAY_EXEC) && !execute_ok(inode))
    345			return -EACCES;
    346		else
    347			return 0;
    348	} else /* file mode might have been restricted at mount time
    349		on the client (above and beyond ACL on servers) for
    350		servers which do not support setting and viewing mode bits,
    351		so allowing client to check permissions is useful */
    352		return generic_permission(&init_user_ns, inode, mask);
    353}
    354
    355static struct kmem_cache *cifs_inode_cachep;
    356static struct kmem_cache *cifs_req_cachep;
    357static struct kmem_cache *cifs_mid_cachep;
    358static struct kmem_cache *cifs_sm_req_cachep;
    359mempool_t *cifs_sm_req_poolp;
    360mempool_t *cifs_req_poolp;
    361mempool_t *cifs_mid_poolp;
    362
    363static struct inode *
    364cifs_alloc_inode(struct super_block *sb)
    365{
    366	struct cifsInodeInfo *cifs_inode;
    367	cifs_inode = alloc_inode_sb(sb, cifs_inode_cachep, GFP_KERNEL);
    368	if (!cifs_inode)
    369		return NULL;
    370	cifs_inode->cifsAttrs = 0x20;	/* default */
    371	cifs_inode->time = 0;
    372	/*
    373	 * Until the file is open and we have gotten oplock info back from the
    374	 * server, can not assume caching of file data or metadata.
    375	 */
    376	cifs_set_oplock_level(cifs_inode, 0);
    377	cifs_inode->flags = 0;
    378	spin_lock_init(&cifs_inode->writers_lock);
    379	cifs_inode->writers = 0;
    380	cifs_inode->netfs.inode.i_blkbits = 14;  /* 2**14 = CIFS_MAX_MSGSIZE */
    381	cifs_inode->server_eof = 0;
    382	cifs_inode->uniqueid = 0;
    383	cifs_inode->createtime = 0;
    384	cifs_inode->epoch = 0;
    385	spin_lock_init(&cifs_inode->open_file_lock);
    386	generate_random_uuid(cifs_inode->lease_key);
    387
    388	/*
    389	 * Can not set i_flags here - they get immediately overwritten to zero
    390	 * by the VFS.
    391	 */
    392	/* cifs_inode->netfs.inode.i_flags = S_NOATIME | S_NOCMTIME; */
    393	INIT_LIST_HEAD(&cifs_inode->openFileList);
    394	INIT_LIST_HEAD(&cifs_inode->llist);
    395	INIT_LIST_HEAD(&cifs_inode->deferred_closes);
    396	spin_lock_init(&cifs_inode->deferred_lock);
    397	return &cifs_inode->netfs.inode;
    398}
    399
    400static void
    401cifs_free_inode(struct inode *inode)
    402{
    403	kmem_cache_free(cifs_inode_cachep, CIFS_I(inode));
    404}
    405
    406static void
    407cifs_evict_inode(struct inode *inode)
    408{
    409	truncate_inode_pages_final(&inode->i_data);
    410	if (inode->i_state & I_PINNING_FSCACHE_WB)
    411		cifs_fscache_unuse_inode_cookie(inode, true);
    412	cifs_fscache_release_inode_cookie(inode);
    413	clear_inode(inode);
    414}
    415
    416static void
    417cifs_show_address(struct seq_file *s, struct TCP_Server_Info *server)
    418{
    419	struct sockaddr_in *sa = (struct sockaddr_in *) &server->dstaddr;
    420	struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *) &server->dstaddr;
    421
    422	seq_puts(s, ",addr=");
    423
    424	switch (server->dstaddr.ss_family) {
    425	case AF_INET:
    426		seq_printf(s, "%pI4", &sa->sin_addr.s_addr);
    427		break;
    428	case AF_INET6:
    429		seq_printf(s, "%pI6", &sa6->sin6_addr.s6_addr);
    430		if (sa6->sin6_scope_id)
    431			seq_printf(s, "%%%u", sa6->sin6_scope_id);
    432		break;
    433	default:
    434		seq_puts(s, "(unknown)");
    435	}
    436	if (server->rdma)
    437		seq_puts(s, ",rdma");
    438}
    439
    440static void
    441cifs_show_security(struct seq_file *s, struct cifs_ses *ses)
    442{
    443	if (ses->sectype == Unspecified) {
    444		if (ses->user_name == NULL)
    445			seq_puts(s, ",sec=none");
    446		return;
    447	}
    448
    449	seq_puts(s, ",sec=");
    450
    451	switch (ses->sectype) {
    452	case NTLMv2:
    453		seq_puts(s, "ntlmv2");
    454		break;
    455	case Kerberos:
    456		seq_puts(s, "krb5");
    457		break;
    458	case RawNTLMSSP:
    459		seq_puts(s, "ntlmssp");
    460		break;
    461	default:
    462		/* shouldn't ever happen */
    463		seq_puts(s, "unknown");
    464		break;
    465	}
    466
    467	if (ses->sign)
    468		seq_puts(s, "i");
    469
    470	if (ses->sectype == Kerberos)
    471		seq_printf(s, ",cruid=%u",
    472			   from_kuid_munged(&init_user_ns, ses->cred_uid));
    473}
    474
    475static void
    476cifs_show_cache_flavor(struct seq_file *s, struct cifs_sb_info *cifs_sb)
    477{
    478	seq_puts(s, ",cache=");
    479
    480	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO)
    481		seq_puts(s, "strict");
    482	else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO)
    483		seq_puts(s, "none");
    484	else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RW_CACHE)
    485		seq_puts(s, "singleclient"); /* assume only one client access */
    486	else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE)
    487		seq_puts(s, "ro"); /* read only caching assumed */
    488	else
    489		seq_puts(s, "loose");
    490}
    491
    492/*
    493 * cifs_show_devname() is used so we show the mount device name with correct
    494 * format (e.g. forward slashes vs. back slashes) in /proc/mounts
    495 */
    496static int cifs_show_devname(struct seq_file *m, struct dentry *root)
    497{
    498	struct cifs_sb_info *cifs_sb = CIFS_SB(root->d_sb);
    499	char *devname = kstrdup(cifs_sb->ctx->source, GFP_KERNEL);
    500
    501	if (devname == NULL)
    502		seq_puts(m, "none");
    503	else {
    504		convert_delimiter(devname, '/');
    505		/* escape all spaces in share names */
    506		seq_escape(m, devname, " \t");
    507		kfree(devname);
    508	}
    509	return 0;
    510}
    511
    512/*
    513 * cifs_show_options() is for displaying mount options in /proc/mounts.
    514 * Not all settable options are displayed but most of the important
    515 * ones are.
    516 */
    517static int
    518cifs_show_options(struct seq_file *s, struct dentry *root)
    519{
    520	struct cifs_sb_info *cifs_sb = CIFS_SB(root->d_sb);
    521	struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
    522	struct sockaddr *srcaddr;
    523	srcaddr = (struct sockaddr *)&tcon->ses->server->srcaddr;
    524
    525	seq_show_option(s, "vers", tcon->ses->server->vals->version_string);
    526	cifs_show_security(s, tcon->ses);
    527	cifs_show_cache_flavor(s, cifs_sb);
    528
    529	if (tcon->no_lease)
    530		seq_puts(s, ",nolease");
    531	if (cifs_sb->ctx->multiuser)
    532		seq_puts(s, ",multiuser");
    533	else if (tcon->ses->user_name)
    534		seq_show_option(s, "username", tcon->ses->user_name);
    535
    536	if (tcon->ses->domainName && tcon->ses->domainName[0] != 0)
    537		seq_show_option(s, "domain", tcon->ses->domainName);
    538
    539	if (srcaddr->sa_family != AF_UNSPEC) {
    540		struct sockaddr_in *saddr4;
    541		struct sockaddr_in6 *saddr6;
    542		saddr4 = (struct sockaddr_in *)srcaddr;
    543		saddr6 = (struct sockaddr_in6 *)srcaddr;
    544		if (srcaddr->sa_family == AF_INET6)
    545			seq_printf(s, ",srcaddr=%pI6c",
    546				   &saddr6->sin6_addr);
    547		else if (srcaddr->sa_family == AF_INET)
    548			seq_printf(s, ",srcaddr=%pI4",
    549				   &saddr4->sin_addr.s_addr);
    550		else
    551			seq_printf(s, ",srcaddr=BAD-AF:%i",
    552				   (int)(srcaddr->sa_family));
    553	}
    554
    555	seq_printf(s, ",uid=%u",
    556		   from_kuid_munged(&init_user_ns, cifs_sb->ctx->linux_uid));
    557	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)
    558		seq_puts(s, ",forceuid");
    559	else
    560		seq_puts(s, ",noforceuid");
    561
    562	seq_printf(s, ",gid=%u",
    563		   from_kgid_munged(&init_user_ns, cifs_sb->ctx->linux_gid));
    564	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)
    565		seq_puts(s, ",forcegid");
    566	else
    567		seq_puts(s, ",noforcegid");
    568
    569	cifs_show_address(s, tcon->ses->server);
    570
    571	if (!tcon->unix_ext)
    572		seq_printf(s, ",file_mode=0%ho,dir_mode=0%ho",
    573					   cifs_sb->ctx->file_mode,
    574					   cifs_sb->ctx->dir_mode);
    575	if (cifs_sb->ctx->iocharset)
    576		seq_printf(s, ",iocharset=%s", cifs_sb->ctx->iocharset);
    577	if (tcon->seal)
    578		seq_puts(s, ",seal");
    579	else if (tcon->ses->server->ignore_signature)
    580		seq_puts(s, ",signloosely");
    581	if (tcon->nocase)
    582		seq_puts(s, ",nocase");
    583	if (tcon->nodelete)
    584		seq_puts(s, ",nodelete");
    585	if (cifs_sb->ctx->no_sparse)
    586		seq_puts(s, ",nosparse");
    587	if (tcon->local_lease)
    588		seq_puts(s, ",locallease");
    589	if (tcon->retry)
    590		seq_puts(s, ",hard");
    591	else
    592		seq_puts(s, ",soft");
    593	if (tcon->use_persistent)
    594		seq_puts(s, ",persistenthandles");
    595	else if (tcon->use_resilient)
    596		seq_puts(s, ",resilienthandles");
    597	if (tcon->posix_extensions)
    598		seq_puts(s, ",posix");
    599	else if (tcon->unix_ext)
    600		seq_puts(s, ",unix");
    601	else
    602		seq_puts(s, ",nounix");
    603	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
    604		seq_puts(s, ",nodfs");
    605	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS)
    606		seq_puts(s, ",posixpaths");
    607	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID)
    608		seq_puts(s, ",setuids");
    609	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UID_FROM_ACL)
    610		seq_puts(s, ",idsfromsid");
    611	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
    612		seq_puts(s, ",serverino");
    613	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD)
    614		seq_puts(s, ",rwpidforward");
    615	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL)
    616		seq_puts(s, ",forcemand");
    617	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR)
    618		seq_puts(s, ",nouser_xattr");
    619	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR)
    620		seq_puts(s, ",mapchars");
    621	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SFM_CHR)
    622		seq_puts(s, ",mapposix");
    623	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL)
    624		seq_puts(s, ",sfu");
    625	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
    626		seq_puts(s, ",nobrl");
    627	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_HANDLE_CACHE)
    628		seq_puts(s, ",nohandlecache");
    629	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID)
    630		seq_puts(s, ",modefromsid");
    631	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL)
    632		seq_puts(s, ",cifsacl");
    633	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
    634		seq_puts(s, ",dynperm");
    635	if (root->d_sb->s_flags & SB_POSIXACL)
    636		seq_puts(s, ",acl");
    637	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS)
    638		seq_puts(s, ",mfsymlinks");
    639	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_FSCACHE)
    640		seq_puts(s, ",fsc");
    641	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)
    642		seq_puts(s, ",nostrictsync");
    643	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM)
    644		seq_puts(s, ",noperm");
    645	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_BACKUPUID)
    646		seq_printf(s, ",backupuid=%u",
    647			   from_kuid_munged(&init_user_ns,
    648					    cifs_sb->ctx->backupuid));
    649	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_BACKUPGID)
    650		seq_printf(s, ",backupgid=%u",
    651			   from_kgid_munged(&init_user_ns,
    652					    cifs_sb->ctx->backupgid));
    653
    654	seq_printf(s, ",rsize=%u", cifs_sb->ctx->rsize);
    655	seq_printf(s, ",wsize=%u", cifs_sb->ctx->wsize);
    656	seq_printf(s, ",bsize=%u", cifs_sb->ctx->bsize);
    657	if (cifs_sb->ctx->rasize)
    658		seq_printf(s, ",rasize=%u", cifs_sb->ctx->rasize);
    659	if (tcon->ses->server->min_offload)
    660		seq_printf(s, ",esize=%u", tcon->ses->server->min_offload);
    661	seq_printf(s, ",echo_interval=%lu",
    662			tcon->ses->server->echo_interval / HZ);
    663
    664	/* Only display max_credits if it was overridden on mount */
    665	if (tcon->ses->server->max_credits != SMB2_MAX_CREDITS_AVAILABLE)
    666		seq_printf(s, ",max_credits=%u", tcon->ses->server->max_credits);
    667
    668	if (tcon->snapshot_time)
    669		seq_printf(s, ",snapshot=%llu", tcon->snapshot_time);
    670	if (tcon->handle_timeout)
    671		seq_printf(s, ",handletimeout=%u", tcon->handle_timeout);
    672
    673	/*
    674	 * Display file and directory attribute timeout in seconds.
    675	 * If file and directory attribute timeout the same then actimeo
    676	 * was likely specified on mount
    677	 */
    678	if (cifs_sb->ctx->acdirmax == cifs_sb->ctx->acregmax)
    679		seq_printf(s, ",actimeo=%lu", cifs_sb->ctx->acregmax / HZ);
    680	else {
    681		seq_printf(s, ",acdirmax=%lu", cifs_sb->ctx->acdirmax / HZ);
    682		seq_printf(s, ",acregmax=%lu", cifs_sb->ctx->acregmax / HZ);
    683	}
    684
    685	if (tcon->ses->chan_max > 1)
    686		seq_printf(s, ",multichannel,max_channels=%zu",
    687			   tcon->ses->chan_max);
    688
    689	if (tcon->use_witness)
    690		seq_puts(s, ",witness");
    691
    692	return 0;
    693}
    694
    695static void cifs_umount_begin(struct super_block *sb)
    696{
    697	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
    698	struct cifs_tcon *tcon;
    699
    700	if (cifs_sb == NULL)
    701		return;
    702
    703	tcon = cifs_sb_master_tcon(cifs_sb);
    704
    705	spin_lock(&cifs_tcp_ses_lock);
    706	if ((tcon->tc_count > 1) || (tcon->status == TID_EXITING)) {
    707		/* we have other mounts to same share or we have
    708		   already tried to force umount this and woken up
    709		   all waiting network requests, nothing to do */
    710		spin_unlock(&cifs_tcp_ses_lock);
    711		return;
    712	} else if (tcon->tc_count == 1)
    713		tcon->status = TID_EXITING;
    714	spin_unlock(&cifs_tcp_ses_lock);
    715
    716	/* cancel_brl_requests(tcon); */ /* BB mark all brl mids as exiting */
    717	/* cancel_notify_requests(tcon); */
    718	if (tcon->ses && tcon->ses->server) {
    719		cifs_dbg(FYI, "wake up tasks now - umount begin not complete\n");
    720		wake_up_all(&tcon->ses->server->request_q);
    721		wake_up_all(&tcon->ses->server->response_q);
    722		msleep(1); /* yield */
    723		/* we have to kick the requests once more */
    724		wake_up_all(&tcon->ses->server->response_q);
    725		msleep(1);
    726	}
    727
    728	return;
    729}
    730
    731#ifdef CONFIG_CIFS_STATS2
    732static int cifs_show_stats(struct seq_file *s, struct dentry *root)
    733{
    734	/* BB FIXME */
    735	return 0;
    736}
    737#endif
    738
    739static int cifs_write_inode(struct inode *inode, struct writeback_control *wbc)
    740{
    741	fscache_unpin_writeback(wbc, cifs_inode_cookie(inode));
    742	return 0;
    743}
    744
    745static int cifs_drop_inode(struct inode *inode)
    746{
    747	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
    748
    749	/* no serverino => unconditional eviction */
    750	return !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) ||
    751		generic_drop_inode(inode);
    752}
    753
    754static const struct super_operations cifs_super_ops = {
    755	.statfs = cifs_statfs,
    756	.alloc_inode = cifs_alloc_inode,
    757	.write_inode	= cifs_write_inode,
    758	.free_inode = cifs_free_inode,
    759	.drop_inode	= cifs_drop_inode,
    760	.evict_inode	= cifs_evict_inode,
    761/*	.show_path	= cifs_show_path, */ /* Would we ever need show path? */
    762	.show_devname   = cifs_show_devname,
    763/*	.delete_inode	= cifs_delete_inode,  */  /* Do not need above
    764	function unless later we add lazy close of inodes or unless the
    765	kernel forgets to call us with the same number of releases (closes)
    766	as opens */
    767	.show_options = cifs_show_options,
    768	.umount_begin   = cifs_umount_begin,
    769#ifdef CONFIG_CIFS_STATS2
    770	.show_stats = cifs_show_stats,
    771#endif
    772};
    773
    774/*
    775 * Get root dentry from superblock according to prefix path mount option.
    776 * Return dentry with refcount + 1 on success and NULL otherwise.
    777 */
    778static struct dentry *
    779cifs_get_root(struct smb3_fs_context *ctx, struct super_block *sb)
    780{
    781	struct dentry *dentry;
    782	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
    783	char *full_path = NULL;
    784	char *s, *p;
    785	char sep;
    786
    787	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH)
    788		return dget(sb->s_root);
    789
    790	full_path = cifs_build_path_to_root(ctx, cifs_sb,
    791				cifs_sb_master_tcon(cifs_sb), 0);
    792	if (full_path == NULL)
    793		return ERR_PTR(-ENOMEM);
    794
    795	cifs_dbg(FYI, "Get root dentry for %s\n", full_path);
    796
    797	sep = CIFS_DIR_SEP(cifs_sb);
    798	dentry = dget(sb->s_root);
    799	s = full_path;
    800
    801	do {
    802		struct inode *dir = d_inode(dentry);
    803		struct dentry *child;
    804
    805		if (!S_ISDIR(dir->i_mode)) {
    806			dput(dentry);
    807			dentry = ERR_PTR(-ENOTDIR);
    808			break;
    809		}
    810
    811		/* skip separators */
    812		while (*s == sep)
    813			s++;
    814		if (!*s)
    815			break;
    816		p = s++;
    817		/* next separator */
    818		while (*s && *s != sep)
    819			s++;
    820
    821		child = lookup_positive_unlocked(p, dentry, s - p);
    822		dput(dentry);
    823		dentry = child;
    824	} while (!IS_ERR(dentry));
    825	kfree(full_path);
    826	return dentry;
    827}
    828
    829static int cifs_set_super(struct super_block *sb, void *data)
    830{
    831	struct cifs_mnt_data *mnt_data = data;
    832	sb->s_fs_info = mnt_data->cifs_sb;
    833	return set_anon_super(sb, NULL);
    834}
    835
    836struct dentry *
    837cifs_smb3_do_mount(struct file_system_type *fs_type,
    838	      int flags, struct smb3_fs_context *old_ctx)
    839{
    840	int rc;
    841	struct super_block *sb = NULL;
    842	struct cifs_sb_info *cifs_sb = NULL;
    843	struct cifs_mnt_data mnt_data;
    844	struct dentry *root;
    845
    846	/*
    847	 * Prints in Kernel / CIFS log the attempted mount operation
    848	 *	If CIFS_DEBUG && cifs_FYI
    849	 */
    850	if (cifsFYI)
    851		cifs_dbg(FYI, "Devname: %s flags: %d\n", old_ctx->UNC, flags);
    852	else
    853		cifs_info("Attempting to mount %s\n", old_ctx->UNC);
    854
    855	cifs_sb = kzalloc(sizeof(struct cifs_sb_info), GFP_KERNEL);
    856	if (cifs_sb == NULL) {
    857		root = ERR_PTR(-ENOMEM);
    858		goto out;
    859	}
    860
    861	cifs_sb->ctx = kzalloc(sizeof(struct smb3_fs_context), GFP_KERNEL);
    862	if (!cifs_sb->ctx) {
    863		root = ERR_PTR(-ENOMEM);
    864		goto out;
    865	}
    866	rc = smb3_fs_context_dup(cifs_sb->ctx, old_ctx);
    867	if (rc) {
    868		root = ERR_PTR(rc);
    869		goto out;
    870	}
    871
    872	rc = cifs_setup_volume_info(cifs_sb->ctx, NULL, NULL);
    873	if (rc) {
    874		root = ERR_PTR(rc);
    875		goto out;
    876	}
    877
    878	rc = cifs_setup_cifs_sb(cifs_sb);
    879	if (rc) {
    880		root = ERR_PTR(rc);
    881		goto out;
    882	}
    883
    884	rc = cifs_mount(cifs_sb, cifs_sb->ctx);
    885	if (rc) {
    886		if (!(flags & SB_SILENT))
    887			cifs_dbg(VFS, "cifs_mount failed w/return code = %d\n",
    888				 rc);
    889		root = ERR_PTR(rc);
    890		goto out;
    891	}
    892
    893	mnt_data.ctx = cifs_sb->ctx;
    894	mnt_data.cifs_sb = cifs_sb;
    895	mnt_data.flags = flags;
    896
    897	/* BB should we make this contingent on mount parm? */
    898	flags |= SB_NODIRATIME | SB_NOATIME;
    899
    900	sb = sget(fs_type, cifs_match_super, cifs_set_super, flags, &mnt_data);
    901	if (IS_ERR(sb)) {
    902		root = ERR_CAST(sb);
    903		cifs_umount(cifs_sb);
    904		cifs_sb = NULL;
    905		goto out;
    906	}
    907
    908	if (sb->s_root) {
    909		cifs_dbg(FYI, "Use existing superblock\n");
    910		cifs_umount(cifs_sb);
    911		cifs_sb = NULL;
    912	} else {
    913		rc = cifs_read_super(sb);
    914		if (rc) {
    915			root = ERR_PTR(rc);
    916			goto out_super;
    917		}
    918
    919		sb->s_flags |= SB_ACTIVE;
    920	}
    921
    922	root = cifs_get_root(cifs_sb ? cifs_sb->ctx : old_ctx, sb);
    923	if (IS_ERR(root))
    924		goto out_super;
    925
    926	if (cifs_sb)
    927		cifs_sb->root = dget(root);
    928
    929	cifs_dbg(FYI, "dentry root is: %p\n", root);
    930	return root;
    931
    932out_super:
    933	deactivate_locked_super(sb);
    934	return root;
    935out:
    936	if (cifs_sb) {
    937		if (!sb || IS_ERR(sb)) {  /* otherwise kill_sb will handle */
    938			kfree(cifs_sb->prepath);
    939			smb3_cleanup_fs_context(cifs_sb->ctx);
    940			kfree(cifs_sb);
    941		}
    942	}
    943	return root;
    944}
    945
    946
    947static ssize_t
    948cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter)
    949{
    950	ssize_t rc;
    951	struct inode *inode = file_inode(iocb->ki_filp);
    952
    953	if (iocb->ki_flags & IOCB_DIRECT)
    954		return cifs_user_readv(iocb, iter);
    955
    956	rc = cifs_revalidate_mapping(inode);
    957	if (rc)
    958		return rc;
    959
    960	return generic_file_read_iter(iocb, iter);
    961}
    962
    963static ssize_t cifs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
    964{
    965	struct inode *inode = file_inode(iocb->ki_filp);
    966	struct cifsInodeInfo *cinode = CIFS_I(inode);
    967	ssize_t written;
    968	int rc;
    969
    970	if (iocb->ki_filp->f_flags & O_DIRECT) {
    971		written = cifs_user_writev(iocb, from);
    972		if (written > 0 && CIFS_CACHE_READ(cinode)) {
    973			cifs_zap_mapping(inode);
    974			cifs_dbg(FYI,
    975				 "Set no oplock for inode=%p after a write operation\n",
    976				 inode);
    977			cinode->oplock = 0;
    978		}
    979		return written;
    980	}
    981
    982	written = cifs_get_writer(cinode);
    983	if (written)
    984		return written;
    985
    986	written = generic_file_write_iter(iocb, from);
    987
    988	if (CIFS_CACHE_WRITE(CIFS_I(inode)))
    989		goto out;
    990
    991	rc = filemap_fdatawrite(inode->i_mapping);
    992	if (rc)
    993		cifs_dbg(FYI, "cifs_file_write_iter: %d rc on %p inode\n",
    994			 rc, inode);
    995
    996out:
    997	cifs_put_writer(cinode);
    998	return written;
    999}
   1000
   1001static loff_t cifs_llseek(struct file *file, loff_t offset, int whence)
   1002{
   1003	struct cifsFileInfo *cfile = file->private_data;
   1004	struct cifs_tcon *tcon;
   1005
   1006	/*
   1007	 * whence == SEEK_END || SEEK_DATA || SEEK_HOLE => we must revalidate
   1008	 * the cached file length
   1009	 */
   1010	if (whence != SEEK_SET && whence != SEEK_CUR) {
   1011		int rc;
   1012		struct inode *inode = file_inode(file);
   1013
   1014		/*
   1015		 * We need to be sure that all dirty pages are written and the
   1016		 * server has the newest file length.
   1017		 */
   1018		if (!CIFS_CACHE_READ(CIFS_I(inode)) && inode->i_mapping &&
   1019		    inode->i_mapping->nrpages != 0) {
   1020			rc = filemap_fdatawait(inode->i_mapping);
   1021			if (rc) {
   1022				mapping_set_error(inode->i_mapping, rc);
   1023				return rc;
   1024			}
   1025		}
   1026		/*
   1027		 * Some applications poll for the file length in this strange
   1028		 * way so we must seek to end on non-oplocked files by
   1029		 * setting the revalidate time to zero.
   1030		 */
   1031		CIFS_I(inode)->time = 0;
   1032
   1033		rc = cifs_revalidate_file_attr(file);
   1034		if (rc < 0)
   1035			return (loff_t)rc;
   1036	}
   1037	if (cfile && cfile->tlink) {
   1038		tcon = tlink_tcon(cfile->tlink);
   1039		if (tcon->ses->server->ops->llseek)
   1040			return tcon->ses->server->ops->llseek(file, tcon,
   1041							      offset, whence);
   1042	}
   1043	return generic_file_llseek(file, offset, whence);
   1044}
   1045
   1046static int
   1047cifs_setlease(struct file *file, long arg, struct file_lock **lease, void **priv)
   1048{
   1049	/*
   1050	 * Note that this is called by vfs setlease with i_lock held to
   1051	 * protect *lease from going away.
   1052	 */
   1053	struct inode *inode = file_inode(file);
   1054	struct cifsFileInfo *cfile = file->private_data;
   1055
   1056	if (!(S_ISREG(inode->i_mode)))
   1057		return -EINVAL;
   1058
   1059	/* Check if file is oplocked if this is request for new lease */
   1060	if (arg == F_UNLCK ||
   1061	    ((arg == F_RDLCK) && CIFS_CACHE_READ(CIFS_I(inode))) ||
   1062	    ((arg == F_WRLCK) && CIFS_CACHE_WRITE(CIFS_I(inode))))
   1063		return generic_setlease(file, arg, lease, priv);
   1064	else if (tlink_tcon(cfile->tlink)->local_lease &&
   1065		 !CIFS_CACHE_READ(CIFS_I(inode)))
   1066		/*
   1067		 * If the server claims to support oplock on this file, then we
   1068		 * still need to check oplock even if the local_lease mount
   1069		 * option is set, but there are servers which do not support
   1070		 * oplock for which this mount option may be useful if the user
   1071		 * knows that the file won't be changed on the server by anyone
   1072		 * else.
   1073		 */
   1074		return generic_setlease(file, arg, lease, priv);
   1075	else
   1076		return -EAGAIN;
   1077}
   1078
   1079struct file_system_type cifs_fs_type = {
   1080	.owner = THIS_MODULE,
   1081	.name = "cifs",
   1082	.init_fs_context = smb3_init_fs_context,
   1083	.parameters = smb3_fs_parameters,
   1084	.kill_sb = cifs_kill_sb,
   1085	.fs_flags = FS_RENAME_DOES_D_MOVE,
   1086};
   1087MODULE_ALIAS_FS("cifs");
   1088
   1089struct file_system_type smb3_fs_type = {
   1090	.owner = THIS_MODULE,
   1091	.name = "smb3",
   1092	.init_fs_context = smb3_init_fs_context,
   1093	.parameters = smb3_fs_parameters,
   1094	.kill_sb = cifs_kill_sb,
   1095	.fs_flags = FS_RENAME_DOES_D_MOVE,
   1096};
   1097MODULE_ALIAS_FS("smb3");
   1098MODULE_ALIAS("smb3");
   1099
   1100const struct inode_operations cifs_dir_inode_ops = {
   1101	.create = cifs_create,
   1102	.atomic_open = cifs_atomic_open,
   1103	.lookup = cifs_lookup,
   1104	.getattr = cifs_getattr,
   1105	.unlink = cifs_unlink,
   1106	.link = cifs_hardlink,
   1107	.mkdir = cifs_mkdir,
   1108	.rmdir = cifs_rmdir,
   1109	.rename = cifs_rename2,
   1110	.permission = cifs_permission,
   1111	.setattr = cifs_setattr,
   1112	.symlink = cifs_symlink,
   1113	.mknod   = cifs_mknod,
   1114	.listxattr = cifs_listxattr,
   1115};
   1116
   1117const struct inode_operations cifs_file_inode_ops = {
   1118	.setattr = cifs_setattr,
   1119	.getattr = cifs_getattr,
   1120	.permission = cifs_permission,
   1121	.listxattr = cifs_listxattr,
   1122	.fiemap = cifs_fiemap,
   1123};
   1124
   1125const struct inode_operations cifs_symlink_inode_ops = {
   1126	.get_link = cifs_get_link,
   1127	.permission = cifs_permission,
   1128	.listxattr = cifs_listxattr,
   1129};
   1130
   1131static loff_t cifs_remap_file_range(struct file *src_file, loff_t off,
   1132		struct file *dst_file, loff_t destoff, loff_t len,
   1133		unsigned int remap_flags)
   1134{
   1135	struct inode *src_inode = file_inode(src_file);
   1136	struct inode *target_inode = file_inode(dst_file);
   1137	struct cifsFileInfo *smb_file_src = src_file->private_data;
   1138	struct cifsFileInfo *smb_file_target;
   1139	struct cifs_tcon *target_tcon;
   1140	unsigned int xid;
   1141	int rc;
   1142
   1143	if (remap_flags & ~(REMAP_FILE_DEDUP | REMAP_FILE_ADVISORY))
   1144		return -EINVAL;
   1145
   1146	cifs_dbg(FYI, "clone range\n");
   1147
   1148	xid = get_xid();
   1149
   1150	if (!src_file->private_data || !dst_file->private_data) {
   1151		rc = -EBADF;
   1152		cifs_dbg(VFS, "missing cifsFileInfo on copy range src file\n");
   1153		goto out;
   1154	}
   1155
   1156	smb_file_target = dst_file->private_data;
   1157	target_tcon = tlink_tcon(smb_file_target->tlink);
   1158
   1159	/*
   1160	 * Note: cifs case is easier than btrfs since server responsible for
   1161	 * checks for proper open modes and file type and if it wants
   1162	 * server could even support copy of range where source = target
   1163	 */
   1164	lock_two_nondirectories(target_inode, src_inode);
   1165
   1166	if (len == 0)
   1167		len = src_inode->i_size - off;
   1168
   1169	cifs_dbg(FYI, "about to flush pages\n");
   1170	/* should we flush first and last page first */
   1171	truncate_inode_pages_range(&target_inode->i_data, destoff,
   1172				   PAGE_ALIGN(destoff + len)-1);
   1173
   1174	if (target_tcon->ses->server->ops->duplicate_extents)
   1175		rc = target_tcon->ses->server->ops->duplicate_extents(xid,
   1176			smb_file_src, smb_file_target, off, len, destoff);
   1177	else
   1178		rc = -EOPNOTSUPP;
   1179
   1180	/* force revalidate of size and timestamps of target file now
   1181	   that target is updated on the server */
   1182	CIFS_I(target_inode)->time = 0;
   1183	/* although unlocking in the reverse order from locking is not
   1184	   strictly necessary here it is a little cleaner to be consistent */
   1185	unlock_two_nondirectories(src_inode, target_inode);
   1186out:
   1187	free_xid(xid);
   1188	return rc < 0 ? rc : len;
   1189}
   1190
   1191ssize_t cifs_file_copychunk_range(unsigned int xid,
   1192				struct file *src_file, loff_t off,
   1193				struct file *dst_file, loff_t destoff,
   1194				size_t len, unsigned int flags)
   1195{
   1196	struct inode *src_inode = file_inode(src_file);
   1197	struct inode *target_inode = file_inode(dst_file);
   1198	struct cifsFileInfo *smb_file_src;
   1199	struct cifsFileInfo *smb_file_target;
   1200	struct cifs_tcon *src_tcon;
   1201	struct cifs_tcon *target_tcon;
   1202	ssize_t rc;
   1203
   1204	cifs_dbg(FYI, "copychunk range\n");
   1205
   1206	if (!src_file->private_data || !dst_file->private_data) {
   1207		rc = -EBADF;
   1208		cifs_dbg(VFS, "missing cifsFileInfo on copy range src file\n");
   1209		goto out;
   1210	}
   1211
   1212	rc = -EXDEV;
   1213	smb_file_target = dst_file->private_data;
   1214	smb_file_src = src_file->private_data;
   1215	src_tcon = tlink_tcon(smb_file_src->tlink);
   1216	target_tcon = tlink_tcon(smb_file_target->tlink);
   1217
   1218	if (src_tcon->ses != target_tcon->ses) {
   1219		cifs_dbg(VFS, "source and target of copy not on same server\n");
   1220		goto out;
   1221	}
   1222
   1223	rc = -EOPNOTSUPP;
   1224	if (!target_tcon->ses->server->ops->copychunk_range)
   1225		goto out;
   1226
   1227	/*
   1228	 * Note: cifs case is easier than btrfs since server responsible for
   1229	 * checks for proper open modes and file type and if it wants
   1230	 * server could even support copy of range where source = target
   1231	 */
   1232	lock_two_nondirectories(target_inode, src_inode);
   1233
   1234	cifs_dbg(FYI, "about to flush pages\n");
   1235	/* should we flush first and last page first */
   1236	truncate_inode_pages(&target_inode->i_data, 0);
   1237
   1238	rc = file_modified(dst_file);
   1239	if (!rc)
   1240		rc = target_tcon->ses->server->ops->copychunk_range(xid,
   1241			smb_file_src, smb_file_target, off, len, destoff);
   1242
   1243	file_accessed(src_file);
   1244
   1245	/* force revalidate of size and timestamps of target file now
   1246	 * that target is updated on the server
   1247	 */
   1248	CIFS_I(target_inode)->time = 0;
   1249	/* although unlocking in the reverse order from locking is not
   1250	 * strictly necessary here it is a little cleaner to be consistent
   1251	 */
   1252	unlock_two_nondirectories(src_inode, target_inode);
   1253
   1254out:
   1255	return rc;
   1256}
   1257
   1258/*
   1259 * Directory operations under CIFS/SMB2/SMB3 are synchronous, so fsync()
   1260 * is a dummy operation.
   1261 */
   1262static int cifs_dir_fsync(struct file *file, loff_t start, loff_t end, int datasync)
   1263{
   1264	cifs_dbg(FYI, "Sync directory - name: %pD datasync: 0x%x\n",
   1265		 file, datasync);
   1266
   1267	return 0;
   1268}
   1269
   1270static ssize_t cifs_copy_file_range(struct file *src_file, loff_t off,
   1271				struct file *dst_file, loff_t destoff,
   1272				size_t len, unsigned int flags)
   1273{
   1274	unsigned int xid = get_xid();
   1275	ssize_t rc;
   1276	struct cifsFileInfo *cfile = dst_file->private_data;
   1277
   1278	if (cfile->swapfile)
   1279		return -EOPNOTSUPP;
   1280
   1281	rc = cifs_file_copychunk_range(xid, src_file, off, dst_file, destoff,
   1282					len, flags);
   1283	free_xid(xid);
   1284
   1285	if (rc == -EOPNOTSUPP || rc == -EXDEV)
   1286		rc = generic_copy_file_range(src_file, off, dst_file,
   1287					     destoff, len, flags);
   1288	return rc;
   1289}
   1290
   1291const struct file_operations cifs_file_ops = {
   1292	.read_iter = cifs_loose_read_iter,
   1293	.write_iter = cifs_file_write_iter,
   1294	.open = cifs_open,
   1295	.release = cifs_close,
   1296	.lock = cifs_lock,
   1297	.flock = cifs_flock,
   1298	.fsync = cifs_fsync,
   1299	.flush = cifs_flush,
   1300	.mmap  = cifs_file_mmap,
   1301	.splice_read = generic_file_splice_read,
   1302	.splice_write = iter_file_splice_write,
   1303	.llseek = cifs_llseek,
   1304	.unlocked_ioctl	= cifs_ioctl,
   1305	.copy_file_range = cifs_copy_file_range,
   1306	.remap_file_range = cifs_remap_file_range,
   1307	.setlease = cifs_setlease,
   1308	.fallocate = cifs_fallocate,
   1309};
   1310
   1311const struct file_operations cifs_file_strict_ops = {
   1312	.read_iter = cifs_strict_readv,
   1313	.write_iter = cifs_strict_writev,
   1314	.open = cifs_open,
   1315	.release = cifs_close,
   1316	.lock = cifs_lock,
   1317	.flock = cifs_flock,
   1318	.fsync = cifs_strict_fsync,
   1319	.flush = cifs_flush,
   1320	.mmap = cifs_file_strict_mmap,
   1321	.splice_read = generic_file_splice_read,
   1322	.splice_write = iter_file_splice_write,
   1323	.llseek = cifs_llseek,
   1324	.unlocked_ioctl	= cifs_ioctl,
   1325	.copy_file_range = cifs_copy_file_range,
   1326	.remap_file_range = cifs_remap_file_range,
   1327	.setlease = cifs_setlease,
   1328	.fallocate = cifs_fallocate,
   1329};
   1330
   1331const struct file_operations cifs_file_direct_ops = {
   1332	.read_iter = cifs_direct_readv,
   1333	.write_iter = cifs_direct_writev,
   1334	.open = cifs_open,
   1335	.release = cifs_close,
   1336	.lock = cifs_lock,
   1337	.flock = cifs_flock,
   1338	.fsync = cifs_fsync,
   1339	.flush = cifs_flush,
   1340	.mmap = cifs_file_mmap,
   1341	.splice_read = generic_file_splice_read,
   1342	.splice_write = iter_file_splice_write,
   1343	.unlocked_ioctl  = cifs_ioctl,
   1344	.copy_file_range = cifs_copy_file_range,
   1345	.remap_file_range = cifs_remap_file_range,
   1346	.llseek = cifs_llseek,
   1347	.setlease = cifs_setlease,
   1348	.fallocate = cifs_fallocate,
   1349};
   1350
   1351const struct file_operations cifs_file_nobrl_ops = {
   1352	.read_iter = cifs_loose_read_iter,
   1353	.write_iter = cifs_file_write_iter,
   1354	.open = cifs_open,
   1355	.release = cifs_close,
   1356	.fsync = cifs_fsync,
   1357	.flush = cifs_flush,
   1358	.mmap  = cifs_file_mmap,
   1359	.splice_read = generic_file_splice_read,
   1360	.splice_write = iter_file_splice_write,
   1361	.llseek = cifs_llseek,
   1362	.unlocked_ioctl	= cifs_ioctl,
   1363	.copy_file_range = cifs_copy_file_range,
   1364	.remap_file_range = cifs_remap_file_range,
   1365	.setlease = cifs_setlease,
   1366	.fallocate = cifs_fallocate,
   1367};
   1368
   1369const struct file_operations cifs_file_strict_nobrl_ops = {
   1370	.read_iter = cifs_strict_readv,
   1371	.write_iter = cifs_strict_writev,
   1372	.open = cifs_open,
   1373	.release = cifs_close,
   1374	.fsync = cifs_strict_fsync,
   1375	.flush = cifs_flush,
   1376	.mmap = cifs_file_strict_mmap,
   1377	.splice_read = generic_file_splice_read,
   1378	.splice_write = iter_file_splice_write,
   1379	.llseek = cifs_llseek,
   1380	.unlocked_ioctl	= cifs_ioctl,
   1381	.copy_file_range = cifs_copy_file_range,
   1382	.remap_file_range = cifs_remap_file_range,
   1383	.setlease = cifs_setlease,
   1384	.fallocate = cifs_fallocate,
   1385};
   1386
   1387const struct file_operations cifs_file_direct_nobrl_ops = {
   1388	.read_iter = cifs_direct_readv,
   1389	.write_iter = cifs_direct_writev,
   1390	.open = cifs_open,
   1391	.release = cifs_close,
   1392	.fsync = cifs_fsync,
   1393	.flush = cifs_flush,
   1394	.mmap = cifs_file_mmap,
   1395	.splice_read = generic_file_splice_read,
   1396	.splice_write = iter_file_splice_write,
   1397	.unlocked_ioctl  = cifs_ioctl,
   1398	.copy_file_range = cifs_copy_file_range,
   1399	.remap_file_range = cifs_remap_file_range,
   1400	.llseek = cifs_llseek,
   1401	.setlease = cifs_setlease,
   1402	.fallocate = cifs_fallocate,
   1403};
   1404
   1405const struct file_operations cifs_dir_ops = {
   1406	.iterate_shared = cifs_readdir,
   1407	.release = cifs_closedir,
   1408	.read    = generic_read_dir,
   1409	.unlocked_ioctl  = cifs_ioctl,
   1410	.copy_file_range = cifs_copy_file_range,
   1411	.remap_file_range = cifs_remap_file_range,
   1412	.llseek = generic_file_llseek,
   1413	.fsync = cifs_dir_fsync,
   1414};
   1415
   1416static void
   1417cifs_init_once(void *inode)
   1418{
   1419	struct cifsInodeInfo *cifsi = inode;
   1420
   1421	inode_init_once(&cifsi->netfs.inode);
   1422	init_rwsem(&cifsi->lock_sem);
   1423}
   1424
   1425static int __init
   1426cifs_init_inodecache(void)
   1427{
   1428	cifs_inode_cachep = kmem_cache_create("cifs_inode_cache",
   1429					      sizeof(struct cifsInodeInfo),
   1430					      0, (SLAB_RECLAIM_ACCOUNT|
   1431						SLAB_MEM_SPREAD|SLAB_ACCOUNT),
   1432					      cifs_init_once);
   1433	if (cifs_inode_cachep == NULL)
   1434		return -ENOMEM;
   1435
   1436	return 0;
   1437}
   1438
   1439static void
   1440cifs_destroy_inodecache(void)
   1441{
   1442	/*
   1443	 * Make sure all delayed rcu free inodes are flushed before we
   1444	 * destroy cache.
   1445	 */
   1446	rcu_barrier();
   1447	kmem_cache_destroy(cifs_inode_cachep);
   1448}
   1449
   1450static int
   1451cifs_init_request_bufs(void)
   1452{
   1453	/*
   1454	 * SMB2 maximum header size is bigger than CIFS one - no problems to
   1455	 * allocate some more bytes for CIFS.
   1456	 */
   1457	size_t max_hdr_size = MAX_SMB2_HDR_SIZE;
   1458
   1459	if (CIFSMaxBufSize < 8192) {
   1460	/* Buffer size can not be smaller than 2 * PATH_MAX since maximum
   1461	Unicode path name has to fit in any SMB/CIFS path based frames */
   1462		CIFSMaxBufSize = 8192;
   1463	} else if (CIFSMaxBufSize > 1024*127) {
   1464		CIFSMaxBufSize = 1024 * 127;
   1465	} else {
   1466		CIFSMaxBufSize &= 0x1FE00; /* Round size to even 512 byte mult*/
   1467	}
   1468/*
   1469	cifs_dbg(VFS, "CIFSMaxBufSize %d 0x%x\n",
   1470		 CIFSMaxBufSize, CIFSMaxBufSize);
   1471*/
   1472	cifs_req_cachep = kmem_cache_create_usercopy("cifs_request",
   1473					    CIFSMaxBufSize + max_hdr_size, 0,
   1474					    SLAB_HWCACHE_ALIGN, 0,
   1475					    CIFSMaxBufSize + max_hdr_size,
   1476					    NULL);
   1477	if (cifs_req_cachep == NULL)
   1478		return -ENOMEM;
   1479
   1480	if (cifs_min_rcv < 1)
   1481		cifs_min_rcv = 1;
   1482	else if (cifs_min_rcv > 64) {
   1483		cifs_min_rcv = 64;
   1484		cifs_dbg(VFS, "cifs_min_rcv set to maximum (64)\n");
   1485	}
   1486
   1487	cifs_req_poolp = mempool_create_slab_pool(cifs_min_rcv,
   1488						  cifs_req_cachep);
   1489
   1490	if (cifs_req_poolp == NULL) {
   1491		kmem_cache_destroy(cifs_req_cachep);
   1492		return -ENOMEM;
   1493	}
   1494	/* MAX_CIFS_SMALL_BUFFER_SIZE bytes is enough for most SMB responses and
   1495	almost all handle based requests (but not write response, nor is it
   1496	sufficient for path based requests).  A smaller size would have
   1497	been more efficient (compacting multiple slab items on one 4k page)
   1498	for the case in which debug was on, but this larger size allows
   1499	more SMBs to use small buffer alloc and is still much more
   1500	efficient to alloc 1 per page off the slab compared to 17K (5page)
   1501	alloc of large cifs buffers even when page debugging is on */
   1502	cifs_sm_req_cachep = kmem_cache_create_usercopy("cifs_small_rq",
   1503			MAX_CIFS_SMALL_BUFFER_SIZE, 0, SLAB_HWCACHE_ALIGN,
   1504			0, MAX_CIFS_SMALL_BUFFER_SIZE, NULL);
   1505	if (cifs_sm_req_cachep == NULL) {
   1506		mempool_destroy(cifs_req_poolp);
   1507		kmem_cache_destroy(cifs_req_cachep);
   1508		return -ENOMEM;
   1509	}
   1510
   1511	if (cifs_min_small < 2)
   1512		cifs_min_small = 2;
   1513	else if (cifs_min_small > 256) {
   1514		cifs_min_small = 256;
   1515		cifs_dbg(FYI, "cifs_min_small set to maximum (256)\n");
   1516	}
   1517
   1518	cifs_sm_req_poolp = mempool_create_slab_pool(cifs_min_small,
   1519						     cifs_sm_req_cachep);
   1520
   1521	if (cifs_sm_req_poolp == NULL) {
   1522		mempool_destroy(cifs_req_poolp);
   1523		kmem_cache_destroy(cifs_req_cachep);
   1524		kmem_cache_destroy(cifs_sm_req_cachep);
   1525		return -ENOMEM;
   1526	}
   1527
   1528	return 0;
   1529}
   1530
   1531static void
   1532cifs_destroy_request_bufs(void)
   1533{
   1534	mempool_destroy(cifs_req_poolp);
   1535	kmem_cache_destroy(cifs_req_cachep);
   1536	mempool_destroy(cifs_sm_req_poolp);
   1537	kmem_cache_destroy(cifs_sm_req_cachep);
   1538}
   1539
   1540static int
   1541cifs_init_mids(void)
   1542{
   1543	cifs_mid_cachep = kmem_cache_create("cifs_mpx_ids",
   1544					    sizeof(struct mid_q_entry), 0,
   1545					    SLAB_HWCACHE_ALIGN, NULL);
   1546	if (cifs_mid_cachep == NULL)
   1547		return -ENOMEM;
   1548
   1549	/* 3 is a reasonable minimum number of simultaneous operations */
   1550	cifs_mid_poolp = mempool_create_slab_pool(3, cifs_mid_cachep);
   1551	if (cifs_mid_poolp == NULL) {
   1552		kmem_cache_destroy(cifs_mid_cachep);
   1553		return -ENOMEM;
   1554	}
   1555
   1556	return 0;
   1557}
   1558
   1559static void
   1560cifs_destroy_mids(void)
   1561{
   1562	mempool_destroy(cifs_mid_poolp);
   1563	kmem_cache_destroy(cifs_mid_cachep);
   1564}
   1565
   1566static int __init
   1567init_cifs(void)
   1568{
   1569	int rc = 0;
   1570	cifs_proc_init();
   1571	INIT_LIST_HEAD(&cifs_tcp_ses_list);
   1572/*
   1573 *  Initialize Global counters
   1574 */
   1575	atomic_set(&sesInfoAllocCount, 0);
   1576	atomic_set(&tconInfoAllocCount, 0);
   1577	atomic_set(&tcpSesNextId, 0);
   1578	atomic_set(&tcpSesAllocCount, 0);
   1579	atomic_set(&tcpSesReconnectCount, 0);
   1580	atomic_set(&tconInfoReconnectCount, 0);
   1581
   1582	atomic_set(&bufAllocCount, 0);
   1583	atomic_set(&smBufAllocCount, 0);
   1584#ifdef CONFIG_CIFS_STATS2
   1585	atomic_set(&totBufAllocCount, 0);
   1586	atomic_set(&totSmBufAllocCount, 0);
   1587	if (slow_rsp_threshold < 1)
   1588		cifs_dbg(FYI, "slow_response_threshold msgs disabled\n");
   1589	else if (slow_rsp_threshold > 32767)
   1590		cifs_dbg(VFS,
   1591		       "slow response threshold set higher than recommended (0 to 32767)\n");
   1592#endif /* CONFIG_CIFS_STATS2 */
   1593
   1594	atomic_set(&midCount, 0);
   1595	GlobalCurrentXid = 0;
   1596	GlobalTotalActiveXid = 0;
   1597	GlobalMaxActiveXid = 0;
   1598	spin_lock_init(&cifs_tcp_ses_lock);
   1599	spin_lock_init(&GlobalMid_Lock);
   1600
   1601	cifs_lock_secret = get_random_u32();
   1602
   1603	if (cifs_max_pending < 2) {
   1604		cifs_max_pending = 2;
   1605		cifs_dbg(FYI, "cifs_max_pending set to min of 2\n");
   1606	} else if (cifs_max_pending > CIFS_MAX_REQ) {
   1607		cifs_max_pending = CIFS_MAX_REQ;
   1608		cifs_dbg(FYI, "cifs_max_pending set to max of %u\n",
   1609			 CIFS_MAX_REQ);
   1610	}
   1611
   1612	cifsiod_wq = alloc_workqueue("cifsiod", WQ_FREEZABLE|WQ_MEM_RECLAIM, 0);
   1613	if (!cifsiod_wq) {
   1614		rc = -ENOMEM;
   1615		goto out_clean_proc;
   1616	}
   1617
   1618	/*
   1619	 * Consider in future setting limit!=0 maybe to min(num_of_cores - 1, 3)
   1620	 * so that we don't launch too many worker threads but
   1621	 * Documentation/core-api/workqueue.rst recommends setting it to 0
   1622	 */
   1623
   1624	/* WQ_UNBOUND allows decrypt tasks to run on any CPU */
   1625	decrypt_wq = alloc_workqueue("smb3decryptd",
   1626				     WQ_UNBOUND|WQ_FREEZABLE|WQ_MEM_RECLAIM, 0);
   1627	if (!decrypt_wq) {
   1628		rc = -ENOMEM;
   1629		goto out_destroy_cifsiod_wq;
   1630	}
   1631
   1632	fileinfo_put_wq = alloc_workqueue("cifsfileinfoput",
   1633				     WQ_UNBOUND|WQ_FREEZABLE|WQ_MEM_RECLAIM, 0);
   1634	if (!fileinfo_put_wq) {
   1635		rc = -ENOMEM;
   1636		goto out_destroy_decrypt_wq;
   1637	}
   1638
   1639	cifsoplockd_wq = alloc_workqueue("cifsoplockd",
   1640					 WQ_FREEZABLE|WQ_MEM_RECLAIM, 0);
   1641	if (!cifsoplockd_wq) {
   1642		rc = -ENOMEM;
   1643		goto out_destroy_fileinfo_put_wq;
   1644	}
   1645
   1646	deferredclose_wq = alloc_workqueue("deferredclose",
   1647					   WQ_FREEZABLE|WQ_MEM_RECLAIM, 0);
   1648	if (!deferredclose_wq) {
   1649		rc = -ENOMEM;
   1650		goto out_destroy_cifsoplockd_wq;
   1651	}
   1652
   1653	rc = cifs_init_inodecache();
   1654	if (rc)
   1655		goto out_destroy_deferredclose_wq;
   1656
   1657	rc = cifs_init_mids();
   1658	if (rc)
   1659		goto out_destroy_inodecache;
   1660
   1661	rc = cifs_init_request_bufs();
   1662	if (rc)
   1663		goto out_destroy_mids;
   1664
   1665#ifdef CONFIG_CIFS_DFS_UPCALL
   1666	rc = dfs_cache_init();
   1667	if (rc)
   1668		goto out_destroy_request_bufs;
   1669#endif /* CONFIG_CIFS_DFS_UPCALL */
   1670#ifdef CONFIG_CIFS_UPCALL
   1671	rc = init_cifs_spnego();
   1672	if (rc)
   1673		goto out_destroy_dfs_cache;
   1674#endif /* CONFIG_CIFS_UPCALL */
   1675#ifdef CONFIG_CIFS_SWN_UPCALL
   1676	rc = cifs_genl_init();
   1677	if (rc)
   1678		goto out_register_key_type;
   1679#endif /* CONFIG_CIFS_SWN_UPCALL */
   1680
   1681	rc = init_cifs_idmap();
   1682	if (rc)
   1683		goto out_cifs_swn_init;
   1684
   1685	rc = register_filesystem(&cifs_fs_type);
   1686	if (rc)
   1687		goto out_init_cifs_idmap;
   1688
   1689	rc = register_filesystem(&smb3_fs_type);
   1690	if (rc) {
   1691		unregister_filesystem(&cifs_fs_type);
   1692		goto out_init_cifs_idmap;
   1693	}
   1694
   1695	return 0;
   1696
   1697out_init_cifs_idmap:
   1698	exit_cifs_idmap();
   1699out_cifs_swn_init:
   1700#ifdef CONFIG_CIFS_SWN_UPCALL
   1701	cifs_genl_exit();
   1702out_register_key_type:
   1703#endif
   1704#ifdef CONFIG_CIFS_UPCALL
   1705	exit_cifs_spnego();
   1706out_destroy_dfs_cache:
   1707#endif
   1708#ifdef CONFIG_CIFS_DFS_UPCALL
   1709	dfs_cache_destroy();
   1710out_destroy_request_bufs:
   1711#endif
   1712	cifs_destroy_request_bufs();
   1713out_destroy_mids:
   1714	cifs_destroy_mids();
   1715out_destroy_inodecache:
   1716	cifs_destroy_inodecache();
   1717out_destroy_deferredclose_wq:
   1718	destroy_workqueue(deferredclose_wq);
   1719out_destroy_cifsoplockd_wq:
   1720	destroy_workqueue(cifsoplockd_wq);
   1721out_destroy_fileinfo_put_wq:
   1722	destroy_workqueue(fileinfo_put_wq);
   1723out_destroy_decrypt_wq:
   1724	destroy_workqueue(decrypt_wq);
   1725out_destroy_cifsiod_wq:
   1726	destroy_workqueue(cifsiod_wq);
   1727out_clean_proc:
   1728	cifs_proc_clean();
   1729	return rc;
   1730}
   1731
   1732static void __exit
   1733exit_cifs(void)
   1734{
   1735	cifs_dbg(NOISY, "exit_smb3\n");
   1736	unregister_filesystem(&cifs_fs_type);
   1737	unregister_filesystem(&smb3_fs_type);
   1738	cifs_dfs_release_automount_timer();
   1739	exit_cifs_idmap();
   1740#ifdef CONFIG_CIFS_SWN_UPCALL
   1741	cifs_genl_exit();
   1742#endif
   1743#ifdef CONFIG_CIFS_UPCALL
   1744	exit_cifs_spnego();
   1745#endif
   1746#ifdef CONFIG_CIFS_DFS_UPCALL
   1747	dfs_cache_destroy();
   1748#endif
   1749	cifs_destroy_request_bufs();
   1750	cifs_destroy_mids();
   1751	cifs_destroy_inodecache();
   1752	destroy_workqueue(deferredclose_wq);
   1753	destroy_workqueue(cifsoplockd_wq);
   1754	destroy_workqueue(decrypt_wq);
   1755	destroy_workqueue(fileinfo_put_wq);
   1756	destroy_workqueue(cifsiod_wq);
   1757	cifs_proc_clean();
   1758}
   1759
   1760MODULE_AUTHOR("Steve French");
   1761MODULE_LICENSE("GPL");	/* combination of LGPL + GPL source behaves as GPL */
   1762MODULE_DESCRIPTION
   1763	("VFS to access SMB3 servers e.g. Samba, Macs, Azure and Windows (and "
   1764	"also older servers complying with the SNIA CIFS Specification)");
   1765MODULE_VERSION(CIFS_VERSION);
   1766MODULE_SOFTDEP("ecb");
   1767MODULE_SOFTDEP("hmac");
   1768MODULE_SOFTDEP("md5");
   1769MODULE_SOFTDEP("nls");
   1770MODULE_SOFTDEP("aes");
   1771MODULE_SOFTDEP("cmac");
   1772MODULE_SOFTDEP("sha256");
   1773MODULE_SOFTDEP("sha512");
   1774MODULE_SOFTDEP("aead2");
   1775MODULE_SOFTDEP("ccm");
   1776MODULE_SOFTDEP("gcm");
   1777module_init(init_cifs)
   1778module_exit(exit_cifs)