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