linux/fs/afs/dir.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/* dir.c: AFS filesystem directory handling
   3 *
   4 * Copyright (C) 2002, 2018 Red Hat, Inc. All Rights Reserved.
   5 * Written by David Howells (dhowells@redhat.com)
   6 */
   7
   8#include <linux/kernel.h>
   9#include <linux/fs.h>
  10#include <linux/namei.h>
  11#include <linux/pagemap.h>
  12#include <linux/swap.h>
  13#include <linux/ctype.h>
  14#include <linux/sched.h>
  15#include <linux/task_io_accounting_ops.h>
  16#include "internal.h"
  17#include "afs_fs.h"
  18#include "xdr_fs.h"
  19
  20static struct dentry *afs_lookup(struct inode *dir, struct dentry *dentry,
  21                                 unsigned int flags);
  22static int afs_dir_open(struct inode *inode, struct file *file);
  23static int afs_readdir(struct file *file, struct dir_context *ctx);
  24static int afs_d_revalidate(struct dentry *dentry, unsigned int flags);
  25static int afs_d_delete(const struct dentry *dentry);
  26static void afs_d_iput(struct dentry *dentry, struct inode *inode);
  27static int afs_lookup_one_filldir(struct dir_context *ctx, const char *name, int nlen,
  28                                  loff_t fpos, u64 ino, unsigned dtype);
  29static int afs_lookup_filldir(struct dir_context *ctx, const char *name, int nlen,
  30                              loff_t fpos, u64 ino, unsigned dtype);
  31static int afs_create(struct user_namespace *mnt_userns, struct inode *dir,
  32                      struct dentry *dentry, umode_t mode, bool excl);
  33static int afs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
  34                     struct dentry *dentry, umode_t mode);
  35static int afs_rmdir(struct inode *dir, struct dentry *dentry);
  36static int afs_unlink(struct inode *dir, struct dentry *dentry);
  37static int afs_link(struct dentry *from, struct inode *dir,
  38                    struct dentry *dentry);
  39static int afs_symlink(struct user_namespace *mnt_userns, struct inode *dir,
  40                       struct dentry *dentry, const char *content);
  41static int afs_rename(struct user_namespace *mnt_userns, struct inode *old_dir,
  42                      struct dentry *old_dentry, struct inode *new_dir,
  43                      struct dentry *new_dentry, unsigned int flags);
  44static int afs_dir_releasepage(struct page *page, gfp_t gfp_flags);
  45static void afs_dir_invalidatepage(struct page *page, unsigned int offset,
  46                                   unsigned int length);
  47
  48static int afs_dir_set_page_dirty(struct page *page)
  49{
  50        BUG(); /* This should never happen. */
  51}
  52
  53const struct file_operations afs_dir_file_operations = {
  54        .open           = afs_dir_open,
  55        .release        = afs_release,
  56        .iterate_shared = afs_readdir,
  57        .lock           = afs_lock,
  58        .llseek         = generic_file_llseek,
  59};
  60
  61const struct inode_operations afs_dir_inode_operations = {
  62        .create         = afs_create,
  63        .lookup         = afs_lookup,
  64        .link           = afs_link,
  65        .unlink         = afs_unlink,
  66        .symlink        = afs_symlink,
  67        .mkdir          = afs_mkdir,
  68        .rmdir          = afs_rmdir,
  69        .rename         = afs_rename,
  70        .permission     = afs_permission,
  71        .getattr        = afs_getattr,
  72        .setattr        = afs_setattr,
  73};
  74
  75const struct address_space_operations afs_dir_aops = {
  76        .set_page_dirty = afs_dir_set_page_dirty,
  77        .releasepage    = afs_dir_releasepage,
  78        .invalidatepage = afs_dir_invalidatepage,
  79};
  80
  81const struct dentry_operations afs_fs_dentry_operations = {
  82        .d_revalidate   = afs_d_revalidate,
  83        .d_delete       = afs_d_delete,
  84        .d_release      = afs_d_release,
  85        .d_automount    = afs_d_automount,
  86        .d_iput         = afs_d_iput,
  87};
  88
  89struct afs_lookup_one_cookie {
  90        struct dir_context      ctx;
  91        struct qstr             name;
  92        bool                    found;
  93        struct afs_fid          fid;
  94};
  95
  96struct afs_lookup_cookie {
  97        struct dir_context      ctx;
  98        struct qstr             name;
  99        bool                    found;
 100        bool                    one_only;
 101        unsigned short          nr_fids;
 102        struct afs_fid          fids[50];
 103};
 104
 105/*
 106 * check that a directory page is valid
 107 */
 108static bool afs_dir_check_page(struct afs_vnode *dvnode, struct page *page,
 109                               loff_t i_size)
 110{
 111        struct afs_xdr_dir_page *dbuf;
 112        loff_t latter, off;
 113        int tmp, qty;
 114
 115        /* Determine how many magic numbers there should be in this page, but
 116         * we must take care because the directory may change size under us.
 117         */
 118        off = page_offset(page);
 119        if (i_size <= off)
 120                goto checked;
 121
 122        latter = i_size - off;
 123        if (latter >= PAGE_SIZE)
 124                qty = PAGE_SIZE;
 125        else
 126                qty = latter;
 127        qty /= sizeof(union afs_xdr_dir_block);
 128
 129        /* check them */
 130        dbuf = kmap(page);
 131        for (tmp = 0; tmp < qty; tmp++) {
 132                if (dbuf->blocks[tmp].hdr.magic != AFS_DIR_MAGIC) {
 133                        printk("kAFS: %s(%lx): bad magic %d/%d is %04hx\n",
 134                               __func__, dvnode->vfs_inode.i_ino, tmp, qty,
 135                               ntohs(dbuf->blocks[tmp].hdr.magic));
 136                        trace_afs_dir_check_failed(dvnode, off, i_size);
 137                        kunmap(page);
 138                        trace_afs_file_error(dvnode, -EIO, afs_file_error_dir_bad_magic);
 139                        goto error;
 140                }
 141
 142                /* Make sure each block is NUL terminated so we can reasonably
 143                 * use string functions on it.  The filenames in the page
 144                 * *should* be NUL-terminated anyway.
 145                 */
 146                ((u8 *)&dbuf->blocks[tmp])[AFS_DIR_BLOCK_SIZE - 1] = 0;
 147        }
 148
 149        kunmap(page);
 150
 151checked:
 152        afs_stat_v(dvnode, n_read_dir);
 153        return true;
 154
 155error:
 156        return false;
 157}
 158
 159/*
 160 * Check the contents of a directory that we've just read.
 161 */
 162static bool afs_dir_check_pages(struct afs_vnode *dvnode, struct afs_read *req)
 163{
 164        struct afs_xdr_dir_page *dbuf;
 165        unsigned int i, j, qty = PAGE_SIZE / sizeof(union afs_xdr_dir_block);
 166
 167        for (i = 0; i < req->nr_pages; i++)
 168                if (!afs_dir_check_page(dvnode, req->pages[i], req->actual_len))
 169                        goto bad;
 170        return true;
 171
 172bad:
 173        pr_warn("DIR %llx:%llx f=%llx l=%llx al=%llx r=%llx\n",
 174                dvnode->fid.vid, dvnode->fid.vnode,
 175                req->file_size, req->len, req->actual_len, req->remain);
 176        pr_warn("DIR %llx %x %x %x\n",
 177                req->pos, req->index, req->nr_pages, req->offset);
 178
 179        for (i = 0; i < req->nr_pages; i++) {
 180                dbuf = kmap(req->pages[i]);
 181                for (j = 0; j < qty; j++) {
 182                        union afs_xdr_dir_block *block = &dbuf->blocks[j];
 183
 184                        pr_warn("[%02x] %32phN\n", i * qty + j, block);
 185                }
 186                kunmap(req->pages[i]);
 187        }
 188        return false;
 189}
 190
 191/*
 192 * open an AFS directory file
 193 */
 194static int afs_dir_open(struct inode *inode, struct file *file)
 195{
 196        _enter("{%lu}", inode->i_ino);
 197
 198        BUILD_BUG_ON(sizeof(union afs_xdr_dir_block) != 2048);
 199        BUILD_BUG_ON(sizeof(union afs_xdr_dirent) != 32);
 200
 201        if (test_bit(AFS_VNODE_DELETED, &AFS_FS_I(inode)->flags))
 202                return -ENOENT;
 203
 204        return afs_open(inode, file);
 205}
 206
 207/*
 208 * Read the directory into the pagecache in one go, scrubbing the previous
 209 * contents.  The list of pages is returned, pinning them so that they don't
 210 * get reclaimed during the iteration.
 211 */
 212static struct afs_read *afs_read_dir(struct afs_vnode *dvnode, struct key *key)
 213        __acquires(&dvnode->validate_lock)
 214{
 215        struct afs_read *req;
 216        loff_t i_size;
 217        int nr_pages, nr_inline, i, n;
 218        int ret = -ENOMEM;
 219
 220retry:
 221        i_size = i_size_read(&dvnode->vfs_inode);
 222        if (i_size < 2048)
 223                return ERR_PTR(afs_bad(dvnode, afs_file_error_dir_small));
 224        if (i_size > 2048 * 1024) {
 225                trace_afs_file_error(dvnode, -EFBIG, afs_file_error_dir_big);
 226                return ERR_PTR(-EFBIG);
 227        }
 228
 229        _enter("%llu", i_size);
 230
 231        /* Get a request record to hold the page list.  We want to hold it
 232         * inline if we can, but we don't want to make an order 1 allocation.
 233         */
 234        nr_pages = (i_size + PAGE_SIZE - 1) / PAGE_SIZE;
 235        nr_inline = nr_pages;
 236        if (nr_inline > (PAGE_SIZE - sizeof(*req)) / sizeof(struct page *))
 237                nr_inline = 0;
 238
 239        req = kzalloc(struct_size(req, array, nr_inline), GFP_KERNEL);
 240        if (!req)
 241                return ERR_PTR(-ENOMEM);
 242
 243        refcount_set(&req->usage, 1);
 244        req->nr_pages = nr_pages;
 245        req->actual_len = i_size; /* May change */
 246        req->len = nr_pages * PAGE_SIZE; /* We can ask for more than there is */
 247        req->data_version = dvnode->status.data_version; /* May change */
 248        if (nr_inline > 0) {
 249                req->pages = req->array;
 250        } else {
 251                req->pages = kcalloc(nr_pages, sizeof(struct page *),
 252                                     GFP_KERNEL);
 253                if (!req->pages)
 254                        goto error;
 255        }
 256
 257        /* Get a list of all the pages that hold or will hold the directory
 258         * content.  We need to fill in any gaps that we might find where the
 259         * memory reclaimer has been at work.  If there are any gaps, we will
 260         * need to reread the entire directory contents.
 261         */
 262        i = 0;
 263        do {
 264                n = find_get_pages_contig(dvnode->vfs_inode.i_mapping, i,
 265                                          req->nr_pages - i,
 266                                          req->pages + i);
 267                _debug("find %u at %u/%u", n, i, req->nr_pages);
 268                if (n == 0) {
 269                        gfp_t gfp = dvnode->vfs_inode.i_mapping->gfp_mask;
 270
 271                        if (test_and_clear_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
 272                                afs_stat_v(dvnode, n_inval);
 273
 274                        ret = -ENOMEM;
 275                        req->pages[i] = __page_cache_alloc(gfp);
 276                        if (!req->pages[i])
 277                                goto error;
 278                        ret = add_to_page_cache_lru(req->pages[i],
 279                                                    dvnode->vfs_inode.i_mapping,
 280                                                    i, gfp);
 281                        if (ret < 0)
 282                                goto error;
 283
 284                        attach_page_private(req->pages[i], (void *)1);
 285                        unlock_page(req->pages[i]);
 286                        i++;
 287                } else {
 288                        i += n;
 289                }
 290        } while (i < req->nr_pages);
 291
 292        /* If we're going to reload, we need to lock all the pages to prevent
 293         * races.
 294         */
 295        ret = -ERESTARTSYS;
 296        if (down_read_killable(&dvnode->validate_lock) < 0)
 297                goto error;
 298
 299        if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
 300                goto success;
 301
 302        up_read(&dvnode->validate_lock);
 303        if (down_write_killable(&dvnode->validate_lock) < 0)
 304                goto error;
 305
 306        if (!test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags)) {
 307                trace_afs_reload_dir(dvnode);
 308                ret = afs_fetch_data(dvnode, key, req);
 309                if (ret < 0)
 310                        goto error_unlock;
 311
 312                task_io_account_read(PAGE_SIZE * req->nr_pages);
 313
 314                if (req->len < req->file_size)
 315                        goto content_has_grown;
 316
 317                /* Validate the data we just read. */
 318                ret = -EIO;
 319                if (!afs_dir_check_pages(dvnode, req))
 320                        goto error_unlock;
 321
 322                // TODO: Trim excess pages
 323
 324                set_bit(AFS_VNODE_DIR_VALID, &dvnode->flags);
 325        }
 326
 327        downgrade_write(&dvnode->validate_lock);
 328success:
 329        return req;
 330
 331error_unlock:
 332        up_write(&dvnode->validate_lock);
 333error:
 334        afs_put_read(req);
 335        _leave(" = %d", ret);
 336        return ERR_PTR(ret);
 337
 338content_has_grown:
 339        up_write(&dvnode->validate_lock);
 340        afs_put_read(req);
 341        goto retry;
 342}
 343
 344/*
 345 * deal with one block in an AFS directory
 346 */
 347static int afs_dir_iterate_block(struct afs_vnode *dvnode,
 348                                 struct dir_context *ctx,
 349                                 union afs_xdr_dir_block *block,
 350                                 unsigned blkoff)
 351{
 352        union afs_xdr_dirent *dire;
 353        unsigned offset, next, curr, nr_slots;
 354        size_t nlen;
 355        int tmp;
 356
 357        _enter("%u,%x,%p,,",(unsigned)ctx->pos,blkoff,block);
 358
 359        curr = (ctx->pos - blkoff) / sizeof(union afs_xdr_dirent);
 360
 361        /* walk through the block, an entry at a time */
 362        for (offset = (blkoff == 0 ? AFS_DIR_RESV_BLOCKS0 : AFS_DIR_RESV_BLOCKS);
 363             offset < AFS_DIR_SLOTS_PER_BLOCK;
 364             offset = next
 365             ) {
 366                /* skip entries marked unused in the bitmap */
 367                if (!(block->hdr.bitmap[offset / 8] &
 368                      (1 << (offset % 8)))) {
 369                        _debug("ENT[%zu.%u]: unused",
 370                               blkoff / sizeof(union afs_xdr_dir_block), offset);
 371                        next = offset + 1;
 372                        if (offset >= curr)
 373                                ctx->pos = blkoff +
 374                                        next * sizeof(union afs_xdr_dirent);
 375                        continue;
 376                }
 377
 378                /* got a valid entry */
 379                dire = &block->dirents[offset];
 380                nlen = strnlen(dire->u.name,
 381                               sizeof(*block) -
 382                               offset * sizeof(union afs_xdr_dirent));
 383                if (nlen > AFSNAMEMAX - 1) {
 384                        _debug("ENT[%zu]: name too long (len %u/%zu)",
 385                               blkoff / sizeof(union afs_xdr_dir_block),
 386                               offset, nlen);
 387                        return afs_bad(dvnode, afs_file_error_dir_name_too_long);
 388                }
 389
 390                _debug("ENT[%zu.%u]: %s %zu \"%s\"",
 391                       blkoff / sizeof(union afs_xdr_dir_block), offset,
 392                       (offset < curr ? "skip" : "fill"),
 393                       nlen, dire->u.name);
 394
 395                nr_slots = afs_dir_calc_slots(nlen);
 396                next = offset + nr_slots;
 397                if (next > AFS_DIR_SLOTS_PER_BLOCK) {
 398                        _debug("ENT[%zu.%u]:"
 399                               " %u extends beyond end dir block"
 400                               " (len %zu)",
 401                               blkoff / sizeof(union afs_xdr_dir_block),
 402                               offset, next, nlen);
 403                        return afs_bad(dvnode, afs_file_error_dir_over_end);
 404                }
 405
 406                /* Check that the name-extension dirents are all allocated */
 407                for (tmp = 1; tmp < nr_slots; tmp++) {
 408                        unsigned int ix = offset + tmp;
 409                        if (!(block->hdr.bitmap[ix / 8] & (1 << (ix % 8)))) {
 410                                _debug("ENT[%zu.u]:"
 411                                       " %u unmarked extension (%u/%u)",
 412                                       blkoff / sizeof(union afs_xdr_dir_block),
 413                                       offset, tmp, nr_slots);
 414                                return afs_bad(dvnode, afs_file_error_dir_unmarked_ext);
 415                        }
 416                }
 417
 418                /* skip if starts before the current position */
 419                if (offset < curr)
 420                        continue;
 421
 422                /* found the next entry */
 423                if (!dir_emit(ctx, dire->u.name, nlen,
 424                              ntohl(dire->u.vnode),
 425                              (ctx->actor == afs_lookup_filldir ||
 426                               ctx->actor == afs_lookup_one_filldir)?
 427                              ntohl(dire->u.unique) : DT_UNKNOWN)) {
 428                        _leave(" = 0 [full]");
 429                        return 0;
 430                }
 431
 432                ctx->pos = blkoff + next * sizeof(union afs_xdr_dirent);
 433        }
 434
 435        _leave(" = 1 [more]");
 436        return 1;
 437}
 438
 439/*
 440 * iterate through the data blob that lists the contents of an AFS directory
 441 */
 442static int afs_dir_iterate(struct inode *dir, struct dir_context *ctx,
 443                           struct key *key, afs_dataversion_t *_dir_version)
 444{
 445        struct afs_vnode *dvnode = AFS_FS_I(dir);
 446        struct afs_xdr_dir_page *dbuf;
 447        union afs_xdr_dir_block *dblock;
 448        struct afs_read *req;
 449        struct page *page;
 450        unsigned blkoff, limit;
 451        int ret;
 452
 453        _enter("{%lu},%u,,", dir->i_ino, (unsigned)ctx->pos);
 454
 455        if (test_bit(AFS_VNODE_DELETED, &AFS_FS_I(dir)->flags)) {
 456                _leave(" = -ESTALE");
 457                return -ESTALE;
 458        }
 459
 460        req = afs_read_dir(dvnode, key);
 461        if (IS_ERR(req))
 462                return PTR_ERR(req);
 463        *_dir_version = req->data_version;
 464
 465        /* round the file position up to the next entry boundary */
 466        ctx->pos += sizeof(union afs_xdr_dirent) - 1;
 467        ctx->pos &= ~(sizeof(union afs_xdr_dirent) - 1);
 468
 469        /* walk through the blocks in sequence */
 470        ret = 0;
 471        while (ctx->pos < req->actual_len) {
 472                blkoff = ctx->pos & ~(sizeof(union afs_xdr_dir_block) - 1);
 473
 474                /* Fetch the appropriate page from the directory and re-add it
 475                 * to the LRU.
 476                 */
 477                page = req->pages[blkoff / PAGE_SIZE];
 478                if (!page) {
 479                        ret = afs_bad(dvnode, afs_file_error_dir_missing_page);
 480                        break;
 481                }
 482                mark_page_accessed(page);
 483
 484                limit = blkoff & ~(PAGE_SIZE - 1);
 485
 486                dbuf = kmap(page);
 487
 488                /* deal with the individual blocks stashed on this page */
 489                do {
 490                        dblock = &dbuf->blocks[(blkoff % PAGE_SIZE) /
 491                                               sizeof(union afs_xdr_dir_block)];
 492                        ret = afs_dir_iterate_block(dvnode, ctx, dblock, blkoff);
 493                        if (ret != 1) {
 494                                kunmap(page);
 495                                goto out;
 496                        }
 497
 498                        blkoff += sizeof(union afs_xdr_dir_block);
 499
 500                } while (ctx->pos < dir->i_size && blkoff < limit);
 501
 502                kunmap(page);
 503                ret = 0;
 504        }
 505
 506out:
 507        up_read(&dvnode->validate_lock);
 508        afs_put_read(req);
 509        _leave(" = %d", ret);
 510        return ret;
 511}
 512
 513/*
 514 * read an AFS directory
 515 */
 516static int afs_readdir(struct file *file, struct dir_context *ctx)
 517{
 518        afs_dataversion_t dir_version;
 519
 520        return afs_dir_iterate(file_inode(file), ctx, afs_file_key(file),
 521                               &dir_version);
 522}
 523
 524/*
 525 * Search the directory for a single name
 526 * - if afs_dir_iterate_block() spots this function, it'll pass the FID
 527 *   uniquifier through dtype
 528 */
 529static int afs_lookup_one_filldir(struct dir_context *ctx, const char *name,
 530                                  int nlen, loff_t fpos, u64 ino, unsigned dtype)
 531{
 532        struct afs_lookup_one_cookie *cookie =
 533                container_of(ctx, struct afs_lookup_one_cookie, ctx);
 534
 535        _enter("{%s,%u},%s,%u,,%llu,%u",
 536               cookie->name.name, cookie->name.len, name, nlen,
 537               (unsigned long long) ino, dtype);
 538
 539        /* insanity checks first */
 540        BUILD_BUG_ON(sizeof(union afs_xdr_dir_block) != 2048);
 541        BUILD_BUG_ON(sizeof(union afs_xdr_dirent) != 32);
 542
 543        if (cookie->name.len != nlen ||
 544            memcmp(cookie->name.name, name, nlen) != 0) {
 545                _leave(" = 0 [no]");
 546                return 0;
 547        }
 548
 549        cookie->fid.vnode = ino;
 550        cookie->fid.unique = dtype;
 551        cookie->found = 1;
 552
 553        _leave(" = -1 [found]");
 554        return -1;
 555}
 556
 557/*
 558 * Do a lookup of a single name in a directory
 559 * - just returns the FID the dentry name maps to if found
 560 */
 561static int afs_do_lookup_one(struct inode *dir, struct dentry *dentry,
 562                             struct afs_fid *fid, struct key *key,
 563                             afs_dataversion_t *_dir_version)
 564{
 565        struct afs_super_info *as = dir->i_sb->s_fs_info;
 566        struct afs_lookup_one_cookie cookie = {
 567                .ctx.actor = afs_lookup_one_filldir,
 568                .name = dentry->d_name,
 569                .fid.vid = as->volume->vid
 570        };
 571        int ret;
 572
 573        _enter("{%lu},%p{%pd},", dir->i_ino, dentry, dentry);
 574
 575        /* search the directory */
 576        ret = afs_dir_iterate(dir, &cookie.ctx, key, _dir_version);
 577        if (ret < 0) {
 578                _leave(" = %d [iter]", ret);
 579                return ret;
 580        }
 581
 582        ret = -ENOENT;
 583        if (!cookie.found) {
 584                _leave(" = -ENOENT [not found]");
 585                return -ENOENT;
 586        }
 587
 588        *fid = cookie.fid;
 589        _leave(" = 0 { vn=%llu u=%u }", fid->vnode, fid->unique);
 590        return 0;
 591}
 592
 593/*
 594 * search the directory for a name
 595 * - if afs_dir_iterate_block() spots this function, it'll pass the FID
 596 *   uniquifier through dtype
 597 */
 598static int afs_lookup_filldir(struct dir_context *ctx, const char *name,
 599                              int nlen, loff_t fpos, u64 ino, unsigned dtype)
 600{
 601        struct afs_lookup_cookie *cookie =
 602                container_of(ctx, struct afs_lookup_cookie, ctx);
 603        int ret;
 604
 605        _enter("{%s,%u},%s,%u,,%llu,%u",
 606               cookie->name.name, cookie->name.len, name, nlen,
 607               (unsigned long long) ino, dtype);
 608
 609        /* insanity checks first */
 610        BUILD_BUG_ON(sizeof(union afs_xdr_dir_block) != 2048);
 611        BUILD_BUG_ON(sizeof(union afs_xdr_dirent) != 32);
 612
 613        if (cookie->found) {
 614                if (cookie->nr_fids < 50) {
 615                        cookie->fids[cookie->nr_fids].vnode     = ino;
 616                        cookie->fids[cookie->nr_fids].unique    = dtype;
 617                        cookie->nr_fids++;
 618                }
 619        } else if (cookie->name.len == nlen &&
 620                   memcmp(cookie->name.name, name, nlen) == 0) {
 621                cookie->fids[1].vnode   = ino;
 622                cookie->fids[1].unique  = dtype;
 623                cookie->found = 1;
 624                if (cookie->one_only)
 625                        return -1;
 626        }
 627
 628        ret = cookie->nr_fids >= 50 ? -1 : 0;
 629        _leave(" = %d", ret);
 630        return ret;
 631}
 632
 633/*
 634 * Deal with the result of a successful lookup operation.  Turn all the files
 635 * into inodes and save the first one - which is the one we actually want.
 636 */
 637static void afs_do_lookup_success(struct afs_operation *op)
 638{
 639        struct afs_vnode_param *vp;
 640        struct afs_vnode *vnode;
 641        struct inode *inode;
 642        u32 abort_code;
 643        int i;
 644
 645        _enter("");
 646
 647        for (i = 0; i < op->nr_files; i++) {
 648                switch (i) {
 649                case 0:
 650                        vp = &op->file[0];
 651                        abort_code = vp->scb.status.abort_code;
 652                        if (abort_code != 0) {
 653                                op->ac.abort_code = abort_code;
 654                                op->error = afs_abort_to_error(abort_code);
 655                        }
 656                        break;
 657
 658                case 1:
 659                        vp = &op->file[1];
 660                        break;
 661
 662                default:
 663                        vp = &op->more_files[i - 2];
 664                        break;
 665                }
 666
 667                if (!vp->scb.have_status && !vp->scb.have_error)
 668                        continue;
 669
 670                _debug("do [%u]", i);
 671                if (vp->vnode) {
 672                        if (!test_bit(AFS_VNODE_UNSET, &vp->vnode->flags))
 673                                afs_vnode_commit_status(op, vp);
 674                } else if (vp->scb.status.abort_code == 0) {
 675                        inode = afs_iget(op, vp);
 676                        if (!IS_ERR(inode)) {
 677                                vnode = AFS_FS_I(inode);
 678                                afs_cache_permit(vnode, op->key,
 679                                                 0 /* Assume vnode->cb_break is 0 */ +
 680                                                 op->cb_v_break,
 681                                                 &vp->scb);
 682                                vp->vnode = vnode;
 683                                vp->put_vnode = true;
 684                        }
 685                } else {
 686                        _debug("- abort %d %llx:%llx.%x",
 687                               vp->scb.status.abort_code,
 688                               vp->fid.vid, vp->fid.vnode, vp->fid.unique);
 689                }
 690        }
 691
 692        _leave("");
 693}
 694
 695static const struct afs_operation_ops afs_inline_bulk_status_operation = {
 696        .issue_afs_rpc  = afs_fs_inline_bulk_status,
 697        .issue_yfs_rpc  = yfs_fs_inline_bulk_status,
 698        .success        = afs_do_lookup_success,
 699};
 700
 701static const struct afs_operation_ops afs_lookup_fetch_status_operation = {
 702        .issue_afs_rpc  = afs_fs_fetch_status,
 703        .issue_yfs_rpc  = yfs_fs_fetch_status,
 704        .success        = afs_do_lookup_success,
 705        .aborted        = afs_check_for_remote_deletion,
 706};
 707
 708/*
 709 * See if we know that the server we expect to use doesn't support
 710 * FS.InlineBulkStatus.
 711 */
 712static bool afs_server_supports_ibulk(struct afs_vnode *dvnode)
 713{
 714        struct afs_server_list *slist;
 715        struct afs_volume *volume = dvnode->volume;
 716        struct afs_server *server;
 717        bool ret = true;
 718        int i;
 719
 720        if (!test_bit(AFS_VOLUME_MAYBE_NO_IBULK, &volume->flags))
 721                return true;
 722
 723        rcu_read_lock();
 724        slist = rcu_dereference(volume->servers);
 725
 726        for (i = 0; i < slist->nr_servers; i++) {
 727                server = slist->servers[i].server;
 728                if (server == dvnode->cb_server) {
 729                        if (test_bit(AFS_SERVER_FL_NO_IBULK, &server->flags))
 730                                ret = false;
 731                        break;
 732                }
 733        }
 734
 735        rcu_read_unlock();
 736        return ret;
 737}
 738
 739/*
 740 * Do a lookup in a directory.  We make use of bulk lookup to query a slew of
 741 * files in one go and create inodes for them.  The inode of the file we were
 742 * asked for is returned.
 743 */
 744static struct inode *afs_do_lookup(struct inode *dir, struct dentry *dentry,
 745                                   struct key *key)
 746{
 747        struct afs_lookup_cookie *cookie;
 748        struct afs_vnode_param *vp;
 749        struct afs_operation *op;
 750        struct afs_vnode *dvnode = AFS_FS_I(dir), *vnode;
 751        struct inode *inode = NULL, *ti;
 752        afs_dataversion_t data_version = READ_ONCE(dvnode->status.data_version);
 753        long ret;
 754        int i;
 755
 756        _enter("{%lu},%p{%pd},", dir->i_ino, dentry, dentry);
 757
 758        cookie = kzalloc(sizeof(struct afs_lookup_cookie), GFP_KERNEL);
 759        if (!cookie)
 760                return ERR_PTR(-ENOMEM);
 761
 762        for (i = 0; i < ARRAY_SIZE(cookie->fids); i++)
 763                cookie->fids[i].vid = dvnode->fid.vid;
 764        cookie->ctx.actor = afs_lookup_filldir;
 765        cookie->name = dentry->d_name;
 766        cookie->nr_fids = 2; /* slot 0 is saved for the fid we actually want
 767                              * and slot 1 for the directory */
 768
 769        if (!afs_server_supports_ibulk(dvnode))
 770                cookie->one_only = true;
 771
 772        /* search the directory */
 773        ret = afs_dir_iterate(dir, &cookie->ctx, key, &data_version);
 774        if (ret < 0)
 775                goto out;
 776
 777        dentry->d_fsdata = (void *)(unsigned long)data_version;
 778
 779        ret = -ENOENT;
 780        if (!cookie->found)
 781                goto out;
 782
 783        /* Check to see if we already have an inode for the primary fid. */
 784        inode = ilookup5(dir->i_sb, cookie->fids[1].vnode,
 785                         afs_ilookup5_test_by_fid, &cookie->fids[1]);
 786        if (inode)
 787                goto out; /* We do */
 788
 789        /* Okay, we didn't find it.  We need to query the server - and whilst
 790         * we're doing that, we're going to attempt to look up a bunch of other
 791         * vnodes also.
 792         */
 793        op = afs_alloc_operation(NULL, dvnode->volume);
 794        if (IS_ERR(op)) {
 795                ret = PTR_ERR(op);
 796                goto out;
 797        }
 798
 799        afs_op_set_vnode(op, 0, dvnode);
 800        afs_op_set_fid(op, 1, &cookie->fids[1]);
 801
 802        op->nr_files = cookie->nr_fids;
 803        _debug("nr_files %u", op->nr_files);
 804
 805        /* Need space for examining all the selected files */
 806        op->error = -ENOMEM;
 807        if (op->nr_files > 2) {
 808                op->more_files = kvcalloc(op->nr_files - 2,
 809                                          sizeof(struct afs_vnode_param),
 810                                          GFP_KERNEL);
 811                if (!op->more_files)
 812                        goto out_op;
 813
 814                for (i = 2; i < op->nr_files; i++) {
 815                        vp = &op->more_files[i - 2];
 816                        vp->fid = cookie->fids[i];
 817
 818                        /* Find any inodes that already exist and get their
 819                         * callback counters.
 820                         */
 821                        ti = ilookup5_nowait(dir->i_sb, vp->fid.vnode,
 822                                             afs_ilookup5_test_by_fid, &vp->fid);
 823                        if (!IS_ERR_OR_NULL(ti)) {
 824                                vnode = AFS_FS_I(ti);
 825                                vp->dv_before = vnode->status.data_version;
 826                                vp->cb_break_before = afs_calc_vnode_cb_break(vnode);
 827                                vp->vnode = vnode;
 828                                vp->put_vnode = true;
 829                                vp->speculative = true; /* vnode not locked */
 830                        }
 831                }
 832        }
 833
 834        /* Try FS.InlineBulkStatus first.  Abort codes for the individual
 835         * lookups contained therein are stored in the reply without aborting
 836         * the whole operation.
 837         */
 838        op->error = -ENOTSUPP;
 839        if (!cookie->one_only) {
 840                op->ops = &afs_inline_bulk_status_operation;
 841                afs_begin_vnode_operation(op);
 842                afs_wait_for_operation(op);
 843        }
 844
 845        if (op->error == -ENOTSUPP) {
 846                /* We could try FS.BulkStatus next, but this aborts the entire
 847                 * op if any of the lookups fails - so, for the moment, revert
 848                 * to FS.FetchStatus for op->file[1].
 849                 */
 850                op->fetch_status.which = 1;
 851                op->ops = &afs_lookup_fetch_status_operation;
 852                afs_begin_vnode_operation(op);
 853                afs_wait_for_operation(op);
 854        }
 855        inode = ERR_PTR(op->error);
 856
 857out_op:
 858        if (op->error == 0) {
 859                inode = &op->file[1].vnode->vfs_inode;
 860                op->file[1].vnode = NULL;
 861        }
 862
 863        if (op->file[0].scb.have_status)
 864                dentry->d_fsdata = (void *)(unsigned long)op->file[0].scb.status.data_version;
 865        else
 866                dentry->d_fsdata = (void *)(unsigned long)op->file[0].dv_before;
 867        ret = afs_put_operation(op);
 868out:
 869        kfree(cookie);
 870        _leave("");
 871        return inode ?: ERR_PTR(ret);
 872}
 873
 874/*
 875 * Look up an entry in a directory with @sys substitution.
 876 */
 877static struct dentry *afs_lookup_atsys(struct inode *dir, struct dentry *dentry,
 878                                       struct key *key)
 879{
 880        struct afs_sysnames *subs;
 881        struct afs_net *net = afs_i2net(dir);
 882        struct dentry *ret;
 883        char *buf, *p, *name;
 884        int len, i;
 885
 886        _enter("");
 887
 888        ret = ERR_PTR(-ENOMEM);
 889        p = buf = kmalloc(AFSNAMEMAX, GFP_KERNEL);
 890        if (!buf)
 891                goto out_p;
 892        if (dentry->d_name.len > 4) {
 893                memcpy(p, dentry->d_name.name, dentry->d_name.len - 4);
 894                p += dentry->d_name.len - 4;
 895        }
 896
 897        /* There is an ordered list of substitutes that we have to try. */
 898        read_lock(&net->sysnames_lock);
 899        subs = net->sysnames;
 900        refcount_inc(&subs->usage);
 901        read_unlock(&net->sysnames_lock);
 902
 903        for (i = 0; i < subs->nr; i++) {
 904                name = subs->subs[i];
 905                len = dentry->d_name.len - 4 + strlen(name);
 906                if (len >= AFSNAMEMAX) {
 907                        ret = ERR_PTR(-ENAMETOOLONG);
 908                        goto out_s;
 909                }
 910
 911                strcpy(p, name);
 912                ret = lookup_one_len(buf, dentry->d_parent, len);
 913                if (IS_ERR(ret) || d_is_positive(ret))
 914                        goto out_s;
 915                dput(ret);
 916        }
 917
 918        /* We don't want to d_add() the @sys dentry here as we don't want to
 919         * the cached dentry to hide changes to the sysnames list.
 920         */
 921        ret = NULL;
 922out_s:
 923        afs_put_sysnames(subs);
 924        kfree(buf);
 925out_p:
 926        key_put(key);
 927        return ret;
 928}
 929
 930/*
 931 * look up an entry in a directory
 932 */
 933static struct dentry *afs_lookup(struct inode *dir, struct dentry *dentry,
 934                                 unsigned int flags)
 935{
 936        struct afs_vnode *dvnode = AFS_FS_I(dir);
 937        struct afs_fid fid = {};
 938        struct inode *inode;
 939        struct dentry *d;
 940        struct key *key;
 941        int ret;
 942
 943        _enter("{%llx:%llu},%p{%pd},",
 944               dvnode->fid.vid, dvnode->fid.vnode, dentry, dentry);
 945
 946        ASSERTCMP(d_inode(dentry), ==, NULL);
 947
 948        if (dentry->d_name.len >= AFSNAMEMAX) {
 949                _leave(" = -ENAMETOOLONG");
 950                return ERR_PTR(-ENAMETOOLONG);
 951        }
 952
 953        if (test_bit(AFS_VNODE_DELETED, &dvnode->flags)) {
 954                _leave(" = -ESTALE");
 955                return ERR_PTR(-ESTALE);
 956        }
 957
 958        key = afs_request_key(dvnode->volume->cell);
 959        if (IS_ERR(key)) {
 960                _leave(" = %ld [key]", PTR_ERR(key));
 961                return ERR_CAST(key);
 962        }
 963
 964        ret = afs_validate(dvnode, key);
 965        if (ret < 0) {
 966                key_put(key);
 967                _leave(" = %d [val]", ret);
 968                return ERR_PTR(ret);
 969        }
 970
 971        if (dentry->d_name.len >= 4 &&
 972            dentry->d_name.name[dentry->d_name.len - 4] == '@' &&
 973            dentry->d_name.name[dentry->d_name.len - 3] == 's' &&
 974            dentry->d_name.name[dentry->d_name.len - 2] == 'y' &&
 975            dentry->d_name.name[dentry->d_name.len - 1] == 's')
 976                return afs_lookup_atsys(dir, dentry, key);
 977
 978        afs_stat_v(dvnode, n_lookup);
 979        inode = afs_do_lookup(dir, dentry, key);
 980        key_put(key);
 981        if (inode == ERR_PTR(-ENOENT))
 982                inode = afs_try_auto_mntpt(dentry, dir);
 983
 984        if (!IS_ERR_OR_NULL(inode))
 985                fid = AFS_FS_I(inode)->fid;
 986
 987        _debug("splice %p", dentry->d_inode);
 988        d = d_splice_alias(inode, dentry);
 989        if (!IS_ERR_OR_NULL(d)) {
 990                d->d_fsdata = dentry->d_fsdata;
 991                trace_afs_lookup(dvnode, &d->d_name, &fid);
 992        } else {
 993                trace_afs_lookup(dvnode, &dentry->d_name, &fid);
 994        }
 995        _leave("");
 996        return d;
 997}
 998
 999/*
1000 * Check the validity of a dentry under RCU conditions.
1001 */
1002static int afs_d_revalidate_rcu(struct dentry *dentry)
1003{
1004        struct afs_vnode *dvnode, *vnode;
1005        struct dentry *parent;
1006        struct inode *dir, *inode;
1007        long dir_version, de_version;
1008
1009        _enter("%p", dentry);
1010
1011        /* Check the parent directory is still valid first. */
1012        parent = READ_ONCE(dentry->d_parent);
1013        dir = d_inode_rcu(parent);
1014        if (!dir)
1015                return -ECHILD;
1016        dvnode = AFS_FS_I(dir);
1017        if (test_bit(AFS_VNODE_DELETED, &dvnode->flags))
1018                return -ECHILD;
1019
1020        if (!afs_check_validity(dvnode))
1021                return -ECHILD;
1022
1023        /* We only need to invalidate a dentry if the server's copy changed
1024         * behind our back.  If we made the change, it's no problem.  Note that
1025         * on a 32-bit system, we only have 32 bits in the dentry to store the
1026         * version.
1027         */
1028        dir_version = (long)READ_ONCE(dvnode->status.data_version);
1029        de_version = (long)READ_ONCE(dentry->d_fsdata);
1030        if (de_version != dir_version) {
1031                dir_version = (long)READ_ONCE(dvnode->invalid_before);
1032                if (de_version - dir_version < 0)
1033                        return -ECHILD;
1034        }
1035
1036        /* Check to see if the vnode referred to by the dentry still
1037         * has a callback.
1038         */
1039        if (d_really_is_positive(dentry)) {
1040                inode = d_inode_rcu(dentry);
1041                if (inode) {
1042                        vnode = AFS_FS_I(inode);
1043                        if (!afs_check_validity(vnode))
1044                                return -ECHILD;
1045                }
1046        }
1047
1048        return 1; /* Still valid */
1049}
1050
1051/*
1052 * check that a dentry lookup hit has found a valid entry
1053 * - NOTE! the hit can be a negative hit too, so we can't assume we have an
1054 *   inode
1055 */
1056static int afs_d_revalidate(struct dentry *dentry, unsigned int flags)
1057{
1058        struct afs_vnode *vnode, *dir;
1059        struct afs_fid fid;
1060        struct dentry *parent;
1061        struct inode *inode;
1062        struct key *key;
1063        afs_dataversion_t dir_version, invalid_before;
1064        long de_version;
1065        int ret;
1066
1067        if (flags & LOOKUP_RCU)
1068                return afs_d_revalidate_rcu(dentry);
1069
1070        if (d_really_is_positive(dentry)) {
1071                vnode = AFS_FS_I(d_inode(dentry));
1072                _enter("{v={%llx:%llu} n=%pd fl=%lx},",
1073                       vnode->fid.vid, vnode->fid.vnode, dentry,
1074                       vnode->flags);
1075        } else {
1076                _enter("{neg n=%pd}", dentry);
1077        }
1078
1079        key = afs_request_key(AFS_FS_S(dentry->d_sb)->volume->cell);
1080        if (IS_ERR(key))
1081                key = NULL;
1082
1083        if (d_really_is_positive(dentry)) {
1084                inode = d_inode(dentry);
1085                if (inode) {
1086                        vnode = AFS_FS_I(inode);
1087                        afs_validate(vnode, key);
1088                        if (test_bit(AFS_VNODE_DELETED, &vnode->flags))
1089                                goto out_bad;
1090                }
1091        }
1092
1093        /* lock down the parent dentry so we can peer at it */
1094        parent = dget_parent(dentry);
1095        dir = AFS_FS_I(d_inode(parent));
1096
1097        /* validate the parent directory */
1098        afs_validate(dir, key);
1099
1100        if (test_bit(AFS_VNODE_DELETED, &dir->flags)) {
1101                _debug("%pd: parent dir deleted", dentry);
1102                goto out_bad_parent;
1103        }
1104
1105        /* We only need to invalidate a dentry if the server's copy changed
1106         * behind our back.  If we made the change, it's no problem.  Note that
1107         * on a 32-bit system, we only have 32 bits in the dentry to store the
1108         * version.
1109         */
1110        dir_version = dir->status.data_version;
1111        de_version = (long)dentry->d_fsdata;
1112        if (de_version == (long)dir_version)
1113                goto out_valid_noupdate;
1114
1115        invalid_before = dir->invalid_before;
1116        if (de_version - (long)invalid_before >= 0)
1117                goto out_valid;
1118
1119        _debug("dir modified");
1120        afs_stat_v(dir, n_reval);
1121
1122        /* search the directory for this vnode */
1123        ret = afs_do_lookup_one(&dir->vfs_inode, dentry, &fid, key, &dir_version);
1124        switch (ret) {
1125        case 0:
1126                /* the filename maps to something */
1127                if (d_really_is_negative(dentry))
1128                        goto out_bad_parent;
1129                inode = d_inode(dentry);
1130                if (is_bad_inode(inode)) {
1131                        printk("kAFS: afs_d_revalidate: %pd2 has bad inode\n",
1132                               dentry);
1133                        goto out_bad_parent;
1134                }
1135
1136                vnode = AFS_FS_I(inode);
1137
1138                /* if the vnode ID has changed, then the dirent points to a
1139                 * different file */
1140                if (fid.vnode != vnode->fid.vnode) {
1141                        _debug("%pd: dirent changed [%llu != %llu]",
1142                               dentry, fid.vnode,
1143                               vnode->fid.vnode);
1144                        goto not_found;
1145                }
1146
1147                /* if the vnode ID uniqifier has changed, then the file has
1148                 * been deleted and replaced, and the original vnode ID has
1149                 * been reused */
1150                if (fid.unique != vnode->fid.unique) {
1151                        _debug("%pd: file deleted (uq %u -> %u I:%u)",
1152                               dentry, fid.unique,
1153                               vnode->fid.unique,
1154                               vnode->vfs_inode.i_generation);
1155                        write_seqlock(&vnode->cb_lock);
1156                        set_bit(AFS_VNODE_DELETED, &vnode->flags);
1157                        write_sequnlock(&vnode->cb_lock);
1158                        goto not_found;
1159                }
1160                goto out_valid;
1161
1162        case -ENOENT:
1163                /* the filename is unknown */
1164                _debug("%pd: dirent not found", dentry);
1165                if (d_really_is_positive(dentry))
1166                        goto not_found;
1167                goto out_valid;
1168
1169        default:
1170                _debug("failed to iterate dir %pd: %d",
1171                       parent, ret);
1172                goto out_bad_parent;
1173        }
1174
1175out_valid:
1176        dentry->d_fsdata = (void *)(unsigned long)dir_version;
1177out_valid_noupdate:
1178        dput(parent);
1179        key_put(key);
1180        _leave(" = 1 [valid]");
1181        return 1;
1182
1183        /* the dirent, if it exists, now points to a different vnode */
1184not_found:
1185        spin_lock(&dentry->d_lock);
1186        dentry->d_flags |= DCACHE_NFSFS_RENAMED;
1187        spin_unlock(&dentry->d_lock);
1188
1189out_bad_parent:
1190        _debug("dropping dentry %pd2", dentry);
1191        dput(parent);
1192out_bad:
1193        key_put(key);
1194
1195        _leave(" = 0 [bad]");
1196        return 0;
1197}
1198
1199/*
1200 * allow the VFS to enquire as to whether a dentry should be unhashed (mustn't
1201 * sleep)
1202 * - called from dput() when d_count is going to 0.
1203 * - return 1 to request dentry be unhashed, 0 otherwise
1204 */
1205static int afs_d_delete(const struct dentry *dentry)
1206{
1207        _enter("%pd", dentry);
1208
1209        if (dentry->d_flags & DCACHE_NFSFS_RENAMED)
1210                goto zap;
1211
1212        if (d_really_is_positive(dentry) &&
1213            (test_bit(AFS_VNODE_DELETED,   &AFS_FS_I(d_inode(dentry))->flags) ||
1214             test_bit(AFS_VNODE_PSEUDODIR, &AFS_FS_I(d_inode(dentry))->flags)))
1215                goto zap;
1216
1217        _leave(" = 0 [keep]");
1218        return 0;
1219
1220zap:
1221        _leave(" = 1 [zap]");
1222        return 1;
1223}
1224
1225/*
1226 * Clean up sillyrename files on dentry removal.
1227 */
1228static void afs_d_iput(struct dentry *dentry, struct inode *inode)
1229{
1230        if (dentry->d_flags & DCACHE_NFSFS_RENAMED)
1231                afs_silly_iput(dentry, inode);
1232        iput(inode);
1233}
1234
1235/*
1236 * handle dentry release
1237 */
1238void afs_d_release(struct dentry *dentry)
1239{
1240        _enter("%pd", dentry);
1241}
1242
1243void afs_check_for_remote_deletion(struct afs_operation *op)
1244{
1245        struct afs_vnode *vnode = op->file[0].vnode;
1246
1247        switch (op->ac.abort_code) {
1248        case VNOVNODE:
1249                set_bit(AFS_VNODE_DELETED, &vnode->flags);
1250                afs_break_callback(vnode, afs_cb_break_for_deleted);
1251        }
1252}
1253
1254/*
1255 * Create a new inode for create/mkdir/symlink
1256 */
1257static void afs_vnode_new_inode(struct afs_operation *op)
1258{
1259        struct afs_vnode_param *vp = &op->file[1];
1260        struct afs_vnode *vnode;
1261        struct inode *inode;
1262
1263        _enter("");
1264
1265        ASSERTCMP(op->error, ==, 0);
1266
1267        inode = afs_iget(op, vp);
1268        if (IS_ERR(inode)) {
1269                /* ENOMEM or EINTR at a really inconvenient time - just abandon
1270                 * the new directory on the server.
1271                 */
1272                op->error = PTR_ERR(inode);
1273                return;
1274        }
1275
1276        vnode = AFS_FS_I(inode);
1277        set_bit(AFS_VNODE_NEW_CONTENT, &vnode->flags);
1278        if (!op->error)
1279                afs_cache_permit(vnode, op->key, vnode->cb_break, &vp->scb);
1280        d_instantiate(op->dentry, inode);
1281}
1282
1283static void afs_create_success(struct afs_operation *op)
1284{
1285        _enter("op=%08x", op->debug_id);
1286        op->ctime = op->file[0].scb.status.mtime_client;
1287        afs_vnode_commit_status(op, &op->file[0]);
1288        afs_update_dentry_version(op, &op->file[0], op->dentry);
1289        afs_vnode_new_inode(op);
1290}
1291
1292static void afs_create_edit_dir(struct afs_operation *op)
1293{
1294        struct afs_vnode_param *dvp = &op->file[0];
1295        struct afs_vnode_param *vp = &op->file[1];
1296        struct afs_vnode *dvnode = dvp->vnode;
1297
1298        _enter("op=%08x", op->debug_id);
1299
1300        down_write(&dvnode->validate_lock);
1301        if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags) &&
1302            dvnode->status.data_version == dvp->dv_before + dvp->dv_delta)
1303                afs_edit_dir_add(dvnode, &op->dentry->d_name, &vp->fid,
1304                                 op->create.reason);
1305        up_write(&dvnode->validate_lock);
1306}
1307
1308static void afs_create_put(struct afs_operation *op)
1309{
1310        _enter("op=%08x", op->debug_id);
1311
1312        if (op->error)
1313                d_drop(op->dentry);
1314}
1315
1316static const struct afs_operation_ops afs_mkdir_operation = {
1317        .issue_afs_rpc  = afs_fs_make_dir,
1318        .issue_yfs_rpc  = yfs_fs_make_dir,
1319        .success        = afs_create_success,
1320        .aborted        = afs_check_for_remote_deletion,
1321        .edit_dir       = afs_create_edit_dir,
1322        .put            = afs_create_put,
1323};
1324
1325/*
1326 * create a directory on an AFS filesystem
1327 */
1328static int afs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
1329                     struct dentry *dentry, umode_t mode)
1330{
1331        struct afs_operation *op;
1332        struct afs_vnode *dvnode = AFS_FS_I(dir);
1333
1334        _enter("{%llx:%llu},{%pd},%ho",
1335               dvnode->fid.vid, dvnode->fid.vnode, dentry, mode);
1336
1337        op = afs_alloc_operation(NULL, dvnode->volume);
1338        if (IS_ERR(op)) {
1339                d_drop(dentry);
1340                return PTR_ERR(op);
1341        }
1342
1343        afs_op_set_vnode(op, 0, dvnode);
1344        op->file[0].dv_delta = 1;
1345        op->file[0].update_ctime = true;
1346        op->dentry      = dentry;
1347        op->create.mode = S_IFDIR | mode;
1348        op->create.reason = afs_edit_dir_for_mkdir;
1349        op->ops         = &afs_mkdir_operation;
1350        return afs_do_sync_operation(op);
1351}
1352
1353/*
1354 * Remove a subdir from a directory.
1355 */
1356static void afs_dir_remove_subdir(struct dentry *dentry)
1357{
1358        if (d_really_is_positive(dentry)) {
1359                struct afs_vnode *vnode = AFS_FS_I(d_inode(dentry));
1360
1361                clear_nlink(&vnode->vfs_inode);
1362                set_bit(AFS_VNODE_DELETED, &vnode->flags);
1363                clear_bit(AFS_VNODE_CB_PROMISED, &vnode->flags);
1364                clear_bit(AFS_VNODE_DIR_VALID, &vnode->flags);
1365        }
1366}
1367
1368static void afs_rmdir_success(struct afs_operation *op)
1369{
1370        _enter("op=%08x", op->debug_id);
1371        op->ctime = op->file[0].scb.status.mtime_client;
1372        afs_vnode_commit_status(op, &op->file[0]);
1373        afs_update_dentry_version(op, &op->file[0], op->dentry);
1374}
1375
1376static void afs_rmdir_edit_dir(struct afs_operation *op)
1377{
1378        struct afs_vnode_param *dvp = &op->file[0];
1379        struct afs_vnode *dvnode = dvp->vnode;
1380
1381        _enter("op=%08x", op->debug_id);
1382        afs_dir_remove_subdir(op->dentry);
1383
1384        down_write(&dvnode->validate_lock);
1385        if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags) &&
1386            dvnode->status.data_version == dvp->dv_before + dvp->dv_delta)
1387                afs_edit_dir_remove(dvnode, &op->dentry->d_name,
1388                                    afs_edit_dir_for_rmdir);
1389        up_write(&dvnode->validate_lock);
1390}
1391
1392static void afs_rmdir_put(struct afs_operation *op)
1393{
1394        _enter("op=%08x", op->debug_id);
1395        if (op->file[1].vnode)
1396                up_write(&op->file[1].vnode->rmdir_lock);
1397}
1398
1399static const struct afs_operation_ops afs_rmdir_operation = {
1400        .issue_afs_rpc  = afs_fs_remove_dir,
1401        .issue_yfs_rpc  = yfs_fs_remove_dir,
1402        .success        = afs_rmdir_success,
1403        .aborted        = afs_check_for_remote_deletion,
1404        .edit_dir       = afs_rmdir_edit_dir,
1405        .put            = afs_rmdir_put,
1406};
1407
1408/*
1409 * remove a directory from an AFS filesystem
1410 */
1411static int afs_rmdir(struct inode *dir, struct dentry *dentry)
1412{
1413        struct afs_operation *op;
1414        struct afs_vnode *dvnode = AFS_FS_I(dir), *vnode = NULL;
1415        int ret;
1416
1417        _enter("{%llx:%llu},{%pd}",
1418               dvnode->fid.vid, dvnode->fid.vnode, dentry);
1419
1420        op = afs_alloc_operation(NULL, dvnode->volume);
1421        if (IS_ERR(op))
1422                return PTR_ERR(op);
1423
1424        afs_op_set_vnode(op, 0, dvnode);
1425        op->file[0].dv_delta = 1;
1426        op->file[0].update_ctime = true;
1427
1428        op->dentry      = dentry;
1429        op->ops         = &afs_rmdir_operation;
1430
1431        /* Try to make sure we have a callback promise on the victim. */
1432        if (d_really_is_positive(dentry)) {
1433                vnode = AFS_FS_I(d_inode(dentry));
1434                ret = afs_validate(vnode, op->key);
1435                if (ret < 0)
1436                        goto error;
1437        }
1438
1439        if (vnode) {
1440                ret = down_write_killable(&vnode->rmdir_lock);
1441                if (ret < 0)
1442                        goto error;
1443                op->file[1].vnode = vnode;
1444        }
1445
1446        return afs_do_sync_operation(op);
1447
1448error:
1449        return afs_put_operation(op);
1450}
1451
1452/*
1453 * Remove a link to a file or symlink from a directory.
1454 *
1455 * If the file was not deleted due to excess hard links, the fileserver will
1456 * break the callback promise on the file - if it had one - before it returns
1457 * to us, and if it was deleted, it won't
1458 *
1459 * However, if we didn't have a callback promise outstanding, or it was
1460 * outstanding on a different server, then it won't break it either...
1461 */
1462static void afs_dir_remove_link(struct afs_operation *op)
1463{
1464        struct afs_vnode *dvnode = op->file[0].vnode;
1465        struct afs_vnode *vnode = op->file[1].vnode;
1466        struct dentry *dentry = op->dentry;
1467        int ret;
1468
1469        if (op->error != 0 ||
1470            (op->file[1].scb.have_status && op->file[1].scb.have_error))
1471                return;
1472        if (d_really_is_positive(dentry))
1473                return;
1474
1475        if (test_bit(AFS_VNODE_DELETED, &vnode->flags)) {
1476                /* Already done */
1477        } else if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags)) {
1478                write_seqlock(&vnode->cb_lock);
1479                drop_nlink(&vnode->vfs_inode);
1480                if (vnode->vfs_inode.i_nlink == 0) {
1481                        set_bit(AFS_VNODE_DELETED, &vnode->flags);
1482                        __afs_break_callback(vnode, afs_cb_break_for_unlink);
1483                }
1484                write_sequnlock(&vnode->cb_lock);
1485        } else {
1486                afs_break_callback(vnode, afs_cb_break_for_unlink);
1487
1488                if (test_bit(AFS_VNODE_DELETED, &vnode->flags))
1489                        _debug("AFS_VNODE_DELETED");
1490
1491                ret = afs_validate(vnode, op->key);
1492                if (ret != -ESTALE)
1493                        op->error = ret;
1494        }
1495
1496        _debug("nlink %d [val %d]", vnode->vfs_inode.i_nlink, op->error);
1497}
1498
1499static void afs_unlink_success(struct afs_operation *op)
1500{
1501        _enter("op=%08x", op->debug_id);
1502        op->ctime = op->file[0].scb.status.mtime_client;
1503        afs_check_dir_conflict(op, &op->file[0]);
1504        afs_vnode_commit_status(op, &op->file[0]);
1505        afs_vnode_commit_status(op, &op->file[1]);
1506        afs_update_dentry_version(op, &op->file[0], op->dentry);
1507        afs_dir_remove_link(op);
1508}
1509
1510static void afs_unlink_edit_dir(struct afs_operation *op)
1511{
1512        struct afs_vnode_param *dvp = &op->file[0];
1513        struct afs_vnode *dvnode = dvp->vnode;
1514
1515        _enter("op=%08x", op->debug_id);
1516        down_write(&dvnode->validate_lock);
1517        if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags) &&
1518            dvnode->status.data_version == dvp->dv_before + dvp->dv_delta)
1519                afs_edit_dir_remove(dvnode, &op->dentry->d_name,
1520                                    afs_edit_dir_for_unlink);
1521        up_write(&dvnode->validate_lock);
1522}
1523
1524static void afs_unlink_put(struct afs_operation *op)
1525{
1526        _enter("op=%08x", op->debug_id);
1527        if (op->unlink.need_rehash && op->error < 0 && op->error != -ENOENT)
1528                d_rehash(op->dentry);
1529}
1530
1531static const struct afs_operation_ops afs_unlink_operation = {
1532        .issue_afs_rpc  = afs_fs_remove_file,
1533        .issue_yfs_rpc  = yfs_fs_remove_file,
1534        .success        = afs_unlink_success,
1535        .aborted        = afs_check_for_remote_deletion,
1536        .edit_dir       = afs_unlink_edit_dir,
1537        .put            = afs_unlink_put,
1538};
1539
1540/*
1541 * Remove a file or symlink from an AFS filesystem.
1542 */
1543static int afs_unlink(struct inode *dir, struct dentry *dentry)
1544{
1545        struct afs_operation *op;
1546        struct afs_vnode *dvnode = AFS_FS_I(dir);
1547        struct afs_vnode *vnode = AFS_FS_I(d_inode(dentry));
1548        int ret;
1549
1550        _enter("{%llx:%llu},{%pd}",
1551               dvnode->fid.vid, dvnode->fid.vnode, dentry);
1552
1553        if (dentry->d_name.len >= AFSNAMEMAX)
1554                return -ENAMETOOLONG;
1555
1556        op = afs_alloc_operation(NULL, dvnode->volume);
1557        if (IS_ERR(op))
1558                return PTR_ERR(op);
1559
1560        afs_op_set_vnode(op, 0, dvnode);
1561        op->file[0].dv_delta = 1;
1562        op->file[0].update_ctime = true;
1563
1564        /* Try to make sure we have a callback promise on the victim. */
1565        ret = afs_validate(vnode, op->key);
1566        if (ret < 0) {
1567                op->error = ret;
1568                goto error;
1569        }
1570
1571        spin_lock(&dentry->d_lock);
1572        if (d_count(dentry) > 1) {
1573                spin_unlock(&dentry->d_lock);
1574                /* Start asynchronous writeout of the inode */
1575                write_inode_now(d_inode(dentry), 0);
1576                op->error = afs_sillyrename(dvnode, vnode, dentry, op->key);
1577                goto error;
1578        }
1579        if (!d_unhashed(dentry)) {
1580                /* Prevent a race with RCU lookup. */
1581                __d_drop(dentry);
1582                op->unlink.need_rehash = true;
1583        }
1584        spin_unlock(&dentry->d_lock);
1585
1586        op->file[1].vnode = vnode;
1587        op->file[1].update_ctime = true;
1588        op->file[1].op_unlinked = true;
1589        op->dentry      = dentry;
1590        op->ops         = &afs_unlink_operation;
1591        afs_begin_vnode_operation(op);
1592        afs_wait_for_operation(op);
1593
1594        /* If there was a conflict with a third party, check the status of the
1595         * unlinked vnode.
1596         */
1597        if (op->error == 0 && (op->flags & AFS_OPERATION_DIR_CONFLICT)) {
1598                op->file[1].update_ctime = false;
1599                op->fetch_status.which = 1;
1600                op->ops = &afs_fetch_status_operation;
1601                afs_begin_vnode_operation(op);
1602                afs_wait_for_operation(op);
1603        }
1604
1605        return afs_put_operation(op);
1606
1607error:
1608        return afs_put_operation(op);
1609}
1610
1611static const struct afs_operation_ops afs_create_operation = {
1612        .issue_afs_rpc  = afs_fs_create_file,
1613        .issue_yfs_rpc  = yfs_fs_create_file,
1614        .success        = afs_create_success,
1615        .aborted        = afs_check_for_remote_deletion,
1616        .edit_dir       = afs_create_edit_dir,
1617        .put            = afs_create_put,
1618};
1619
1620/*
1621 * create a regular file on an AFS filesystem
1622 */
1623static int afs_create(struct user_namespace *mnt_userns, struct inode *dir,
1624                      struct dentry *dentry, umode_t mode, bool excl)
1625{
1626        struct afs_operation *op;
1627        struct afs_vnode *dvnode = AFS_FS_I(dir);
1628        int ret = -ENAMETOOLONG;
1629
1630        _enter("{%llx:%llu},{%pd},%ho",
1631               dvnode->fid.vid, dvnode->fid.vnode, dentry, mode);
1632
1633        if (dentry->d_name.len >= AFSNAMEMAX)
1634                goto error;
1635
1636        op = afs_alloc_operation(NULL, dvnode->volume);
1637        if (IS_ERR(op)) {
1638                ret = PTR_ERR(op);
1639                goto error;
1640        }
1641
1642        afs_op_set_vnode(op, 0, dvnode);
1643        op->file[0].dv_delta = 1;
1644        op->file[0].update_ctime = true;
1645
1646        op->dentry      = dentry;
1647        op->create.mode = S_IFREG | mode;
1648        op->create.reason = afs_edit_dir_for_create;
1649        op->ops         = &afs_create_operation;
1650        return afs_do_sync_operation(op);
1651
1652error:
1653        d_drop(dentry);
1654        _leave(" = %d", ret);
1655        return ret;
1656}
1657
1658static void afs_link_success(struct afs_operation *op)
1659{
1660        struct afs_vnode_param *dvp = &op->file[0];
1661        struct afs_vnode_param *vp = &op->file[1];
1662
1663        _enter("op=%08x", op->debug_id);
1664        op->ctime = dvp->scb.status.mtime_client;
1665        afs_vnode_commit_status(op, dvp);
1666        afs_vnode_commit_status(op, vp);
1667        afs_update_dentry_version(op, dvp, op->dentry);
1668        if (op->dentry_2->d_parent == op->dentry->d_parent)
1669                afs_update_dentry_version(op, dvp, op->dentry_2);
1670        ihold(&vp->vnode->vfs_inode);
1671        d_instantiate(op->dentry, &vp->vnode->vfs_inode);
1672}
1673
1674static void afs_link_put(struct afs_operation *op)
1675{
1676        _enter("op=%08x", op->debug_id);
1677        if (op->error)
1678                d_drop(op->dentry);
1679}
1680
1681static const struct afs_operation_ops afs_link_operation = {
1682        .issue_afs_rpc  = afs_fs_link,
1683        .issue_yfs_rpc  = yfs_fs_link,
1684        .success        = afs_link_success,
1685        .aborted        = afs_check_for_remote_deletion,
1686        .edit_dir       = afs_create_edit_dir,
1687        .put            = afs_link_put,
1688};
1689
1690/*
1691 * create a hard link between files in an AFS filesystem
1692 */
1693static int afs_link(struct dentry *from, struct inode *dir,
1694                    struct dentry *dentry)
1695{
1696        struct afs_operation *op;
1697        struct afs_vnode *dvnode = AFS_FS_I(dir);
1698        struct afs_vnode *vnode = AFS_FS_I(d_inode(from));
1699        int ret = -ENAMETOOLONG;
1700
1701        _enter("{%llx:%llu},{%llx:%llu},{%pd}",
1702               vnode->fid.vid, vnode->fid.vnode,
1703               dvnode->fid.vid, dvnode->fid.vnode,
1704               dentry);
1705
1706        if (dentry->d_name.len >= AFSNAMEMAX)
1707                goto error;
1708
1709        op = afs_alloc_operation(NULL, dvnode->volume);
1710        if (IS_ERR(op)) {
1711                ret = PTR_ERR(op);
1712                goto error;
1713        }
1714
1715        afs_op_set_vnode(op, 0, dvnode);
1716        afs_op_set_vnode(op, 1, vnode);
1717        op->file[0].dv_delta = 1;
1718        op->file[0].update_ctime = true;
1719        op->file[1].update_ctime = true;
1720
1721        op->dentry              = dentry;
1722        op->dentry_2            = from;
1723        op->ops                 = &afs_link_operation;
1724        op->create.reason       = afs_edit_dir_for_link;
1725        return afs_do_sync_operation(op);
1726
1727error:
1728        d_drop(dentry);
1729        _leave(" = %d", ret);
1730        return ret;
1731}
1732
1733static const struct afs_operation_ops afs_symlink_operation = {
1734        .issue_afs_rpc  = afs_fs_symlink,
1735        .issue_yfs_rpc  = yfs_fs_symlink,
1736        .success        = afs_create_success,
1737        .aborted        = afs_check_for_remote_deletion,
1738        .edit_dir       = afs_create_edit_dir,
1739        .put            = afs_create_put,
1740};
1741
1742/*
1743 * create a symlink in an AFS filesystem
1744 */
1745static int afs_symlink(struct user_namespace *mnt_userns, struct inode *dir,
1746                       struct dentry *dentry, const char *content)
1747{
1748        struct afs_operation *op;
1749        struct afs_vnode *dvnode = AFS_FS_I(dir);
1750        int ret;
1751
1752        _enter("{%llx:%llu},{%pd},%s",
1753               dvnode->fid.vid, dvnode->fid.vnode, dentry,
1754               content);
1755
1756        ret = -ENAMETOOLONG;
1757        if (dentry->d_name.len >= AFSNAMEMAX)
1758                goto error;
1759
1760        ret = -EINVAL;
1761        if (strlen(content) >= AFSPATHMAX)
1762                goto error;
1763
1764        op = afs_alloc_operation(NULL, dvnode->volume);
1765        if (IS_ERR(op)) {
1766                ret = PTR_ERR(op);
1767                goto error;
1768        }
1769
1770        afs_op_set_vnode(op, 0, dvnode);
1771        op->file[0].dv_delta = 1;
1772
1773        op->dentry              = dentry;
1774        op->ops                 = &afs_symlink_operation;
1775        op->create.reason       = afs_edit_dir_for_symlink;
1776        op->create.symlink      = content;
1777        return afs_do_sync_operation(op);
1778
1779error:
1780        d_drop(dentry);
1781        _leave(" = %d", ret);
1782        return ret;
1783}
1784
1785static void afs_rename_success(struct afs_operation *op)
1786{
1787        _enter("op=%08x", op->debug_id);
1788
1789        op->ctime = op->file[0].scb.status.mtime_client;
1790        afs_check_dir_conflict(op, &op->file[1]);
1791        afs_vnode_commit_status(op, &op->file[0]);
1792        if (op->file[1].vnode != op->file[0].vnode) {
1793                op->ctime = op->file[1].scb.status.mtime_client;
1794                afs_vnode_commit_status(op, &op->file[1]);
1795        }
1796}
1797
1798static void afs_rename_edit_dir(struct afs_operation *op)
1799{
1800        struct afs_vnode_param *orig_dvp = &op->file[0];
1801        struct afs_vnode_param *new_dvp = &op->file[1];
1802        struct afs_vnode *orig_dvnode = orig_dvp->vnode;
1803        struct afs_vnode *new_dvnode = new_dvp->vnode;
1804        struct afs_vnode *vnode = AFS_FS_I(d_inode(op->dentry));
1805        struct dentry *old_dentry = op->dentry;
1806        struct dentry *new_dentry = op->dentry_2;
1807        struct inode *new_inode;
1808
1809        _enter("op=%08x", op->debug_id);
1810
1811        if (op->rename.rehash) {
1812                d_rehash(op->rename.rehash);
1813                op->rename.rehash = NULL;
1814        }
1815
1816        down_write(&orig_dvnode->validate_lock);
1817        if (test_bit(AFS_VNODE_DIR_VALID, &orig_dvnode->flags) &&
1818            orig_dvnode->status.data_version == orig_dvp->dv_before + orig_dvp->dv_delta)
1819                afs_edit_dir_remove(orig_dvnode, &old_dentry->d_name,
1820                                    afs_edit_dir_for_rename_0);
1821
1822        if (new_dvnode != orig_dvnode) {
1823                up_write(&orig_dvnode->validate_lock);
1824                down_write(&new_dvnode->validate_lock);
1825        }
1826
1827        if (test_bit(AFS_VNODE_DIR_VALID, &new_dvnode->flags) &&
1828            new_dvnode->status.data_version == new_dvp->dv_before + new_dvp->dv_delta) {
1829                if (!op->rename.new_negative)
1830                        afs_edit_dir_remove(new_dvnode, &new_dentry->d_name,
1831                                            afs_edit_dir_for_rename_1);
1832
1833                afs_edit_dir_add(new_dvnode, &new_dentry->d_name,
1834                                 &vnode->fid, afs_edit_dir_for_rename_2);
1835        }
1836
1837        new_inode = d_inode(new_dentry);
1838        if (new_inode) {
1839                spin_lock(&new_inode->i_lock);
1840                if (new_inode->i_nlink > 0)
1841                        drop_nlink(new_inode);
1842                spin_unlock(&new_inode->i_lock);
1843        }
1844
1845        /* Now we can update d_fsdata on the dentries to reflect their
1846         * new parent's data_version.
1847         *
1848         * Note that if we ever implement RENAME_EXCHANGE, we'll have
1849         * to update both dentries with opposing dir versions.
1850         */
1851        afs_update_dentry_version(op, new_dvp, op->dentry);
1852        afs_update_dentry_version(op, new_dvp, op->dentry_2);
1853
1854        d_move(old_dentry, new_dentry);
1855
1856        up_write(&new_dvnode->validate_lock);
1857}
1858
1859static void afs_rename_put(struct afs_operation *op)
1860{
1861        _enter("op=%08x", op->debug_id);
1862        if (op->rename.rehash)
1863                d_rehash(op->rename.rehash);
1864        dput(op->rename.tmp);
1865        if (op->error)
1866                d_rehash(op->dentry);
1867}
1868
1869static const struct afs_operation_ops afs_rename_operation = {
1870        .issue_afs_rpc  = afs_fs_rename,
1871        .issue_yfs_rpc  = yfs_fs_rename,
1872        .success        = afs_rename_success,
1873        .edit_dir       = afs_rename_edit_dir,
1874        .put            = afs_rename_put,
1875};
1876
1877/*
1878 * rename a file in an AFS filesystem and/or move it between directories
1879 */
1880static int afs_rename(struct user_namespace *mnt_userns, struct inode *old_dir,
1881                      struct dentry *old_dentry, struct inode *new_dir,
1882                      struct dentry *new_dentry, unsigned int flags)
1883{
1884        struct afs_operation *op;
1885        struct afs_vnode *orig_dvnode, *new_dvnode, *vnode;
1886        int ret;
1887
1888        if (flags)
1889                return -EINVAL;
1890
1891        /* Don't allow silly-rename files be moved around. */
1892        if (old_dentry->d_flags & DCACHE_NFSFS_RENAMED)
1893                return -EINVAL;
1894
1895        vnode = AFS_FS_I(d_inode(old_dentry));
1896        orig_dvnode = AFS_FS_I(old_dir);
1897        new_dvnode = AFS_FS_I(new_dir);
1898
1899        _enter("{%llx:%llu},{%llx:%llu},{%llx:%llu},{%pd}",
1900               orig_dvnode->fid.vid, orig_dvnode->fid.vnode,
1901               vnode->fid.vid, vnode->fid.vnode,
1902               new_dvnode->fid.vid, new_dvnode->fid.vnode,
1903               new_dentry);
1904
1905        op = afs_alloc_operation(NULL, orig_dvnode->volume);
1906        if (IS_ERR(op))
1907                return PTR_ERR(op);
1908
1909        afs_op_set_vnode(op, 0, orig_dvnode);
1910        afs_op_set_vnode(op, 1, new_dvnode); /* May be same as orig_dvnode */
1911        op->file[0].dv_delta = 1;
1912        op->file[1].dv_delta = 1;
1913        op->file[0].update_ctime = true;
1914        op->file[1].update_ctime = true;
1915
1916        op->dentry              = old_dentry;
1917        op->dentry_2            = new_dentry;
1918        op->rename.new_negative = d_is_negative(new_dentry);
1919        op->ops                 = &afs_rename_operation;
1920
1921        /* For non-directories, check whether the target is busy and if so,
1922         * make a copy of the dentry and then do a silly-rename.  If the
1923         * silly-rename succeeds, the copied dentry is hashed and becomes the
1924         * new target.
1925         */
1926        if (d_is_positive(new_dentry) && !d_is_dir(new_dentry)) {
1927                /* To prevent any new references to the target during the
1928                 * rename, we unhash the dentry in advance.
1929                 */
1930                if (!d_unhashed(new_dentry)) {
1931                        d_drop(new_dentry);
1932                        op->rename.rehash = new_dentry;
1933                }
1934
1935                if (d_count(new_dentry) > 2) {
1936                        /* copy the target dentry's name */
1937                        ret = -ENOMEM;
1938                        op->rename.tmp = d_alloc(new_dentry->d_parent,
1939                                                 &new_dentry->d_name);
1940                        if (!op->rename.tmp)
1941                                goto error;
1942
1943                        ret = afs_sillyrename(new_dvnode,
1944                                              AFS_FS_I(d_inode(new_dentry)),
1945                                              new_dentry, op->key);
1946                        if (ret)
1947                                goto error;
1948
1949                        op->dentry_2 = op->rename.tmp;
1950                        op->rename.rehash = NULL;
1951                        op->rename.new_negative = true;
1952                }
1953        }
1954
1955        /* This bit is potentially nasty as there's a potential race with
1956         * afs_d_revalidate{,_rcu}().  We have to change d_fsdata on the dentry
1957         * to reflect it's new parent's new data_version after the op, but
1958         * d_revalidate may see old_dentry between the op having taken place
1959         * and the version being updated.
1960         *
1961         * So drop the old_dentry for now to make other threads go through
1962         * lookup instead - which we hold a lock against.
1963         */
1964        d_drop(old_dentry);
1965
1966        return afs_do_sync_operation(op);
1967
1968error:
1969        return afs_put_operation(op);
1970}
1971
1972/*
1973 * Release a directory page and clean up its private state if it's not busy
1974 * - return true if the page can now be released, false if not
1975 */
1976static int afs_dir_releasepage(struct page *page, gfp_t gfp_flags)
1977{
1978        struct afs_vnode *dvnode = AFS_FS_I(page->mapping->host);
1979
1980        _enter("{{%llx:%llu}[%lu]}", dvnode->fid.vid, dvnode->fid.vnode, page->index);
1981
1982        detach_page_private(page);
1983
1984        /* The directory will need reloading. */
1985        if (test_and_clear_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
1986                afs_stat_v(dvnode, n_relpg);
1987        return 1;
1988}
1989
1990/*
1991 * invalidate part or all of a page
1992 * - release a page and clean up its private data if offset is 0 (indicating
1993 *   the entire page)
1994 */
1995static void afs_dir_invalidatepage(struct page *page, unsigned int offset,
1996                                   unsigned int length)
1997{
1998        struct afs_vnode *dvnode = AFS_FS_I(page->mapping->host);
1999
2000        _enter("{%lu},%u,%u", page->index, offset, length);
2001
2002        BUG_ON(!PageLocked(page));
2003
2004        /* The directory will need reloading. */
2005        if (test_and_clear_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
2006                afs_stat_v(dvnode, n_inval);
2007
2008        /* we clean up only if the entire page is being invalidated */
2009        if (offset == 0 && length == PAGE_SIZE)
2010                detach_page_private(page);
2011}
2012