linux/fs/nfs/inode.c
<<
>>
Prefs
   1/*
   2 *  linux/fs/nfs/inode.c
   3 *
   4 *  Copyright (C) 1992  Rick Sladkey
   5 *
   6 *  nfs inode and superblock handling functions
   7 *
   8 *  Modularised by Alan Cox <alan@lxorguk.ukuu.org.uk>, while hacking some
   9 *  experimental NFS changes. Modularisation taken straight from SYS5 fs.
  10 *
  11 *  Change to nfs_read_super() to permit NFS mounts to multi-homed hosts.
  12 *  J.S.Peatfield@damtp.cam.ac.uk
  13 *
  14 */
  15
  16#include <linux/module.h>
  17#include <linux/init.h>
  18#include <linux/sched.h>
  19#include <linux/time.h>
  20#include <linux/kernel.h>
  21#include <linux/mm.h>
  22#include <linux/string.h>
  23#include <linux/stat.h>
  24#include <linux/errno.h>
  25#include <linux/unistd.h>
  26#include <linux/sunrpc/clnt.h>
  27#include <linux/sunrpc/stats.h>
  28#include <linux/sunrpc/metrics.h>
  29#include <linux/nfs_fs.h>
  30#include <linux/nfs_mount.h>
  31#include <linux/nfs4_mount.h>
  32#include <linux/lockd/bind.h>
  33#include <linux/seq_file.h>
  34#include <linux/mount.h>
  35#include <linux/nfs_idmap.h>
  36#include <linux/vfs.h>
  37#include <linux/inet.h>
  38#include <linux/nfs_xdr.h>
  39#include <linux/slab.h>
  40#include <linux/compat.h>
  41#include <linux/freezer.h>
  42#include <linux/crc32.h>
  43
  44#include <asm/uaccess.h>
  45
  46#include "nfs4_fs.h"
  47#include "callback.h"
  48#include "delegation.h"
  49#include "iostat.h"
  50#include "internal.h"
  51#include "fscache.h"
  52#include "dns_resolve.h"
  53#include "pnfs.h"
  54#include "netns.h"
  55
  56#define NFSDBG_FACILITY         NFSDBG_VFS
  57
  58#define NFS_64_BIT_INODE_NUMBERS_ENABLED        1
  59
  60/* Default is to see 64-bit inode numbers */
  61static bool enable_ino64 = NFS_64_BIT_INODE_NUMBERS_ENABLED;
  62
  63static void nfs_invalidate_inode(struct inode *);
  64static int nfs_update_inode(struct inode *, struct nfs_fattr *);
  65
  66static struct kmem_cache * nfs_inode_cachep;
  67
  68static inline unsigned long
  69nfs_fattr_to_ino_t(struct nfs_fattr *fattr)
  70{
  71        return nfs_fileid_to_ino_t(fattr->fileid);
  72}
  73
  74/**
  75 * nfs_wait_bit_killable - helper for functions that are sleeping on bit locks
  76 * @word: long word containing the bit lock
  77 */
  78int nfs_wait_bit_killable(void *word)
  79{
  80        if (fatal_signal_pending(current))
  81                return -ERESTARTSYS;
  82        freezable_schedule();
  83        return 0;
  84}
  85
  86/**
  87 * nfs_compat_user_ino64 - returns the user-visible inode number
  88 * @fileid: 64-bit fileid
  89 *
  90 * This function returns a 32-bit inode number if the boot parameter
  91 * nfs.enable_ino64 is zero.
  92 */
  93u64 nfs_compat_user_ino64(u64 fileid)
  94{
  95#ifdef CONFIG_COMPAT
  96        compat_ulong_t ino;
  97#else   
  98        unsigned long ino;
  99#endif
 100
 101        if (enable_ino64)
 102                return fileid;
 103        ino = fileid;
 104        if (sizeof(ino) < sizeof(fileid))
 105                ino ^= fileid >> (sizeof(fileid)-sizeof(ino)) * 8;
 106        return ino;
 107}
 108
 109static void nfs_clear_inode(struct inode *inode)
 110{
 111        /*
 112         * The following should never happen...
 113         */
 114        BUG_ON(nfs_have_writebacks(inode));
 115        BUG_ON(!list_empty(&NFS_I(inode)->open_files));
 116        nfs_zap_acl_cache(inode);
 117        nfs_access_zap_cache(inode);
 118        nfs_fscache_release_inode_cookie(inode);
 119}
 120
 121void nfs_evict_inode(struct inode *inode)
 122{
 123        truncate_inode_pages(&inode->i_data, 0);
 124        end_writeback(inode);
 125        nfs_clear_inode(inode);
 126}
 127
 128/**
 129 * nfs_sync_mapping - helper to flush all mmapped dirty data to disk
 130 */
 131int nfs_sync_mapping(struct address_space *mapping)
 132{
 133        int ret = 0;
 134
 135        if (mapping->nrpages != 0) {
 136                unmap_mapping_range(mapping, 0, 0, 0);
 137                ret = nfs_wb_all(mapping->host);
 138        }
 139        return ret;
 140}
 141
 142/*
 143 * Invalidate the local caches
 144 */
 145static void nfs_zap_caches_locked(struct inode *inode)
 146{
 147        struct nfs_inode *nfsi = NFS_I(inode);
 148        int mode = inode->i_mode;
 149
 150        nfs_inc_stats(inode, NFSIOS_ATTRINVALIDATE);
 151
 152        nfsi->attrtimeo = NFS_MINATTRTIMEO(inode);
 153        nfsi->attrtimeo_timestamp = jiffies;
 154
 155        memset(NFS_COOKIEVERF(inode), 0, sizeof(NFS_COOKIEVERF(inode)));
 156        if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode))
 157                nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL|NFS_INO_REVAL_PAGECACHE;
 158        else
 159                nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL|NFS_INO_REVAL_PAGECACHE;
 160}
 161
 162void nfs_zap_caches(struct inode *inode)
 163{
 164        spin_lock(&inode->i_lock);
 165        nfs_zap_caches_locked(inode);
 166        spin_unlock(&inode->i_lock);
 167}
 168
 169void nfs_zap_mapping(struct inode *inode, struct address_space *mapping)
 170{
 171        if (mapping->nrpages != 0) {
 172                spin_lock(&inode->i_lock);
 173                NFS_I(inode)->cache_validity |= NFS_INO_INVALID_DATA;
 174                spin_unlock(&inode->i_lock);
 175        }
 176}
 177
 178void nfs_zap_acl_cache(struct inode *inode)
 179{
 180        void (*clear_acl_cache)(struct inode *);
 181
 182        clear_acl_cache = NFS_PROTO(inode)->clear_acl_cache;
 183        if (clear_acl_cache != NULL)
 184                clear_acl_cache(inode);
 185        spin_lock(&inode->i_lock);
 186        NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_ACL;
 187        spin_unlock(&inode->i_lock);
 188}
 189
 190void nfs_invalidate_atime(struct inode *inode)
 191{
 192        spin_lock(&inode->i_lock);
 193        NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATIME;
 194        spin_unlock(&inode->i_lock);
 195}
 196
 197/*
 198 * Invalidate, but do not unhash, the inode.
 199 * NB: must be called with inode->i_lock held!
 200 */
 201static void nfs_invalidate_inode(struct inode *inode)
 202{
 203        set_bit(NFS_INO_STALE, &NFS_I(inode)->flags);
 204        nfs_zap_caches_locked(inode);
 205}
 206
 207struct nfs_find_desc {
 208        struct nfs_fh           *fh;
 209        struct nfs_fattr        *fattr;
 210};
 211
 212/*
 213 * In NFSv3 we can have 64bit inode numbers. In order to support
 214 * this, and re-exported directories (also seen in NFSv2)
 215 * we are forced to allow 2 different inodes to have the same
 216 * i_ino.
 217 */
 218static int
 219nfs_find_actor(struct inode *inode, void *opaque)
 220{
 221        struct nfs_find_desc    *desc = (struct nfs_find_desc *)opaque;
 222        struct nfs_fh           *fh = desc->fh;
 223        struct nfs_fattr        *fattr = desc->fattr;
 224
 225        if (NFS_FILEID(inode) != fattr->fileid)
 226                return 0;
 227        if (nfs_compare_fh(NFS_FH(inode), fh))
 228                return 0;
 229        if (is_bad_inode(inode) || NFS_STALE(inode))
 230                return 0;
 231        return 1;
 232}
 233
 234static int
 235nfs_init_locked(struct inode *inode, void *opaque)
 236{
 237        struct nfs_find_desc    *desc = (struct nfs_find_desc *)opaque;
 238        struct nfs_fattr        *fattr = desc->fattr;
 239
 240        set_nfs_fileid(inode, fattr->fileid);
 241        nfs_copy_fh(NFS_FH(inode), desc->fh);
 242        return 0;
 243}
 244
 245/*
 246 * This is our front-end to iget that looks up inodes by file handle
 247 * instead of inode number.
 248 */
 249struct inode *
 250nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr)
 251{
 252        struct nfs_find_desc desc = {
 253                .fh     = fh,
 254                .fattr  = fattr
 255        };
 256        struct inode *inode = ERR_PTR(-ENOENT);
 257        unsigned long hash;
 258
 259        nfs_attr_check_mountpoint(sb, fattr);
 260
 261        if (((fattr->valid & NFS_ATTR_FATTR_FILEID) == 0) &&
 262            !nfs_attr_use_mounted_on_fileid(fattr))
 263                goto out_no_inode;
 264        if ((fattr->valid & NFS_ATTR_FATTR_TYPE) == 0)
 265                goto out_no_inode;
 266
 267        hash = nfs_fattr_to_ino_t(fattr);
 268
 269        inode = iget5_locked(sb, hash, nfs_find_actor, nfs_init_locked, &desc);
 270        if (inode == NULL) {
 271                inode = ERR_PTR(-ENOMEM);
 272                goto out_no_inode;
 273        }
 274
 275        if (inode->i_state & I_NEW) {
 276                struct nfs_inode *nfsi = NFS_I(inode);
 277                unsigned long now = jiffies;
 278
 279                /* We set i_ino for the few things that still rely on it,
 280                 * such as stat(2) */
 281                inode->i_ino = hash;
 282
 283                /* We can't support update_atime(), since the server will reset it */
 284                inode->i_flags |= S_NOATIME|S_NOCMTIME;
 285                inode->i_mode = fattr->mode;
 286                if ((fattr->valid & NFS_ATTR_FATTR_MODE) == 0
 287                                && nfs_server_capable(inode, NFS_CAP_MODE))
 288                        nfsi->cache_validity |= NFS_INO_INVALID_ATTR
 289                                | NFS_INO_INVALID_ACCESS
 290                                | NFS_INO_INVALID_ACL;
 291                /* Why so? Because we want revalidate for devices/FIFOs, and
 292                 * that's precisely what we have in nfs_file_inode_operations.
 293                 */
 294                inode->i_op = NFS_SB(sb)->nfs_client->rpc_ops->file_inode_ops;
 295                if (S_ISREG(inode->i_mode)) {
 296                        inode->i_fop = NFS_SB(sb)->nfs_client->rpc_ops->file_ops;
 297                        inode->i_data.a_ops = &nfs_file_aops;
 298                        inode->i_data.backing_dev_info = &NFS_SB(sb)->backing_dev_info;
 299                } else if (S_ISDIR(inode->i_mode)) {
 300                        inode->i_op = NFS_SB(sb)->nfs_client->rpc_ops->dir_inode_ops;
 301                        inode->i_fop = &nfs_dir_operations;
 302                        inode->i_data.a_ops = &nfs_dir_aops;
 303                        if (nfs_server_capable(inode, NFS_CAP_READDIRPLUS))
 304                                set_bit(NFS_INO_ADVISE_RDPLUS, &NFS_I(inode)->flags);
 305                        /* Deal with crossing mountpoints */
 306                        if (fattr->valid & NFS_ATTR_FATTR_MOUNTPOINT ||
 307                                        fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL) {
 308                                if (fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL)
 309                                        inode->i_op = &nfs_referral_inode_operations;
 310                                else
 311                                        inode->i_op = &nfs_mountpoint_inode_operations;
 312                                inode->i_fop = NULL;
 313                                inode->i_flags |= S_AUTOMOUNT;
 314                        }
 315                } else if (S_ISLNK(inode->i_mode))
 316                        inode->i_op = &nfs_symlink_inode_operations;
 317                else
 318                        init_special_inode(inode, inode->i_mode, fattr->rdev);
 319
 320                memset(&inode->i_atime, 0, sizeof(inode->i_atime));
 321                memset(&inode->i_mtime, 0, sizeof(inode->i_mtime));
 322                memset(&inode->i_ctime, 0, sizeof(inode->i_ctime));
 323                inode->i_version = 0;
 324                inode->i_size = 0;
 325                clear_nlink(inode);
 326                inode->i_uid = -2;
 327                inode->i_gid = -2;
 328                inode->i_blocks = 0;
 329                memset(nfsi->cookieverf, 0, sizeof(nfsi->cookieverf));
 330
 331                nfsi->read_cache_jiffies = fattr->time_start;
 332                nfsi->attr_gencount = fattr->gencount;
 333                if (fattr->valid & NFS_ATTR_FATTR_ATIME)
 334                        inode->i_atime = fattr->atime;
 335                else if (nfs_server_capable(inode, NFS_CAP_ATIME))
 336                        nfsi->cache_validity |= NFS_INO_INVALID_ATTR;
 337                if (fattr->valid & NFS_ATTR_FATTR_MTIME)
 338                        inode->i_mtime = fattr->mtime;
 339                else if (nfs_server_capable(inode, NFS_CAP_MTIME))
 340                        nfsi->cache_validity |= NFS_INO_INVALID_ATTR
 341                                | NFS_INO_INVALID_DATA;
 342                if (fattr->valid & NFS_ATTR_FATTR_CTIME)
 343                        inode->i_ctime = fattr->ctime;
 344                else if (nfs_server_capable(inode, NFS_CAP_CTIME))
 345                        nfsi->cache_validity |= NFS_INO_INVALID_ATTR
 346                                | NFS_INO_INVALID_ACCESS
 347                                | NFS_INO_INVALID_ACL;
 348                if (fattr->valid & NFS_ATTR_FATTR_CHANGE)
 349                        inode->i_version = fattr->change_attr;
 350                else if (nfs_server_capable(inode, NFS_CAP_CHANGE_ATTR))
 351                        nfsi->cache_validity |= NFS_INO_INVALID_ATTR
 352                                | NFS_INO_INVALID_DATA;
 353                if (fattr->valid & NFS_ATTR_FATTR_SIZE)
 354                        inode->i_size = nfs_size_to_loff_t(fattr->size);
 355                else
 356                        nfsi->cache_validity |= NFS_INO_INVALID_ATTR
 357                                | NFS_INO_INVALID_DATA
 358                                | NFS_INO_REVAL_PAGECACHE;
 359                if (fattr->valid & NFS_ATTR_FATTR_NLINK)
 360                        set_nlink(inode, fattr->nlink);
 361                else if (nfs_server_capable(inode, NFS_CAP_NLINK))
 362                        nfsi->cache_validity |= NFS_INO_INVALID_ATTR;
 363                if (fattr->valid & NFS_ATTR_FATTR_OWNER)
 364                        inode->i_uid = fattr->uid;
 365                else if (nfs_server_capable(inode, NFS_CAP_OWNER))
 366                        nfsi->cache_validity |= NFS_INO_INVALID_ATTR
 367                                | NFS_INO_INVALID_ACCESS
 368                                | NFS_INO_INVALID_ACL;
 369                if (fattr->valid & NFS_ATTR_FATTR_GROUP)
 370                        inode->i_gid = fattr->gid;
 371                else if (nfs_server_capable(inode, NFS_CAP_OWNER_GROUP))
 372                        nfsi->cache_validity |= NFS_INO_INVALID_ATTR
 373                                | NFS_INO_INVALID_ACCESS
 374                                | NFS_INO_INVALID_ACL;
 375                if (fattr->valid & NFS_ATTR_FATTR_BLOCKS_USED)
 376                        inode->i_blocks = fattr->du.nfs2.blocks;
 377                if (fattr->valid & NFS_ATTR_FATTR_SPACE_USED) {
 378                        /*
 379                         * report the blocks in 512byte units
 380                         */
 381                        inode->i_blocks = nfs_calc_block_size(fattr->du.nfs3.used);
 382                }
 383                nfsi->attrtimeo = NFS_MINATTRTIMEO(inode);
 384                nfsi->attrtimeo_timestamp = now;
 385                nfsi->access_cache = RB_ROOT;
 386
 387                nfs_fscache_init_inode_cookie(inode);
 388
 389                unlock_new_inode(inode);
 390        } else
 391                nfs_refresh_inode(inode, fattr);
 392        dprintk("NFS: nfs_fhget(%s/%Ld fh_crc=0x%08x ct=%d)\n",
 393                inode->i_sb->s_id,
 394                (long long)NFS_FILEID(inode),
 395                nfs_display_fhandle_hash(fh),
 396                atomic_read(&inode->i_count));
 397
 398out:
 399        return inode;
 400
 401out_no_inode:
 402        dprintk("nfs_fhget: iget failed with error %ld\n", PTR_ERR(inode));
 403        goto out;
 404}
 405
 406#define NFS_VALID_ATTRS (ATTR_MODE|ATTR_UID|ATTR_GID|ATTR_SIZE|ATTR_ATIME|ATTR_ATIME_SET|ATTR_MTIME|ATTR_MTIME_SET|ATTR_FILE|ATTR_OPEN)
 407
 408int
 409nfs_setattr(struct dentry *dentry, struct iattr *attr)
 410{
 411        struct inode *inode = dentry->d_inode;
 412        struct nfs_fattr *fattr;
 413        int error = -ENOMEM;
 414
 415        nfs_inc_stats(inode, NFSIOS_VFSSETATTR);
 416
 417        /* skip mode change if it's just for clearing setuid/setgid */
 418        if (attr->ia_valid & (ATTR_KILL_SUID | ATTR_KILL_SGID))
 419                attr->ia_valid &= ~ATTR_MODE;
 420
 421        if (attr->ia_valid & ATTR_SIZE) {
 422                if (!S_ISREG(inode->i_mode) || attr->ia_size == i_size_read(inode))
 423                        attr->ia_valid &= ~ATTR_SIZE;
 424        }
 425
 426        /* Optimization: if the end result is no change, don't RPC */
 427        attr->ia_valid &= NFS_VALID_ATTRS;
 428        if ((attr->ia_valid & ~(ATTR_FILE|ATTR_OPEN)) == 0)
 429                return 0;
 430
 431        /* Write all dirty data */
 432        if (S_ISREG(inode->i_mode))
 433                nfs_wb_all(inode);
 434
 435        fattr = nfs_alloc_fattr();
 436        if (fattr == NULL)
 437                goto out;
 438        /*
 439         * Return any delegations if we're going to change ACLs
 440         */
 441        if ((attr->ia_valid & (ATTR_MODE|ATTR_UID|ATTR_GID)) != 0)
 442                nfs_inode_return_delegation(inode);
 443        error = NFS_PROTO(inode)->setattr(dentry, fattr, attr);
 444        if (error == 0)
 445                nfs_refresh_inode(inode, fattr);
 446        nfs_free_fattr(fattr);
 447out:
 448        return error;
 449}
 450
 451/**
 452 * nfs_vmtruncate - unmap mappings "freed" by truncate() syscall
 453 * @inode: inode of the file used
 454 * @offset: file offset to start truncating
 455 *
 456 * This is a copy of the common vmtruncate, but with the locking
 457 * corrected to take into account the fact that NFS requires
 458 * inode->i_size to be updated under the inode->i_lock.
 459 */
 460static int nfs_vmtruncate(struct inode * inode, loff_t offset)
 461{
 462        loff_t oldsize;
 463        int err;
 464
 465        err = inode_newsize_ok(inode, offset);
 466        if (err)
 467                goto out;
 468
 469        spin_lock(&inode->i_lock);
 470        oldsize = inode->i_size;
 471        i_size_write(inode, offset);
 472        spin_unlock(&inode->i_lock);
 473
 474        truncate_pagecache(inode, oldsize, offset);
 475out:
 476        return err;
 477}
 478
 479/**
 480 * nfs_setattr_update_inode - Update inode metadata after a setattr call.
 481 * @inode: pointer to struct inode
 482 * @attr: pointer to struct iattr
 483 *
 484 * Note: we do this in the *proc.c in order to ensure that
 485 *       it works for things like exclusive creates too.
 486 */
 487void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr)
 488{
 489        if ((attr->ia_valid & (ATTR_MODE|ATTR_UID|ATTR_GID)) != 0) {
 490                spin_lock(&inode->i_lock);
 491                if ((attr->ia_valid & ATTR_MODE) != 0) {
 492                        int mode = attr->ia_mode & S_IALLUGO;
 493                        mode |= inode->i_mode & ~S_IALLUGO;
 494                        inode->i_mode = mode;
 495                }
 496                if ((attr->ia_valid & ATTR_UID) != 0)
 497                        inode->i_uid = attr->ia_uid;
 498                if ((attr->ia_valid & ATTR_GID) != 0)
 499                        inode->i_gid = attr->ia_gid;
 500                NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;
 501                spin_unlock(&inode->i_lock);
 502        }
 503        if ((attr->ia_valid & ATTR_SIZE) != 0) {
 504                nfs_inc_stats(inode, NFSIOS_SETATTRTRUNC);
 505                nfs_vmtruncate(inode, attr->ia_size);
 506        }
 507}
 508
 509int nfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
 510{
 511        struct inode *inode = dentry->d_inode;
 512        int need_atime = NFS_I(inode)->cache_validity & NFS_INO_INVALID_ATIME;
 513        int err;
 514
 515        /* Flush out writes to the server in order to update c/mtime.  */
 516        if (S_ISREG(inode->i_mode)) {
 517                err = filemap_write_and_wait(inode->i_mapping);
 518                if (err)
 519                        goto out;
 520        }
 521
 522        /*
 523         * We may force a getattr if the user cares about atime.
 524         *
 525         * Note that we only have to check the vfsmount flags here:
 526         *  - NFS always sets S_NOATIME by so checking it would give a
 527         *    bogus result
 528         *  - NFS never sets MS_NOATIME or MS_NODIRATIME so there is
 529         *    no point in checking those.
 530         */
 531        if ((mnt->mnt_flags & MNT_NOATIME) ||
 532            ((mnt->mnt_flags & MNT_NODIRATIME) && S_ISDIR(inode->i_mode)))
 533                need_atime = 0;
 534
 535        if (need_atime)
 536                err = __nfs_revalidate_inode(NFS_SERVER(inode), inode);
 537        else
 538                err = nfs_revalidate_inode(NFS_SERVER(inode), inode);
 539        if (!err) {
 540                generic_fillattr(inode, stat);
 541                stat->ino = nfs_compat_user_ino64(NFS_FILEID(inode));
 542        }
 543out:
 544        return err;
 545}
 546
 547static void nfs_init_lock_context(struct nfs_lock_context *l_ctx)
 548{
 549        atomic_set(&l_ctx->count, 1);
 550        l_ctx->lockowner = current->files;
 551        l_ctx->pid = current->tgid;
 552        INIT_LIST_HEAD(&l_ctx->list);
 553}
 554
 555static struct nfs_lock_context *__nfs_find_lock_context(struct nfs_open_context *ctx)
 556{
 557        struct nfs_lock_context *pos;
 558
 559        list_for_each_entry(pos, &ctx->lock_context.list, list) {
 560                if (pos->lockowner != current->files)
 561                        continue;
 562                if (pos->pid != current->tgid)
 563                        continue;
 564                atomic_inc(&pos->count);
 565                return pos;
 566        }
 567        return NULL;
 568}
 569
 570struct nfs_lock_context *nfs_get_lock_context(struct nfs_open_context *ctx)
 571{
 572        struct nfs_lock_context *res, *new = NULL;
 573        struct inode *inode = ctx->dentry->d_inode;
 574
 575        spin_lock(&inode->i_lock);
 576        res = __nfs_find_lock_context(ctx);
 577        if (res == NULL) {
 578                spin_unlock(&inode->i_lock);
 579                new = kmalloc(sizeof(*new), GFP_KERNEL);
 580                if (new == NULL)
 581                        return NULL;
 582                nfs_init_lock_context(new);
 583                spin_lock(&inode->i_lock);
 584                res = __nfs_find_lock_context(ctx);
 585                if (res == NULL) {
 586                        list_add_tail(&new->list, &ctx->lock_context.list);
 587                        new->open_context = ctx;
 588                        res = new;
 589                        new = NULL;
 590                }
 591        }
 592        spin_unlock(&inode->i_lock);
 593        kfree(new);
 594        return res;
 595}
 596
 597void nfs_put_lock_context(struct nfs_lock_context *l_ctx)
 598{
 599        struct nfs_open_context *ctx = l_ctx->open_context;
 600        struct inode *inode = ctx->dentry->d_inode;
 601
 602        if (!atomic_dec_and_lock(&l_ctx->count, &inode->i_lock))
 603                return;
 604        list_del(&l_ctx->list);
 605        spin_unlock(&inode->i_lock);
 606        kfree(l_ctx);
 607}
 608
 609/**
 610 * nfs_close_context - Common close_context() routine NFSv2/v3
 611 * @ctx: pointer to context
 612 * @is_sync: is this a synchronous close
 613 *
 614 * always ensure that the attributes are up to date if we're mounted
 615 * with close-to-open semantics
 616 */
 617void nfs_close_context(struct nfs_open_context *ctx, int is_sync)
 618{
 619        struct inode *inode;
 620        struct nfs_server *server;
 621
 622        if (!(ctx->mode & FMODE_WRITE))
 623                return;
 624        if (!is_sync)
 625                return;
 626        inode = ctx->dentry->d_inode;
 627        if (!list_empty(&NFS_I(inode)->open_files))
 628                return;
 629        server = NFS_SERVER(inode);
 630        if (server->flags & NFS_MOUNT_NOCTO)
 631                return;
 632        nfs_revalidate_inode(server, inode);
 633}
 634
 635struct nfs_open_context *alloc_nfs_open_context(struct dentry *dentry, fmode_t f_mode)
 636{
 637        struct nfs_open_context *ctx;
 638        struct rpc_cred *cred = rpc_lookup_cred();
 639        if (IS_ERR(cred))
 640                return ERR_CAST(cred);
 641
 642        ctx = kmalloc(sizeof(*ctx), GFP_KERNEL);
 643        if (!ctx) {
 644                put_rpccred(cred);
 645                return ERR_PTR(-ENOMEM);
 646        }
 647        nfs_sb_active(dentry->d_sb);
 648        ctx->dentry = dget(dentry);
 649        ctx->cred = cred;
 650        ctx->state = NULL;
 651        ctx->mode = f_mode;
 652        ctx->flags = 0;
 653        ctx->error = 0;
 654        nfs_init_lock_context(&ctx->lock_context);
 655        ctx->lock_context.open_context = ctx;
 656        INIT_LIST_HEAD(&ctx->list);
 657        return ctx;
 658}
 659
 660struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx)
 661{
 662        if (ctx != NULL)
 663                atomic_inc(&ctx->lock_context.count);
 664        return ctx;
 665}
 666
 667static void __put_nfs_open_context(struct nfs_open_context *ctx, int is_sync)
 668{
 669        struct inode *inode = ctx->dentry->d_inode;
 670        struct super_block *sb = ctx->dentry->d_sb;
 671
 672        if (!list_empty(&ctx->list)) {
 673                if (!atomic_dec_and_lock(&ctx->lock_context.count, &inode->i_lock))
 674                        return;
 675                list_del(&ctx->list);
 676                spin_unlock(&inode->i_lock);
 677        } else if (!atomic_dec_and_test(&ctx->lock_context.count))
 678                return;
 679        if (inode != NULL)
 680                NFS_PROTO(inode)->close_context(ctx, is_sync);
 681        if (ctx->cred != NULL)
 682                put_rpccred(ctx->cred);
 683        dput(ctx->dentry);
 684        nfs_sb_deactive(sb);
 685        kfree(ctx);
 686}
 687
 688void put_nfs_open_context(struct nfs_open_context *ctx)
 689{
 690        __put_nfs_open_context(ctx, 0);
 691}
 692
 693/*
 694 * Ensure that mmap has a recent RPC credential for use when writing out
 695 * shared pages
 696 */
 697void nfs_file_set_open_context(struct file *filp, struct nfs_open_context *ctx)
 698{
 699        struct inode *inode = filp->f_path.dentry->d_inode;
 700        struct nfs_inode *nfsi = NFS_I(inode);
 701
 702        filp->private_data = get_nfs_open_context(ctx);
 703        spin_lock(&inode->i_lock);
 704        list_add(&ctx->list, &nfsi->open_files);
 705        spin_unlock(&inode->i_lock);
 706}
 707
 708/*
 709 * Given an inode, search for an open context with the desired characteristics
 710 */
 711struct nfs_open_context *nfs_find_open_context(struct inode *inode, struct rpc_cred *cred, fmode_t mode)
 712{
 713        struct nfs_inode *nfsi = NFS_I(inode);
 714        struct nfs_open_context *pos, *ctx = NULL;
 715
 716        spin_lock(&inode->i_lock);
 717        list_for_each_entry(pos, &nfsi->open_files, list) {
 718                if (cred != NULL && pos->cred != cred)
 719                        continue;
 720                if ((pos->mode & (FMODE_READ|FMODE_WRITE)) != mode)
 721                        continue;
 722                ctx = get_nfs_open_context(pos);
 723                break;
 724        }
 725        spin_unlock(&inode->i_lock);
 726        return ctx;
 727}
 728
 729static void nfs_file_clear_open_context(struct file *filp)
 730{
 731        struct inode *inode = filp->f_path.dentry->d_inode;
 732        struct nfs_open_context *ctx = nfs_file_open_context(filp);
 733
 734        if (ctx) {
 735                filp->private_data = NULL;
 736                spin_lock(&inode->i_lock);
 737                list_move_tail(&ctx->list, &NFS_I(inode)->open_files);
 738                spin_unlock(&inode->i_lock);
 739                __put_nfs_open_context(ctx, filp->f_flags & O_DIRECT ? 0 : 1);
 740        }
 741}
 742
 743/*
 744 * These allocate and release file read/write context information.
 745 */
 746int nfs_open(struct inode *inode, struct file *filp)
 747{
 748        struct nfs_open_context *ctx;
 749
 750        ctx = alloc_nfs_open_context(filp->f_path.dentry, filp->f_mode);
 751        if (IS_ERR(ctx))
 752                return PTR_ERR(ctx);
 753        nfs_file_set_open_context(filp, ctx);
 754        put_nfs_open_context(ctx);
 755        nfs_fscache_set_inode_cookie(inode, filp);
 756        return 0;
 757}
 758
 759int nfs_release(struct inode *inode, struct file *filp)
 760{
 761        nfs_file_clear_open_context(filp);
 762        return 0;
 763}
 764
 765/*
 766 * This function is called whenever some part of NFS notices that
 767 * the cached attributes have to be refreshed.
 768 */
 769int
 770__nfs_revalidate_inode(struct nfs_server *server, struct inode *inode)
 771{
 772        int              status = -ESTALE;
 773        struct nfs_fattr *fattr = NULL;
 774        struct nfs_inode *nfsi = NFS_I(inode);
 775
 776        dfprintk(PAGECACHE, "NFS: revalidating (%s/%Ld)\n",
 777                inode->i_sb->s_id, (long long)NFS_FILEID(inode));
 778
 779        if (is_bad_inode(inode))
 780                goto out;
 781        if (NFS_STALE(inode))
 782                goto out;
 783
 784        status = -ENOMEM;
 785        fattr = nfs_alloc_fattr();
 786        if (fattr == NULL)
 787                goto out;
 788
 789        nfs_inc_stats(inode, NFSIOS_INODEREVALIDATE);
 790        status = NFS_PROTO(inode)->getattr(server, NFS_FH(inode), fattr);
 791        if (status != 0) {
 792                dfprintk(PAGECACHE, "nfs_revalidate_inode: (%s/%Ld) getattr failed, error=%d\n",
 793                         inode->i_sb->s_id,
 794                         (long long)NFS_FILEID(inode), status);
 795                if (status == -ESTALE) {
 796                        nfs_zap_caches(inode);
 797                        if (!S_ISDIR(inode->i_mode))
 798                                set_bit(NFS_INO_STALE, &NFS_I(inode)->flags);
 799                }
 800                goto out;
 801        }
 802
 803        status = nfs_refresh_inode(inode, fattr);
 804        if (status) {
 805                dfprintk(PAGECACHE, "nfs_revalidate_inode: (%s/%Ld) refresh failed, error=%d\n",
 806                         inode->i_sb->s_id,
 807                         (long long)NFS_FILEID(inode), status);
 808                goto out;
 809        }
 810
 811        if (nfsi->cache_validity & NFS_INO_INVALID_ACL)
 812                nfs_zap_acl_cache(inode);
 813
 814        dfprintk(PAGECACHE, "NFS: (%s/%Ld) revalidation complete\n",
 815                inode->i_sb->s_id,
 816                (long long)NFS_FILEID(inode));
 817
 818 out:
 819        nfs_free_fattr(fattr);
 820        return status;
 821}
 822
 823int nfs_attribute_timeout(struct inode *inode)
 824{
 825        struct nfs_inode *nfsi = NFS_I(inode);
 826
 827        return !time_in_range_open(jiffies, nfsi->read_cache_jiffies, nfsi->read_cache_jiffies + nfsi->attrtimeo);
 828}
 829
 830static int nfs_attribute_cache_expired(struct inode *inode)
 831{
 832        if (nfs_have_delegated_attributes(inode))
 833                return 0;
 834        return nfs_attribute_timeout(inode);
 835}
 836
 837/**
 838 * nfs_revalidate_inode - Revalidate the inode attributes
 839 * @server - pointer to nfs_server struct
 840 * @inode - pointer to inode struct
 841 *
 842 * Updates inode attribute information by retrieving the data from the server.
 843 */
 844int nfs_revalidate_inode(struct nfs_server *server, struct inode *inode)
 845{
 846        if (!(NFS_I(inode)->cache_validity & NFS_INO_INVALID_ATTR)
 847                        && !nfs_attribute_cache_expired(inode))
 848                return NFS_STALE(inode) ? -ESTALE : 0;
 849        return __nfs_revalidate_inode(server, inode);
 850}
 851
 852static int nfs_invalidate_mapping(struct inode *inode, struct address_space *mapping)
 853{
 854        struct nfs_inode *nfsi = NFS_I(inode);
 855        
 856        if (mapping->nrpages != 0) {
 857                int ret = invalidate_inode_pages2(mapping);
 858                if (ret < 0)
 859                        return ret;
 860        }
 861        spin_lock(&inode->i_lock);
 862        nfsi->cache_validity &= ~NFS_INO_INVALID_DATA;
 863        if (S_ISDIR(inode->i_mode))
 864                memset(nfsi->cookieverf, 0, sizeof(nfsi->cookieverf));
 865        spin_unlock(&inode->i_lock);
 866        nfs_inc_stats(inode, NFSIOS_DATAINVALIDATE);
 867        nfs_fscache_reset_inode_cookie(inode);
 868        dfprintk(PAGECACHE, "NFS: (%s/%Ld) data cache invalidated\n",
 869                        inode->i_sb->s_id, (long long)NFS_FILEID(inode));
 870        return 0;
 871}
 872
 873/**
 874 * nfs_revalidate_mapping - Revalidate the pagecache
 875 * @inode - pointer to host inode
 876 * @mapping - pointer to mapping
 877 */
 878int nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping)
 879{
 880        struct nfs_inode *nfsi = NFS_I(inode);
 881        int ret = 0;
 882
 883        if ((nfsi->cache_validity & NFS_INO_REVAL_PAGECACHE)
 884                        || nfs_attribute_cache_expired(inode)
 885                        || NFS_STALE(inode)) {
 886                ret = __nfs_revalidate_inode(NFS_SERVER(inode), inode);
 887                if (ret < 0)
 888                        goto out;
 889        }
 890        if (nfsi->cache_validity & NFS_INO_INVALID_DATA)
 891                ret = nfs_invalidate_mapping(inode, mapping);
 892out:
 893        return ret;
 894}
 895
 896static unsigned long nfs_wcc_update_inode(struct inode *inode, struct nfs_fattr *fattr)
 897{
 898        struct nfs_inode *nfsi = NFS_I(inode);
 899        unsigned long ret = 0;
 900
 901        if ((fattr->valid & NFS_ATTR_FATTR_PRECHANGE)
 902                        && (fattr->valid & NFS_ATTR_FATTR_CHANGE)
 903                        && inode->i_version == fattr->pre_change_attr) {
 904                inode->i_version = fattr->change_attr;
 905                if (S_ISDIR(inode->i_mode))
 906                        nfsi->cache_validity |= NFS_INO_INVALID_DATA;
 907                ret |= NFS_INO_INVALID_ATTR;
 908        }
 909        /* If we have atomic WCC data, we may update some attributes */
 910        if ((fattr->valid & NFS_ATTR_FATTR_PRECTIME)
 911                        && (fattr->valid & NFS_ATTR_FATTR_CTIME)
 912                        && timespec_equal(&inode->i_ctime, &fattr->pre_ctime)) {
 913                memcpy(&inode->i_ctime, &fattr->ctime, sizeof(inode->i_ctime));
 914                ret |= NFS_INO_INVALID_ATTR;
 915        }
 916
 917        if ((fattr->valid & NFS_ATTR_FATTR_PREMTIME)
 918                        && (fattr->valid & NFS_ATTR_FATTR_MTIME)
 919                        && timespec_equal(&inode->i_mtime, &fattr->pre_mtime)) {
 920                memcpy(&inode->i_mtime, &fattr->mtime, sizeof(inode->i_mtime));
 921                if (S_ISDIR(inode->i_mode))
 922                        nfsi->cache_validity |= NFS_INO_INVALID_DATA;
 923                ret |= NFS_INO_INVALID_ATTR;
 924        }
 925        if ((fattr->valid & NFS_ATTR_FATTR_PRESIZE)
 926                        && (fattr->valid & NFS_ATTR_FATTR_SIZE)
 927                        && i_size_read(inode) == nfs_size_to_loff_t(fattr->pre_size)
 928                        && nfsi->npages == 0) {
 929                i_size_write(inode, nfs_size_to_loff_t(fattr->size));
 930                ret |= NFS_INO_INVALID_ATTR;
 931        }
 932        return ret;
 933}
 934
 935/**
 936 * nfs_check_inode_attributes - verify consistency of the inode attribute cache
 937 * @inode - pointer to inode
 938 * @fattr - updated attributes
 939 *
 940 * Verifies the attribute cache. If we have just changed the attributes,
 941 * so that fattr carries weak cache consistency data, then it may
 942 * also update the ctime/mtime/change_attribute.
 943 */
 944static int nfs_check_inode_attributes(struct inode *inode, struct nfs_fattr *fattr)
 945{
 946        struct nfs_inode *nfsi = NFS_I(inode);
 947        loff_t cur_size, new_isize;
 948        unsigned long invalid = 0;
 949
 950
 951        /* Has the inode gone and changed behind our back? */
 952        if ((fattr->valid & NFS_ATTR_FATTR_FILEID) && nfsi->fileid != fattr->fileid)
 953                return -EIO;
 954        if ((fattr->valid & NFS_ATTR_FATTR_TYPE) && (inode->i_mode & S_IFMT) != (fattr->mode & S_IFMT))
 955                return -EIO;
 956
 957        if ((fattr->valid & NFS_ATTR_FATTR_CHANGE) != 0 &&
 958                        inode->i_version != fattr->change_attr)
 959                invalid |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE;
 960
 961        /* Verify a few of the more important attributes */
 962        if ((fattr->valid & NFS_ATTR_FATTR_MTIME) && !timespec_equal(&inode->i_mtime, &fattr->mtime))
 963                invalid |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE;
 964
 965        if (fattr->valid & NFS_ATTR_FATTR_SIZE) {
 966                cur_size = i_size_read(inode);
 967                new_isize = nfs_size_to_loff_t(fattr->size);
 968                if (cur_size != new_isize && nfsi->npages == 0)
 969                        invalid |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE;
 970        }
 971
 972        /* Have any file permissions changed? */
 973        if ((fattr->valid & NFS_ATTR_FATTR_MODE) && (inode->i_mode & S_IALLUGO) != (fattr->mode & S_IALLUGO))
 974                invalid |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS | NFS_INO_INVALID_ACL;
 975        if ((fattr->valid & NFS_ATTR_FATTR_OWNER) && inode->i_uid != fattr->uid)
 976                invalid |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS | NFS_INO_INVALID_ACL;
 977        if ((fattr->valid & NFS_ATTR_FATTR_GROUP) && inode->i_gid != fattr->gid)
 978                invalid |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS | NFS_INO_INVALID_ACL;
 979
 980        /* Has the link count changed? */
 981        if ((fattr->valid & NFS_ATTR_FATTR_NLINK) && inode->i_nlink != fattr->nlink)
 982                invalid |= NFS_INO_INVALID_ATTR;
 983
 984        if ((fattr->valid & NFS_ATTR_FATTR_ATIME) && !timespec_equal(&inode->i_atime, &fattr->atime))
 985                invalid |= NFS_INO_INVALID_ATIME;
 986
 987        if (invalid != 0)
 988                nfsi->cache_validity |= invalid;
 989
 990        nfsi->read_cache_jiffies = fattr->time_start;
 991        return 0;
 992}
 993
 994static int nfs_ctime_need_update(const struct inode *inode, const struct nfs_fattr *fattr)
 995{
 996        if (!(fattr->valid & NFS_ATTR_FATTR_CTIME))
 997                return 0;
 998        return timespec_compare(&fattr->ctime, &inode->i_ctime) > 0;
 999}
1000
1001static int nfs_size_need_update(const struct inode *inode, const struct nfs_fattr *fattr)
1002{
1003        if (!(fattr->valid & NFS_ATTR_FATTR_SIZE))
1004                return 0;
1005        return nfs_size_to_loff_t(fattr->size) > i_size_read(inode);
1006}
1007
1008static atomic_long_t nfs_attr_generation_counter;
1009
1010static unsigned long nfs_read_attr_generation_counter(void)
1011{
1012        return atomic_long_read(&nfs_attr_generation_counter);
1013}
1014
1015unsigned long nfs_inc_attr_generation_counter(void)
1016{
1017        return atomic_long_inc_return(&nfs_attr_generation_counter);
1018}
1019
1020void nfs_fattr_init(struct nfs_fattr *fattr)
1021{
1022        fattr->valid = 0;
1023        fattr->time_start = jiffies;
1024        fattr->gencount = nfs_inc_attr_generation_counter();
1025        fattr->owner_name = NULL;
1026        fattr->group_name = NULL;
1027}
1028
1029struct nfs_fattr *nfs_alloc_fattr(void)
1030{
1031        struct nfs_fattr *fattr;
1032
1033        fattr = kmalloc(sizeof(*fattr), GFP_NOFS);
1034        if (fattr != NULL)
1035                nfs_fattr_init(fattr);
1036        return fattr;
1037}
1038
1039struct nfs_fh *nfs_alloc_fhandle(void)
1040{
1041        struct nfs_fh *fh;
1042
1043        fh = kmalloc(sizeof(struct nfs_fh), GFP_NOFS);
1044        if (fh != NULL)
1045                fh->size = 0;
1046        return fh;
1047}
1048
1049#ifdef NFS_DEBUG
1050/*
1051 * _nfs_display_fhandle_hash - calculate the crc32 hash for the filehandle
1052 *                             in the same way that wireshark does
1053 *
1054 * @fh: file handle
1055 *
1056 * For debugging only.
1057 */
1058u32 _nfs_display_fhandle_hash(const struct nfs_fh *fh)
1059{
1060        /* wireshark uses 32-bit AUTODIN crc and does a bitwise
1061         * not on the result */
1062        return ~crc32(0xFFFFFFFF, &fh->data[0], fh->size);
1063}
1064
1065/*
1066 * _nfs_display_fhandle - display an NFS file handle on the console
1067 *
1068 * @fh: file handle to display
1069 * @caption: display caption
1070 *
1071 * For debugging only.
1072 */
1073void _nfs_display_fhandle(const struct nfs_fh *fh, const char *caption)
1074{
1075        unsigned short i;
1076
1077        if (fh == NULL || fh->size == 0) {
1078                printk(KERN_DEFAULT "%s at %p is empty\n", caption, fh);
1079                return;
1080        }
1081
1082        printk(KERN_DEFAULT "%s at %p is %u bytes, crc: 0x%08x:\n",
1083               caption, fh, fh->size, _nfs_display_fhandle_hash(fh));
1084        for (i = 0; i < fh->size; i += 16) {
1085                __be32 *pos = (__be32 *)&fh->data[i];
1086
1087                switch ((fh->size - i - 1) >> 2) {
1088                case 0:
1089                        printk(KERN_DEFAULT " %08x\n",
1090                                be32_to_cpup(pos));
1091                        break;
1092                case 1:
1093                        printk(KERN_DEFAULT " %08x %08x\n",
1094                                be32_to_cpup(pos), be32_to_cpup(pos + 1));
1095                        break;
1096                case 2:
1097                        printk(KERN_DEFAULT " %08x %08x %08x\n",
1098                                be32_to_cpup(pos), be32_to_cpup(pos + 1),
1099                                be32_to_cpup(pos + 2));
1100                        break;
1101                default:
1102                        printk(KERN_DEFAULT " %08x %08x %08x %08x\n",
1103                                be32_to_cpup(pos), be32_to_cpup(pos + 1),
1104                                be32_to_cpup(pos + 2), be32_to_cpup(pos + 3));
1105                }
1106        }
1107}
1108#endif
1109
1110/**
1111 * nfs_inode_attrs_need_update - check if the inode attributes need updating
1112 * @inode - pointer to inode
1113 * @fattr - attributes
1114 *
1115 * Attempt to divine whether or not an RPC call reply carrying stale
1116 * attributes got scheduled after another call carrying updated ones.
1117 *
1118 * To do so, the function first assumes that a more recent ctime means
1119 * that the attributes in fattr are newer, however it also attempt to
1120 * catch the case where ctime either didn't change, or went backwards
1121 * (if someone reset the clock on the server) by looking at whether
1122 * or not this RPC call was started after the inode was last updated.
1123 * Note also the check for wraparound of 'attr_gencount'
1124 *
1125 * The function returns 'true' if it thinks the attributes in 'fattr' are
1126 * more recent than the ones cached in the inode.
1127 *
1128 */
1129static int nfs_inode_attrs_need_update(const struct inode *inode, const struct nfs_fattr *fattr)
1130{
1131        const struct nfs_inode *nfsi = NFS_I(inode);
1132
1133        return ((long)fattr->gencount - (long)nfsi->attr_gencount) > 0 ||
1134                nfs_ctime_need_update(inode, fattr) ||
1135                nfs_size_need_update(inode, fattr) ||
1136                ((long)nfsi->attr_gencount - (long)nfs_read_attr_generation_counter() > 0);
1137}
1138
1139static int nfs_refresh_inode_locked(struct inode *inode, struct nfs_fattr *fattr)
1140{
1141        if (nfs_inode_attrs_need_update(inode, fattr))
1142                return nfs_update_inode(inode, fattr);
1143        return nfs_check_inode_attributes(inode, fattr);
1144}
1145
1146/**
1147 * nfs_refresh_inode - try to update the inode attribute cache
1148 * @inode - pointer to inode
1149 * @fattr - updated attributes
1150 *
1151 * Check that an RPC call that returned attributes has not overlapped with
1152 * other recent updates of the inode metadata, then decide whether it is
1153 * safe to do a full update of the inode attributes, or whether just to
1154 * call nfs_check_inode_attributes.
1155 */
1156int nfs_refresh_inode(struct inode *inode, struct nfs_fattr *fattr)
1157{
1158        int status;
1159
1160        if ((fattr->valid & NFS_ATTR_FATTR) == 0)
1161                return 0;
1162        spin_lock(&inode->i_lock);
1163        status = nfs_refresh_inode_locked(inode, fattr);
1164        spin_unlock(&inode->i_lock);
1165
1166        return status;
1167}
1168
1169static int nfs_post_op_update_inode_locked(struct inode *inode, struct nfs_fattr *fattr)
1170{
1171        struct nfs_inode *nfsi = NFS_I(inode);
1172
1173        nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE;
1174        if (S_ISDIR(inode->i_mode))
1175                nfsi->cache_validity |= NFS_INO_INVALID_DATA;
1176        if ((fattr->valid & NFS_ATTR_FATTR) == 0)
1177                return 0;
1178        return nfs_refresh_inode_locked(inode, fattr);
1179}
1180
1181/**
1182 * nfs_post_op_update_inode - try to update the inode attribute cache
1183 * @inode - pointer to inode
1184 * @fattr - updated attributes
1185 *
1186 * After an operation that has changed the inode metadata, mark the
1187 * attribute cache as being invalid, then try to update it.
1188 *
1189 * NB: if the server didn't return any post op attributes, this
1190 * function will force the retrieval of attributes before the next
1191 * NFS request.  Thus it should be used only for operations that
1192 * are expected to change one or more attributes, to avoid
1193 * unnecessary NFS requests and trips through nfs_update_inode().
1194 */
1195int nfs_post_op_update_inode(struct inode *inode, struct nfs_fattr *fattr)
1196{
1197        int status;
1198
1199        spin_lock(&inode->i_lock);
1200        status = nfs_post_op_update_inode_locked(inode, fattr);
1201        spin_unlock(&inode->i_lock);
1202        return status;
1203}
1204
1205/**
1206 * nfs_post_op_update_inode_force_wcc - try to update the inode attribute cache
1207 * @inode - pointer to inode
1208 * @fattr - updated attributes
1209 *
1210 * After an operation that has changed the inode metadata, mark the
1211 * attribute cache as being invalid, then try to update it. Fake up
1212 * weak cache consistency data, if none exist.
1213 *
1214 * This function is mainly designed to be used by the ->write_done() functions.
1215 */
1216int nfs_post_op_update_inode_force_wcc(struct inode *inode, struct nfs_fattr *fattr)
1217{
1218        int status;
1219
1220        spin_lock(&inode->i_lock);
1221        /* Don't do a WCC update if these attributes are already stale */
1222        if ((fattr->valid & NFS_ATTR_FATTR) == 0 ||
1223                        !nfs_inode_attrs_need_update(inode, fattr)) {
1224                fattr->valid &= ~(NFS_ATTR_FATTR_PRECHANGE
1225                                | NFS_ATTR_FATTR_PRESIZE
1226                                | NFS_ATTR_FATTR_PREMTIME
1227                                | NFS_ATTR_FATTR_PRECTIME);
1228                goto out_noforce;
1229        }
1230        if ((fattr->valid & NFS_ATTR_FATTR_CHANGE) != 0 &&
1231                        (fattr->valid & NFS_ATTR_FATTR_PRECHANGE) == 0) {
1232                fattr->pre_change_attr = inode->i_version;
1233                fattr->valid |= NFS_ATTR_FATTR_PRECHANGE;
1234        }
1235        if ((fattr->valid & NFS_ATTR_FATTR_CTIME) != 0 &&
1236                        (fattr->valid & NFS_ATTR_FATTR_PRECTIME) == 0) {
1237                memcpy(&fattr->pre_ctime, &inode->i_ctime, sizeof(fattr->pre_ctime));
1238                fattr->valid |= NFS_ATTR_FATTR_PRECTIME;
1239        }
1240        if ((fattr->valid & NFS_ATTR_FATTR_MTIME) != 0 &&
1241                        (fattr->valid & NFS_ATTR_FATTR_PREMTIME) == 0) {
1242                memcpy(&fattr->pre_mtime, &inode->i_mtime, sizeof(fattr->pre_mtime));
1243                fattr->valid |= NFS_ATTR_FATTR_PREMTIME;
1244        }
1245        if ((fattr->valid & NFS_ATTR_FATTR_SIZE) != 0 &&
1246                        (fattr->valid & NFS_ATTR_FATTR_PRESIZE) == 0) {
1247                fattr->pre_size = i_size_read(inode);
1248                fattr->valid |= NFS_ATTR_FATTR_PRESIZE;
1249        }
1250out_noforce:
1251        status = nfs_post_op_update_inode_locked(inode, fattr);
1252        spin_unlock(&inode->i_lock);
1253        return status;
1254}
1255
1256/*
1257 * Many nfs protocol calls return the new file attributes after
1258 * an operation.  Here we update the inode to reflect the state
1259 * of the server's inode.
1260 *
1261 * This is a bit tricky because we have to make sure all dirty pages
1262 * have been sent off to the server before calling invalidate_inode_pages.
1263 * To make sure no other process adds more write requests while we try
1264 * our best to flush them, we make them sleep during the attribute refresh.
1265 *
1266 * A very similar scenario holds for the dir cache.
1267 */
1268static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
1269{
1270        struct nfs_server *server;
1271        struct nfs_inode *nfsi = NFS_I(inode);
1272        loff_t cur_isize, new_isize;
1273        unsigned long invalid = 0;
1274        unsigned long now = jiffies;
1275        unsigned long save_cache_validity;
1276
1277        dfprintk(VFS, "NFS: %s(%s/%ld fh_crc=0x%08x ct=%d info=0x%x)\n",
1278                        __func__, inode->i_sb->s_id, inode->i_ino,
1279                        nfs_display_fhandle_hash(NFS_FH(inode)),
1280                        atomic_read(&inode->i_count), fattr->valid);
1281
1282        if ((fattr->valid & NFS_ATTR_FATTR_FILEID) && nfsi->fileid != fattr->fileid)
1283                goto out_fileid;
1284
1285        /*
1286         * Make sure the inode's type hasn't changed.
1287         */
1288        if ((fattr->valid & NFS_ATTR_FATTR_TYPE) && (inode->i_mode & S_IFMT) != (fattr->mode & S_IFMT))
1289                goto out_changed;
1290
1291        server = NFS_SERVER(inode);
1292        /* Update the fsid? */
1293        if (S_ISDIR(inode->i_mode) && (fattr->valid & NFS_ATTR_FATTR_FSID) &&
1294                        !nfs_fsid_equal(&server->fsid, &fattr->fsid) &&
1295                        !IS_AUTOMOUNT(inode))
1296                server->fsid = fattr->fsid;
1297
1298        /*
1299         * Update the read time so we don't revalidate too often.
1300         */
1301        nfsi->read_cache_jiffies = fattr->time_start;
1302
1303        save_cache_validity = nfsi->cache_validity;
1304        nfsi->cache_validity &= ~(NFS_INO_INVALID_ATTR
1305                        | NFS_INO_INVALID_ATIME
1306                        | NFS_INO_REVAL_FORCED
1307                        | NFS_INO_REVAL_PAGECACHE);
1308
1309        /* Do atomic weak cache consistency updates */
1310        invalid |= nfs_wcc_update_inode(inode, fattr);
1311
1312        /* More cache consistency checks */
1313        if (fattr->valid & NFS_ATTR_FATTR_CHANGE) {
1314                if (inode->i_version != fattr->change_attr) {
1315                        dprintk("NFS: change_attr change on server for file %s/%ld\n",
1316                                        inode->i_sb->s_id, inode->i_ino);
1317                        invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;
1318                        if (S_ISDIR(inode->i_mode))
1319                                nfs_force_lookup_revalidate(inode);
1320                        inode->i_version = fattr->change_attr;
1321                }
1322        } else if (server->caps & NFS_CAP_CHANGE_ATTR)
1323                invalid |= save_cache_validity;
1324
1325        if (fattr->valid & NFS_ATTR_FATTR_MTIME) {
1326                /* NFSv2/v3: Check if the mtime agrees */
1327                if (!timespec_equal(&inode->i_mtime, &fattr->mtime)) {
1328                        dprintk("NFS: mtime change on server for file %s/%ld\n",
1329                                        inode->i_sb->s_id, inode->i_ino);
1330                        invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA;
1331                        if (S_ISDIR(inode->i_mode))
1332                                nfs_force_lookup_revalidate(inode);
1333                        memcpy(&inode->i_mtime, &fattr->mtime, sizeof(inode->i_mtime));
1334                }
1335        } else if (server->caps & NFS_CAP_MTIME)
1336                invalid |= save_cache_validity & (NFS_INO_INVALID_ATTR
1337                                | NFS_INO_INVALID_DATA
1338                                | NFS_INO_REVAL_PAGECACHE
1339                                | NFS_INO_REVAL_FORCED);
1340
1341        if (fattr->valid & NFS_ATTR_FATTR_CTIME) {
1342                /* If ctime has changed we should definitely clear access+acl caches */
1343                if (!timespec_equal(&inode->i_ctime, &fattr->ctime)) {
1344                        invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;
1345                        /* and probably clear data for a directory too as utimes can cause
1346                         * havoc with our cache.
1347                         */
1348                        if (S_ISDIR(inode->i_mode)) {
1349                                invalid |= NFS_INO_INVALID_DATA;
1350                                nfs_force_lookup_revalidate(inode);
1351                        }
1352                        memcpy(&inode->i_ctime, &fattr->ctime, sizeof(inode->i_ctime));
1353                }
1354        } else if (server->caps & NFS_CAP_CTIME)
1355                invalid |= save_cache_validity & (NFS_INO_INVALID_ATTR
1356                                | NFS_INO_INVALID_ACCESS
1357                                | NFS_INO_INVALID_ACL
1358                                | NFS_INO_REVAL_FORCED);
1359
1360        /* Check if our cached file size is stale */
1361        if (fattr->valid & NFS_ATTR_FATTR_SIZE) {
1362                new_isize = nfs_size_to_loff_t(fattr->size);
1363                cur_isize = i_size_read(inode);
1364                if (new_isize != cur_isize) {
1365                        /* Do we perhaps have any outstanding writes, or has
1366                         * the file grown beyond our last write? */
1367                        if ((nfsi->npages == 0 && !test_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->flags)) ||
1368                             new_isize > cur_isize) {
1369                                i_size_write(inode, new_isize);
1370                                invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA;
1371                        }
1372                        dprintk("NFS: isize change on server for file %s/%ld "
1373                                        "(%Ld to %Ld)\n",
1374                                        inode->i_sb->s_id,
1375                                        inode->i_ino,
1376                                        (long long)cur_isize,
1377                                        (long long)new_isize);
1378                }
1379        } else
1380                invalid |= save_cache_validity & (NFS_INO_INVALID_ATTR
1381                                | NFS_INO_REVAL_PAGECACHE
1382                                | NFS_INO_REVAL_FORCED);
1383
1384
1385        if (fattr->valid & NFS_ATTR_FATTR_ATIME)
1386                memcpy(&inode->i_atime, &fattr->atime, sizeof(inode->i_atime));
1387        else if (server->caps & NFS_CAP_ATIME)
1388                invalid |= save_cache_validity & (NFS_INO_INVALID_ATIME
1389                                | NFS_INO_REVAL_FORCED);
1390
1391        if (fattr->valid & NFS_ATTR_FATTR_MODE) {
1392                if ((inode->i_mode & S_IALLUGO) != (fattr->mode & S_IALLUGO)) {
1393                        umode_t newmode = inode->i_mode & S_IFMT;
1394                        newmode |= fattr->mode & S_IALLUGO;
1395                        inode->i_mode = newmode;
1396                        invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;
1397                }
1398        } else if (server->caps & NFS_CAP_MODE)
1399                invalid |= save_cache_validity & (NFS_INO_INVALID_ATTR
1400                                | NFS_INO_INVALID_ACCESS
1401                                | NFS_INO_INVALID_ACL
1402                                | NFS_INO_REVAL_FORCED);
1403
1404        if (fattr->valid & NFS_ATTR_FATTR_OWNER) {
1405                if (inode->i_uid != fattr->uid) {
1406                        invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;
1407                        inode->i_uid = fattr->uid;
1408                }
1409        } else if (server->caps & NFS_CAP_OWNER)
1410                invalid |= save_cache_validity & (NFS_INO_INVALID_ATTR
1411                                | NFS_INO_INVALID_ACCESS
1412                                | NFS_INO_INVALID_ACL
1413                                | NFS_INO_REVAL_FORCED);
1414
1415        if (fattr->valid & NFS_ATTR_FATTR_GROUP) {
1416                if (inode->i_gid != fattr->gid) {
1417                        invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;
1418                        inode->i_gid = fattr->gid;
1419                }
1420        } else if (server->caps & NFS_CAP_OWNER_GROUP)
1421                invalid |= save_cache_validity & (NFS_INO_INVALID_ATTR
1422                                | NFS_INO_INVALID_ACCESS
1423                                | NFS_INO_INVALID_ACL
1424                                | NFS_INO_REVAL_FORCED);
1425
1426        if (fattr->valid & NFS_ATTR_FATTR_NLINK) {
1427                if (inode->i_nlink != fattr->nlink) {
1428                        invalid |= NFS_INO_INVALID_ATTR;
1429                        if (S_ISDIR(inode->i_mode))
1430                                invalid |= NFS_INO_INVALID_DATA;
1431                        set_nlink(inode, fattr->nlink);
1432                }
1433        } else if (server->caps & NFS_CAP_NLINK)
1434                invalid |= save_cache_validity & (NFS_INO_INVALID_ATTR
1435                                | NFS_INO_REVAL_FORCED);
1436
1437        if (fattr->valid & NFS_ATTR_FATTR_SPACE_USED) {
1438                /*
1439                 * report the blocks in 512byte units
1440                 */
1441                inode->i_blocks = nfs_calc_block_size(fattr->du.nfs3.used);
1442        }
1443        if (fattr->valid & NFS_ATTR_FATTR_BLOCKS_USED)
1444                inode->i_blocks = fattr->du.nfs2.blocks;
1445
1446        /* Update attrtimeo value if we're out of the unstable period */
1447        if (invalid & NFS_INO_INVALID_ATTR) {
1448                nfs_inc_stats(inode, NFSIOS_ATTRINVALIDATE);
1449                nfsi->attrtimeo = NFS_MINATTRTIMEO(inode);
1450                nfsi->attrtimeo_timestamp = now;
1451                nfsi->attr_gencount = nfs_inc_attr_generation_counter();
1452        } else {
1453                if (!time_in_range_open(now, nfsi->attrtimeo_timestamp, nfsi->attrtimeo_timestamp + nfsi->attrtimeo)) {
1454                        if ((nfsi->attrtimeo <<= 1) > NFS_MAXATTRTIMEO(inode))
1455                                nfsi->attrtimeo = NFS_MAXATTRTIMEO(inode);
1456                        nfsi->attrtimeo_timestamp = now;
1457                }
1458        }
1459        invalid &= ~NFS_INO_INVALID_ATTR;
1460        /* Don't invalidate the data if we were to blame */
1461        if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)
1462                                || S_ISLNK(inode->i_mode)))
1463                invalid &= ~NFS_INO_INVALID_DATA;
1464        if (!nfs_have_delegation(inode, FMODE_READ) ||
1465                        (save_cache_validity & NFS_INO_REVAL_FORCED))
1466                nfsi->cache_validity |= invalid;
1467
1468        return 0;
1469 out_changed:
1470        /*
1471         * Big trouble! The inode has become a different object.
1472         */
1473        printk(KERN_DEBUG "NFS: %s: inode %ld mode changed, %07o to %07o\n",
1474                        __func__, inode->i_ino, inode->i_mode, fattr->mode);
1475 out_err:
1476        /*
1477         * No need to worry about unhashing the dentry, as the
1478         * lookup validation will know that the inode is bad.
1479         * (But we fall through to invalidate the caches.)
1480         */
1481        nfs_invalidate_inode(inode);
1482        return -ESTALE;
1483
1484 out_fileid:
1485        printk(KERN_ERR "NFS: server %s error: fileid changed\n"
1486                "fsid %s: expected fileid 0x%Lx, got 0x%Lx\n",
1487                NFS_SERVER(inode)->nfs_client->cl_hostname, inode->i_sb->s_id,
1488                (long long)nfsi->fileid, (long long)fattr->fileid);
1489        goto out_err;
1490}
1491
1492
1493#ifdef CONFIG_NFS_V4
1494
1495/*
1496 * Clean out any remaining NFSv4 state that might be left over due
1497 * to open() calls that passed nfs_atomic_lookup, but failed to call
1498 * nfs_open().
1499 */
1500void nfs4_evict_inode(struct inode *inode)
1501{
1502        truncate_inode_pages(&inode->i_data, 0);
1503        end_writeback(inode);
1504        pnfs_return_layout(inode);
1505        pnfs_destroy_layout(NFS_I(inode));
1506        /* If we are holding a delegation, return it! */
1507        nfs_inode_return_delegation_noreclaim(inode);
1508        /* First call standard NFS clear_inode() code */
1509        nfs_clear_inode(inode);
1510}
1511#endif
1512
1513struct inode *nfs_alloc_inode(struct super_block *sb)
1514{
1515        struct nfs_inode *nfsi;
1516        nfsi = (struct nfs_inode *)kmem_cache_alloc(nfs_inode_cachep, GFP_KERNEL);
1517        if (!nfsi)
1518                return NULL;
1519        nfsi->flags = 0UL;
1520        nfsi->cache_validity = 0UL;
1521#ifdef CONFIG_NFS_V3_ACL
1522        nfsi->acl_access = ERR_PTR(-EAGAIN);
1523        nfsi->acl_default = ERR_PTR(-EAGAIN);
1524#endif
1525#ifdef CONFIG_NFS_V4
1526        nfsi->nfs4_acl = NULL;
1527#endif /* CONFIG_NFS_V4 */
1528        return &nfsi->vfs_inode;
1529}
1530
1531static void nfs_i_callback(struct rcu_head *head)
1532{
1533        struct inode *inode = container_of(head, struct inode, i_rcu);
1534        kmem_cache_free(nfs_inode_cachep, NFS_I(inode));
1535}
1536
1537void nfs_destroy_inode(struct inode *inode)
1538{
1539        call_rcu(&inode->i_rcu, nfs_i_callback);
1540}
1541
1542static inline void nfs4_init_once(struct nfs_inode *nfsi)
1543{
1544#ifdef CONFIG_NFS_V4
1545        INIT_LIST_HEAD(&nfsi->open_states);
1546        nfsi->delegation = NULL;
1547        nfsi->delegation_state = 0;
1548        init_rwsem(&nfsi->rwsem);
1549        nfsi->layout = NULL;
1550        atomic_set(&nfsi->commits_outstanding, 0);
1551#endif
1552}
1553
1554static void init_once(void *foo)
1555{
1556        struct nfs_inode *nfsi = (struct nfs_inode *) foo;
1557
1558        inode_init_once(&nfsi->vfs_inode);
1559        INIT_LIST_HEAD(&nfsi->open_files);
1560        INIT_LIST_HEAD(&nfsi->access_cache_entry_lru);
1561        INIT_LIST_HEAD(&nfsi->access_cache_inode_lru);
1562        INIT_LIST_HEAD(&nfsi->commit_list);
1563        nfsi->npages = 0;
1564        nfsi->ncommit = 0;
1565        atomic_set(&nfsi->silly_count, 1);
1566        INIT_HLIST_HEAD(&nfsi->silly_list);
1567        init_waitqueue_head(&nfsi->waitqueue);
1568        nfs4_init_once(nfsi);
1569}
1570
1571static int __init nfs_init_inodecache(void)
1572{
1573        nfs_inode_cachep = kmem_cache_create("nfs_inode_cache",
1574                                             sizeof(struct nfs_inode),
1575                                             0, (SLAB_RECLAIM_ACCOUNT|
1576                                                SLAB_MEM_SPREAD),
1577                                             init_once);
1578        if (nfs_inode_cachep == NULL)
1579                return -ENOMEM;
1580
1581        return 0;
1582}
1583
1584static void nfs_destroy_inodecache(void)
1585{
1586        kmem_cache_destroy(nfs_inode_cachep);
1587}
1588
1589struct workqueue_struct *nfsiod_workqueue;
1590
1591/*
1592 * start up the nfsiod workqueue
1593 */
1594static int nfsiod_start(void)
1595{
1596        struct workqueue_struct *wq;
1597        dprintk("RPC:       creating workqueue nfsiod\n");
1598        wq = alloc_workqueue("nfsiod", WQ_MEM_RECLAIM, 0);
1599        if (wq == NULL)
1600                return -ENOMEM;
1601        nfsiod_workqueue = wq;
1602        return 0;
1603}
1604
1605/*
1606 * Destroy the nfsiod workqueue
1607 */
1608static void nfsiod_stop(void)
1609{
1610        struct workqueue_struct *wq;
1611
1612        wq = nfsiod_workqueue;
1613        if (wq == NULL)
1614                return;
1615        nfsiod_workqueue = NULL;
1616        destroy_workqueue(wq);
1617}
1618
1619int nfs_net_id;
1620EXPORT_SYMBOL_GPL(nfs_net_id);
1621
1622static int nfs_net_init(struct net *net)
1623{
1624        nfs_clients_init(net);
1625        return nfs_dns_resolver_cache_init(net);
1626}
1627
1628static void nfs_net_exit(struct net *net)
1629{
1630        nfs_dns_resolver_cache_destroy(net);
1631        nfs_cleanup_cb_ident_idr(net);
1632}
1633
1634static struct pernet_operations nfs_net_ops = {
1635        .init = nfs_net_init,
1636        .exit = nfs_net_exit,
1637        .id   = &nfs_net_id,
1638        .size = sizeof(struct nfs_net),
1639};
1640
1641/*
1642 * Initialize NFS
1643 */
1644static int __init init_nfs_fs(void)
1645{
1646        int err;
1647
1648        err = nfs_idmap_init();
1649        if (err < 0)
1650                goto out10;
1651
1652        err = nfs_dns_resolver_init();
1653        if (err < 0)
1654                goto out9;
1655
1656        err = register_pernet_subsys(&nfs_net_ops);
1657        if (err < 0)
1658                goto out8;
1659
1660        err = nfs_fscache_register();
1661        if (err < 0)
1662                goto out7;
1663
1664        err = nfsiod_start();
1665        if (err)
1666                goto out6;
1667
1668        err = nfs_fs_proc_init();
1669        if (err)
1670                goto out5;
1671
1672        err = nfs_init_nfspagecache();
1673        if (err)
1674                goto out4;
1675
1676        err = nfs_init_inodecache();
1677        if (err)
1678                goto out3;
1679
1680        err = nfs_init_readpagecache();
1681        if (err)
1682                goto out2;
1683
1684        err = nfs_init_writepagecache();
1685        if (err)
1686                goto out1;
1687
1688        err = nfs_init_directcache();
1689        if (err)
1690                goto out0;
1691
1692#ifdef CONFIG_PROC_FS
1693        rpc_proc_register(&init_net, &nfs_rpcstat);
1694#endif
1695        if ((err = register_nfs_fs()) != 0)
1696                goto out;
1697        return 0;
1698out:
1699#ifdef CONFIG_PROC_FS
1700        rpc_proc_unregister(&init_net, "nfs");
1701#endif
1702        nfs_destroy_directcache();
1703out0:
1704        nfs_destroy_writepagecache();
1705out1:
1706        nfs_destroy_readpagecache();
1707out2:
1708        nfs_destroy_inodecache();
1709out3:
1710        nfs_destroy_nfspagecache();
1711out4:
1712        nfs_fs_proc_exit();
1713out5:
1714        nfsiod_stop();
1715out6:
1716        nfs_fscache_unregister();
1717out7:
1718        unregister_pernet_subsys(&nfs_net_ops);
1719out8:
1720        nfs_dns_resolver_destroy();
1721out9:
1722        nfs_idmap_quit();
1723out10:
1724        return err;
1725}
1726
1727static void __exit exit_nfs_fs(void)
1728{
1729        nfs_destroy_directcache();
1730        nfs_destroy_writepagecache();
1731        nfs_destroy_readpagecache();
1732        nfs_destroy_inodecache();
1733        nfs_destroy_nfspagecache();
1734        nfs_fscache_unregister();
1735        unregister_pernet_subsys(&nfs_net_ops);
1736        nfs_dns_resolver_destroy();
1737        nfs_idmap_quit();
1738#ifdef CONFIG_PROC_FS
1739        rpc_proc_unregister(&init_net, "nfs");
1740#endif
1741        unregister_nfs_fs();
1742        nfs_fs_proc_exit();
1743        nfsiod_stop();
1744}
1745
1746/* Not quite true; I just maintain it */
1747MODULE_AUTHOR("Olaf Kirch <okir@monad.swb.de>");
1748MODULE_LICENSE("GPL");
1749module_param(enable_ino64, bool, 0644);
1750
1751module_init(init_nfs_fs)
1752module_exit(exit_nfs_fs)
1753