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