linux/fs/nfs/dir.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 *  linux/fs/nfs/dir.c
   4 *
   5 *  Copyright (C) 1992  Rick Sladkey
   6 *
   7 *  nfs directory handling functions
   8 *
   9 * 10 Apr 1996  Added silly rename for unlink   --okir
  10 * 28 Sep 1996  Improved directory cache --okir
  11 * 23 Aug 1997  Claus Heine claus@momo.math.rwth-aachen.de 
  12 *              Re-implemented silly rename for unlink, newly implemented
  13 *              silly rename for nfs_rename() following the suggestions
  14 *              of Olaf Kirch (okir) found in this file.
  15 *              Following Linus comments on my original hack, this version
  16 *              depends only on the dcache stuff and doesn't touch the inode
  17 *              layer (iput() and friends).
  18 *  6 Jun 1999  Cache readdir lookups in the page cache. -DaveM
  19 */
  20
  21#include <linux/module.h>
  22#include <linux/time.h>
  23#include <linux/errno.h>
  24#include <linux/stat.h>
  25#include <linux/fcntl.h>
  26#include <linux/string.h>
  27#include <linux/kernel.h>
  28#include <linux/slab.h>
  29#include <linux/mm.h>
  30#include <linux/sunrpc/clnt.h>
  31#include <linux/nfs_fs.h>
  32#include <linux/nfs_mount.h>
  33#include <linux/pagemap.h>
  34#include <linux/pagevec.h>
  35#include <linux/namei.h>
  36#include <linux/mount.h>
  37#include <linux/swap.h>
  38#include <linux/sched.h>
  39#include <linux/kmemleak.h>
  40#include <linux/xattr.h>
  41
  42#include "delegation.h"
  43#include "iostat.h"
  44#include "internal.h"
  45#include "fscache.h"
  46
  47#include "nfstrace.h"
  48
  49/* #define NFS_DEBUG_VERBOSE 1 */
  50
  51static int nfs_opendir(struct inode *, struct file *);
  52static int nfs_closedir(struct inode *, struct file *);
  53static int nfs_readdir(struct file *, struct dir_context *);
  54static int nfs_fsync_dir(struct file *, loff_t, loff_t, int);
  55static loff_t nfs_llseek_dir(struct file *, loff_t, int);
  56static void nfs_readdir_clear_array(struct page*);
  57
  58const struct file_operations nfs_dir_operations = {
  59        .llseek         = nfs_llseek_dir,
  60        .read           = generic_read_dir,
  61        .iterate_shared = nfs_readdir,
  62        .open           = nfs_opendir,
  63        .release        = nfs_closedir,
  64        .fsync          = nfs_fsync_dir,
  65};
  66
  67const struct address_space_operations nfs_dir_aops = {
  68        .freepage = nfs_readdir_clear_array,
  69};
  70
  71static struct nfs_open_dir_context *alloc_nfs_open_dir_context(struct inode *dir, const struct cred *cred)
  72{
  73        struct nfs_inode *nfsi = NFS_I(dir);
  74        struct nfs_open_dir_context *ctx;
  75        ctx = kmalloc(sizeof(*ctx), GFP_KERNEL);
  76        if (ctx != NULL) {
  77                ctx->duped = 0;
  78                ctx->attr_gencount = nfsi->attr_gencount;
  79                ctx->dir_cookie = 0;
  80                ctx->dup_cookie = 0;
  81                ctx->cred = get_cred(cred);
  82                spin_lock(&dir->i_lock);
  83                if (list_empty(&nfsi->open_files) &&
  84                    (nfsi->cache_validity & NFS_INO_DATA_INVAL_DEFER))
  85                        nfsi->cache_validity |= NFS_INO_INVALID_DATA |
  86                                NFS_INO_REVAL_FORCED;
  87                list_add(&ctx->list, &nfsi->open_files);
  88                spin_unlock(&dir->i_lock);
  89                return ctx;
  90        }
  91        return  ERR_PTR(-ENOMEM);
  92}
  93
  94static void put_nfs_open_dir_context(struct inode *dir, struct nfs_open_dir_context *ctx)
  95{
  96        spin_lock(&dir->i_lock);
  97        list_del(&ctx->list);
  98        spin_unlock(&dir->i_lock);
  99        put_cred(ctx->cred);
 100        kfree(ctx);
 101}
 102
 103/*
 104 * Open file
 105 */
 106static int
 107nfs_opendir(struct inode *inode, struct file *filp)
 108{
 109        int res = 0;
 110        struct nfs_open_dir_context *ctx;
 111
 112        dfprintk(FILE, "NFS: open dir(%pD2)\n", filp);
 113
 114        nfs_inc_stats(inode, NFSIOS_VFSOPEN);
 115
 116        ctx = alloc_nfs_open_dir_context(inode, current_cred());
 117        if (IS_ERR(ctx)) {
 118                res = PTR_ERR(ctx);
 119                goto out;
 120        }
 121        filp->private_data = ctx;
 122out:
 123        return res;
 124}
 125
 126static int
 127nfs_closedir(struct inode *inode, struct file *filp)
 128{
 129        put_nfs_open_dir_context(file_inode(filp), filp->private_data);
 130        return 0;
 131}
 132
 133struct nfs_cache_array_entry {
 134        u64 cookie;
 135        u64 ino;
 136        struct qstr string;
 137        unsigned char d_type;
 138};
 139
 140struct nfs_cache_array {
 141        int size;
 142        int eof_index;
 143        u64 last_cookie;
 144        struct nfs_cache_array_entry array[];
 145};
 146
 147typedef struct {
 148        struct file     *file;
 149        struct page     *page;
 150        struct dir_context *ctx;
 151        unsigned long   page_index;
 152        u64             *dir_cookie;
 153        u64             last_cookie;
 154        loff_t          current_index;
 155        loff_t          prev_index;
 156
 157        unsigned long   dir_verifier;
 158        unsigned long   timestamp;
 159        unsigned long   gencount;
 160        unsigned int    cache_entry_index;
 161        bool plus;
 162        bool eof;
 163} nfs_readdir_descriptor_t;
 164
 165static
 166void nfs_readdir_init_array(struct page *page)
 167{
 168        struct nfs_cache_array *array;
 169
 170        array = kmap_atomic(page);
 171        memset(array, 0, sizeof(struct nfs_cache_array));
 172        array->eof_index = -1;
 173        kunmap_atomic(array);
 174}
 175
 176/*
 177 * we are freeing strings created by nfs_add_to_readdir_array()
 178 */
 179static
 180void nfs_readdir_clear_array(struct page *page)
 181{
 182        struct nfs_cache_array *array;
 183        int i;
 184
 185        array = kmap_atomic(page);
 186        for (i = 0; i < array->size; i++)
 187                kfree(array->array[i].string.name);
 188        array->size = 0;
 189        kunmap_atomic(array);
 190}
 191
 192/*
 193 * the caller is responsible for freeing qstr.name
 194 * when called by nfs_readdir_add_to_array, the strings will be freed in
 195 * nfs_clear_readdir_array()
 196 */
 197static
 198int nfs_readdir_make_qstr(struct qstr *string, const char *name, unsigned int len)
 199{
 200        string->len = len;
 201        string->name = kmemdup_nul(name, len, GFP_KERNEL);
 202        if (string->name == NULL)
 203                return -ENOMEM;
 204        /*
 205         * Avoid a kmemleak false positive. The pointer to the name is stored
 206         * in a page cache page which kmemleak does not scan.
 207         */
 208        kmemleak_not_leak(string->name);
 209        string->hash = full_name_hash(NULL, name, len);
 210        return 0;
 211}
 212
 213static
 214int nfs_readdir_add_to_array(struct nfs_entry *entry, struct page *page)
 215{
 216        struct nfs_cache_array *array = kmap(page);
 217        struct nfs_cache_array_entry *cache_entry;
 218        int ret;
 219
 220        cache_entry = &array->array[array->size];
 221
 222        /* Check that this entry lies within the page bounds */
 223        ret = -ENOSPC;
 224        if ((char *)&cache_entry[1] - (char *)page_address(page) > PAGE_SIZE)
 225                goto out;
 226
 227        cache_entry->cookie = entry->prev_cookie;
 228        cache_entry->ino = entry->ino;
 229        cache_entry->d_type = entry->d_type;
 230        ret = nfs_readdir_make_qstr(&cache_entry->string, entry->name, entry->len);
 231        if (ret)
 232                goto out;
 233        array->last_cookie = entry->cookie;
 234        array->size++;
 235        if (entry->eof != 0)
 236                array->eof_index = array->size;
 237out:
 238        kunmap(page);
 239        return ret;
 240}
 241
 242static inline
 243int is_32bit_api(void)
 244{
 245#ifdef CONFIG_COMPAT
 246        return in_compat_syscall();
 247#else
 248        return (BITS_PER_LONG == 32);
 249#endif
 250}
 251
 252static
 253bool nfs_readdir_use_cookie(const struct file *filp)
 254{
 255        if ((filp->f_mode & FMODE_32BITHASH) ||
 256            (!(filp->f_mode & FMODE_64BITHASH) && is_32bit_api()))
 257                return false;
 258        return true;
 259}
 260
 261static
 262int nfs_readdir_search_for_pos(struct nfs_cache_array *array, nfs_readdir_descriptor_t *desc)
 263{
 264        loff_t diff = desc->ctx->pos - desc->current_index;
 265        unsigned int index;
 266
 267        if (diff < 0)
 268                goto out_eof;
 269        if (diff >= array->size) {
 270                if (array->eof_index >= 0)
 271                        goto out_eof;
 272                return -EAGAIN;
 273        }
 274
 275        index = (unsigned int)diff;
 276        *desc->dir_cookie = array->array[index].cookie;
 277        desc->cache_entry_index = index;
 278        return 0;
 279out_eof:
 280        desc->eof = true;
 281        return -EBADCOOKIE;
 282}
 283
 284static bool
 285nfs_readdir_inode_mapping_valid(struct nfs_inode *nfsi)
 286{
 287        if (nfsi->cache_validity & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA))
 288                return false;
 289        smp_rmb();
 290        return !test_bit(NFS_INO_INVALIDATING, &nfsi->flags);
 291}
 292
 293static
 294int nfs_readdir_search_for_cookie(struct nfs_cache_array *array, nfs_readdir_descriptor_t *desc)
 295{
 296        int i;
 297        loff_t new_pos;
 298        int status = -EAGAIN;
 299
 300        for (i = 0; i < array->size; i++) {
 301                if (array->array[i].cookie == *desc->dir_cookie) {
 302                        struct nfs_inode *nfsi = NFS_I(file_inode(desc->file));
 303                        struct nfs_open_dir_context *ctx = desc->file->private_data;
 304
 305                        new_pos = desc->current_index + i;
 306                        if (ctx->attr_gencount != nfsi->attr_gencount ||
 307                            !nfs_readdir_inode_mapping_valid(nfsi)) {
 308                                ctx->duped = 0;
 309                                ctx->attr_gencount = nfsi->attr_gencount;
 310                        } else if (new_pos < desc->prev_index) {
 311                                if (ctx->duped > 0
 312                                    && ctx->dup_cookie == *desc->dir_cookie) {
 313                                        if (printk_ratelimit()) {
 314                                                pr_notice("NFS: directory %pD2 contains a readdir loop."
 315                                                                "Please contact your server vendor.  "
 316                                                                "The file: %.*s has duplicate cookie %llu\n",
 317                                                                desc->file, array->array[i].string.len,
 318                                                                array->array[i].string.name, *desc->dir_cookie);
 319                                        }
 320                                        status = -ELOOP;
 321                                        goto out;
 322                                }
 323                                ctx->dup_cookie = *desc->dir_cookie;
 324                                ctx->duped = -1;
 325                        }
 326                        if (nfs_readdir_use_cookie(desc->file))
 327                                desc->ctx->pos = *desc->dir_cookie;
 328                        else
 329                                desc->ctx->pos = new_pos;
 330                        desc->prev_index = new_pos;
 331                        desc->cache_entry_index = i;
 332                        return 0;
 333                }
 334        }
 335        if (array->eof_index >= 0) {
 336                status = -EBADCOOKIE;
 337                if (*desc->dir_cookie == array->last_cookie)
 338                        desc->eof = true;
 339        }
 340out:
 341        return status;
 342}
 343
 344static
 345int nfs_readdir_search_array(nfs_readdir_descriptor_t *desc)
 346{
 347        struct nfs_cache_array *array;
 348        int status;
 349
 350        array = kmap(desc->page);
 351
 352        if (*desc->dir_cookie == 0)
 353                status = nfs_readdir_search_for_pos(array, desc);
 354        else
 355                status = nfs_readdir_search_for_cookie(array, desc);
 356
 357        if (status == -EAGAIN) {
 358                desc->last_cookie = array->last_cookie;
 359                desc->current_index += array->size;
 360                desc->page_index++;
 361        }
 362        kunmap(desc->page);
 363        return status;
 364}
 365
 366/* Fill a page with xdr information before transferring to the cache page */
 367static
 368int nfs_readdir_xdr_filler(struct page **pages, nfs_readdir_descriptor_t *desc,
 369                        struct nfs_entry *entry, struct file *file, struct inode *inode)
 370{
 371        struct nfs_open_dir_context *ctx = file->private_data;
 372        const struct cred *cred = ctx->cred;
 373        unsigned long   timestamp, gencount;
 374        int             error;
 375
 376 again:
 377        timestamp = jiffies;
 378        gencount = nfs_inc_attr_generation_counter();
 379        desc->dir_verifier = nfs_save_change_attribute(inode);
 380        error = NFS_PROTO(inode)->readdir(file_dentry(file), cred, entry->cookie, pages,
 381                                          NFS_SERVER(inode)->dtsize, desc->plus);
 382        if (error < 0) {
 383                /* We requested READDIRPLUS, but the server doesn't grok it */
 384                if (error == -ENOTSUPP && desc->plus) {
 385                        NFS_SERVER(inode)->caps &= ~NFS_CAP_READDIRPLUS;
 386                        clear_bit(NFS_INO_ADVISE_RDPLUS, &NFS_I(inode)->flags);
 387                        desc->plus = false;
 388                        goto again;
 389                }
 390                goto error;
 391        }
 392        desc->timestamp = timestamp;
 393        desc->gencount = gencount;
 394error:
 395        return error;
 396}
 397
 398static int xdr_decode(nfs_readdir_descriptor_t *desc,
 399                      struct nfs_entry *entry, struct xdr_stream *xdr)
 400{
 401        struct inode *inode = file_inode(desc->file);
 402        int error;
 403
 404        error = NFS_PROTO(inode)->decode_dirent(xdr, entry, desc->plus);
 405        if (error)
 406                return error;
 407        entry->fattr->time_start = desc->timestamp;
 408        entry->fattr->gencount = desc->gencount;
 409        return 0;
 410}
 411
 412/* Match file and dirent using either filehandle or fileid
 413 * Note: caller is responsible for checking the fsid
 414 */
 415static
 416int nfs_same_file(struct dentry *dentry, struct nfs_entry *entry)
 417{
 418        struct inode *inode;
 419        struct nfs_inode *nfsi;
 420
 421        if (d_really_is_negative(dentry))
 422                return 0;
 423
 424        inode = d_inode(dentry);
 425        if (is_bad_inode(inode) || NFS_STALE(inode))
 426                return 0;
 427
 428        nfsi = NFS_I(inode);
 429        if (entry->fattr->fileid != nfsi->fileid)
 430                return 0;
 431        if (entry->fh->size && nfs_compare_fh(entry->fh, &nfsi->fh) != 0)
 432                return 0;
 433        return 1;
 434}
 435
 436static
 437bool nfs_use_readdirplus(struct inode *dir, struct dir_context *ctx)
 438{
 439        if (!nfs_server_capable(dir, NFS_CAP_READDIRPLUS))
 440                return false;
 441        if (test_and_clear_bit(NFS_INO_ADVISE_RDPLUS, &NFS_I(dir)->flags))
 442                return true;
 443        if (ctx->pos == 0)
 444                return true;
 445        return false;
 446}
 447
 448/*
 449 * This function is called by the lookup and getattr code to request the
 450 * use of readdirplus to accelerate any future lookups in the same
 451 * directory.
 452 */
 453void nfs_advise_use_readdirplus(struct inode *dir)
 454{
 455        struct nfs_inode *nfsi = NFS_I(dir);
 456
 457        if (nfs_server_capable(dir, NFS_CAP_READDIRPLUS) &&
 458            !list_empty(&nfsi->open_files))
 459                set_bit(NFS_INO_ADVISE_RDPLUS, &nfsi->flags);
 460}
 461
 462/*
 463 * This function is mainly for use by nfs_getattr().
 464 *
 465 * If this is an 'ls -l', we want to force use of readdirplus.
 466 * Do this by checking if there is an active file descriptor
 467 * and calling nfs_advise_use_readdirplus, then forcing a
 468 * cache flush.
 469 */
 470void nfs_force_use_readdirplus(struct inode *dir)
 471{
 472        struct nfs_inode *nfsi = NFS_I(dir);
 473
 474        if (nfs_server_capable(dir, NFS_CAP_READDIRPLUS) &&
 475            !list_empty(&nfsi->open_files)) {
 476                set_bit(NFS_INO_ADVISE_RDPLUS, &nfsi->flags);
 477                invalidate_mapping_pages(dir->i_mapping,
 478                        nfsi->page_index + 1, -1);
 479        }
 480}
 481
 482static
 483void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry,
 484                unsigned long dir_verifier)
 485{
 486        struct qstr filename = QSTR_INIT(entry->name, entry->len);
 487        DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
 488        struct dentry *dentry;
 489        struct dentry *alias;
 490        struct inode *inode;
 491        int status;
 492
 493        if (!(entry->fattr->valid & NFS_ATTR_FATTR_FILEID))
 494                return;
 495        if (!(entry->fattr->valid & NFS_ATTR_FATTR_FSID))
 496                return;
 497        if (filename.len == 0)
 498                return;
 499        /* Validate that the name doesn't contain any illegal '\0' */
 500        if (strnlen(filename.name, filename.len) != filename.len)
 501                return;
 502        /* ...or '/' */
 503        if (strnchr(filename.name, filename.len, '/'))
 504                return;
 505        if (filename.name[0] == '.') {
 506                if (filename.len == 1)
 507                        return;
 508                if (filename.len == 2 && filename.name[1] == '.')
 509                        return;
 510        }
 511        filename.hash = full_name_hash(parent, filename.name, filename.len);
 512
 513        dentry = d_lookup(parent, &filename);
 514again:
 515        if (!dentry) {
 516                dentry = d_alloc_parallel(parent, &filename, &wq);
 517                if (IS_ERR(dentry))
 518                        return;
 519        }
 520        if (!d_in_lookup(dentry)) {
 521                /* Is there a mountpoint here? If so, just exit */
 522                if (!nfs_fsid_equal(&NFS_SB(dentry->d_sb)->fsid,
 523                                        &entry->fattr->fsid))
 524                        goto out;
 525                if (nfs_same_file(dentry, entry)) {
 526                        if (!entry->fh->size)
 527                                goto out;
 528                        nfs_set_verifier(dentry, dir_verifier);
 529                        status = nfs_refresh_inode(d_inode(dentry), entry->fattr);
 530                        if (!status)
 531                                nfs_setsecurity(d_inode(dentry), entry->fattr, entry->label);
 532                        goto out;
 533                } else {
 534                        d_invalidate(dentry);
 535                        dput(dentry);
 536                        dentry = NULL;
 537                        goto again;
 538                }
 539        }
 540        if (!entry->fh->size) {
 541                d_lookup_done(dentry);
 542                goto out;
 543        }
 544
 545        inode = nfs_fhget(dentry->d_sb, entry->fh, entry->fattr, entry->label);
 546        alias = d_splice_alias(inode, dentry);
 547        d_lookup_done(dentry);
 548        if (alias) {
 549                if (IS_ERR(alias))
 550                        goto out;
 551                dput(dentry);
 552                dentry = alias;
 553        }
 554        nfs_set_verifier(dentry, dir_verifier);
 555out:
 556        dput(dentry);
 557}
 558
 559/* Perform conversion from xdr to cache array */
 560static
 561int nfs_readdir_page_filler(nfs_readdir_descriptor_t *desc, struct nfs_entry *entry,
 562                                struct page **xdr_pages, struct page *page, unsigned int buflen)
 563{
 564        struct xdr_stream stream;
 565        struct xdr_buf buf;
 566        struct page *scratch;
 567        struct nfs_cache_array *array;
 568        unsigned int count = 0;
 569        int status;
 570
 571        scratch = alloc_page(GFP_KERNEL);
 572        if (scratch == NULL)
 573                return -ENOMEM;
 574
 575        if (buflen == 0)
 576                goto out_nopages;
 577
 578        xdr_init_decode_pages(&stream, &buf, xdr_pages, buflen);
 579        xdr_set_scratch_buffer(&stream, page_address(scratch), PAGE_SIZE);
 580
 581        do {
 582                status = xdr_decode(desc, entry, &stream);
 583                if (status != 0) {
 584                        if (status == -EAGAIN)
 585                                status = 0;
 586                        break;
 587                }
 588
 589                count++;
 590
 591                if (desc->plus)
 592                        nfs_prime_dcache(file_dentry(desc->file), entry,
 593                                        desc->dir_verifier);
 594
 595                status = nfs_readdir_add_to_array(entry, page);
 596                if (status != 0)
 597                        break;
 598        } while (!entry->eof);
 599
 600out_nopages:
 601        if (count == 0 || (status == -EBADCOOKIE && entry->eof != 0)) {
 602                array = kmap(page);
 603                array->eof_index = array->size;
 604                status = 0;
 605                kunmap(page);
 606        }
 607
 608        put_page(scratch);
 609        return status;
 610}
 611
 612static
 613void nfs_readdir_free_pages(struct page **pages, unsigned int npages)
 614{
 615        unsigned int i;
 616        for (i = 0; i < npages; i++)
 617                put_page(pages[i]);
 618}
 619
 620/*
 621 * nfs_readdir_alloc_pages() will allocate pages that must be freed with a call
 622 * to nfs_readdir_free_pages()
 623 */
 624static
 625int nfs_readdir_alloc_pages(struct page **pages, unsigned int npages)
 626{
 627        unsigned int i;
 628
 629        for (i = 0; i < npages; i++) {
 630                struct page *page = alloc_page(GFP_KERNEL);
 631                if (page == NULL)
 632                        goto out_freepages;
 633                pages[i] = page;
 634        }
 635        return 0;
 636
 637out_freepages:
 638        nfs_readdir_free_pages(pages, i);
 639        return -ENOMEM;
 640}
 641
 642static
 643int nfs_readdir_xdr_to_array(nfs_readdir_descriptor_t *desc, struct page *page, struct inode *inode)
 644{
 645        struct page *pages[NFS_MAX_READDIR_PAGES];
 646        struct nfs_entry entry;
 647        struct file     *file = desc->file;
 648        struct nfs_cache_array *array;
 649        int status = -ENOMEM;
 650        unsigned int array_size = ARRAY_SIZE(pages);
 651
 652        nfs_readdir_init_array(page);
 653
 654        entry.prev_cookie = 0;
 655        entry.cookie = desc->last_cookie;
 656        entry.eof = 0;
 657        entry.fh = nfs_alloc_fhandle();
 658        entry.fattr = nfs_alloc_fattr();
 659        entry.server = NFS_SERVER(inode);
 660        if (entry.fh == NULL || entry.fattr == NULL)
 661                goto out;
 662
 663        entry.label = nfs4_label_alloc(NFS_SERVER(inode), GFP_NOWAIT);
 664        if (IS_ERR(entry.label)) {
 665                status = PTR_ERR(entry.label);
 666                goto out;
 667        }
 668
 669        array = kmap(page);
 670
 671        status = nfs_readdir_alloc_pages(pages, array_size);
 672        if (status < 0)
 673                goto out_release_array;
 674        do {
 675                unsigned int pglen;
 676                status = nfs_readdir_xdr_filler(pages, desc, &entry, file, inode);
 677
 678                if (status < 0)
 679                        break;
 680                pglen = status;
 681                status = nfs_readdir_page_filler(desc, &entry, pages, page, pglen);
 682                if (status < 0) {
 683                        if (status == -ENOSPC)
 684                                status = 0;
 685                        break;
 686                }
 687        } while (array->eof_index < 0);
 688
 689        nfs_readdir_free_pages(pages, array_size);
 690out_release_array:
 691        kunmap(page);
 692        nfs4_label_free(entry.label);
 693out:
 694        nfs_free_fattr(entry.fattr);
 695        nfs_free_fhandle(entry.fh);
 696        return status;
 697}
 698
 699/*
 700 * Now we cache directories properly, by converting xdr information
 701 * to an array that can be used for lookups later.  This results in
 702 * fewer cache pages, since we can store more information on each page.
 703 * We only need to convert from xdr once so future lookups are much simpler
 704 */
 705static
 706int nfs_readdir_filler(void *data, struct page* page)
 707{
 708        nfs_readdir_descriptor_t *desc = data;
 709        struct inode    *inode = file_inode(desc->file);
 710        int ret;
 711
 712        ret = nfs_readdir_xdr_to_array(desc, page, inode);
 713        if (ret < 0)
 714                goto error;
 715        SetPageUptodate(page);
 716
 717        if (invalidate_inode_pages2_range(inode->i_mapping, page->index + 1, -1) < 0) {
 718                /* Should never happen */
 719                nfs_zap_mapping(inode, inode->i_mapping);
 720        }
 721        unlock_page(page);
 722        return 0;
 723 error:
 724        nfs_readdir_clear_array(page);
 725        unlock_page(page);
 726        return ret;
 727}
 728
 729static
 730void cache_page_release(nfs_readdir_descriptor_t *desc)
 731{
 732        put_page(desc->page);
 733        desc->page = NULL;
 734}
 735
 736static
 737struct page *get_cache_page(nfs_readdir_descriptor_t *desc)
 738{
 739        return read_cache_page(desc->file->f_mapping, desc->page_index,
 740                        nfs_readdir_filler, desc);
 741}
 742
 743/*
 744 * Returns 0 if desc->dir_cookie was found on page desc->page_index
 745 * and locks the page to prevent removal from the page cache.
 746 */
 747static
 748int find_and_lock_cache_page(nfs_readdir_descriptor_t *desc)
 749{
 750        struct inode *inode = file_inode(desc->file);
 751        struct nfs_inode *nfsi = NFS_I(inode);
 752        int res;
 753
 754        desc->page = get_cache_page(desc);
 755        if (IS_ERR(desc->page))
 756                return PTR_ERR(desc->page);
 757        res = lock_page_killable(desc->page);
 758        if (res != 0)
 759                goto error;
 760        res = -EAGAIN;
 761        if (desc->page->mapping != NULL) {
 762                res = nfs_readdir_search_array(desc);
 763                if (res == 0) {
 764                        nfsi->page_index = desc->page_index;
 765                        return 0;
 766                }
 767        }
 768        unlock_page(desc->page);
 769error:
 770        cache_page_release(desc);
 771        return res;
 772}
 773
 774/* Search for desc->dir_cookie from the beginning of the page cache */
 775static inline
 776int readdir_search_pagecache(nfs_readdir_descriptor_t *desc)
 777{
 778        int res;
 779
 780        if (desc->page_index == 0) {
 781                desc->current_index = 0;
 782                desc->prev_index = 0;
 783                desc->last_cookie = 0;
 784        }
 785        do {
 786                res = find_and_lock_cache_page(desc);
 787        } while (res == -EAGAIN);
 788        return res;
 789}
 790
 791/*
 792 * Once we've found the start of the dirent within a page: fill 'er up...
 793 */
 794static 
 795int nfs_do_filldir(nfs_readdir_descriptor_t *desc)
 796{
 797        struct file     *file = desc->file;
 798        int i = 0;
 799        int res = 0;
 800        struct nfs_cache_array *array = NULL;
 801        struct nfs_open_dir_context *ctx = file->private_data;
 802
 803        array = kmap(desc->page);
 804        for (i = desc->cache_entry_index; i < array->size; i++) {
 805                struct nfs_cache_array_entry *ent;
 806
 807                ent = &array->array[i];
 808                if (!dir_emit(desc->ctx, ent->string.name, ent->string.len,
 809                    nfs_compat_user_ino64(ent->ino), ent->d_type)) {
 810                        desc->eof = true;
 811                        break;
 812                }
 813                if (i < (array->size-1))
 814                        *desc->dir_cookie = array->array[i+1].cookie;
 815                else
 816                        *desc->dir_cookie = array->last_cookie;
 817                if (nfs_readdir_use_cookie(file))
 818                        desc->ctx->pos = *desc->dir_cookie;
 819                else
 820                        desc->ctx->pos++;
 821                if (ctx->duped != 0)
 822                        ctx->duped = 1;
 823        }
 824        if (array->eof_index >= 0)
 825                desc->eof = true;
 826
 827        kunmap(desc->page);
 828        dfprintk(DIRCACHE, "NFS: nfs_do_filldir() filling ended @ cookie %Lu; returning = %d\n",
 829                        (unsigned long long)*desc->dir_cookie, res);
 830        return res;
 831}
 832
 833/*
 834 * If we cannot find a cookie in our cache, we suspect that this is
 835 * because it points to a deleted file, so we ask the server to return
 836 * whatever it thinks is the next entry. We then feed this to filldir.
 837 * If all goes well, we should then be able to find our way round the
 838 * cache on the next call to readdir_search_pagecache();
 839 *
 840 * NOTE: we cannot add the anonymous page to the pagecache because
 841 *       the data it contains might not be page aligned. Besides,
 842 *       we should already have a complete representation of the
 843 *       directory in the page cache by the time we get here.
 844 */
 845static inline
 846int uncached_readdir(nfs_readdir_descriptor_t *desc)
 847{
 848        struct page     *page = NULL;
 849        int             status;
 850        struct inode *inode = file_inode(desc->file);
 851        struct nfs_open_dir_context *ctx = desc->file->private_data;
 852
 853        dfprintk(DIRCACHE, "NFS: uncached_readdir() searching for cookie %Lu\n",
 854                        (unsigned long long)*desc->dir_cookie);
 855
 856        page = alloc_page(GFP_HIGHUSER);
 857        if (!page) {
 858                status = -ENOMEM;
 859                goto out;
 860        }
 861
 862        desc->page_index = 0;
 863        desc->last_cookie = *desc->dir_cookie;
 864        desc->page = page;
 865        ctx->duped = 0;
 866
 867        status = nfs_readdir_xdr_to_array(desc, page, inode);
 868        if (status < 0)
 869                goto out_release;
 870
 871        status = nfs_do_filldir(desc);
 872
 873 out_release:
 874        nfs_readdir_clear_array(desc->page);
 875        cache_page_release(desc);
 876 out:
 877        dfprintk(DIRCACHE, "NFS: %s: returns %d\n",
 878                        __func__, status);
 879        return status;
 880}
 881
 882/* The file offset position represents the dirent entry number.  A
 883   last cookie cache takes care of the common case of reading the
 884   whole directory.
 885 */
 886static int nfs_readdir(struct file *file, struct dir_context *ctx)
 887{
 888        struct dentry   *dentry = file_dentry(file);
 889        struct inode    *inode = d_inode(dentry);
 890        struct nfs_open_dir_context *dir_ctx = file->private_data;
 891        nfs_readdir_descriptor_t my_desc = {
 892                .file = file,
 893                .ctx = ctx,
 894                .dir_cookie = &dir_ctx->dir_cookie,
 895                .plus = nfs_use_readdirplus(inode, ctx),
 896        },
 897                        *desc = &my_desc;
 898        int res = 0;
 899
 900        dfprintk(FILE, "NFS: readdir(%pD2) starting at cookie %llu\n",
 901                        file, (long long)ctx->pos);
 902        nfs_inc_stats(inode, NFSIOS_VFSGETDENTS);
 903
 904        /*
 905         * ctx->pos points to the dirent entry number.
 906         * *desc->dir_cookie has the cookie for the next entry. We have
 907         * to either find the entry with the appropriate number or
 908         * revalidate the cookie.
 909         */
 910        if (ctx->pos == 0 || nfs_attribute_cache_expired(inode))
 911                res = nfs_revalidate_mapping(inode, file->f_mapping);
 912        if (res < 0)
 913                goto out;
 914
 915        do {
 916                res = readdir_search_pagecache(desc);
 917
 918                if (res == -EBADCOOKIE) {
 919                        res = 0;
 920                        /* This means either end of directory */
 921                        if (*desc->dir_cookie && !desc->eof) {
 922                                /* Or that the server has 'lost' a cookie */
 923                                res = uncached_readdir(desc);
 924                                if (res == 0)
 925                                        continue;
 926                        }
 927                        break;
 928                }
 929                if (res == -ETOOSMALL && desc->plus) {
 930                        clear_bit(NFS_INO_ADVISE_RDPLUS, &NFS_I(inode)->flags);
 931                        nfs_zap_caches(inode);
 932                        desc->page_index = 0;
 933                        desc->plus = false;
 934                        desc->eof = false;
 935                        continue;
 936                }
 937                if (res < 0)
 938                        break;
 939
 940                res = nfs_do_filldir(desc);
 941                unlock_page(desc->page);
 942                cache_page_release(desc);
 943                if (res < 0)
 944                        break;
 945        } while (!desc->eof);
 946out:
 947        if (res > 0)
 948                res = 0;
 949        dfprintk(FILE, "NFS: readdir(%pD2) returns %d\n", file, res);
 950        return res;
 951}
 952
 953static loff_t nfs_llseek_dir(struct file *filp, loff_t offset, int whence)
 954{
 955        struct inode *inode = file_inode(filp);
 956        struct nfs_open_dir_context *dir_ctx = filp->private_data;
 957
 958        dfprintk(FILE, "NFS: llseek dir(%pD2, %lld, %d)\n",
 959                        filp, offset, whence);
 960
 961        switch (whence) {
 962        default:
 963                return -EINVAL;
 964        case SEEK_SET:
 965                if (offset < 0)
 966                        return -EINVAL;
 967                inode_lock(inode);
 968                break;
 969        case SEEK_CUR:
 970                if (offset == 0)
 971                        return filp->f_pos;
 972                inode_lock(inode);
 973                offset += filp->f_pos;
 974                if (offset < 0) {
 975                        inode_unlock(inode);
 976                        return -EINVAL;
 977                }
 978        }
 979        if (offset != filp->f_pos) {
 980                filp->f_pos = offset;
 981                if (nfs_readdir_use_cookie(filp))
 982                        dir_ctx->dir_cookie = offset;
 983                else
 984                        dir_ctx->dir_cookie = 0;
 985                dir_ctx->duped = 0;
 986        }
 987        inode_unlock(inode);
 988        return offset;
 989}
 990
 991/*
 992 * All directory operations under NFS are synchronous, so fsync()
 993 * is a dummy operation.
 994 */
 995static int nfs_fsync_dir(struct file *filp, loff_t start, loff_t end,
 996                         int datasync)
 997{
 998        struct inode *inode = file_inode(filp);
 999
1000        dfprintk(FILE, "NFS: fsync dir(%pD2) datasync %d\n", filp, datasync);
1001
1002        inode_lock(inode);
1003        nfs_inc_stats(inode, NFSIOS_VFSFSYNC);
1004        inode_unlock(inode);
1005        return 0;
1006}
1007
1008/**
1009 * nfs_force_lookup_revalidate - Mark the directory as having changed
1010 * @dir: pointer to directory inode
1011 *
1012 * This forces the revalidation code in nfs_lookup_revalidate() to do a
1013 * full lookup on all child dentries of 'dir' whenever a change occurs
1014 * on the server that might have invalidated our dcache.
1015 *
1016 * Note that we reserve bit '0' as a tag to let us know when a dentry
1017 * was revalidated while holding a delegation on its inode.
1018 *
1019 * The caller should be holding dir->i_lock
1020 */
1021void nfs_force_lookup_revalidate(struct inode *dir)
1022{
1023        NFS_I(dir)->cache_change_attribute += 2;
1024}
1025EXPORT_SYMBOL_GPL(nfs_force_lookup_revalidate);
1026
1027/**
1028 * nfs_verify_change_attribute - Detects NFS remote directory changes
1029 * @dir: pointer to parent directory inode
1030 * @verf: previously saved change attribute
1031 *
1032 * Return "false" if the verifiers doesn't match the change attribute.
1033 * This would usually indicate that the directory contents have changed on
1034 * the server, and that any dentries need revalidating.
1035 */
1036static bool nfs_verify_change_attribute(struct inode *dir, unsigned long verf)
1037{
1038        return (verf & ~1UL) == nfs_save_change_attribute(dir);
1039}
1040
1041static void nfs_set_verifier_delegated(unsigned long *verf)
1042{
1043        *verf |= 1UL;
1044}
1045
1046#if IS_ENABLED(CONFIG_NFS_V4)
1047static void nfs_unset_verifier_delegated(unsigned long *verf)
1048{
1049        *verf &= ~1UL;
1050}
1051#endif /* IS_ENABLED(CONFIG_NFS_V4) */
1052
1053static bool nfs_test_verifier_delegated(unsigned long verf)
1054{
1055        return verf & 1;
1056}
1057
1058static bool nfs_verifier_is_delegated(struct dentry *dentry)
1059{
1060        return nfs_test_verifier_delegated(dentry->d_time);
1061}
1062
1063static void nfs_set_verifier_locked(struct dentry *dentry, unsigned long verf)
1064{
1065        struct inode *inode = d_inode(dentry);
1066
1067        if (!nfs_verifier_is_delegated(dentry) &&
1068            !nfs_verify_change_attribute(d_inode(dentry->d_parent), verf))
1069                goto out;
1070        if (inode && NFS_PROTO(inode)->have_delegation(inode, FMODE_READ))
1071                nfs_set_verifier_delegated(&verf);
1072out:
1073        dentry->d_time = verf;
1074}
1075
1076/**
1077 * nfs_set_verifier - save a parent directory verifier in the dentry
1078 * @dentry: pointer to dentry
1079 * @verf: verifier to save
1080 *
1081 * Saves the parent directory verifier in @dentry. If the inode has
1082 * a delegation, we also tag the dentry as having been revalidated
1083 * while holding a delegation so that we know we don't have to
1084 * look it up again after a directory change.
1085 */
1086void nfs_set_verifier(struct dentry *dentry, unsigned long verf)
1087{
1088
1089        spin_lock(&dentry->d_lock);
1090        nfs_set_verifier_locked(dentry, verf);
1091        spin_unlock(&dentry->d_lock);
1092}
1093EXPORT_SYMBOL_GPL(nfs_set_verifier);
1094
1095#if IS_ENABLED(CONFIG_NFS_V4)
1096/**
1097 * nfs_clear_verifier_delegated - clear the dir verifier delegation tag
1098 * @inode: pointer to inode
1099 *
1100 * Iterates through the dentries in the inode alias list and clears
1101 * the tag used to indicate that the dentry has been revalidated
1102 * while holding a delegation.
1103 * This function is intended for use when the delegation is being
1104 * returned or revoked.
1105 */
1106void nfs_clear_verifier_delegated(struct inode *inode)
1107{
1108        struct dentry *alias;
1109
1110        if (!inode)
1111                return;
1112        spin_lock(&inode->i_lock);
1113        hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
1114                spin_lock(&alias->d_lock);
1115                nfs_unset_verifier_delegated(&alias->d_time);
1116                spin_unlock(&alias->d_lock);
1117        }
1118        spin_unlock(&inode->i_lock);
1119}
1120EXPORT_SYMBOL_GPL(nfs_clear_verifier_delegated);
1121#endif /* IS_ENABLED(CONFIG_NFS_V4) */
1122
1123/*
1124 * A check for whether or not the parent directory has changed.
1125 * In the case it has, we assume that the dentries are untrustworthy
1126 * and may need to be looked up again.
1127 * If rcu_walk prevents us from performing a full check, return 0.
1128 */
1129static int nfs_check_verifier(struct inode *dir, struct dentry *dentry,
1130                              int rcu_walk)
1131{
1132        if (IS_ROOT(dentry))
1133                return 1;
1134        if (NFS_SERVER(dir)->flags & NFS_MOUNT_LOOKUP_CACHE_NONE)
1135                return 0;
1136        if (!nfs_verify_change_attribute(dir, dentry->d_time))
1137                return 0;
1138        /* Revalidate nfsi->cache_change_attribute before we declare a match */
1139        if (nfs_mapping_need_revalidate_inode(dir)) {
1140                if (rcu_walk)
1141                        return 0;
1142                if (__nfs_revalidate_inode(NFS_SERVER(dir), dir) < 0)
1143                        return 0;
1144        }
1145        if (!nfs_verify_change_attribute(dir, dentry->d_time))
1146                return 0;
1147        return 1;
1148}
1149
1150/*
1151 * Use intent information to check whether or not we're going to do
1152 * an O_EXCL create using this path component.
1153 */
1154static int nfs_is_exclusive_create(struct inode *dir, unsigned int flags)
1155{
1156        if (NFS_PROTO(dir)->version == 2)
1157                return 0;
1158        return flags & LOOKUP_EXCL;
1159}
1160
1161/*
1162 * Inode and filehandle revalidation for lookups.
1163 *
1164 * We force revalidation in the cases where the VFS sets LOOKUP_REVAL,
1165 * or if the intent information indicates that we're about to open this
1166 * particular file and the "nocto" mount flag is not set.
1167 *
1168 */
1169static
1170int nfs_lookup_verify_inode(struct inode *inode, unsigned int flags)
1171{
1172        struct nfs_server *server = NFS_SERVER(inode);
1173        int ret;
1174
1175        if (IS_AUTOMOUNT(inode))
1176                return 0;
1177
1178        if (flags & LOOKUP_OPEN) {
1179                switch (inode->i_mode & S_IFMT) {
1180                case S_IFREG:
1181                        /* A NFSv4 OPEN will revalidate later */
1182                        if (server->caps & NFS_CAP_ATOMIC_OPEN)
1183                                goto out;
1184                        /* Fallthrough */
1185                case S_IFDIR:
1186                        if (server->flags & NFS_MOUNT_NOCTO)
1187                                break;
1188                        /* NFS close-to-open cache consistency validation */
1189                        goto out_force;
1190                }
1191        }
1192
1193        /* VFS wants an on-the-wire revalidation */
1194        if (flags & LOOKUP_REVAL)
1195                goto out_force;
1196out:
1197        return (inode->i_nlink == 0) ? -ESTALE : 0;
1198out_force:
1199        if (flags & LOOKUP_RCU)
1200                return -ECHILD;
1201        ret = __nfs_revalidate_inode(server, inode);
1202        if (ret != 0)
1203                return ret;
1204        goto out;
1205}
1206
1207/*
1208 * We judge how long we want to trust negative
1209 * dentries by looking at the parent inode mtime.
1210 *
1211 * If parent mtime has changed, we revalidate, else we wait for a
1212 * period corresponding to the parent's attribute cache timeout value.
1213 *
1214 * If LOOKUP_RCU prevents us from performing a full check, return 1
1215 * suggesting a reval is needed.
1216 *
1217 * Note that when creating a new file, or looking up a rename target,
1218 * then it shouldn't be necessary to revalidate a negative dentry.
1219 */
1220static inline
1221int nfs_neg_need_reval(struct inode *dir, struct dentry *dentry,
1222                       unsigned int flags)
1223{
1224        if (flags & (LOOKUP_CREATE | LOOKUP_RENAME_TARGET))
1225                return 0;
1226        if (NFS_SERVER(dir)->flags & NFS_MOUNT_LOOKUP_CACHE_NONEG)
1227                return 1;
1228        return !nfs_check_verifier(dir, dentry, flags & LOOKUP_RCU);
1229}
1230
1231static int
1232nfs_lookup_revalidate_done(struct inode *dir, struct dentry *dentry,
1233                           struct inode *inode, int error)
1234{
1235        switch (error) {
1236        case 1:
1237                dfprintk(LOOKUPCACHE, "NFS: %s(%pd2) is valid\n",
1238                        __func__, dentry);
1239                return 1;
1240        case 0:
1241                nfs_mark_for_revalidate(dir);
1242                if (inode && S_ISDIR(inode->i_mode)) {
1243                        /* Purge readdir caches. */
1244                        nfs_zap_caches(inode);
1245                        /*
1246                         * We can't d_drop the root of a disconnected tree:
1247                         * its d_hash is on the s_anon list and d_drop() would hide
1248                         * it from shrink_dcache_for_unmount(), leading to busy
1249                         * inodes on unmount and further oopses.
1250                         */
1251                        if (IS_ROOT(dentry))
1252                                return 1;
1253                }
1254                dfprintk(LOOKUPCACHE, "NFS: %s(%pd2) is invalid\n",
1255                                __func__, dentry);
1256                return 0;
1257        }
1258        dfprintk(LOOKUPCACHE, "NFS: %s(%pd2) lookup returned error %d\n",
1259                                __func__, dentry, error);
1260        return error;
1261}
1262
1263static int
1264nfs_lookup_revalidate_negative(struct inode *dir, struct dentry *dentry,
1265                               unsigned int flags)
1266{
1267        int ret = 1;
1268        if (nfs_neg_need_reval(dir, dentry, flags)) {
1269                if (flags & LOOKUP_RCU)
1270                        return -ECHILD;
1271                ret = 0;
1272        }
1273        return nfs_lookup_revalidate_done(dir, dentry, NULL, ret);
1274}
1275
1276static int
1277nfs_lookup_revalidate_delegated(struct inode *dir, struct dentry *dentry,
1278                                struct inode *inode)
1279{
1280        nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
1281        return nfs_lookup_revalidate_done(dir, dentry, inode, 1);
1282}
1283
1284static int
1285nfs_lookup_revalidate_dentry(struct inode *dir, struct dentry *dentry,
1286                             struct inode *inode)
1287{
1288        struct nfs_fh *fhandle;
1289        struct nfs_fattr *fattr;
1290        struct nfs4_label *label;
1291        unsigned long dir_verifier;
1292        int ret;
1293
1294        ret = -ENOMEM;
1295        fhandle = nfs_alloc_fhandle();
1296        fattr = nfs_alloc_fattr();
1297        label = nfs4_label_alloc(NFS_SERVER(inode), GFP_KERNEL);
1298        if (fhandle == NULL || fattr == NULL || IS_ERR(label))
1299                goto out;
1300
1301        dir_verifier = nfs_save_change_attribute(dir);
1302        ret = NFS_PROTO(dir)->lookup(dir, dentry, fhandle, fattr, label);
1303        if (ret < 0) {
1304                switch (ret) {
1305                case -ESTALE:
1306                case -ENOENT:
1307                        ret = 0;
1308                        break;
1309                case -ETIMEDOUT:
1310                        if (NFS_SERVER(inode)->flags & NFS_MOUNT_SOFTREVAL)
1311                                ret = 1;
1312                }
1313                goto out;
1314        }
1315        ret = 0;
1316        if (nfs_compare_fh(NFS_FH(inode), fhandle))
1317                goto out;
1318        if (nfs_refresh_inode(inode, fattr) < 0)
1319                goto out;
1320
1321        nfs_setsecurity(inode, fattr, label);
1322        nfs_set_verifier(dentry, dir_verifier);
1323
1324        /* set a readdirplus hint that we had a cache miss */
1325        nfs_force_use_readdirplus(dir);
1326        ret = 1;
1327out:
1328        nfs_free_fattr(fattr);
1329        nfs_free_fhandle(fhandle);
1330        nfs4_label_free(label);
1331        return nfs_lookup_revalidate_done(dir, dentry, inode, ret);
1332}
1333
1334/*
1335 * This is called every time the dcache has a lookup hit,
1336 * and we should check whether we can really trust that
1337 * lookup.
1338 *
1339 * NOTE! The hit can be a negative hit too, don't assume
1340 * we have an inode!
1341 *
1342 * If the parent directory is seen to have changed, we throw out the
1343 * cached dentry and do a new lookup.
1344 */
1345static int
1346nfs_do_lookup_revalidate(struct inode *dir, struct dentry *dentry,
1347                         unsigned int flags)
1348{
1349        struct inode *inode;
1350        int error;
1351
1352        nfs_inc_stats(dir, NFSIOS_DENTRYREVALIDATE);
1353        inode = d_inode(dentry);
1354
1355        if (!inode)
1356                return nfs_lookup_revalidate_negative(dir, dentry, flags);
1357
1358        if (is_bad_inode(inode)) {
1359                dfprintk(LOOKUPCACHE, "%s: %pd2 has dud inode\n",
1360                                __func__, dentry);
1361                goto out_bad;
1362        }
1363
1364        if (nfs_verifier_is_delegated(dentry))
1365                return nfs_lookup_revalidate_delegated(dir, dentry, inode);
1366
1367        /* Force a full look up iff the parent directory has changed */
1368        if (!(flags & (LOOKUP_EXCL | LOOKUP_REVAL)) &&
1369            nfs_check_verifier(dir, dentry, flags & LOOKUP_RCU)) {
1370                error = nfs_lookup_verify_inode(inode, flags);
1371                if (error) {
1372                        if (error == -ESTALE)
1373                                nfs_zap_caches(dir);
1374                        goto out_bad;
1375                }
1376                nfs_advise_use_readdirplus(dir);
1377                goto out_valid;
1378        }
1379
1380        if (flags & LOOKUP_RCU)
1381                return -ECHILD;
1382
1383        if (NFS_STALE(inode))
1384                goto out_bad;
1385
1386        trace_nfs_lookup_revalidate_enter(dir, dentry, flags);
1387        error = nfs_lookup_revalidate_dentry(dir, dentry, inode);
1388        trace_nfs_lookup_revalidate_exit(dir, dentry, flags, error);
1389        return error;
1390out_valid:
1391        return nfs_lookup_revalidate_done(dir, dentry, inode, 1);
1392out_bad:
1393        if (flags & LOOKUP_RCU)
1394                return -ECHILD;
1395        return nfs_lookup_revalidate_done(dir, dentry, inode, 0);
1396}
1397
1398static int
1399__nfs_lookup_revalidate(struct dentry *dentry, unsigned int flags,
1400                        int (*reval)(struct inode *, struct dentry *, unsigned int))
1401{
1402        struct dentry *parent;
1403        struct inode *dir;
1404        int ret;
1405
1406        if (flags & LOOKUP_RCU) {
1407                parent = READ_ONCE(dentry->d_parent);
1408                dir = d_inode_rcu(parent);
1409                if (!dir)
1410                        return -ECHILD;
1411                ret = reval(dir, dentry, flags);
1412                if (parent != READ_ONCE(dentry->d_parent))
1413                        return -ECHILD;
1414        } else {
1415                parent = dget_parent(dentry);
1416                ret = reval(d_inode(parent), dentry, flags);
1417                dput(parent);
1418        }
1419        return ret;
1420}
1421
1422static int nfs_lookup_revalidate(struct dentry *dentry, unsigned int flags)
1423{
1424        return __nfs_lookup_revalidate(dentry, flags, nfs_do_lookup_revalidate);
1425}
1426
1427/*
1428 * A weaker form of d_revalidate for revalidating just the d_inode(dentry)
1429 * when we don't really care about the dentry name. This is called when a
1430 * pathwalk ends on a dentry that was not found via a normal lookup in the
1431 * parent dir (e.g.: ".", "..", procfs symlinks or mountpoint traversals).
1432 *
1433 * In this situation, we just want to verify that the inode itself is OK
1434 * since the dentry might have changed on the server.
1435 */
1436static int nfs_weak_revalidate(struct dentry *dentry, unsigned int flags)
1437{
1438        struct inode *inode = d_inode(dentry);
1439        int error = 0;
1440
1441        /*
1442         * I believe we can only get a negative dentry here in the case of a
1443         * procfs-style symlink. Just assume it's correct for now, but we may
1444         * eventually need to do something more here.
1445         */
1446        if (!inode) {
1447                dfprintk(LOOKUPCACHE, "%s: %pd2 has negative inode\n",
1448                                __func__, dentry);
1449                return 1;
1450        }
1451
1452        if (is_bad_inode(inode)) {
1453                dfprintk(LOOKUPCACHE, "%s: %pd2 has dud inode\n",
1454                                __func__, dentry);
1455                return 0;
1456        }
1457
1458        error = nfs_lookup_verify_inode(inode, flags);
1459        dfprintk(LOOKUPCACHE, "NFS: %s: inode %lu is %s\n",
1460                        __func__, inode->i_ino, error ? "invalid" : "valid");
1461        return !error;
1462}
1463
1464/*
1465 * This is called from dput() when d_count is going to 0.
1466 */
1467static int nfs_dentry_delete(const struct dentry *dentry)
1468{
1469        dfprintk(VFS, "NFS: dentry_delete(%pd2, %x)\n",
1470                dentry, dentry->d_flags);
1471
1472        /* Unhash any dentry with a stale inode */
1473        if (d_really_is_positive(dentry) && NFS_STALE(d_inode(dentry)))
1474                return 1;
1475
1476        if (dentry->d_flags & DCACHE_NFSFS_RENAMED) {
1477                /* Unhash it, so that ->d_iput() would be called */
1478                return 1;
1479        }
1480        if (!(dentry->d_sb->s_flags & SB_ACTIVE)) {
1481                /* Unhash it, so that ancestors of killed async unlink
1482                 * files will be cleaned up during umount */
1483                return 1;
1484        }
1485        return 0;
1486
1487}
1488
1489/* Ensure that we revalidate inode->i_nlink */
1490static void nfs_drop_nlink(struct inode *inode)
1491{
1492        spin_lock(&inode->i_lock);
1493        /* drop the inode if we're reasonably sure this is the last link */
1494        if (inode->i_nlink > 0)
1495                drop_nlink(inode);
1496        NFS_I(inode)->attr_gencount = nfs_inc_attr_generation_counter();
1497        NFS_I(inode)->cache_validity |= NFS_INO_INVALID_CHANGE
1498                | NFS_INO_INVALID_CTIME
1499                | NFS_INO_INVALID_OTHER
1500                | NFS_INO_REVAL_FORCED;
1501        spin_unlock(&inode->i_lock);
1502}
1503
1504/*
1505 * Called when the dentry loses inode.
1506 * We use it to clean up silly-renamed files.
1507 */
1508static void nfs_dentry_iput(struct dentry *dentry, struct inode *inode)
1509{
1510        if (S_ISDIR(inode->i_mode))
1511                /* drop any readdir cache as it could easily be old */
1512                NFS_I(inode)->cache_validity |= NFS_INO_INVALID_DATA;
1513
1514        if (dentry->d_flags & DCACHE_NFSFS_RENAMED) {
1515                nfs_complete_unlink(dentry, inode);
1516                nfs_drop_nlink(inode);
1517        }
1518        iput(inode);
1519}
1520
1521static void nfs_d_release(struct dentry *dentry)
1522{
1523        /* free cached devname value, if it survived that far */
1524        if (unlikely(dentry->d_fsdata)) {
1525                if (dentry->d_flags & DCACHE_NFSFS_RENAMED)
1526                        WARN_ON(1);
1527                else
1528                        kfree(dentry->d_fsdata);
1529        }
1530}
1531
1532const struct dentry_operations nfs_dentry_operations = {
1533        .d_revalidate   = nfs_lookup_revalidate,
1534        .d_weak_revalidate      = nfs_weak_revalidate,
1535        .d_delete       = nfs_dentry_delete,
1536        .d_iput         = nfs_dentry_iput,
1537        .d_automount    = nfs_d_automount,
1538        .d_release      = nfs_d_release,
1539};
1540EXPORT_SYMBOL_GPL(nfs_dentry_operations);
1541
1542struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, unsigned int flags)
1543{
1544        struct dentry *res;
1545        struct inode *inode = NULL;
1546        struct nfs_fh *fhandle = NULL;
1547        struct nfs_fattr *fattr = NULL;
1548        struct nfs4_label *label = NULL;
1549        unsigned long dir_verifier;
1550        int error;
1551
1552        dfprintk(VFS, "NFS: lookup(%pd2)\n", dentry);
1553        nfs_inc_stats(dir, NFSIOS_VFSLOOKUP);
1554
1555        if (unlikely(dentry->d_name.len > NFS_SERVER(dir)->namelen))
1556                return ERR_PTR(-ENAMETOOLONG);
1557
1558        /*
1559         * If we're doing an exclusive create, optimize away the lookup
1560         * but don't hash the dentry.
1561         */
1562        if (nfs_is_exclusive_create(dir, flags) || flags & LOOKUP_RENAME_TARGET)
1563                return NULL;
1564
1565        res = ERR_PTR(-ENOMEM);
1566        fhandle = nfs_alloc_fhandle();
1567        fattr = nfs_alloc_fattr();
1568        if (fhandle == NULL || fattr == NULL)
1569                goto out;
1570
1571        label = nfs4_label_alloc(NFS_SERVER(dir), GFP_NOWAIT);
1572        if (IS_ERR(label))
1573                goto out;
1574
1575        dir_verifier = nfs_save_change_attribute(dir);
1576        trace_nfs_lookup_enter(dir, dentry, flags);
1577        error = NFS_PROTO(dir)->lookup(dir, dentry, fhandle, fattr, label);
1578        if (error == -ENOENT)
1579                goto no_entry;
1580        if (error < 0) {
1581                res = ERR_PTR(error);
1582                goto out_label;
1583        }
1584        inode = nfs_fhget(dentry->d_sb, fhandle, fattr, label);
1585        res = ERR_CAST(inode);
1586        if (IS_ERR(res))
1587                goto out_label;
1588
1589        /* Notify readdir to use READDIRPLUS */
1590        nfs_force_use_readdirplus(dir);
1591
1592no_entry:
1593        res = d_splice_alias(inode, dentry);
1594        if (res != NULL) {
1595                if (IS_ERR(res))
1596                        goto out_label;
1597                dentry = res;
1598        }
1599        nfs_set_verifier(dentry, dir_verifier);
1600out_label:
1601        trace_nfs_lookup_exit(dir, dentry, flags, error);
1602        nfs4_label_free(label);
1603out:
1604        nfs_free_fattr(fattr);
1605        nfs_free_fhandle(fhandle);
1606        return res;
1607}
1608EXPORT_SYMBOL_GPL(nfs_lookup);
1609
1610#if IS_ENABLED(CONFIG_NFS_V4)
1611static int nfs4_lookup_revalidate(struct dentry *, unsigned int);
1612
1613const struct dentry_operations nfs4_dentry_operations = {
1614        .d_revalidate   = nfs4_lookup_revalidate,
1615        .d_weak_revalidate      = nfs_weak_revalidate,
1616        .d_delete       = nfs_dentry_delete,
1617        .d_iput         = nfs_dentry_iput,
1618        .d_automount    = nfs_d_automount,
1619        .d_release      = nfs_d_release,
1620};
1621EXPORT_SYMBOL_GPL(nfs4_dentry_operations);
1622
1623static fmode_t flags_to_mode(int flags)
1624{
1625        fmode_t res = (__force fmode_t)flags & FMODE_EXEC;
1626        if ((flags & O_ACCMODE) != O_WRONLY)
1627                res |= FMODE_READ;
1628        if ((flags & O_ACCMODE) != O_RDONLY)
1629                res |= FMODE_WRITE;
1630        return res;
1631}
1632
1633static struct nfs_open_context *create_nfs_open_context(struct dentry *dentry, int open_flags, struct file *filp)
1634{
1635        return alloc_nfs_open_context(dentry, flags_to_mode(open_flags), filp);
1636}
1637
1638static int do_open(struct inode *inode, struct file *filp)
1639{
1640        nfs_fscache_open_file(inode, filp);
1641        return 0;
1642}
1643
1644static int nfs_finish_open(struct nfs_open_context *ctx,
1645                           struct dentry *dentry,
1646                           struct file *file, unsigned open_flags)
1647{
1648        int err;
1649
1650        err = finish_open(file, dentry, do_open);
1651        if (err)
1652                goto out;
1653        if (S_ISREG(file->f_path.dentry->d_inode->i_mode))
1654                nfs_file_set_open_context(file, ctx);
1655        else
1656                err = -EOPENSTALE;
1657out:
1658        return err;
1659}
1660
1661int nfs_atomic_open(struct inode *dir, struct dentry *dentry,
1662                    struct file *file, unsigned open_flags,
1663                    umode_t mode)
1664{
1665        DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
1666        struct nfs_open_context *ctx;
1667        struct dentry *res;
1668        struct iattr attr = { .ia_valid = ATTR_OPEN };
1669        struct inode *inode;
1670        unsigned int lookup_flags = 0;
1671        bool switched = false;
1672        int created = 0;
1673        int err;
1674
1675        /* Expect a negative dentry */
1676        BUG_ON(d_inode(dentry));
1677
1678        dfprintk(VFS, "NFS: atomic_open(%s/%lu), %pd\n",
1679                        dir->i_sb->s_id, dir->i_ino, dentry);
1680
1681        err = nfs_check_flags(open_flags);
1682        if (err)
1683                return err;
1684
1685        /* NFS only supports OPEN on regular files */
1686        if ((open_flags & O_DIRECTORY)) {
1687                if (!d_in_lookup(dentry)) {
1688                        /*
1689                         * Hashed negative dentry with O_DIRECTORY: dentry was
1690                         * revalidated and is fine, no need to perform lookup
1691                         * again
1692                         */
1693                        return -ENOENT;
1694                }
1695                lookup_flags = LOOKUP_OPEN|LOOKUP_DIRECTORY;
1696                goto no_open;
1697        }
1698
1699        if (dentry->d_name.len > NFS_SERVER(dir)->namelen)
1700                return -ENAMETOOLONG;
1701
1702        if (open_flags & O_CREAT) {
1703                struct nfs_server *server = NFS_SERVER(dir);
1704
1705                if (!(server->attr_bitmask[2] & FATTR4_WORD2_MODE_UMASK))
1706                        mode &= ~current_umask();
1707
1708                attr.ia_valid |= ATTR_MODE;
1709                attr.ia_mode = mode;
1710        }
1711        if (open_flags & O_TRUNC) {
1712                attr.ia_valid |= ATTR_SIZE;
1713                attr.ia_size = 0;
1714        }
1715
1716        if (!(open_flags & O_CREAT) && !d_in_lookup(dentry)) {
1717                d_drop(dentry);
1718                switched = true;
1719                dentry = d_alloc_parallel(dentry->d_parent,
1720                                          &dentry->d_name, &wq);
1721                if (IS_ERR(dentry))
1722                        return PTR_ERR(dentry);
1723                if (unlikely(!d_in_lookup(dentry)))
1724                        return finish_no_open(file, dentry);
1725        }
1726
1727        ctx = create_nfs_open_context(dentry, open_flags, file);
1728        err = PTR_ERR(ctx);
1729        if (IS_ERR(ctx))
1730                goto out;
1731
1732        trace_nfs_atomic_open_enter(dir, ctx, open_flags);
1733        inode = NFS_PROTO(dir)->open_context(dir, ctx, open_flags, &attr, &created);
1734        if (created)
1735                file->f_mode |= FMODE_CREATED;
1736        if (IS_ERR(inode)) {
1737                err = PTR_ERR(inode);
1738                trace_nfs_atomic_open_exit(dir, ctx, open_flags, err);
1739                put_nfs_open_context(ctx);
1740                d_drop(dentry);
1741                switch (err) {
1742                case -ENOENT:
1743                        d_splice_alias(NULL, dentry);
1744                        nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
1745                        break;
1746                case -EISDIR:
1747                case -ENOTDIR:
1748                        goto no_open;
1749                case -ELOOP:
1750                        if (!(open_flags & O_NOFOLLOW))
1751                                goto no_open;
1752                        break;
1753                        /* case -EINVAL: */
1754                default:
1755                        break;
1756                }
1757                goto out;
1758        }
1759
1760        err = nfs_finish_open(ctx, ctx->dentry, file, open_flags);
1761        trace_nfs_atomic_open_exit(dir, ctx, open_flags, err);
1762        put_nfs_open_context(ctx);
1763out:
1764        if (unlikely(switched)) {
1765                d_lookup_done(dentry);
1766                dput(dentry);
1767        }
1768        return err;
1769
1770no_open:
1771        res = nfs_lookup(dir, dentry, lookup_flags);
1772        if (switched) {
1773                d_lookup_done(dentry);
1774                if (!res)
1775                        res = dentry;
1776                else
1777                        dput(dentry);
1778        }
1779        if (IS_ERR(res))
1780                return PTR_ERR(res);
1781        return finish_no_open(file, res);
1782}
1783EXPORT_SYMBOL_GPL(nfs_atomic_open);
1784
1785static int
1786nfs4_do_lookup_revalidate(struct inode *dir, struct dentry *dentry,
1787                          unsigned int flags)
1788{
1789        struct inode *inode;
1790
1791        if (!(flags & LOOKUP_OPEN) || (flags & LOOKUP_DIRECTORY))
1792                goto full_reval;
1793        if (d_mountpoint(dentry))
1794                goto full_reval;
1795
1796        inode = d_inode(dentry);
1797
1798        /* We can't create new files in nfs_open_revalidate(), so we
1799         * optimize away revalidation of negative dentries.
1800         */
1801        if (inode == NULL)
1802                goto full_reval;
1803
1804        if (nfs_verifier_is_delegated(dentry))
1805                return nfs_lookup_revalidate_delegated(dir, dentry, inode);
1806
1807        /* NFS only supports OPEN on regular files */
1808        if (!S_ISREG(inode->i_mode))
1809                goto full_reval;
1810
1811        /* We cannot do exclusive creation on a positive dentry */
1812        if (flags & (LOOKUP_EXCL | LOOKUP_REVAL))
1813                goto reval_dentry;
1814
1815        /* Check if the directory changed */
1816        if (!nfs_check_verifier(dir, dentry, flags & LOOKUP_RCU))
1817                goto reval_dentry;
1818
1819        /* Let f_op->open() actually open (and revalidate) the file */
1820        return 1;
1821reval_dentry:
1822        if (flags & LOOKUP_RCU)
1823                return -ECHILD;
1824        return nfs_lookup_revalidate_dentry(dir, dentry, inode);
1825
1826full_reval:
1827        return nfs_do_lookup_revalidate(dir, dentry, flags);
1828}
1829
1830static int nfs4_lookup_revalidate(struct dentry *dentry, unsigned int flags)
1831{
1832        return __nfs_lookup_revalidate(dentry, flags,
1833                        nfs4_do_lookup_revalidate);
1834}
1835
1836#endif /* CONFIG_NFSV4 */
1837
1838struct dentry *
1839nfs_add_or_obtain(struct dentry *dentry, struct nfs_fh *fhandle,
1840                                struct nfs_fattr *fattr,
1841                                struct nfs4_label *label)
1842{
1843        struct dentry *parent = dget_parent(dentry);
1844        struct inode *dir = d_inode(parent);
1845        struct inode *inode;
1846        struct dentry *d;
1847        int error;
1848
1849        d_drop(dentry);
1850
1851        if (fhandle->size == 0) {
1852                error = NFS_PROTO(dir)->lookup(dir, dentry, fhandle, fattr, NULL);
1853                if (error)
1854                        goto out_error;
1855        }
1856        nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
1857        if (!(fattr->valid & NFS_ATTR_FATTR)) {
1858                struct nfs_server *server = NFS_SB(dentry->d_sb);
1859                error = server->nfs_client->rpc_ops->getattr(server, fhandle,
1860                                fattr, NULL, NULL);
1861                if (error < 0)
1862                        goto out_error;
1863        }
1864        inode = nfs_fhget(dentry->d_sb, fhandle, fattr, label);
1865        d = d_splice_alias(inode, dentry);
1866out:
1867        dput(parent);
1868        return d;
1869out_error:
1870        nfs_mark_for_revalidate(dir);
1871        d = ERR_PTR(error);
1872        goto out;
1873}
1874EXPORT_SYMBOL_GPL(nfs_add_or_obtain);
1875
1876/*
1877 * Code common to create, mkdir, and mknod.
1878 */
1879int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fhandle,
1880                                struct nfs_fattr *fattr,
1881                                struct nfs4_label *label)
1882{
1883        struct dentry *d;
1884
1885        d = nfs_add_or_obtain(dentry, fhandle, fattr, label);
1886        if (IS_ERR(d))
1887                return PTR_ERR(d);
1888
1889        /* Callers don't care */
1890        dput(d);
1891        return 0;
1892}
1893EXPORT_SYMBOL_GPL(nfs_instantiate);
1894
1895/*
1896 * Following a failed create operation, we drop the dentry rather
1897 * than retain a negative dentry. This avoids a problem in the event
1898 * that the operation succeeded on the server, but an error in the
1899 * reply path made it appear to have failed.
1900 */
1901int nfs_create(struct inode *dir, struct dentry *dentry,
1902                umode_t mode, bool excl)
1903{
1904        struct iattr attr;
1905        int open_flags = excl ? O_CREAT | O_EXCL : O_CREAT;
1906        int error;
1907
1908        dfprintk(VFS, "NFS: create(%s/%lu), %pd\n",
1909                        dir->i_sb->s_id, dir->i_ino, dentry);
1910
1911        attr.ia_mode = mode;
1912        attr.ia_valid = ATTR_MODE;
1913
1914        trace_nfs_create_enter(dir, dentry, open_flags);
1915        error = NFS_PROTO(dir)->create(dir, dentry, &attr, open_flags);
1916        trace_nfs_create_exit(dir, dentry, open_flags, error);
1917        if (error != 0)
1918                goto out_err;
1919        return 0;
1920out_err:
1921        d_drop(dentry);
1922        return error;
1923}
1924EXPORT_SYMBOL_GPL(nfs_create);
1925
1926/*
1927 * See comments for nfs_proc_create regarding failed operations.
1928 */
1929int
1930nfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t rdev)
1931{
1932        struct iattr attr;
1933        int status;
1934
1935        dfprintk(VFS, "NFS: mknod(%s/%lu), %pd\n",
1936                        dir->i_sb->s_id, dir->i_ino, dentry);
1937
1938        attr.ia_mode = mode;
1939        attr.ia_valid = ATTR_MODE;
1940
1941        trace_nfs_mknod_enter(dir, dentry);
1942        status = NFS_PROTO(dir)->mknod(dir, dentry, &attr, rdev);
1943        trace_nfs_mknod_exit(dir, dentry, status);
1944        if (status != 0)
1945                goto out_err;
1946        return 0;
1947out_err:
1948        d_drop(dentry);
1949        return status;
1950}
1951EXPORT_SYMBOL_GPL(nfs_mknod);
1952
1953/*
1954 * See comments for nfs_proc_create regarding failed operations.
1955 */
1956int nfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
1957{
1958        struct iattr attr;
1959        int error;
1960
1961        dfprintk(VFS, "NFS: mkdir(%s/%lu), %pd\n",
1962                        dir->i_sb->s_id, dir->i_ino, dentry);
1963
1964        attr.ia_valid = ATTR_MODE;
1965        attr.ia_mode = mode | S_IFDIR;
1966
1967        trace_nfs_mkdir_enter(dir, dentry);
1968        error = NFS_PROTO(dir)->mkdir(dir, dentry, &attr);
1969        trace_nfs_mkdir_exit(dir, dentry, error);
1970        if (error != 0)
1971                goto out_err;
1972        return 0;
1973out_err:
1974        d_drop(dentry);
1975        return error;
1976}
1977EXPORT_SYMBOL_GPL(nfs_mkdir);
1978
1979static void nfs_dentry_handle_enoent(struct dentry *dentry)
1980{
1981        if (simple_positive(dentry))
1982                d_delete(dentry);
1983}
1984
1985int nfs_rmdir(struct inode *dir, struct dentry *dentry)
1986{
1987        int error;
1988
1989        dfprintk(VFS, "NFS: rmdir(%s/%lu), %pd\n",
1990                        dir->i_sb->s_id, dir->i_ino, dentry);
1991
1992        trace_nfs_rmdir_enter(dir, dentry);
1993        if (d_really_is_positive(dentry)) {
1994                down_write(&NFS_I(d_inode(dentry))->rmdir_sem);
1995                error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name);
1996                /* Ensure the VFS deletes this inode */
1997                switch (error) {
1998                case 0:
1999                        clear_nlink(d_inode(dentry));
2000                        break;
2001                case -ENOENT:
2002                        nfs_dentry_handle_enoent(dentry);
2003                }
2004                up_write(&NFS_I(d_inode(dentry))->rmdir_sem);
2005        } else
2006                error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name);
2007        trace_nfs_rmdir_exit(dir, dentry, error);
2008
2009        return error;
2010}
2011EXPORT_SYMBOL_GPL(nfs_rmdir);
2012
2013/*
2014 * Remove a file after making sure there are no pending writes,
2015 * and after checking that the file has only one user. 
2016 *
2017 * We invalidate the attribute cache and free the inode prior to the operation
2018 * to avoid possible races if the server reuses the inode.
2019 */
2020static int nfs_safe_remove(struct dentry *dentry)
2021{
2022        struct inode *dir = d_inode(dentry->d_parent);
2023        struct inode *inode = d_inode(dentry);
2024        int error = -EBUSY;
2025                
2026        dfprintk(VFS, "NFS: safe_remove(%pd2)\n", dentry);
2027
2028        /* If the dentry was sillyrenamed, we simply call d_delete() */
2029        if (dentry->d_flags & DCACHE_NFSFS_RENAMED) {
2030                error = 0;
2031                goto out;
2032        }
2033
2034        trace_nfs_remove_enter(dir, dentry);
2035        if (inode != NULL) {
2036                error = NFS_PROTO(dir)->remove(dir, dentry);
2037                if (error == 0)
2038                        nfs_drop_nlink(inode);
2039        } else
2040                error = NFS_PROTO(dir)->remove(dir, dentry);
2041        if (error == -ENOENT)
2042                nfs_dentry_handle_enoent(dentry);
2043        trace_nfs_remove_exit(dir, dentry, error);
2044out:
2045        return error;
2046}
2047
2048/*  We do silly rename. In case sillyrename() returns -EBUSY, the inode
2049 *  belongs to an active ".nfs..." file and we return -EBUSY.
2050 *
2051 *  If sillyrename() returns 0, we do nothing, otherwise we unlink.
2052 */
2053int nfs_unlink(struct inode *dir, struct dentry *dentry)
2054{
2055        int error;
2056        int need_rehash = 0;
2057
2058        dfprintk(VFS, "NFS: unlink(%s/%lu, %pd)\n", dir->i_sb->s_id,
2059                dir->i_ino, dentry);
2060
2061        trace_nfs_unlink_enter(dir, dentry);
2062        spin_lock(&dentry->d_lock);
2063        if (d_count(dentry) > 1) {
2064                spin_unlock(&dentry->d_lock);
2065                /* Start asynchronous writeout of the inode */
2066                write_inode_now(d_inode(dentry), 0);
2067                error = nfs_sillyrename(dir, dentry);
2068                goto out;
2069        }
2070        if (!d_unhashed(dentry)) {
2071                __d_drop(dentry);
2072                need_rehash = 1;
2073        }
2074        spin_unlock(&dentry->d_lock);
2075        error = nfs_safe_remove(dentry);
2076        if (!error || error == -ENOENT) {
2077                nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
2078        } else if (need_rehash)
2079                d_rehash(dentry);
2080out:
2081        trace_nfs_unlink_exit(dir, dentry, error);
2082        return error;
2083}
2084EXPORT_SYMBOL_GPL(nfs_unlink);
2085
2086/*
2087 * To create a symbolic link, most file systems instantiate a new inode,
2088 * add a page to it containing the path, then write it out to the disk
2089 * using prepare_write/commit_write.
2090 *
2091 * Unfortunately the NFS client can't create the in-core inode first
2092 * because it needs a file handle to create an in-core inode (see
2093 * fs/nfs/inode.c:nfs_fhget).  We only have a file handle *after* the
2094 * symlink request has completed on the server.
2095 *
2096 * So instead we allocate a raw page, copy the symname into it, then do
2097 * the SYMLINK request with the page as the buffer.  If it succeeds, we
2098 * now have a new file handle and can instantiate an in-core NFS inode
2099 * and move the raw page into its mapping.
2100 */
2101int nfs_symlink(struct inode *dir, struct dentry *dentry, const char *symname)
2102{
2103        struct page *page;
2104        char *kaddr;
2105        struct iattr attr;
2106        unsigned int pathlen = strlen(symname);
2107        int error;
2108
2109        dfprintk(VFS, "NFS: symlink(%s/%lu, %pd, %s)\n", dir->i_sb->s_id,
2110                dir->i_ino, dentry, symname);
2111
2112        if (pathlen > PAGE_SIZE)
2113                return -ENAMETOOLONG;
2114
2115        attr.ia_mode = S_IFLNK | S_IRWXUGO;
2116        attr.ia_valid = ATTR_MODE;
2117
2118        page = alloc_page(GFP_USER);
2119        if (!page)
2120                return -ENOMEM;
2121
2122        kaddr = page_address(page);
2123        memcpy(kaddr, symname, pathlen);
2124        if (pathlen < PAGE_SIZE)
2125                memset(kaddr + pathlen, 0, PAGE_SIZE - pathlen);
2126
2127        trace_nfs_symlink_enter(dir, dentry);
2128        error = NFS_PROTO(dir)->symlink(dir, dentry, page, pathlen, &attr);
2129        trace_nfs_symlink_exit(dir, dentry, error);
2130        if (error != 0) {
2131                dfprintk(VFS, "NFS: symlink(%s/%lu, %pd, %s) error %d\n",
2132                        dir->i_sb->s_id, dir->i_ino,
2133                        dentry, symname, error);
2134                d_drop(dentry);
2135                __free_page(page);
2136                return error;
2137        }
2138
2139        /*
2140         * No big deal if we can't add this page to the page cache here.
2141         * READLINK will get the missing page from the server if needed.
2142         */
2143        if (!add_to_page_cache_lru(page, d_inode(dentry)->i_mapping, 0,
2144                                                        GFP_KERNEL)) {
2145                SetPageUptodate(page);
2146                unlock_page(page);
2147                /*
2148                 * add_to_page_cache_lru() grabs an extra page refcount.
2149                 * Drop it here to avoid leaking this page later.
2150                 */
2151                put_page(page);
2152        } else
2153                __free_page(page);
2154
2155        return 0;
2156}
2157EXPORT_SYMBOL_GPL(nfs_symlink);
2158
2159int
2160nfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry)
2161{
2162        struct inode *inode = d_inode(old_dentry);
2163        int error;
2164
2165        dfprintk(VFS, "NFS: link(%pd2 -> %pd2)\n",
2166                old_dentry, dentry);
2167
2168        trace_nfs_link_enter(inode, dir, dentry);
2169        d_drop(dentry);
2170        error = NFS_PROTO(dir)->link(inode, dir, &dentry->d_name);
2171        if (error == 0) {
2172                ihold(inode);
2173                d_add(dentry, inode);
2174        }
2175        trace_nfs_link_exit(inode, dir, dentry, error);
2176        return error;
2177}
2178EXPORT_SYMBOL_GPL(nfs_link);
2179
2180/*
2181 * RENAME
2182 * FIXME: Some nfsds, like the Linux user space nfsd, may generate a
2183 * different file handle for the same inode after a rename (e.g. when
2184 * moving to a different directory). A fail-safe method to do so would
2185 * be to look up old_dir/old_name, create a link to new_dir/new_name and
2186 * rename the old file using the sillyrename stuff. This way, the original
2187 * file in old_dir will go away when the last process iput()s the inode.
2188 *
2189 * FIXED.
2190 * 
2191 * It actually works quite well. One needs to have the possibility for
2192 * at least one ".nfs..." file in each directory the file ever gets
2193 * moved or linked to which happens automagically with the new
2194 * implementation that only depends on the dcache stuff instead of
2195 * using the inode layer
2196 *
2197 * Unfortunately, things are a little more complicated than indicated
2198 * above. For a cross-directory move, we want to make sure we can get
2199 * rid of the old inode after the operation.  This means there must be
2200 * no pending writes (if it's a file), and the use count must be 1.
2201 * If these conditions are met, we can drop the dentries before doing
2202 * the rename.
2203 */
2204int nfs_rename(struct inode *old_dir, struct dentry *old_dentry,
2205               struct inode *new_dir, struct dentry *new_dentry,
2206               unsigned int flags)
2207{
2208        struct inode *old_inode = d_inode(old_dentry);
2209        struct inode *new_inode = d_inode(new_dentry);
2210        struct dentry *dentry = NULL, *rehash = NULL;
2211        struct rpc_task *task;
2212        int error = -EBUSY;
2213
2214        if (flags)
2215                return -EINVAL;
2216
2217        dfprintk(VFS, "NFS: rename(%pd2 -> %pd2, ct=%d)\n",
2218                 old_dentry, new_dentry,
2219                 d_count(new_dentry));
2220
2221        trace_nfs_rename_enter(old_dir, old_dentry, new_dir, new_dentry);
2222        /*
2223         * For non-directories, check whether the target is busy and if so,
2224         * make a copy of the dentry and then do a silly-rename. If the
2225         * silly-rename succeeds, the copied dentry is hashed and becomes
2226         * the new target.
2227         */
2228        if (new_inode && !S_ISDIR(new_inode->i_mode)) {
2229                /*
2230                 * To prevent any new references to the target during the
2231                 * rename, we unhash the dentry in advance.
2232                 */
2233                if (!d_unhashed(new_dentry)) {
2234                        d_drop(new_dentry);
2235                        rehash = new_dentry;
2236                }
2237
2238                if (d_count(new_dentry) > 2) {
2239                        int err;
2240
2241                        /* copy the target dentry's name */
2242                        dentry = d_alloc(new_dentry->d_parent,
2243                                         &new_dentry->d_name);
2244                        if (!dentry)
2245                                goto out;
2246
2247                        /* silly-rename the existing target ... */
2248                        err = nfs_sillyrename(new_dir, new_dentry);
2249                        if (err)
2250                                goto out;
2251
2252                        new_dentry = dentry;
2253                        rehash = NULL;
2254                        new_inode = NULL;
2255                }
2256        }
2257
2258        task = nfs_async_rename(old_dir, new_dir, old_dentry, new_dentry, NULL);
2259        if (IS_ERR(task)) {
2260                error = PTR_ERR(task);
2261                goto out;
2262        }
2263
2264        error = rpc_wait_for_completion_task(task);
2265        if (error != 0) {
2266                ((struct nfs_renamedata *)task->tk_calldata)->cancelled = 1;
2267                /* Paired with the atomic_dec_and_test() barrier in rpc_do_put_task() */
2268                smp_wmb();
2269        } else
2270                error = task->tk_status;
2271        rpc_put_task(task);
2272        /* Ensure the inode attributes are revalidated */
2273        if (error == 0) {
2274                spin_lock(&old_inode->i_lock);
2275                NFS_I(old_inode)->attr_gencount = nfs_inc_attr_generation_counter();
2276                NFS_I(old_inode)->cache_validity |= NFS_INO_INVALID_CHANGE
2277                        | NFS_INO_INVALID_CTIME
2278                        | NFS_INO_REVAL_FORCED;
2279                spin_unlock(&old_inode->i_lock);
2280        }
2281out:
2282        if (rehash)
2283                d_rehash(rehash);
2284        trace_nfs_rename_exit(old_dir, old_dentry,
2285                        new_dir, new_dentry, error);
2286        if (!error) {
2287                if (new_inode != NULL)
2288                        nfs_drop_nlink(new_inode);
2289                /*
2290                 * The d_move() should be here instead of in an async RPC completion
2291                 * handler because we need the proper locks to move the dentry.  If
2292                 * we're interrupted by a signal, the async RPC completion handler
2293                 * should mark the directories for revalidation.
2294                 */
2295                d_move(old_dentry, new_dentry);
2296                nfs_set_verifier(old_dentry,
2297                                        nfs_save_change_attribute(new_dir));
2298        } else if (error == -ENOENT)
2299                nfs_dentry_handle_enoent(old_dentry);
2300
2301        /* new dentry created? */
2302        if (dentry)
2303                dput(dentry);
2304        return error;
2305}
2306EXPORT_SYMBOL_GPL(nfs_rename);
2307
2308static DEFINE_SPINLOCK(nfs_access_lru_lock);
2309static LIST_HEAD(nfs_access_lru_list);
2310static atomic_long_t nfs_access_nr_entries;
2311
2312static unsigned long nfs_access_max_cachesize = 4*1024*1024;
2313module_param(nfs_access_max_cachesize, ulong, 0644);
2314MODULE_PARM_DESC(nfs_access_max_cachesize, "NFS access maximum total cache length");
2315
2316static void nfs_access_free_entry(struct nfs_access_entry *entry)
2317{
2318        put_cred(entry->cred);
2319        kfree_rcu(entry, rcu_head);
2320        smp_mb__before_atomic();
2321        atomic_long_dec(&nfs_access_nr_entries);
2322        smp_mb__after_atomic();
2323}
2324
2325static void nfs_access_free_list(struct list_head *head)
2326{
2327        struct nfs_access_entry *cache;
2328
2329        while (!list_empty(head)) {
2330                cache = list_entry(head->next, struct nfs_access_entry, lru);
2331                list_del(&cache->lru);
2332                nfs_access_free_entry(cache);
2333        }
2334}
2335
2336static unsigned long
2337nfs_do_access_cache_scan(unsigned int nr_to_scan)
2338{
2339        LIST_HEAD(head);
2340        struct nfs_inode *nfsi, *next;
2341        struct nfs_access_entry *cache;
2342        long freed = 0;
2343
2344        spin_lock(&nfs_access_lru_lock);
2345        list_for_each_entry_safe(nfsi, next, &nfs_access_lru_list, access_cache_inode_lru) {
2346                struct inode *inode;
2347
2348                if (nr_to_scan-- == 0)
2349                        break;
2350                inode = &nfsi->vfs_inode;
2351                spin_lock(&inode->i_lock);
2352                if (list_empty(&nfsi->access_cache_entry_lru))
2353                        goto remove_lru_entry;
2354                cache = list_entry(nfsi->access_cache_entry_lru.next,
2355                                struct nfs_access_entry, lru);
2356                list_move(&cache->lru, &head);
2357                rb_erase(&cache->rb_node, &nfsi->access_cache);
2358                freed++;
2359                if (!list_empty(&nfsi->access_cache_entry_lru))
2360                        list_move_tail(&nfsi->access_cache_inode_lru,
2361                                        &nfs_access_lru_list);
2362                else {
2363remove_lru_entry:
2364                        list_del_init(&nfsi->access_cache_inode_lru);
2365                        smp_mb__before_atomic();
2366                        clear_bit(NFS_INO_ACL_LRU_SET, &nfsi->flags);
2367                        smp_mb__after_atomic();
2368                }
2369                spin_unlock(&inode->i_lock);
2370        }
2371        spin_unlock(&nfs_access_lru_lock);
2372        nfs_access_free_list(&head);
2373        return freed;
2374}
2375
2376unsigned long
2377nfs_access_cache_scan(struct shrinker *shrink, struct shrink_control *sc)
2378{
2379        int nr_to_scan = sc->nr_to_scan;
2380        gfp_t gfp_mask = sc->gfp_mask;
2381
2382        if ((gfp_mask & GFP_KERNEL) != GFP_KERNEL)
2383                return SHRINK_STOP;
2384        return nfs_do_access_cache_scan(nr_to_scan);
2385}
2386
2387
2388unsigned long
2389nfs_access_cache_count(struct shrinker *shrink, struct shrink_control *sc)
2390{
2391        return vfs_pressure_ratio(atomic_long_read(&nfs_access_nr_entries));
2392}
2393
2394static void
2395nfs_access_cache_enforce_limit(void)
2396{
2397        long nr_entries = atomic_long_read(&nfs_access_nr_entries);
2398        unsigned long diff;
2399        unsigned int nr_to_scan;
2400
2401        if (nr_entries < 0 || nr_entries <= nfs_access_max_cachesize)
2402                return;
2403        nr_to_scan = 100;
2404        diff = nr_entries - nfs_access_max_cachesize;
2405        if (diff < nr_to_scan)
2406                nr_to_scan = diff;
2407        nfs_do_access_cache_scan(nr_to_scan);
2408}
2409
2410static void __nfs_access_zap_cache(struct nfs_inode *nfsi, struct list_head *head)
2411{
2412        struct rb_root *root_node = &nfsi->access_cache;
2413        struct rb_node *n;
2414        struct nfs_access_entry *entry;
2415
2416        /* Unhook entries from the cache */
2417        while ((n = rb_first(root_node)) != NULL) {
2418                entry = rb_entry(n, struct nfs_access_entry, rb_node);
2419                rb_erase(n, root_node);
2420                list_move(&entry->lru, head);
2421        }
2422        nfsi->cache_validity &= ~NFS_INO_INVALID_ACCESS;
2423}
2424
2425void nfs_access_zap_cache(struct inode *inode)
2426{
2427        LIST_HEAD(head);
2428
2429        if (test_bit(NFS_INO_ACL_LRU_SET, &NFS_I(inode)->flags) == 0)
2430                return;
2431        /* Remove from global LRU init */
2432        spin_lock(&nfs_access_lru_lock);
2433        if (test_and_clear_bit(NFS_INO_ACL_LRU_SET, &NFS_I(inode)->flags))
2434                list_del_init(&NFS_I(inode)->access_cache_inode_lru);
2435
2436        spin_lock(&inode->i_lock);
2437        __nfs_access_zap_cache(NFS_I(inode), &head);
2438        spin_unlock(&inode->i_lock);
2439        spin_unlock(&nfs_access_lru_lock);
2440        nfs_access_free_list(&head);
2441}
2442EXPORT_SYMBOL_GPL(nfs_access_zap_cache);
2443
2444static struct nfs_access_entry *nfs_access_search_rbtree(struct inode *inode, const struct cred *cred)
2445{
2446        struct rb_node *n = NFS_I(inode)->access_cache.rb_node;
2447
2448        while (n != NULL) {
2449                struct nfs_access_entry *entry =
2450                        rb_entry(n, struct nfs_access_entry, rb_node);
2451                int cmp = cred_fscmp(cred, entry->cred);
2452
2453                if (cmp < 0)
2454                        n = n->rb_left;
2455                else if (cmp > 0)
2456                        n = n->rb_right;
2457                else
2458                        return entry;
2459        }
2460        return NULL;
2461}
2462
2463static int nfs_access_get_cached(struct inode *inode, const struct cred *cred, struct nfs_access_entry *res, bool may_block)
2464{
2465        struct nfs_inode *nfsi = NFS_I(inode);
2466        struct nfs_access_entry *cache;
2467        bool retry = true;
2468        int err;
2469
2470        spin_lock(&inode->i_lock);
2471        for(;;) {
2472                if (nfsi->cache_validity & NFS_INO_INVALID_ACCESS)
2473                        goto out_zap;
2474                cache = nfs_access_search_rbtree(inode, cred);
2475                err = -ENOENT;
2476                if (cache == NULL)
2477                        goto out;
2478                /* Found an entry, is our attribute cache valid? */
2479                if (!nfs_check_cache_invalid(inode, NFS_INO_INVALID_ACCESS))
2480                        break;
2481                if (!retry)
2482                        break;
2483                err = -ECHILD;
2484                if (!may_block)
2485                        goto out;
2486                spin_unlock(&inode->i_lock);
2487                err = __nfs_revalidate_inode(NFS_SERVER(inode), inode);
2488                if (err)
2489                        return err;
2490                spin_lock(&inode->i_lock);
2491                retry = false;
2492        }
2493        res->cred = cache->cred;
2494        res->mask = cache->mask;
2495        list_move_tail(&cache->lru, &nfsi->access_cache_entry_lru);
2496        err = 0;
2497out:
2498        spin_unlock(&inode->i_lock);
2499        return err;
2500out_zap:
2501        spin_unlock(&inode->i_lock);
2502        nfs_access_zap_cache(inode);
2503        return -ENOENT;
2504}
2505
2506static int nfs_access_get_cached_rcu(struct inode *inode, const struct cred *cred, struct nfs_access_entry *res)
2507{
2508        /* Only check the most recently returned cache entry,
2509         * but do it without locking.
2510         */
2511        struct nfs_inode *nfsi = NFS_I(inode);
2512        struct nfs_access_entry *cache;
2513        int err = -ECHILD;
2514        struct list_head *lh;
2515
2516        rcu_read_lock();
2517        if (nfsi->cache_validity & NFS_INO_INVALID_ACCESS)
2518                goto out;
2519        lh = rcu_dereference(list_tail_rcu(&nfsi->access_cache_entry_lru));
2520        cache = list_entry(lh, struct nfs_access_entry, lru);
2521        if (lh == &nfsi->access_cache_entry_lru ||
2522            cred_fscmp(cred, cache->cred) != 0)
2523                cache = NULL;
2524        if (cache == NULL)
2525                goto out;
2526        if (nfs_check_cache_invalid(inode, NFS_INO_INVALID_ACCESS))
2527                goto out;
2528        res->cred = cache->cred;
2529        res->mask = cache->mask;
2530        err = 0;
2531out:
2532        rcu_read_unlock();
2533        return err;
2534}
2535
2536static void nfs_access_add_rbtree(struct inode *inode, struct nfs_access_entry *set)
2537{
2538        struct nfs_inode *nfsi = NFS_I(inode);
2539        struct rb_root *root_node = &nfsi->access_cache;
2540        struct rb_node **p = &root_node->rb_node;
2541        struct rb_node *parent = NULL;
2542        struct nfs_access_entry *entry;
2543        int cmp;
2544
2545        spin_lock(&inode->i_lock);
2546        while (*p != NULL) {
2547                parent = *p;
2548                entry = rb_entry(parent, struct nfs_access_entry, rb_node);
2549                cmp = cred_fscmp(set->cred, entry->cred);
2550
2551                if (cmp < 0)
2552                        p = &parent->rb_left;
2553                else if (cmp > 0)
2554                        p = &parent->rb_right;
2555                else
2556                        goto found;
2557        }
2558        rb_link_node(&set->rb_node, parent, p);
2559        rb_insert_color(&set->rb_node, root_node);
2560        list_add_tail(&set->lru, &nfsi->access_cache_entry_lru);
2561        spin_unlock(&inode->i_lock);
2562        return;
2563found:
2564        rb_replace_node(parent, &set->rb_node, root_node);
2565        list_add_tail(&set->lru, &nfsi->access_cache_entry_lru);
2566        list_del(&entry->lru);
2567        spin_unlock(&inode->i_lock);
2568        nfs_access_free_entry(entry);
2569}
2570
2571void nfs_access_add_cache(struct inode *inode, struct nfs_access_entry *set)
2572{
2573        struct nfs_access_entry *cache = kmalloc(sizeof(*cache), GFP_KERNEL);
2574        if (cache == NULL)
2575                return;
2576        RB_CLEAR_NODE(&cache->rb_node);
2577        cache->cred = get_cred(set->cred);
2578        cache->mask = set->mask;
2579
2580        /* The above field assignments must be visible
2581         * before this item appears on the lru.  We cannot easily
2582         * use rcu_assign_pointer, so just force the memory barrier.
2583         */
2584        smp_wmb();
2585        nfs_access_add_rbtree(inode, cache);
2586
2587        /* Update accounting */
2588        smp_mb__before_atomic();
2589        atomic_long_inc(&nfs_access_nr_entries);
2590        smp_mb__after_atomic();
2591
2592        /* Add inode to global LRU list */
2593        if (!test_bit(NFS_INO_ACL_LRU_SET, &NFS_I(inode)->flags)) {
2594                spin_lock(&nfs_access_lru_lock);
2595                if (!test_and_set_bit(NFS_INO_ACL_LRU_SET, &NFS_I(inode)->flags))
2596                        list_add_tail(&NFS_I(inode)->access_cache_inode_lru,
2597                                        &nfs_access_lru_list);
2598                spin_unlock(&nfs_access_lru_lock);
2599        }
2600        nfs_access_cache_enforce_limit();
2601}
2602EXPORT_SYMBOL_GPL(nfs_access_add_cache);
2603
2604#define NFS_MAY_READ (NFS_ACCESS_READ)
2605#define NFS_MAY_WRITE (NFS_ACCESS_MODIFY | \
2606                NFS_ACCESS_EXTEND | \
2607                NFS_ACCESS_DELETE)
2608#define NFS_FILE_MAY_WRITE (NFS_ACCESS_MODIFY | \
2609                NFS_ACCESS_EXTEND)
2610#define NFS_DIR_MAY_WRITE NFS_MAY_WRITE
2611#define NFS_MAY_LOOKUP (NFS_ACCESS_LOOKUP)
2612#define NFS_MAY_EXECUTE (NFS_ACCESS_EXECUTE)
2613static int
2614nfs_access_calc_mask(u32 access_result, umode_t umode)
2615{
2616        int mask = 0;
2617
2618        if (access_result & NFS_MAY_READ)
2619                mask |= MAY_READ;
2620        if (S_ISDIR(umode)) {
2621                if ((access_result & NFS_DIR_MAY_WRITE) == NFS_DIR_MAY_WRITE)
2622                        mask |= MAY_WRITE;
2623                if ((access_result & NFS_MAY_LOOKUP) == NFS_MAY_LOOKUP)
2624                        mask |= MAY_EXEC;
2625        } else if (S_ISREG(umode)) {
2626                if ((access_result & NFS_FILE_MAY_WRITE) == NFS_FILE_MAY_WRITE)
2627                        mask |= MAY_WRITE;
2628                if ((access_result & NFS_MAY_EXECUTE) == NFS_MAY_EXECUTE)
2629                        mask |= MAY_EXEC;
2630        } else if (access_result & NFS_MAY_WRITE)
2631                        mask |= MAY_WRITE;
2632        return mask;
2633}
2634
2635void nfs_access_set_mask(struct nfs_access_entry *entry, u32 access_result)
2636{
2637        entry->mask = access_result;
2638}
2639EXPORT_SYMBOL_GPL(nfs_access_set_mask);
2640
2641static int nfs_do_access(struct inode *inode, const struct cred *cred, int mask)
2642{
2643        struct nfs_access_entry cache;
2644        bool may_block = (mask & MAY_NOT_BLOCK) == 0;
2645        int cache_mask = -1;
2646        int status;
2647
2648        trace_nfs_access_enter(inode);
2649
2650        status = nfs_access_get_cached_rcu(inode, cred, &cache);
2651        if (status != 0)
2652                status = nfs_access_get_cached(inode, cred, &cache, may_block);
2653        if (status == 0)
2654                goto out_cached;
2655
2656        status = -ECHILD;
2657        if (!may_block)
2658                goto out;
2659
2660        /*
2661         * Determine which access bits we want to ask for...
2662         */
2663        cache.mask = NFS_ACCESS_READ | NFS_ACCESS_MODIFY | NFS_ACCESS_EXTEND;
2664        if (S_ISDIR(inode->i_mode))
2665                cache.mask |= NFS_ACCESS_DELETE | NFS_ACCESS_LOOKUP;
2666        else
2667                cache.mask |= NFS_ACCESS_EXECUTE;
2668        cache.cred = cred;
2669        status = NFS_PROTO(inode)->access(inode, &cache);
2670        if (status != 0) {
2671                if (status == -ESTALE) {
2672                        if (!S_ISDIR(inode->i_mode))
2673                                nfs_set_inode_stale(inode);
2674                        else
2675                                nfs_zap_caches(inode);
2676                }
2677                goto out;
2678        }
2679        nfs_access_add_cache(inode, &cache);
2680out_cached:
2681        cache_mask = nfs_access_calc_mask(cache.mask, inode->i_mode);
2682        if ((mask & ~cache_mask & (MAY_READ | MAY_WRITE | MAY_EXEC)) != 0)
2683                status = -EACCES;
2684out:
2685        trace_nfs_access_exit(inode, mask, cache_mask, status);
2686        return status;
2687}
2688
2689static int nfs_open_permission_mask(int openflags)
2690{
2691        int mask = 0;
2692
2693        if (openflags & __FMODE_EXEC) {
2694                /* ONLY check exec rights */
2695                mask = MAY_EXEC;
2696        } else {
2697                if ((openflags & O_ACCMODE) != O_WRONLY)
2698                        mask |= MAY_READ;
2699                if ((openflags & O_ACCMODE) != O_RDONLY)
2700                        mask |= MAY_WRITE;
2701        }
2702
2703        return mask;
2704}
2705
2706int nfs_may_open(struct inode *inode, const struct cred *cred, int openflags)
2707{
2708        return nfs_do_access(inode, cred, nfs_open_permission_mask(openflags));
2709}
2710EXPORT_SYMBOL_GPL(nfs_may_open);
2711
2712static int nfs_execute_ok(struct inode *inode, int mask)
2713{
2714        struct nfs_server *server = NFS_SERVER(inode);
2715        int ret = 0;
2716
2717        if (S_ISDIR(inode->i_mode))
2718                return 0;
2719        if (nfs_check_cache_invalid(inode, NFS_INO_INVALID_OTHER)) {
2720                if (mask & MAY_NOT_BLOCK)
2721                        return -ECHILD;
2722                ret = __nfs_revalidate_inode(server, inode);
2723        }
2724        if (ret == 0 && !execute_ok(inode))
2725                ret = -EACCES;
2726        return ret;
2727}
2728
2729int nfs_permission(struct inode *inode, int mask)
2730{
2731        const struct cred *cred = current_cred();
2732        int res = 0;
2733
2734        nfs_inc_stats(inode, NFSIOS_VFSACCESS);
2735
2736        if ((mask & (MAY_READ | MAY_WRITE | MAY_EXEC)) == 0)
2737                goto out;
2738        /* Is this sys_access() ? */
2739        if (mask & (MAY_ACCESS | MAY_CHDIR))
2740                goto force_lookup;
2741
2742        switch (inode->i_mode & S_IFMT) {
2743                case S_IFLNK:
2744                        goto out;
2745                case S_IFREG:
2746                        if ((mask & MAY_OPEN) &&
2747                           nfs_server_capable(inode, NFS_CAP_ATOMIC_OPEN))
2748                                return 0;
2749                        break;
2750                case S_IFDIR:
2751                        /*
2752                         * Optimize away all write operations, since the server
2753                         * will check permissions when we perform the op.
2754                         */
2755                        if ((mask & MAY_WRITE) && !(mask & MAY_READ))
2756                                goto out;
2757        }
2758
2759force_lookup:
2760        if (!NFS_PROTO(inode)->access)
2761                goto out_notsup;
2762
2763        res = nfs_do_access(inode, cred, mask);
2764out:
2765        if (!res && (mask & MAY_EXEC))
2766                res = nfs_execute_ok(inode, mask);
2767
2768        dfprintk(VFS, "NFS: permission(%s/%lu), mask=0x%x, res=%d\n",
2769                inode->i_sb->s_id, inode->i_ino, mask, res);
2770        return res;
2771out_notsup:
2772        if (mask & MAY_NOT_BLOCK)
2773                return -ECHILD;
2774
2775        res = nfs_revalidate_inode(NFS_SERVER(inode), inode);
2776        if (res == 0)
2777                res = generic_permission(inode, mask);
2778        goto out;
2779}
2780EXPORT_SYMBOL_GPL(nfs_permission);
2781
2782/*
2783 * Local variables:
2784 *  version-control: t
2785 *  kept-new-versions: 5
2786 * End:
2787 */
2788