linux/fs/afs/dir.c
<<
>>
Prefs
   1/* dir.c: AFS filesystem directory handling
   2 *
   3 * Copyright (C) 2002, 2018 Red Hat, Inc. All Rights Reserved.
   4 * Written by David Howells (dhowells@redhat.com)
   5 *
   6 * This program is free software; you can redistribute it and/or
   7 * modify it under the terms of the GNU General Public License
   8 * as published by the Free Software Foundation; either version
   9 * 2 of the License, or (at your option) any later version.
  10 */
  11
  12#include <linux/kernel.h>
  13#include <linux/fs.h>
  14#include <linux/namei.h>
  15#include <linux/pagemap.h>
  16#include <linux/swap.h>
  17#include <linux/ctype.h>
  18#include <linux/sched.h>
  19#include <linux/task_io_accounting_ops.h>
  20#include "internal.h"
  21#include "xdr_fs.h"
  22
  23static struct dentry *afs_lookup(struct inode *dir, struct dentry *dentry,
  24                                 unsigned int flags);
  25static int afs_dir_open(struct inode *inode, struct file *file);
  26static int afs_readdir(struct file *file, struct dir_context *ctx);
  27static int afs_d_revalidate(struct dentry *dentry, unsigned int flags);
  28static int afs_d_delete(const struct dentry *dentry);
  29static int afs_lookup_one_filldir(struct dir_context *ctx, const char *name, int nlen,
  30                                  loff_t fpos, u64 ino, unsigned dtype);
  31static int afs_lookup_filldir(struct dir_context *ctx, const char *name, int nlen,
  32                              loff_t fpos, u64 ino, unsigned dtype);
  33static int afs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
  34                      bool excl);
  35static int afs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode);
  36static int afs_rmdir(struct inode *dir, struct dentry *dentry);
  37static int afs_unlink(struct inode *dir, struct dentry *dentry);
  38static int afs_link(struct dentry *from, struct inode *dir,
  39                    struct dentry *dentry);
  40static int afs_symlink(struct inode *dir, struct dentry *dentry,
  41                       const char *content);
  42static int afs_rename(struct inode *old_dir, struct dentry *old_dentry,
  43                      struct inode *new_dir, struct dentry *new_dentry,
  44                      unsigned int flags);
  45static int afs_dir_releasepage(struct page *page, gfp_t gfp_flags);
  46static void afs_dir_invalidatepage(struct page *page, unsigned int offset,
  47                                   unsigned int length);
  48
  49static int afs_dir_set_page_dirty(struct page *page)
  50{
  51        BUG(); /* This should never happen. */
  52}
  53
  54const struct file_operations afs_dir_file_operations = {
  55        .open           = afs_dir_open,
  56        .release        = afs_release,
  57        .iterate_shared = afs_readdir,
  58        .lock           = afs_lock,
  59        .llseek         = generic_file_llseek,
  60};
  61
  62const struct inode_operations afs_dir_inode_operations = {
  63        .create         = afs_create,
  64        .lookup         = afs_lookup,
  65        .link           = afs_link,
  66        .unlink         = afs_unlink,
  67        .symlink        = afs_symlink,
  68        .mkdir          = afs_mkdir,
  69        .rmdir          = afs_rmdir,
  70        .rename         = afs_rename,
  71        .permission     = afs_permission,
  72        .getattr        = afs_getattr,
  73        .setattr        = afs_setattr,
  74        .listxattr      = afs_listxattr,
  75};
  76
  77const struct address_space_operations afs_dir_aops = {
  78        .set_page_dirty = afs_dir_set_page_dirty,
  79        .releasepage    = afs_dir_releasepage,
  80        .invalidatepage = afs_dir_invalidatepage,
  81};
  82
  83const struct dentry_operations afs_fs_dentry_operations = {
  84        .d_revalidate   = afs_d_revalidate,
  85        .d_delete       = afs_d_delete,
  86        .d_release      = afs_d_release,
  87        .d_automount    = afs_d_automount,
  88};
  89
  90struct afs_lookup_one_cookie {
  91        struct dir_context      ctx;
  92        struct qstr             name;
  93        bool                    found;
  94        struct afs_fid          fid;
  95};
  96
  97struct afs_lookup_cookie {
  98        struct dir_context      ctx;
  99        struct qstr             name;
 100        bool                    found;
 101        bool                    one_only;
 102        unsigned short          nr_fids;
 103        struct afs_file_status  *statuses;
 104        struct afs_callback     *callbacks;
 105        struct afs_fid          fids[50];
 106};
 107
 108/*
 109 * check that a directory page is valid
 110 */
 111static bool afs_dir_check_page(struct afs_vnode *dvnode, struct page *page,
 112                               loff_t i_size)
 113{
 114        struct afs_xdr_dir_page *dbuf;
 115        loff_t latter, off;
 116        int tmp, qty;
 117
 118        /* Determine how many magic numbers there should be in this page, but
 119         * we must take care because the directory may change size under us.
 120         */
 121        off = page_offset(page);
 122        if (i_size <= off)
 123                goto checked;
 124
 125        latter = i_size - off;
 126        if (latter >= PAGE_SIZE)
 127                qty = PAGE_SIZE;
 128        else
 129                qty = latter;
 130        qty /= sizeof(union afs_xdr_dir_block);
 131
 132        /* check them */
 133        dbuf = kmap(page);
 134        for (tmp = 0; tmp < qty; tmp++) {
 135                if (dbuf->blocks[tmp].hdr.magic != AFS_DIR_MAGIC) {
 136                        printk("kAFS: %s(%lx): bad magic %d/%d is %04hx\n",
 137                               __func__, dvnode->vfs_inode.i_ino, tmp, qty,
 138                               ntohs(dbuf->blocks[tmp].hdr.magic));
 139                        trace_afs_dir_check_failed(dvnode, off, i_size);
 140                        kunmap(page);
 141                        goto error;
 142                }
 143
 144                /* Make sure each block is NUL terminated so we can reasonably
 145                 * use string functions on it.  The filenames in the page
 146                 * *should* be NUL-terminated anyway.
 147                 */
 148                ((u8 *)&dbuf->blocks[tmp])[AFS_DIR_BLOCK_SIZE - 1] = 0;
 149        }
 150
 151        kunmap(page);
 152
 153checked:
 154        afs_stat_v(dvnode, n_read_dir);
 155        return true;
 156
 157error:
 158        return false;
 159}
 160
 161/*
 162 * open an AFS directory file
 163 */
 164static int afs_dir_open(struct inode *inode, struct file *file)
 165{
 166        _enter("{%lu}", inode->i_ino);
 167
 168        BUILD_BUG_ON(sizeof(union afs_xdr_dir_block) != 2048);
 169        BUILD_BUG_ON(sizeof(union afs_xdr_dirent) != 32);
 170
 171        if (test_bit(AFS_VNODE_DELETED, &AFS_FS_I(inode)->flags))
 172                return -ENOENT;
 173
 174        return afs_open(inode, file);
 175}
 176
 177/*
 178 * Read the directory into the pagecache in one go, scrubbing the previous
 179 * contents.  The list of pages is returned, pinning them so that they don't
 180 * get reclaimed during the iteration.
 181 */
 182static struct afs_read *afs_read_dir(struct afs_vnode *dvnode, struct key *key)
 183        __acquires(&dvnode->validate_lock)
 184{
 185        struct afs_read *req;
 186        loff_t i_size;
 187        int nr_pages, nr_inline, i, n;
 188        int ret = -ENOMEM;
 189
 190retry:
 191        i_size = i_size_read(&dvnode->vfs_inode);
 192        if (i_size < 2048)
 193                return ERR_PTR(-EIO);
 194        if (i_size > 2048 * 1024)
 195                return ERR_PTR(-EFBIG);
 196
 197        _enter("%llu", i_size);
 198
 199        /* Get a request record to hold the page list.  We want to hold it
 200         * inline if we can, but we don't want to make an order 1 allocation.
 201         */
 202        nr_pages = (i_size + PAGE_SIZE - 1) / PAGE_SIZE;
 203        nr_inline = nr_pages;
 204        if (nr_inline > (PAGE_SIZE - sizeof(*req)) / sizeof(struct page *))
 205                nr_inline = 0;
 206
 207        req = kzalloc(sizeof(*req) + sizeof(struct page *) * nr_inline,
 208                      GFP_KERNEL);
 209        if (!req)
 210                return ERR_PTR(-ENOMEM);
 211
 212        refcount_set(&req->usage, 1);
 213        req->nr_pages = nr_pages;
 214        req->actual_len = i_size; /* May change */
 215        req->len = nr_pages * PAGE_SIZE; /* We can ask for more than there is */
 216        req->data_version = dvnode->status.data_version; /* May change */
 217        if (nr_inline > 0) {
 218                req->pages = req->array;
 219        } else {
 220                req->pages = kcalloc(nr_pages, sizeof(struct page *),
 221                                     GFP_KERNEL);
 222                if (!req->pages)
 223                        goto error;
 224        }
 225
 226        /* Get a list of all the pages that hold or will hold the directory
 227         * content.  We need to fill in any gaps that we might find where the
 228         * memory reclaimer has been at work.  If there are any gaps, we will
 229         * need to reread the entire directory contents.
 230         */
 231        i = 0;
 232        do {
 233                n = find_get_pages_contig(dvnode->vfs_inode.i_mapping, i,
 234                                          req->nr_pages - i,
 235                                          req->pages + i);
 236                _debug("find %u at %u/%u", n, i, req->nr_pages);
 237                if (n == 0) {
 238                        gfp_t gfp = dvnode->vfs_inode.i_mapping->gfp_mask;
 239
 240                        if (test_and_clear_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
 241                                afs_stat_v(dvnode, n_inval);
 242
 243                        ret = -ENOMEM;
 244                        req->pages[i] = __page_cache_alloc(gfp);
 245                        if (!req->pages[i])
 246                                goto error;
 247                        ret = add_to_page_cache_lru(req->pages[i],
 248                                                    dvnode->vfs_inode.i_mapping,
 249                                                    i, gfp);
 250                        if (ret < 0)
 251                                goto error;
 252
 253                        set_page_private(req->pages[i], 1);
 254                        SetPagePrivate(req->pages[i]);
 255                        unlock_page(req->pages[i]);
 256                        i++;
 257                } else {
 258                        i += n;
 259                }
 260        } while (i < req->nr_pages);
 261
 262        /* If we're going to reload, we need to lock all the pages to prevent
 263         * races.
 264         */
 265        ret = -ERESTARTSYS;
 266        if (down_read_killable(&dvnode->validate_lock) < 0)
 267                goto error;
 268
 269        if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
 270                goto success;
 271
 272        up_read(&dvnode->validate_lock);
 273        if (down_write_killable(&dvnode->validate_lock) < 0)
 274                goto error;
 275
 276        if (!test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags)) {
 277                ret = afs_fetch_data(dvnode, key, req);
 278                if (ret < 0)
 279                        goto error_unlock;
 280
 281                task_io_account_read(PAGE_SIZE * req->nr_pages);
 282
 283                if (req->len < req->file_size)
 284                        goto content_has_grown;
 285
 286                /* Validate the data we just read. */
 287                ret = -EIO;
 288                for (i = 0; i < req->nr_pages; i++)
 289                        if (!afs_dir_check_page(dvnode, req->pages[i],
 290                                                req->actual_len))
 291                                goto error_unlock;
 292
 293                // TODO: Trim excess pages
 294
 295                set_bit(AFS_VNODE_DIR_VALID, &dvnode->flags);
 296        }
 297
 298        downgrade_write(&dvnode->validate_lock);
 299success:
 300        return req;
 301
 302error_unlock:
 303        up_write(&dvnode->validate_lock);
 304error:
 305        afs_put_read(req);
 306        _leave(" = %d", ret);
 307        return ERR_PTR(ret);
 308
 309content_has_grown:
 310        up_write(&dvnode->validate_lock);
 311        afs_put_read(req);
 312        goto retry;
 313}
 314
 315/*
 316 * deal with one block in an AFS directory
 317 */
 318static int afs_dir_iterate_block(struct dir_context *ctx,
 319                                 union afs_xdr_dir_block *block,
 320                                 unsigned blkoff)
 321{
 322        union afs_xdr_dirent *dire;
 323        unsigned offset, next, curr;
 324        size_t nlen;
 325        int tmp;
 326
 327        _enter("%u,%x,%p,,",(unsigned)ctx->pos,blkoff,block);
 328
 329        curr = (ctx->pos - blkoff) / sizeof(union afs_xdr_dirent);
 330
 331        /* walk through the block, an entry at a time */
 332        for (offset = (blkoff == 0 ? AFS_DIR_RESV_BLOCKS0 : AFS_DIR_RESV_BLOCKS);
 333             offset < AFS_DIR_SLOTS_PER_BLOCK;
 334             offset = next
 335             ) {
 336                next = offset + 1;
 337
 338                /* skip entries marked unused in the bitmap */
 339                if (!(block->hdr.bitmap[offset / 8] &
 340                      (1 << (offset % 8)))) {
 341                        _debug("ENT[%zu.%u]: unused",
 342                               blkoff / sizeof(union afs_xdr_dir_block), offset);
 343                        if (offset >= curr)
 344                                ctx->pos = blkoff +
 345                                        next * sizeof(union afs_xdr_dirent);
 346                        continue;
 347                }
 348
 349                /* got a valid entry */
 350                dire = &block->dirents[offset];
 351                nlen = strnlen(dire->u.name,
 352                               sizeof(*block) -
 353                               offset * sizeof(union afs_xdr_dirent));
 354
 355                _debug("ENT[%zu.%u]: %s %zu \"%s\"",
 356                       blkoff / sizeof(union afs_xdr_dir_block), offset,
 357                       (offset < curr ? "skip" : "fill"),
 358                       nlen, dire->u.name);
 359
 360                /* work out where the next possible entry is */
 361                for (tmp = nlen; tmp > 15; tmp -= sizeof(union afs_xdr_dirent)) {
 362                        if (next >= AFS_DIR_SLOTS_PER_BLOCK) {
 363                                _debug("ENT[%zu.%u]:"
 364                                       " %u travelled beyond end dir block"
 365                                       " (len %u/%zu)",
 366                                       blkoff / sizeof(union afs_xdr_dir_block),
 367                                       offset, next, tmp, nlen);
 368                                return -EIO;
 369                        }
 370                        if (!(block->hdr.bitmap[next / 8] &
 371                              (1 << (next % 8)))) {
 372                                _debug("ENT[%zu.%u]:"
 373                                       " %u unmarked extension (len %u/%zu)",
 374                                       blkoff / sizeof(union afs_xdr_dir_block),
 375                                       offset, next, tmp, nlen);
 376                                return -EIO;
 377                        }
 378
 379                        _debug("ENT[%zu.%u]: ext %u/%zu",
 380                               blkoff / sizeof(union afs_xdr_dir_block),
 381                               next, tmp, nlen);
 382                        next++;
 383                }
 384
 385                /* skip if starts before the current position */
 386                if (offset < curr)
 387                        continue;
 388
 389                /* found the next entry */
 390                if (!dir_emit(ctx, dire->u.name, nlen,
 391                              ntohl(dire->u.vnode),
 392                              (ctx->actor == afs_lookup_filldir ||
 393                               ctx->actor == afs_lookup_one_filldir)?
 394                              ntohl(dire->u.unique) : DT_UNKNOWN)) {
 395                        _leave(" = 0 [full]");
 396                        return 0;
 397                }
 398
 399                ctx->pos = blkoff + next * sizeof(union afs_xdr_dirent);
 400        }
 401
 402        _leave(" = 1 [more]");
 403        return 1;
 404}
 405
 406/*
 407 * iterate through the data blob that lists the contents of an AFS directory
 408 */
 409static int afs_dir_iterate(struct inode *dir, struct dir_context *ctx,
 410                           struct key *key)
 411{
 412        struct afs_vnode *dvnode = AFS_FS_I(dir);
 413        struct afs_xdr_dir_page *dbuf;
 414        union afs_xdr_dir_block *dblock;
 415        struct afs_read *req;
 416        struct page *page;
 417        unsigned blkoff, limit;
 418        int ret;
 419
 420        _enter("{%lu},%u,,", dir->i_ino, (unsigned)ctx->pos);
 421
 422        if (test_bit(AFS_VNODE_DELETED, &AFS_FS_I(dir)->flags)) {
 423                _leave(" = -ESTALE");
 424                return -ESTALE;
 425        }
 426
 427        req = afs_read_dir(dvnode, key);
 428        if (IS_ERR(req))
 429                return PTR_ERR(req);
 430
 431        /* round the file position up to the next entry boundary */
 432        ctx->pos += sizeof(union afs_xdr_dirent) - 1;
 433        ctx->pos &= ~(sizeof(union afs_xdr_dirent) - 1);
 434
 435        /* walk through the blocks in sequence */
 436        ret = 0;
 437        while (ctx->pos < req->actual_len) {
 438                blkoff = ctx->pos & ~(sizeof(union afs_xdr_dir_block) - 1);
 439
 440                /* Fetch the appropriate page from the directory and re-add it
 441                 * to the LRU.
 442                 */
 443                page = req->pages[blkoff / PAGE_SIZE];
 444                if (!page) {
 445                        ret = -EIO;
 446                        break;
 447                }
 448                mark_page_accessed(page);
 449
 450                limit = blkoff & ~(PAGE_SIZE - 1);
 451
 452                dbuf = kmap(page);
 453
 454                /* deal with the individual blocks stashed on this page */
 455                do {
 456                        dblock = &dbuf->blocks[(blkoff % PAGE_SIZE) /
 457                                               sizeof(union afs_xdr_dir_block)];
 458                        ret = afs_dir_iterate_block(ctx, dblock, blkoff);
 459                        if (ret != 1) {
 460                                kunmap(page);
 461                                goto out;
 462                        }
 463
 464                        blkoff += sizeof(union afs_xdr_dir_block);
 465
 466                } while (ctx->pos < dir->i_size && blkoff < limit);
 467
 468                kunmap(page);
 469                ret = 0;
 470        }
 471
 472out:
 473        up_read(&dvnode->validate_lock);
 474        afs_put_read(req);
 475        _leave(" = %d", ret);
 476        return ret;
 477}
 478
 479/*
 480 * read an AFS directory
 481 */
 482static int afs_readdir(struct file *file, struct dir_context *ctx)
 483{
 484        return afs_dir_iterate(file_inode(file), ctx, afs_file_key(file));
 485}
 486
 487/*
 488 * Search the directory for a single name
 489 * - if afs_dir_iterate_block() spots this function, it'll pass the FID
 490 *   uniquifier through dtype
 491 */
 492static int afs_lookup_one_filldir(struct dir_context *ctx, const char *name,
 493                                  int nlen, loff_t fpos, u64 ino, unsigned dtype)
 494{
 495        struct afs_lookup_one_cookie *cookie =
 496                container_of(ctx, struct afs_lookup_one_cookie, ctx);
 497
 498        _enter("{%s,%u},%s,%u,,%llu,%u",
 499               cookie->name.name, cookie->name.len, name, nlen,
 500               (unsigned long long) ino, dtype);
 501
 502        /* insanity checks first */
 503        BUILD_BUG_ON(sizeof(union afs_xdr_dir_block) != 2048);
 504        BUILD_BUG_ON(sizeof(union afs_xdr_dirent) != 32);
 505
 506        if (cookie->name.len != nlen ||
 507            memcmp(cookie->name.name, name, nlen) != 0) {
 508                _leave(" = 0 [no]");
 509                return 0;
 510        }
 511
 512        cookie->fid.vnode = ino;
 513        cookie->fid.unique = dtype;
 514        cookie->found = 1;
 515
 516        _leave(" = -1 [found]");
 517        return -1;
 518}
 519
 520/*
 521 * Do a lookup of a single name in a directory
 522 * - just returns the FID the dentry name maps to if found
 523 */
 524static int afs_do_lookup_one(struct inode *dir, struct dentry *dentry,
 525                             struct afs_fid *fid, struct key *key)
 526{
 527        struct afs_super_info *as = dir->i_sb->s_fs_info;
 528        struct afs_lookup_one_cookie cookie = {
 529                .ctx.actor = afs_lookup_one_filldir,
 530                .name = dentry->d_name,
 531                .fid.vid = as->volume->vid
 532        };
 533        int ret;
 534
 535        _enter("{%lu},%p{%pd},", dir->i_ino, dentry, dentry);
 536
 537        /* search the directory */
 538        ret = afs_dir_iterate(dir, &cookie.ctx, key);
 539        if (ret < 0) {
 540                _leave(" = %d [iter]", ret);
 541                return ret;
 542        }
 543
 544        ret = -ENOENT;
 545        if (!cookie.found) {
 546                _leave(" = -ENOENT [not found]");
 547                return -ENOENT;
 548        }
 549
 550        *fid = cookie.fid;
 551        _leave(" = 0 { vn=%u u=%u }", fid->vnode, fid->unique);
 552        return 0;
 553}
 554
 555/*
 556 * search the directory for a name
 557 * - if afs_dir_iterate_block() spots this function, it'll pass the FID
 558 *   uniquifier through dtype
 559 */
 560static int afs_lookup_filldir(struct dir_context *ctx, const char *name,
 561                              int nlen, loff_t fpos, u64 ino, unsigned dtype)
 562{
 563        struct afs_lookup_cookie *cookie =
 564                container_of(ctx, struct afs_lookup_cookie, ctx);
 565        int ret;
 566
 567        _enter("{%s,%u},%s,%u,,%llu,%u",
 568               cookie->name.name, cookie->name.len, name, nlen,
 569               (unsigned long long) ino, dtype);
 570
 571        /* insanity checks first */
 572        BUILD_BUG_ON(sizeof(union afs_xdr_dir_block) != 2048);
 573        BUILD_BUG_ON(sizeof(union afs_xdr_dirent) != 32);
 574
 575        if (cookie->found) {
 576                if (cookie->nr_fids < 50) {
 577                        cookie->fids[cookie->nr_fids].vnode     = ino;
 578                        cookie->fids[cookie->nr_fids].unique    = dtype;
 579                        cookie->nr_fids++;
 580                }
 581        } else if (cookie->name.len == nlen &&
 582                   memcmp(cookie->name.name, name, nlen) == 0) {
 583                cookie->fids[0].vnode   = ino;
 584                cookie->fids[0].unique  = dtype;
 585                cookie->found = 1;
 586                if (cookie->one_only)
 587                        return -1;
 588        }
 589
 590        ret = cookie->nr_fids >= 50 ? -1 : 0;
 591        _leave(" = %d", ret);
 592        return ret;
 593}
 594
 595/*
 596 * Do a lookup in a directory.  We make use of bulk lookup to query a slew of
 597 * files in one go and create inodes for them.  The inode of the file we were
 598 * asked for is returned.
 599 */
 600static struct inode *afs_do_lookup(struct inode *dir, struct dentry *dentry,
 601                                   struct key *key)
 602{
 603        struct afs_lookup_cookie *cookie;
 604        struct afs_cb_interest *cbi = NULL;
 605        struct afs_super_info *as = dir->i_sb->s_fs_info;
 606        struct afs_iget_data data;
 607        struct afs_fs_cursor fc;
 608        struct afs_vnode *dvnode = AFS_FS_I(dir);
 609        struct inode *inode = NULL;
 610        int ret, i;
 611
 612        _enter("{%lu},%p{%pd},", dir->i_ino, dentry, dentry);
 613
 614        cookie = kzalloc(sizeof(struct afs_lookup_cookie), GFP_KERNEL);
 615        if (!cookie)
 616                return ERR_PTR(-ENOMEM);
 617
 618        cookie->ctx.actor = afs_lookup_filldir;
 619        cookie->name = dentry->d_name;
 620        cookie->nr_fids = 1; /* slot 0 is saved for the fid we actually want */
 621
 622        read_seqlock_excl(&dvnode->cb_lock);
 623        if (dvnode->cb_interest &&
 624            dvnode->cb_interest->server &&
 625            test_bit(AFS_SERVER_FL_NO_IBULK, &dvnode->cb_interest->server->flags))
 626                cookie->one_only = true;
 627        read_sequnlock_excl(&dvnode->cb_lock);
 628
 629        for (i = 0; i < 50; i++)
 630                cookie->fids[i].vid = as->volume->vid;
 631
 632        /* search the directory */
 633        ret = afs_dir_iterate(dir, &cookie->ctx, key);
 634        if (ret < 0) {
 635                inode = ERR_PTR(ret);
 636                goto out;
 637        }
 638
 639        inode = ERR_PTR(-ENOENT);
 640        if (!cookie->found)
 641                goto out;
 642
 643        /* Check to see if we already have an inode for the primary fid. */
 644        data.volume = dvnode->volume;
 645        data.fid = cookie->fids[0];
 646        inode = ilookup5(dir->i_sb, cookie->fids[0].vnode, afs_iget5_test, &data);
 647        if (inode)
 648                goto out;
 649
 650        /* Need space for examining all the selected files */
 651        inode = ERR_PTR(-ENOMEM);
 652        cookie->statuses = kcalloc(cookie->nr_fids, sizeof(struct afs_file_status),
 653                                   GFP_KERNEL);
 654        if (!cookie->statuses)
 655                goto out;
 656
 657        cookie->callbacks = kcalloc(cookie->nr_fids, sizeof(struct afs_callback),
 658                                    GFP_KERNEL);
 659        if (!cookie->callbacks)
 660                goto out_s;
 661
 662        /* Try FS.InlineBulkStatus first.  Abort codes for the individual
 663         * lookups contained therein are stored in the reply without aborting
 664         * the whole operation.
 665         */
 666        if (cookie->one_only)
 667                goto no_inline_bulk_status;
 668
 669        inode = ERR_PTR(-ERESTARTSYS);
 670        if (afs_begin_vnode_operation(&fc, dvnode, key)) {
 671                while (afs_select_fileserver(&fc)) {
 672                        if (test_bit(AFS_SERVER_FL_NO_IBULK,
 673                                      &fc.cbi->server->flags)) {
 674                                fc.ac.abort_code = RX_INVALID_OPERATION;
 675                                fc.ac.error = -ECONNABORTED;
 676                                break;
 677                        }
 678                        afs_fs_inline_bulk_status(&fc,
 679                                                  afs_v2net(dvnode),
 680                                                  cookie->fids,
 681                                                  cookie->statuses,
 682                                                  cookie->callbacks,
 683                                                  cookie->nr_fids, NULL);
 684                }
 685
 686                if (fc.ac.error == 0)
 687                        cbi = afs_get_cb_interest(fc.cbi);
 688                if (fc.ac.abort_code == RX_INVALID_OPERATION)
 689                        set_bit(AFS_SERVER_FL_NO_IBULK, &fc.cbi->server->flags);
 690                inode = ERR_PTR(afs_end_vnode_operation(&fc));
 691        }
 692
 693        if (!IS_ERR(inode))
 694                goto success;
 695        if (fc.ac.abort_code != RX_INVALID_OPERATION)
 696                goto out_c;
 697
 698no_inline_bulk_status:
 699        /* We could try FS.BulkStatus next, but this aborts the entire op if
 700         * any of the lookups fails - so, for the moment, revert to
 701         * FS.FetchStatus for just the primary fid.
 702         */
 703        cookie->nr_fids = 1;
 704        inode = ERR_PTR(-ERESTARTSYS);
 705        if (afs_begin_vnode_operation(&fc, dvnode, key)) {
 706                while (afs_select_fileserver(&fc)) {
 707                        afs_fs_fetch_status(&fc,
 708                                            afs_v2net(dvnode),
 709                                            cookie->fids,
 710                                            cookie->statuses,
 711                                            cookie->callbacks,
 712                                            NULL);
 713                }
 714
 715                if (fc.ac.error == 0)
 716                        cbi = afs_get_cb_interest(fc.cbi);
 717                inode = ERR_PTR(afs_end_vnode_operation(&fc));
 718        }
 719
 720        if (IS_ERR(inode))
 721                goto out_c;
 722
 723        for (i = 0; i < cookie->nr_fids; i++)
 724                cookie->statuses[i].abort_code = 0;
 725
 726success:
 727        /* Turn all the files into inodes and save the first one - which is the
 728         * one we actually want.
 729         */
 730        if (cookie->statuses[0].abort_code != 0)
 731                inode = ERR_PTR(afs_abort_to_error(cookie->statuses[0].abort_code));
 732
 733        for (i = 0; i < cookie->nr_fids; i++) {
 734                struct inode *ti;
 735
 736                if (cookie->statuses[i].abort_code != 0)
 737                        continue;
 738
 739                ti = afs_iget(dir->i_sb, key, &cookie->fids[i],
 740                              &cookie->statuses[i],
 741                              &cookie->callbacks[i],
 742                              cbi);
 743                if (i == 0) {
 744                        inode = ti;
 745                } else {
 746                        if (!IS_ERR(ti))
 747                                iput(ti);
 748                }
 749        }
 750
 751out_c:
 752        afs_put_cb_interest(afs_v2net(dvnode), cbi);
 753        kfree(cookie->callbacks);
 754out_s:
 755        kfree(cookie->statuses);
 756out:
 757        kfree(cookie);
 758        return inode;
 759}
 760
 761/*
 762 * Look up an entry in a directory with @sys substitution.
 763 */
 764static struct dentry *afs_lookup_atsys(struct inode *dir, struct dentry *dentry,
 765                                       struct key *key)
 766{
 767        struct afs_sysnames *subs;
 768        struct afs_net *net = afs_i2net(dir);
 769        struct dentry *ret;
 770        char *buf, *p, *name;
 771        int len, i;
 772
 773        _enter("");
 774
 775        ret = ERR_PTR(-ENOMEM);
 776        p = buf = kmalloc(AFSNAMEMAX, GFP_KERNEL);
 777        if (!buf)
 778                goto out_p;
 779        if (dentry->d_name.len > 4) {
 780                memcpy(p, dentry->d_name.name, dentry->d_name.len - 4);
 781                p += dentry->d_name.len - 4;
 782        }
 783
 784        /* There is an ordered list of substitutes that we have to try. */
 785        read_lock(&net->sysnames_lock);
 786        subs = net->sysnames;
 787        refcount_inc(&subs->usage);
 788        read_unlock(&net->sysnames_lock);
 789
 790        for (i = 0; i < subs->nr; i++) {
 791                name = subs->subs[i];
 792                len = dentry->d_name.len - 4 + strlen(name);
 793                if (len >= AFSNAMEMAX) {
 794                        ret = ERR_PTR(-ENAMETOOLONG);
 795                        goto out_s;
 796                }
 797
 798                strcpy(p, name);
 799                ret = lookup_one_len(buf, dentry->d_parent, len);
 800                if (IS_ERR(ret) || d_is_positive(ret))
 801                        goto out_s;
 802                dput(ret);
 803        }
 804
 805        /* We don't want to d_add() the @sys dentry here as we don't want to
 806         * the cached dentry to hide changes to the sysnames list.
 807         */
 808        ret = NULL;
 809out_s:
 810        afs_put_sysnames(subs);
 811        kfree(buf);
 812out_p:
 813        key_put(key);
 814        return ret;
 815}
 816
 817/*
 818 * look up an entry in a directory
 819 */
 820static struct dentry *afs_lookup(struct inode *dir, struct dentry *dentry,
 821                                 unsigned int flags)
 822{
 823        struct afs_vnode *dvnode = AFS_FS_I(dir);
 824        struct inode *inode;
 825        struct key *key;
 826        int ret;
 827
 828        _enter("{%x:%u},%p{%pd},",
 829               dvnode->fid.vid, dvnode->fid.vnode, dentry, dentry);
 830
 831        ASSERTCMP(d_inode(dentry), ==, NULL);
 832
 833        if (dentry->d_name.len >= AFSNAMEMAX) {
 834                _leave(" = -ENAMETOOLONG");
 835                return ERR_PTR(-ENAMETOOLONG);
 836        }
 837
 838        if (test_bit(AFS_VNODE_DELETED, &dvnode->flags)) {
 839                _leave(" = -ESTALE");
 840                return ERR_PTR(-ESTALE);
 841        }
 842
 843        key = afs_request_key(dvnode->volume->cell);
 844        if (IS_ERR(key)) {
 845                _leave(" = %ld [key]", PTR_ERR(key));
 846                return ERR_CAST(key);
 847        }
 848
 849        ret = afs_validate(dvnode, key);
 850        if (ret < 0) {
 851                key_put(key);
 852                _leave(" = %d [val]", ret);
 853                return ERR_PTR(ret);
 854        }
 855
 856        if (dentry->d_name.len >= 4 &&
 857            dentry->d_name.name[dentry->d_name.len - 4] == '@' &&
 858            dentry->d_name.name[dentry->d_name.len - 3] == 's' &&
 859            dentry->d_name.name[dentry->d_name.len - 2] == 'y' &&
 860            dentry->d_name.name[dentry->d_name.len - 1] == 's')
 861                return afs_lookup_atsys(dir, dentry, key);
 862
 863        afs_stat_v(dvnode, n_lookup);
 864        inode = afs_do_lookup(dir, dentry, key);
 865        if (IS_ERR(inode)) {
 866                ret = PTR_ERR(inode);
 867                if (ret == -ENOENT) {
 868                        inode = afs_try_auto_mntpt(dentry, dir);
 869                        if (!IS_ERR(inode)) {
 870                                key_put(key);
 871                                goto success;
 872                        }
 873
 874                        ret = PTR_ERR(inode);
 875                }
 876
 877                key_put(key);
 878                if (ret == -ENOENT) {
 879                        d_add(dentry, NULL);
 880                        _leave(" = NULL [negative]");
 881                        return NULL;
 882                }
 883                _leave(" = %d [do]", ret);
 884                return ERR_PTR(ret);
 885        }
 886        dentry->d_fsdata = (void *)(unsigned long)dvnode->status.data_version;
 887
 888        /* instantiate the dentry */
 889        key_put(key);
 890        if (IS_ERR(inode)) {
 891                _leave(" = %ld", PTR_ERR(inode));
 892                return ERR_CAST(inode);
 893        }
 894
 895success:
 896        d_add(dentry, inode);
 897        _leave(" = 0 { ino=%lu v=%u }",
 898               d_inode(dentry)->i_ino,
 899               d_inode(dentry)->i_generation);
 900
 901        return NULL;
 902}
 903
 904/*
 905 * check that a dentry lookup hit has found a valid entry
 906 * - NOTE! the hit can be a negative hit too, so we can't assume we have an
 907 *   inode
 908 */
 909static int afs_d_revalidate(struct dentry *dentry, unsigned int flags)
 910{
 911        struct afs_vnode *vnode, *dir;
 912        struct afs_fid uninitialized_var(fid);
 913        struct dentry *parent;
 914        struct inode *inode;
 915        struct key *key;
 916        long dir_version, de_version;
 917        int ret;
 918
 919        if (flags & LOOKUP_RCU)
 920                return -ECHILD;
 921
 922        if (d_really_is_positive(dentry)) {
 923                vnode = AFS_FS_I(d_inode(dentry));
 924                _enter("{v={%x:%u} n=%pd fl=%lx},",
 925                       vnode->fid.vid, vnode->fid.vnode, dentry,
 926                       vnode->flags);
 927        } else {
 928                _enter("{neg n=%pd}", dentry);
 929        }
 930
 931        key = afs_request_key(AFS_FS_S(dentry->d_sb)->volume->cell);
 932        if (IS_ERR(key))
 933                key = NULL;
 934
 935        if (d_really_is_positive(dentry)) {
 936                inode = d_inode(dentry);
 937                if (inode) {
 938                        vnode = AFS_FS_I(inode);
 939                        afs_validate(vnode, key);
 940                        if (test_bit(AFS_VNODE_DELETED, &vnode->flags))
 941                                goto out_bad;
 942                }
 943        }
 944
 945        /* lock down the parent dentry so we can peer at it */
 946        parent = dget_parent(dentry);
 947        dir = AFS_FS_I(d_inode(parent));
 948
 949        /* validate the parent directory */
 950        afs_validate(dir, key);
 951
 952        if (test_bit(AFS_VNODE_DELETED, &dir->flags)) {
 953                _debug("%pd: parent dir deleted", dentry);
 954                goto out_bad_parent;
 955        }
 956
 957        /* We only need to invalidate a dentry if the server's copy changed
 958         * behind our back.  If we made the change, it's no problem.  Note that
 959         * on a 32-bit system, we only have 32 bits in the dentry to store the
 960         * version.
 961         */
 962        dir_version = (long)dir->status.data_version;
 963        de_version = (long)dentry->d_fsdata;
 964        if (de_version == dir_version)
 965                goto out_valid;
 966
 967        dir_version = (long)dir->invalid_before;
 968        if (de_version - dir_version >= 0)
 969                goto out_valid;
 970
 971        _debug("dir modified");
 972        afs_stat_v(dir, n_reval);
 973
 974        /* search the directory for this vnode */
 975        ret = afs_do_lookup_one(&dir->vfs_inode, dentry, &fid, key);
 976        switch (ret) {
 977        case 0:
 978                /* the filename maps to something */
 979                if (d_really_is_negative(dentry))
 980                        goto out_bad_parent;
 981                inode = d_inode(dentry);
 982                if (is_bad_inode(inode)) {
 983                        printk("kAFS: afs_d_revalidate: %pd2 has bad inode\n",
 984                               dentry);
 985                        goto out_bad_parent;
 986                }
 987
 988                vnode = AFS_FS_I(inode);
 989
 990                /* if the vnode ID has changed, then the dirent points to a
 991                 * different file */
 992                if (fid.vnode != vnode->fid.vnode) {
 993                        _debug("%pd: dirent changed [%u != %u]",
 994                               dentry, fid.vnode,
 995                               vnode->fid.vnode);
 996                        goto not_found;
 997                }
 998
 999                /* if the vnode ID uniqifier has changed, then the file has
1000                 * been deleted and replaced, and the original vnode ID has
1001                 * been reused */
1002                if (fid.unique != vnode->fid.unique) {
1003                        _debug("%pd: file deleted (uq %u -> %u I:%u)",
1004                               dentry, fid.unique,
1005                               vnode->fid.unique,
1006                               vnode->vfs_inode.i_generation);
1007                        write_seqlock(&vnode->cb_lock);
1008                        set_bit(AFS_VNODE_DELETED, &vnode->flags);
1009                        write_sequnlock(&vnode->cb_lock);
1010                        goto not_found;
1011                }
1012                goto out_valid;
1013
1014        case -ENOENT:
1015                /* the filename is unknown */
1016                _debug("%pd: dirent not found", dentry);
1017                if (d_really_is_positive(dentry))
1018                        goto not_found;
1019                goto out_valid;
1020
1021        default:
1022                _debug("failed to iterate dir %pd: %d",
1023                       parent, ret);
1024                goto out_bad_parent;
1025        }
1026
1027out_valid:
1028        dentry->d_fsdata = (void *)dir_version;
1029        dput(parent);
1030        key_put(key);
1031        _leave(" = 1 [valid]");
1032        return 1;
1033
1034        /* the dirent, if it exists, now points to a different vnode */
1035not_found:
1036        spin_lock(&dentry->d_lock);
1037        dentry->d_flags |= DCACHE_NFSFS_RENAMED;
1038        spin_unlock(&dentry->d_lock);
1039
1040out_bad_parent:
1041        _debug("dropping dentry %pd2", dentry);
1042        dput(parent);
1043out_bad:
1044        key_put(key);
1045
1046        _leave(" = 0 [bad]");
1047        return 0;
1048}
1049
1050/*
1051 * allow the VFS to enquire as to whether a dentry should be unhashed (mustn't
1052 * sleep)
1053 * - called from dput() when d_count is going to 0.
1054 * - return 1 to request dentry be unhashed, 0 otherwise
1055 */
1056static int afs_d_delete(const struct dentry *dentry)
1057{
1058        _enter("%pd", dentry);
1059
1060        if (dentry->d_flags & DCACHE_NFSFS_RENAMED)
1061                goto zap;
1062
1063        if (d_really_is_positive(dentry) &&
1064            (test_bit(AFS_VNODE_DELETED,   &AFS_FS_I(d_inode(dentry))->flags) ||
1065             test_bit(AFS_VNODE_PSEUDODIR, &AFS_FS_I(d_inode(dentry))->flags)))
1066                goto zap;
1067
1068        _leave(" = 0 [keep]");
1069        return 0;
1070
1071zap:
1072        _leave(" = 1 [zap]");
1073        return 1;
1074}
1075
1076/*
1077 * handle dentry release
1078 */
1079void afs_d_release(struct dentry *dentry)
1080{
1081        _enter("%pd", dentry);
1082}
1083
1084/*
1085 * Create a new inode for create/mkdir/symlink
1086 */
1087static void afs_vnode_new_inode(struct afs_fs_cursor *fc,
1088                                struct dentry *new_dentry,
1089                                struct afs_fid *newfid,
1090                                struct afs_file_status *newstatus,
1091                                struct afs_callback *newcb)
1092{
1093        struct afs_vnode *vnode;
1094        struct inode *inode;
1095
1096        if (fc->ac.error < 0)
1097                return;
1098
1099        d_drop(new_dentry);
1100
1101        inode = afs_iget(fc->vnode->vfs_inode.i_sb, fc->key,
1102                         newfid, newstatus, newcb, fc->cbi);
1103        if (IS_ERR(inode)) {
1104                /* ENOMEM or EINTR at a really inconvenient time - just abandon
1105                 * the new directory on the server.
1106                 */
1107                fc->ac.error = PTR_ERR(inode);
1108                return;
1109        }
1110
1111        vnode = AFS_FS_I(inode);
1112        set_bit(AFS_VNODE_NEW_CONTENT, &vnode->flags);
1113        d_add(new_dentry, inode);
1114}
1115
1116/*
1117 * create a directory on an AFS filesystem
1118 */
1119static int afs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
1120{
1121        struct afs_file_status newstatus;
1122        struct afs_fs_cursor fc;
1123        struct afs_callback newcb;
1124        struct afs_vnode *dvnode = AFS_FS_I(dir);
1125        struct afs_fid newfid;
1126        struct key *key;
1127        u64 data_version = dvnode->status.data_version;
1128        int ret;
1129
1130        mode |= S_IFDIR;
1131
1132        _enter("{%x:%u},{%pd},%ho",
1133               dvnode->fid.vid, dvnode->fid.vnode, dentry, mode);
1134
1135        key = afs_request_key(dvnode->volume->cell);
1136        if (IS_ERR(key)) {
1137                ret = PTR_ERR(key);
1138                goto error;
1139        }
1140
1141        ret = -ERESTARTSYS;
1142        if (afs_begin_vnode_operation(&fc, dvnode, key)) {
1143                while (afs_select_fileserver(&fc)) {
1144                        fc.cb_break = afs_calc_vnode_cb_break(dvnode);
1145                        afs_fs_create(&fc, dentry->d_name.name, mode, data_version,
1146                                      &newfid, &newstatus, &newcb);
1147                }
1148
1149                afs_check_for_remote_deletion(&fc, fc.vnode);
1150                afs_vnode_commit_status(&fc, dvnode, fc.cb_break);
1151                afs_vnode_new_inode(&fc, dentry, &newfid, &newstatus, &newcb);
1152                ret = afs_end_vnode_operation(&fc);
1153                if (ret < 0)
1154                        goto error_key;
1155        } else {
1156                goto error_key;
1157        }
1158
1159        if (ret == 0 &&
1160            test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
1161                afs_edit_dir_add(dvnode, &dentry->d_name, &newfid,
1162                                 afs_edit_dir_for_create);
1163
1164        key_put(key);
1165        _leave(" = 0");
1166        return 0;
1167
1168error_key:
1169        key_put(key);
1170error:
1171        d_drop(dentry);
1172        _leave(" = %d", ret);
1173        return ret;
1174}
1175
1176/*
1177 * Remove a subdir from a directory.
1178 */
1179static void afs_dir_remove_subdir(struct dentry *dentry)
1180{
1181        if (d_really_is_positive(dentry)) {
1182                struct afs_vnode *vnode = AFS_FS_I(d_inode(dentry));
1183
1184                clear_nlink(&vnode->vfs_inode);
1185                set_bit(AFS_VNODE_DELETED, &vnode->flags);
1186                clear_bit(AFS_VNODE_CB_PROMISED, &vnode->flags);
1187                clear_bit(AFS_VNODE_DIR_VALID, &vnode->flags);
1188        }
1189}
1190
1191/*
1192 * remove a directory from an AFS filesystem
1193 */
1194static int afs_rmdir(struct inode *dir, struct dentry *dentry)
1195{
1196        struct afs_fs_cursor fc;
1197        struct afs_vnode *dvnode = AFS_FS_I(dir);
1198        struct key *key;
1199        u64 data_version = dvnode->status.data_version;
1200        int ret;
1201
1202        _enter("{%x:%u},{%pd}",
1203               dvnode->fid.vid, dvnode->fid.vnode, dentry);
1204
1205        key = afs_request_key(dvnode->volume->cell);
1206        if (IS_ERR(key)) {
1207                ret = PTR_ERR(key);
1208                goto error;
1209        }
1210
1211        ret = -ERESTARTSYS;
1212        if (afs_begin_vnode_operation(&fc, dvnode, key)) {
1213                while (afs_select_fileserver(&fc)) {
1214                        fc.cb_break = afs_calc_vnode_cb_break(dvnode);
1215                        afs_fs_remove(&fc, dentry->d_name.name, true,
1216                                      data_version);
1217                }
1218
1219                afs_vnode_commit_status(&fc, dvnode, fc.cb_break);
1220                ret = afs_end_vnode_operation(&fc);
1221                if (ret == 0) {
1222                        afs_dir_remove_subdir(dentry);
1223                        if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
1224                                afs_edit_dir_remove(dvnode, &dentry->d_name,
1225                                                    afs_edit_dir_for_rmdir);
1226                }
1227        }
1228
1229        key_put(key);
1230error:
1231        return ret;
1232}
1233
1234/*
1235 * Remove a link to a file or symlink from a directory.
1236 *
1237 * If the file was not deleted due to excess hard links, the fileserver will
1238 * break the callback promise on the file - if it had one - before it returns
1239 * to us, and if it was deleted, it won't
1240 *
1241 * However, if we didn't have a callback promise outstanding, or it was
1242 * outstanding on a different server, then it won't break it either...
1243 */
1244static int afs_dir_remove_link(struct dentry *dentry, struct key *key,
1245                               unsigned long d_version_before,
1246                               unsigned long d_version_after)
1247{
1248        bool dir_valid;
1249        int ret = 0;
1250
1251        /* There were no intervening changes on the server if the version
1252         * number we got back was incremented by exactly 1.
1253         */
1254        dir_valid = (d_version_after == d_version_before + 1);
1255
1256        if (d_really_is_positive(dentry)) {
1257                struct afs_vnode *vnode = AFS_FS_I(d_inode(dentry));
1258
1259                if (dir_valid) {
1260                        drop_nlink(&vnode->vfs_inode);
1261                        if (vnode->vfs_inode.i_nlink == 0) {
1262                                set_bit(AFS_VNODE_DELETED, &vnode->flags);
1263                                clear_bit(AFS_VNODE_CB_PROMISED, &vnode->flags);
1264                        }
1265                        ret = 0;
1266                } else {
1267                        clear_bit(AFS_VNODE_CB_PROMISED, &vnode->flags);
1268
1269                        if (test_bit(AFS_VNODE_DELETED, &vnode->flags))
1270                                kdebug("AFS_VNODE_DELETED");
1271
1272                        ret = afs_validate(vnode, key);
1273                        if (ret == -ESTALE)
1274                                ret = 0;
1275                }
1276                _debug("nlink %d [val %d]", vnode->vfs_inode.i_nlink, ret);
1277        }
1278
1279        return ret;
1280}
1281
1282/*
1283 * Remove a file or symlink from an AFS filesystem.
1284 */
1285static int afs_unlink(struct inode *dir, struct dentry *dentry)
1286{
1287        struct afs_fs_cursor fc;
1288        struct afs_vnode *dvnode = AFS_FS_I(dir), *vnode;
1289        struct key *key;
1290        unsigned long d_version = (unsigned long)dentry->d_fsdata;
1291        u64 data_version = dvnode->status.data_version;
1292        int ret;
1293
1294        _enter("{%x:%u},{%pd}",
1295               dvnode->fid.vid, dvnode->fid.vnode, dentry);
1296
1297        if (dentry->d_name.len >= AFSNAMEMAX)
1298                return -ENAMETOOLONG;
1299
1300        key = afs_request_key(dvnode->volume->cell);
1301        if (IS_ERR(key)) {
1302                ret = PTR_ERR(key);
1303                goto error;
1304        }
1305
1306        /* Try to make sure we have a callback promise on the victim. */
1307        if (d_really_is_positive(dentry)) {
1308                vnode = AFS_FS_I(d_inode(dentry));
1309                ret = afs_validate(vnode, key);
1310                if (ret < 0)
1311                        goto error_key;
1312        }
1313
1314        ret = -ERESTARTSYS;
1315        if (afs_begin_vnode_operation(&fc, dvnode, key)) {
1316                while (afs_select_fileserver(&fc)) {
1317                        fc.cb_break = afs_calc_vnode_cb_break(dvnode);
1318                        afs_fs_remove(&fc, dentry->d_name.name, false,
1319                                      data_version);
1320                }
1321
1322                afs_vnode_commit_status(&fc, dvnode, fc.cb_break);
1323                ret = afs_end_vnode_operation(&fc);
1324                if (ret == 0)
1325                        ret = afs_dir_remove_link(
1326                                dentry, key, d_version,
1327                                (unsigned long)dvnode->status.data_version);
1328                if (ret == 0 &&
1329                    test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
1330                        afs_edit_dir_remove(dvnode, &dentry->d_name,
1331                                            afs_edit_dir_for_unlink);
1332        }
1333
1334error_key:
1335        key_put(key);
1336error:
1337        _leave(" = %d", ret);
1338        return ret;
1339}
1340
1341/*
1342 * create a regular file on an AFS filesystem
1343 */
1344static int afs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
1345                      bool excl)
1346{
1347        struct afs_fs_cursor fc;
1348        struct afs_file_status newstatus;
1349        struct afs_callback newcb;
1350        struct afs_vnode *dvnode = AFS_FS_I(dir);
1351        struct afs_fid newfid;
1352        struct key *key;
1353        u64 data_version = dvnode->status.data_version;
1354        int ret;
1355
1356        mode |= S_IFREG;
1357
1358        _enter("{%x:%u},{%pd},%ho,",
1359               dvnode->fid.vid, dvnode->fid.vnode, dentry, mode);
1360
1361        ret = -ENAMETOOLONG;
1362        if (dentry->d_name.len >= AFSNAMEMAX)
1363                goto error;
1364
1365        key = afs_request_key(dvnode->volume->cell);
1366        if (IS_ERR(key)) {
1367                ret = PTR_ERR(key);
1368                goto error;
1369        }
1370
1371        ret = -ERESTARTSYS;
1372        if (afs_begin_vnode_operation(&fc, dvnode, key)) {
1373                while (afs_select_fileserver(&fc)) {
1374                        fc.cb_break = afs_calc_vnode_cb_break(dvnode);
1375                        afs_fs_create(&fc, dentry->d_name.name, mode, data_version,
1376                                      &newfid, &newstatus, &newcb);
1377                }
1378
1379                afs_check_for_remote_deletion(&fc, fc.vnode);
1380                afs_vnode_commit_status(&fc, dvnode, fc.cb_break);
1381                afs_vnode_new_inode(&fc, dentry, &newfid, &newstatus, &newcb);
1382                ret = afs_end_vnode_operation(&fc);
1383                if (ret < 0)
1384                        goto error_key;
1385        } else {
1386                goto error_key;
1387        }
1388
1389        if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
1390                afs_edit_dir_add(dvnode, &dentry->d_name, &newfid,
1391                                 afs_edit_dir_for_create);
1392
1393        key_put(key);
1394        _leave(" = 0");
1395        return 0;
1396
1397error_key:
1398        key_put(key);
1399error:
1400        d_drop(dentry);
1401        _leave(" = %d", ret);
1402        return ret;
1403}
1404
1405/*
1406 * create a hard link between files in an AFS filesystem
1407 */
1408static int afs_link(struct dentry *from, struct inode *dir,
1409                    struct dentry *dentry)
1410{
1411        struct afs_fs_cursor fc;
1412        struct afs_vnode *dvnode, *vnode;
1413        struct key *key;
1414        u64 data_version;
1415        int ret;
1416
1417        vnode = AFS_FS_I(d_inode(from));
1418        dvnode = AFS_FS_I(dir);
1419        data_version = dvnode->status.data_version;
1420
1421        _enter("{%x:%u},{%x:%u},{%pd}",
1422               vnode->fid.vid, vnode->fid.vnode,
1423               dvnode->fid.vid, dvnode->fid.vnode,
1424               dentry);
1425
1426        ret = -ENAMETOOLONG;
1427        if (dentry->d_name.len >= AFSNAMEMAX)
1428                goto error;
1429
1430        key = afs_request_key(dvnode->volume->cell);
1431        if (IS_ERR(key)) {
1432                ret = PTR_ERR(key);
1433                goto error;
1434        }
1435
1436        ret = -ERESTARTSYS;
1437        if (afs_begin_vnode_operation(&fc, dvnode, key)) {
1438                if (mutex_lock_interruptible_nested(&vnode->io_lock, 1) < 0) {
1439                        afs_end_vnode_operation(&fc);
1440                        goto error_key;
1441                }
1442
1443                while (afs_select_fileserver(&fc)) {
1444                        fc.cb_break = afs_calc_vnode_cb_break(dvnode);
1445                        fc.cb_break_2 = afs_calc_vnode_cb_break(vnode);
1446                        afs_fs_link(&fc, vnode, dentry->d_name.name, data_version);
1447                }
1448
1449                afs_vnode_commit_status(&fc, dvnode, fc.cb_break);
1450                afs_vnode_commit_status(&fc, vnode, fc.cb_break_2);
1451                ihold(&vnode->vfs_inode);
1452                d_instantiate(dentry, &vnode->vfs_inode);
1453
1454                mutex_unlock(&vnode->io_lock);
1455                ret = afs_end_vnode_operation(&fc);
1456                if (ret < 0)
1457                        goto error_key;
1458        } else {
1459                goto error_key;
1460        }
1461
1462        if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
1463                afs_edit_dir_add(dvnode, &dentry->d_name, &vnode->fid,
1464                                 afs_edit_dir_for_link);
1465
1466        key_put(key);
1467        _leave(" = 0");
1468        return 0;
1469
1470error_key:
1471        key_put(key);
1472error:
1473        d_drop(dentry);
1474        _leave(" = %d", ret);
1475        return ret;
1476}
1477
1478/*
1479 * create a symlink in an AFS filesystem
1480 */
1481static int afs_symlink(struct inode *dir, struct dentry *dentry,
1482                       const char *content)
1483{
1484        struct afs_fs_cursor fc;
1485        struct afs_file_status newstatus;
1486        struct afs_vnode *dvnode = AFS_FS_I(dir);
1487        struct afs_fid newfid;
1488        struct key *key;
1489        u64 data_version = dvnode->status.data_version;
1490        int ret;
1491
1492        _enter("{%x:%u},{%pd},%s",
1493               dvnode->fid.vid, dvnode->fid.vnode, dentry,
1494               content);
1495
1496        ret = -ENAMETOOLONG;
1497        if (dentry->d_name.len >= AFSNAMEMAX)
1498                goto error;
1499
1500        ret = -EINVAL;
1501        if (strlen(content) >= AFSPATHMAX)
1502                goto error;
1503
1504        key = afs_request_key(dvnode->volume->cell);
1505        if (IS_ERR(key)) {
1506                ret = PTR_ERR(key);
1507                goto error;
1508        }
1509
1510        ret = -ERESTARTSYS;
1511        if (afs_begin_vnode_operation(&fc, dvnode, key)) {
1512                while (afs_select_fileserver(&fc)) {
1513                        fc.cb_break = afs_calc_vnode_cb_break(dvnode);
1514                        afs_fs_symlink(&fc, dentry->d_name.name,
1515                                       content, data_version,
1516                                       &newfid, &newstatus);
1517                }
1518
1519                afs_check_for_remote_deletion(&fc, fc.vnode);
1520                afs_vnode_commit_status(&fc, dvnode, fc.cb_break);
1521                afs_vnode_new_inode(&fc, dentry, &newfid, &newstatus, NULL);
1522                ret = afs_end_vnode_operation(&fc);
1523                if (ret < 0)
1524                        goto error_key;
1525        } else {
1526                goto error_key;
1527        }
1528
1529        if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
1530                afs_edit_dir_add(dvnode, &dentry->d_name, &newfid,
1531                                 afs_edit_dir_for_symlink);
1532
1533        key_put(key);
1534        _leave(" = 0");
1535        return 0;
1536
1537error_key:
1538        key_put(key);
1539error:
1540        d_drop(dentry);
1541        _leave(" = %d", ret);
1542        return ret;
1543}
1544
1545/*
1546 * rename a file in an AFS filesystem and/or move it between directories
1547 */
1548static int afs_rename(struct inode *old_dir, struct dentry *old_dentry,
1549                      struct inode *new_dir, struct dentry *new_dentry,
1550                      unsigned int flags)
1551{
1552        struct afs_fs_cursor fc;
1553        struct afs_vnode *orig_dvnode, *new_dvnode, *vnode;
1554        struct key *key;
1555        u64 orig_data_version, new_data_version;
1556        bool new_negative = d_is_negative(new_dentry);
1557        int ret;
1558
1559        if (flags)
1560                return -EINVAL;
1561
1562        vnode = AFS_FS_I(d_inode(old_dentry));
1563        orig_dvnode = AFS_FS_I(old_dir);
1564        new_dvnode = AFS_FS_I(new_dir);
1565        orig_data_version = orig_dvnode->status.data_version;
1566        new_data_version = new_dvnode->status.data_version;
1567
1568        _enter("{%x:%u},{%x:%u},{%x:%u},{%pd}",
1569               orig_dvnode->fid.vid, orig_dvnode->fid.vnode,
1570               vnode->fid.vid, vnode->fid.vnode,
1571               new_dvnode->fid.vid, new_dvnode->fid.vnode,
1572               new_dentry);
1573
1574        key = afs_request_key(orig_dvnode->volume->cell);
1575        if (IS_ERR(key)) {
1576                ret = PTR_ERR(key);
1577                goto error;
1578        }
1579
1580        ret = -ERESTARTSYS;
1581        if (afs_begin_vnode_operation(&fc, orig_dvnode, key)) {
1582                if (orig_dvnode != new_dvnode) {
1583                        if (mutex_lock_interruptible_nested(&new_dvnode->io_lock, 1) < 0) {
1584                                afs_end_vnode_operation(&fc);
1585                                goto error_key;
1586                        }
1587                }
1588                while (afs_select_fileserver(&fc)) {
1589                        fc.cb_break = afs_calc_vnode_cb_break(orig_dvnode);
1590                        fc.cb_break_2 = afs_calc_vnode_cb_break(new_dvnode);
1591                        afs_fs_rename(&fc, old_dentry->d_name.name,
1592                                      new_dvnode, new_dentry->d_name.name,
1593                                      orig_data_version, new_data_version);
1594                }
1595
1596                afs_vnode_commit_status(&fc, orig_dvnode, fc.cb_break);
1597                afs_vnode_commit_status(&fc, new_dvnode, fc.cb_break_2);
1598                if (orig_dvnode != new_dvnode)
1599                        mutex_unlock(&new_dvnode->io_lock);
1600                ret = afs_end_vnode_operation(&fc);
1601                if (ret < 0)
1602                        goto error_key;
1603        }
1604
1605        if (ret == 0) {
1606                if (test_bit(AFS_VNODE_DIR_VALID, &orig_dvnode->flags))
1607                    afs_edit_dir_remove(orig_dvnode, &old_dentry->d_name,
1608                                        afs_edit_dir_for_rename);
1609
1610                if (!new_negative &&
1611                    test_bit(AFS_VNODE_DIR_VALID, &new_dvnode->flags))
1612                        afs_edit_dir_remove(new_dvnode, &new_dentry->d_name,
1613                                            afs_edit_dir_for_rename);
1614
1615                if (test_bit(AFS_VNODE_DIR_VALID, &new_dvnode->flags))
1616                        afs_edit_dir_add(new_dvnode, &new_dentry->d_name,
1617                                         &vnode->fid,  afs_edit_dir_for_rename);
1618        }
1619
1620error_key:
1621        key_put(key);
1622error:
1623        _leave(" = %d", ret);
1624        return ret;
1625}
1626
1627/*
1628 * Release a directory page and clean up its private state if it's not busy
1629 * - return true if the page can now be released, false if not
1630 */
1631static int afs_dir_releasepage(struct page *page, gfp_t gfp_flags)
1632{
1633        struct afs_vnode *dvnode = AFS_FS_I(page->mapping->host);
1634
1635        _enter("{{%x:%u}[%lu]}", dvnode->fid.vid, dvnode->fid.vnode, page->index);
1636
1637        set_page_private(page, 0);
1638        ClearPagePrivate(page);
1639
1640        /* The directory will need reloading. */
1641        if (test_and_clear_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
1642                afs_stat_v(dvnode, n_relpg);
1643        return 1;
1644}
1645
1646/*
1647 * invalidate part or all of a page
1648 * - release a page and clean up its private data if offset is 0 (indicating
1649 *   the entire page)
1650 */
1651static void afs_dir_invalidatepage(struct page *page, unsigned int offset,
1652                                   unsigned int length)
1653{
1654        struct afs_vnode *dvnode = AFS_FS_I(page->mapping->host);
1655
1656        _enter("{%lu},%u,%u", page->index, offset, length);
1657
1658        BUG_ON(!PageLocked(page));
1659
1660        /* The directory will need reloading. */
1661        if (test_and_clear_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
1662                afs_stat_v(dvnode, n_inval);
1663
1664        /* we clean up only if the entire page is being invalidated */
1665        if (offset == 0 && length == PAGE_SIZE) {
1666                set_page_private(page, 0);
1667                ClearPagePrivate(page);
1668        }
1669}
1670