linux/fs/cifs/cifsfs.c
<<
>>
Prefs
   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
  56int cifsFYI = 0;
  57bool traceSMB;
  58bool enable_oplocks = true;
  59bool linuxExtEnabled = true;
  60bool lookupCacheEnabled = true;
  61unsigned int global_secflags = CIFSSEC_DEF;
  62/* unsigned int ntlmv2_support = 0; */
  63unsigned int sign_CIFS_PDUs = 1;
  64static const struct super_operations cifs_super_ops;
  65unsigned int CIFSMaxBufSize = CIFS_MAX_MSGSIZE;
  66module_param(CIFSMaxBufSize, uint, 0444);
  67MODULE_PARM_DESC(CIFSMaxBufSize, "Network buffer size (not including header). "
  68                                 "Default: 16384 Range: 8192 to 130048");
  69unsigned int cifs_min_rcv = CIFS_MIN_RCV_POOL;
  70module_param(cifs_min_rcv, uint, 0444);
  71MODULE_PARM_DESC(cifs_min_rcv, "Network buffers in pool. Default: 4 Range: "
  72                                "1 to 64");
  73unsigned int cifs_min_small = 30;
  74module_param(cifs_min_small, uint, 0444);
  75MODULE_PARM_DESC(cifs_min_small, "Small network buffers in pool. Default: 30 "
  76                                 "Range: 2 to 256");
  77unsigned int cifs_max_pending = CIFS_MAX_REQ;
  78module_param(cifs_max_pending, uint, 0444);
  79MODULE_PARM_DESC(cifs_max_pending, "Simultaneous requests to server. "
  80                                   "Default: 32767 Range: 2 to 32767.");
  81module_param(enable_oplocks, bool, 0644);
  82MODULE_PARM_DESC(enable_oplocks, "Enable or disable oplocks. Default: y/Y/1");
  83
  84extern mempool_t *cifs_sm_req_poolp;
  85extern mempool_t *cifs_req_poolp;
  86extern mempool_t *cifs_mid_poolp;
  87
  88struct workqueue_struct *cifsiod_wq;
  89struct 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 */
  98void
  99cifs_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
 107void
 108cifs_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
 116static int
 117cifs_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
 176out_no_root:
 177        cifs_dbg(VFS, "%s: get root inode failed\n", __func__);
 178        return rc;
 179}
 180
 181static 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
 188static int
 189cifs_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
 218static 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
 230static 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
 248static struct kmem_cache *cifs_inode_cachep;
 249static struct kmem_cache *cifs_req_cachep;
 250static struct kmem_cache *cifs_mid_cachep;
 251static struct kmem_cache *cifs_sm_req_cachep;
 252mempool_t *cifs_sm_req_poolp;
 253mempool_t *cifs_req_poolp;
 254mempool_t *cifs_mid_poolp;
 255
 256static struct inode *
 257cifs_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
 290static 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
 296static void
 297cifs_destroy_inode(struct inode *inode)
 298{
 299        call_rcu(&inode->i_rcu, cifs_i_callback);
 300}
 301
 302static void
 303cifs_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
 310static void
 311cifs_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
 334static void
 335cifs_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
 371static void
 372cifs_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
 384static void
 385cifs_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 */
 401static int
 402cifs_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
 531static 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
 568static int cifs_show_stats(struct seq_file *s, struct dentry *root)
 569{
 570        /* BB FIXME */
 571        return 0;
 572}
 573#endif
 574
 575static 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
 582static 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
 591static 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 */
 613static struct dentry *
 614cifs_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
 669static 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
 676static struct dentry *
 677cifs_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
 754out_super:
 755        deactivate_locked_super(sb);
 756out:
 757        cifs_cleanup_volume_info(volume_info);
 758        return root;
 759
 760out_free:
 761        kfree(cifs_sb->prepath);
 762        kfree(cifs_sb->mountdata);
 763        kfree(cifs_sb);
 764out_nls:
 765        unload_nls(volume_info->local_nls);
 766        goto out;
 767}
 768
 769static ssize_t
 770cifs_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
 785static 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
 818out:
 819        cifs_put_writer(cinode);
 820        return written;
 821}
 822
 823static 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
 859static int
 860cifs_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
 892struct 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};
 899MODULE_ALIAS_FS("cifs");
 900const 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
 917const 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
 924const struct inode_operations cifs_symlink_inode_ops = {
 925        .get_link = cifs_get_link,
 926        .permission = cifs_permission,
 927        .listxattr = cifs_listxattr,
 928};
 929
 930static 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);
 978out:
 979        free_xid(xid);
 980        return rc;
 981}
 982
 983ssize_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
1046out:
1047        return rc;
1048}
1049
1050static ssize_t cifs_copy_file_range(struct file *src_file, loff_t off,
1051                                struct file *dst_file, loff_t destoff,
1052                                size_t len, unsigned int flags)
1053{
1054        unsigned int xid = get_xid();
1055        ssize_t rc;
1056
1057        rc = cifs_file_copychunk_range(xid, src_file, off, dst_file, destoff,
1058                                        len, flags);
1059        free_xid(xid);
1060        return rc;
1061}
1062
1063const struct file_operations cifs_file_ops = {
1064        .read_iter = cifs_loose_read_iter,
1065        .write_iter = cifs_file_write_iter,
1066        .open = cifs_open,
1067        .release = cifs_close,
1068        .lock = cifs_lock,
1069        .fsync = cifs_fsync,
1070        .flush = cifs_flush,
1071        .mmap  = cifs_file_mmap,
1072        .splice_read = generic_file_splice_read,
1073        .splice_write = iter_file_splice_write,
1074        .llseek = cifs_llseek,
1075        .unlocked_ioctl = cifs_ioctl,
1076        .copy_file_range = cifs_copy_file_range,
1077        .clone_file_range = cifs_clone_file_range,
1078        .setlease = cifs_setlease,
1079        .fallocate = cifs_fallocate,
1080};
1081
1082const struct file_operations cifs_file_strict_ops = {
1083        .read_iter = cifs_strict_readv,
1084        .write_iter = cifs_strict_writev,
1085        .open = cifs_open,
1086        .release = cifs_close,
1087        .lock = cifs_lock,
1088        .fsync = cifs_strict_fsync,
1089        .flush = cifs_flush,
1090        .mmap = cifs_file_strict_mmap,
1091        .splice_read = generic_file_splice_read,
1092        .splice_write = iter_file_splice_write,
1093        .llseek = cifs_llseek,
1094        .unlocked_ioctl = cifs_ioctl,
1095        .copy_file_range = cifs_copy_file_range,
1096        .clone_file_range = cifs_clone_file_range,
1097        .setlease = cifs_setlease,
1098        .fallocate = cifs_fallocate,
1099};
1100
1101const struct file_operations cifs_file_direct_ops = {
1102        /* BB reevaluate whether they can be done with directio, no cache */
1103        .read_iter = cifs_user_readv,
1104        .write_iter = cifs_user_writev,
1105        .open = cifs_open,
1106        .release = cifs_close,
1107        .lock = cifs_lock,
1108        .fsync = cifs_fsync,
1109        .flush = cifs_flush,
1110        .mmap = cifs_file_mmap,
1111        .splice_read = generic_file_splice_read,
1112        .splice_write = iter_file_splice_write,
1113        .unlocked_ioctl  = cifs_ioctl,
1114        .copy_file_range = cifs_copy_file_range,
1115        .clone_file_range = cifs_clone_file_range,
1116        .llseek = cifs_llseek,
1117        .setlease = cifs_setlease,
1118        .fallocate = cifs_fallocate,
1119};
1120
1121const struct file_operations cifs_file_nobrl_ops = {
1122        .read_iter = cifs_loose_read_iter,
1123        .write_iter = cifs_file_write_iter,
1124        .open = cifs_open,
1125        .release = cifs_close,
1126        .fsync = cifs_fsync,
1127        .flush = cifs_flush,
1128        .mmap  = cifs_file_mmap,
1129        .splice_read = generic_file_splice_read,
1130        .splice_write = iter_file_splice_write,
1131        .llseek = cifs_llseek,
1132        .unlocked_ioctl = cifs_ioctl,
1133        .copy_file_range = cifs_copy_file_range,
1134        .clone_file_range = cifs_clone_file_range,
1135        .setlease = cifs_setlease,
1136        .fallocate = cifs_fallocate,
1137};
1138
1139const struct file_operations cifs_file_strict_nobrl_ops = {
1140        .read_iter = cifs_strict_readv,
1141        .write_iter = cifs_strict_writev,
1142        .open = cifs_open,
1143        .release = cifs_close,
1144        .fsync = cifs_strict_fsync,
1145        .flush = cifs_flush,
1146        .mmap = cifs_file_strict_mmap,
1147        .splice_read = generic_file_splice_read,
1148        .splice_write = iter_file_splice_write,
1149        .llseek = cifs_llseek,
1150        .unlocked_ioctl = cifs_ioctl,
1151        .copy_file_range = cifs_copy_file_range,
1152        .clone_file_range = cifs_clone_file_range,
1153        .setlease = cifs_setlease,
1154        .fallocate = cifs_fallocate,
1155};
1156
1157const struct file_operations cifs_file_direct_nobrl_ops = {
1158        /* BB reevaluate whether they can be done with directio, no cache */
1159        .read_iter = cifs_user_readv,
1160        .write_iter = cifs_user_writev,
1161        .open = cifs_open,
1162        .release = cifs_close,
1163        .fsync = cifs_fsync,
1164        .flush = cifs_flush,
1165        .mmap = cifs_file_mmap,
1166        .splice_read = generic_file_splice_read,
1167        .splice_write = iter_file_splice_write,
1168        .unlocked_ioctl  = cifs_ioctl,
1169        .copy_file_range = cifs_copy_file_range,
1170        .clone_file_range = cifs_clone_file_range,
1171        .llseek = cifs_llseek,
1172        .setlease = cifs_setlease,
1173        .fallocate = cifs_fallocate,
1174};
1175
1176const struct file_operations cifs_dir_ops = {
1177        .iterate_shared = cifs_readdir,
1178        .release = cifs_closedir,
1179        .read    = generic_read_dir,
1180        .unlocked_ioctl  = cifs_ioctl,
1181        .copy_file_range = cifs_copy_file_range,
1182        .clone_file_range = cifs_clone_file_range,
1183        .llseek = generic_file_llseek,
1184};
1185
1186static void
1187cifs_init_once(void *inode)
1188{
1189        struct cifsInodeInfo *cifsi = inode;
1190
1191        inode_init_once(&cifsi->vfs_inode);
1192        init_rwsem(&cifsi->lock_sem);
1193}
1194
1195static int __init
1196cifs_init_inodecache(void)
1197{
1198        cifs_inode_cachep = kmem_cache_create("cifs_inode_cache",
1199                                              sizeof(struct cifsInodeInfo),
1200                                              0, (SLAB_RECLAIM_ACCOUNT|
1201                                                SLAB_MEM_SPREAD|SLAB_ACCOUNT),
1202                                              cifs_init_once);
1203        if (cifs_inode_cachep == NULL)
1204                return -ENOMEM;
1205
1206        return 0;
1207}
1208
1209static void
1210cifs_destroy_inodecache(void)
1211{
1212        /*
1213         * Make sure all delayed rcu free inodes are flushed before we
1214         * destroy cache.
1215         */
1216        rcu_barrier();
1217        kmem_cache_destroy(cifs_inode_cachep);
1218}
1219
1220static int
1221cifs_init_request_bufs(void)
1222{
1223        /*
1224         * SMB2 maximum header size is bigger than CIFS one - no problems to
1225         * allocate some more bytes for CIFS.
1226         */
1227        size_t max_hdr_size = MAX_SMB2_HDR_SIZE;
1228
1229        if (CIFSMaxBufSize < 8192) {
1230        /* Buffer size can not be smaller than 2 * PATH_MAX since maximum
1231        Unicode path name has to fit in any SMB/CIFS path based frames */
1232                CIFSMaxBufSize = 8192;
1233        } else if (CIFSMaxBufSize > 1024*127) {
1234                CIFSMaxBufSize = 1024 * 127;
1235        } else {
1236                CIFSMaxBufSize &= 0x1FE00; /* Round size to even 512 byte mult*/
1237        }
1238/*
1239        cifs_dbg(VFS, "CIFSMaxBufSize %d 0x%x\n",
1240                 CIFSMaxBufSize, CIFSMaxBufSize);
1241*/
1242        cifs_req_cachep = kmem_cache_create_usercopy("cifs_request",
1243                                            CIFSMaxBufSize + max_hdr_size, 0,
1244                                            SLAB_HWCACHE_ALIGN, 0,
1245                                            CIFSMaxBufSize + max_hdr_size,
1246                                            NULL);
1247        if (cifs_req_cachep == NULL)
1248                return -ENOMEM;
1249
1250        if (cifs_min_rcv < 1)
1251                cifs_min_rcv = 1;
1252        else if (cifs_min_rcv > 64) {
1253                cifs_min_rcv = 64;
1254                cifs_dbg(VFS, "cifs_min_rcv set to maximum (64)\n");
1255        }
1256
1257        cifs_req_poolp = mempool_create_slab_pool(cifs_min_rcv,
1258                                                  cifs_req_cachep);
1259
1260        if (cifs_req_poolp == NULL) {
1261                kmem_cache_destroy(cifs_req_cachep);
1262                return -ENOMEM;
1263        }
1264        /* MAX_CIFS_SMALL_BUFFER_SIZE bytes is enough for most SMB responses and
1265        almost all handle based requests (but not write response, nor is it
1266        sufficient for path based requests).  A smaller size would have
1267        been more efficient (compacting multiple slab items on one 4k page)
1268        for the case in which debug was on, but this larger size allows
1269        more SMBs to use small buffer alloc and is still much more
1270        efficient to alloc 1 per page off the slab compared to 17K (5page)
1271        alloc of large cifs buffers even when page debugging is on */
1272        cifs_sm_req_cachep = kmem_cache_create_usercopy("cifs_small_rq",
1273                        MAX_CIFS_SMALL_BUFFER_SIZE, 0, SLAB_HWCACHE_ALIGN,
1274                        0, MAX_CIFS_SMALL_BUFFER_SIZE, NULL);
1275        if (cifs_sm_req_cachep == NULL) {
1276                mempool_destroy(cifs_req_poolp);
1277                kmem_cache_destroy(cifs_req_cachep);
1278                return -ENOMEM;
1279        }
1280
1281        if (cifs_min_small < 2)
1282                cifs_min_small = 2;
1283        else if (cifs_min_small > 256) {
1284                cifs_min_small = 256;
1285                cifs_dbg(FYI, "cifs_min_small set to maximum (256)\n");
1286        }
1287
1288        cifs_sm_req_poolp = mempool_create_slab_pool(cifs_min_small,
1289                                                     cifs_sm_req_cachep);
1290
1291        if (cifs_sm_req_poolp == NULL) {
1292                mempool_destroy(cifs_req_poolp);
1293                kmem_cache_destroy(cifs_req_cachep);
1294                kmem_cache_destroy(cifs_sm_req_cachep);
1295                return -ENOMEM;
1296        }
1297
1298        return 0;
1299}
1300
1301static void
1302cifs_destroy_request_bufs(void)
1303{
1304        mempool_destroy(cifs_req_poolp);
1305        kmem_cache_destroy(cifs_req_cachep);
1306        mempool_destroy(cifs_sm_req_poolp);
1307        kmem_cache_destroy(cifs_sm_req_cachep);
1308}
1309
1310static int
1311cifs_init_mids(void)
1312{
1313        cifs_mid_cachep = kmem_cache_create("cifs_mpx_ids",
1314                                            sizeof(struct mid_q_entry), 0,
1315                                            SLAB_HWCACHE_ALIGN, NULL);
1316        if (cifs_mid_cachep == NULL)
1317                return -ENOMEM;
1318
1319        /* 3 is a reasonable minimum number of simultaneous operations */
1320        cifs_mid_poolp = mempool_create_slab_pool(3, cifs_mid_cachep);
1321        if (cifs_mid_poolp == NULL) {
1322                kmem_cache_destroy(cifs_mid_cachep);
1323                return -ENOMEM;
1324        }
1325
1326        return 0;
1327}
1328
1329static void
1330cifs_destroy_mids(void)
1331{
1332        mempool_destroy(cifs_mid_poolp);
1333        kmem_cache_destroy(cifs_mid_cachep);
1334}
1335
1336static int __init
1337init_cifs(void)
1338{
1339        int rc = 0;
1340        cifs_proc_init();
1341        INIT_LIST_HEAD(&cifs_tcp_ses_list);
1342#ifdef CONFIG_CIFS_DNOTIFY_EXPERIMENTAL /* unused temporarily */
1343        INIT_LIST_HEAD(&GlobalDnotifyReqList);
1344        INIT_LIST_HEAD(&GlobalDnotifyRsp_Q);
1345#endif /* was needed for dnotify, and will be needed for inotify when VFS fix */
1346/*
1347 *  Initialize Global counters
1348 */
1349        atomic_set(&sesInfoAllocCount, 0);
1350        atomic_set(&tconInfoAllocCount, 0);
1351        atomic_set(&tcpSesAllocCount, 0);
1352        atomic_set(&tcpSesReconnectCount, 0);
1353        atomic_set(&tconInfoReconnectCount, 0);
1354
1355        atomic_set(&bufAllocCount, 0);
1356        atomic_set(&smBufAllocCount, 0);
1357#ifdef CONFIG_CIFS_STATS2
1358        atomic_set(&totBufAllocCount, 0);
1359        atomic_set(&totSmBufAllocCount, 0);
1360#endif /* CONFIG_CIFS_STATS2 */
1361
1362        atomic_set(&midCount, 0);
1363        GlobalCurrentXid = 0;
1364        GlobalTotalActiveXid = 0;
1365        GlobalMaxActiveXid = 0;
1366        spin_lock_init(&cifs_tcp_ses_lock);
1367        spin_lock_init(&GlobalMid_Lock);
1368
1369        cifs_lock_secret = get_random_u32();
1370
1371        if (cifs_max_pending < 2) {
1372                cifs_max_pending = 2;
1373                cifs_dbg(FYI, "cifs_max_pending set to min of 2\n");
1374        } else if (cifs_max_pending > CIFS_MAX_REQ) {
1375                cifs_max_pending = CIFS_MAX_REQ;
1376                cifs_dbg(FYI, "cifs_max_pending set to max of %u\n",
1377                         CIFS_MAX_REQ);
1378        }
1379
1380        cifsiod_wq = alloc_workqueue("cifsiod", WQ_FREEZABLE|WQ_MEM_RECLAIM, 0);
1381        if (!cifsiod_wq) {
1382                rc = -ENOMEM;
1383                goto out_clean_proc;
1384        }
1385
1386        cifsoplockd_wq = alloc_workqueue("cifsoplockd",
1387                                         WQ_FREEZABLE|WQ_MEM_RECLAIM, 0);
1388        if (!cifsoplockd_wq) {
1389                rc = -ENOMEM;
1390                goto out_destroy_cifsiod_wq;
1391        }
1392
1393        rc = cifs_fscache_register();
1394        if (rc)
1395                goto out_destroy_cifsoplockd_wq;
1396
1397        rc = cifs_init_inodecache();
1398        if (rc)
1399                goto out_unreg_fscache;
1400
1401        rc = cifs_init_mids();
1402        if (rc)
1403                goto out_destroy_inodecache;
1404
1405        rc = cifs_init_request_bufs();
1406        if (rc)
1407                goto out_destroy_mids;
1408
1409#ifdef CONFIG_CIFS_UPCALL
1410        rc = init_cifs_spnego();
1411        if (rc)
1412                goto out_destroy_request_bufs;
1413#endif /* CONFIG_CIFS_UPCALL */
1414
1415#ifdef CONFIG_CIFS_ACL
1416        rc = init_cifs_idmap();
1417        if (rc)
1418                goto out_register_key_type;
1419#endif /* CONFIG_CIFS_ACL */
1420
1421        rc = register_filesystem(&cifs_fs_type);
1422        if (rc)
1423                goto out_init_cifs_idmap;
1424
1425        return 0;
1426
1427out_init_cifs_idmap:
1428#ifdef CONFIG_CIFS_ACL
1429        exit_cifs_idmap();
1430out_register_key_type:
1431#endif
1432#ifdef CONFIG_CIFS_UPCALL
1433        exit_cifs_spnego();
1434out_destroy_request_bufs:
1435#endif
1436        cifs_destroy_request_bufs();
1437out_destroy_mids:
1438        cifs_destroy_mids();
1439out_destroy_inodecache:
1440        cifs_destroy_inodecache();
1441out_unreg_fscache:
1442        cifs_fscache_unregister();
1443out_destroy_cifsoplockd_wq:
1444        destroy_workqueue(cifsoplockd_wq);
1445out_destroy_cifsiod_wq:
1446        destroy_workqueue(cifsiod_wq);
1447out_clean_proc:
1448        cifs_proc_clean();
1449        return rc;
1450}
1451
1452static void __exit
1453exit_cifs(void)
1454{
1455        cifs_dbg(NOISY, "exit_cifs\n");
1456        unregister_filesystem(&cifs_fs_type);
1457        cifs_dfs_release_automount_timer();
1458#ifdef CONFIG_CIFS_ACL
1459        exit_cifs_idmap();
1460#endif
1461#ifdef CONFIG_CIFS_UPCALL
1462        exit_cifs_spnego();
1463#endif
1464        cifs_destroy_request_bufs();
1465        cifs_destroy_mids();
1466        cifs_destroy_inodecache();
1467        cifs_fscache_unregister();
1468        destroy_workqueue(cifsoplockd_wq);
1469        destroy_workqueue(cifsiod_wq);
1470        cifs_proc_clean();
1471}
1472
1473MODULE_AUTHOR("Steve French <sfrench@us.ibm.com>");
1474MODULE_LICENSE("GPL");  /* combination of LGPL + GPL source behaves as GPL */
1475MODULE_DESCRIPTION
1476    ("VFS to access servers complying with the SNIA CIFS Specification "
1477     "e.g. Samba and Windows");
1478MODULE_VERSION(CIFS_VERSION);
1479MODULE_SOFTDEP("pre: arc4");
1480MODULE_SOFTDEP("pre: des");
1481MODULE_SOFTDEP("pre: ecb");
1482MODULE_SOFTDEP("pre: hmac");
1483MODULE_SOFTDEP("pre: md4");
1484MODULE_SOFTDEP("pre: md5");
1485MODULE_SOFTDEP("pre: nls");
1486MODULE_SOFTDEP("pre: aes");
1487MODULE_SOFTDEP("pre: cmac");
1488MODULE_SOFTDEP("pre: sha256");
1489MODULE_SOFTDEP("pre: aead2");
1490MODULE_SOFTDEP("pre: ccm");
1491module_init(init_cifs)
1492module_exit(exit_cifs)
1493