Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /* dir.c: AFS filesystem directory handling
0003  *
0004  * Copyright (C) 2002, 2018 Red Hat, Inc. All Rights Reserved.
0005  * Written by David Howells (dhowells@redhat.com)
0006  */
0007 
0008 #include <linux/kernel.h>
0009 #include <linux/fs.h>
0010 #include <linux/namei.h>
0011 #include <linux/pagemap.h>
0012 #include <linux/swap.h>
0013 #include <linux/ctype.h>
0014 #include <linux/sched.h>
0015 #include <linux/task_io_accounting_ops.h>
0016 #include "internal.h"
0017 #include "afs_fs.h"
0018 #include "xdr_fs.h"
0019 
0020 static struct dentry *afs_lookup(struct inode *dir, struct dentry *dentry,
0021                  unsigned int flags);
0022 static int afs_dir_open(struct inode *inode, struct file *file);
0023 static int afs_readdir(struct file *file, struct dir_context *ctx);
0024 static int afs_d_revalidate(struct dentry *dentry, unsigned int flags);
0025 static int afs_d_delete(const struct dentry *dentry);
0026 static void afs_d_iput(struct dentry *dentry, struct inode *inode);
0027 static int afs_lookup_one_filldir(struct dir_context *ctx, const char *name, int nlen,
0028                   loff_t fpos, u64 ino, unsigned dtype);
0029 static int afs_lookup_filldir(struct dir_context *ctx, const char *name, int nlen,
0030                   loff_t fpos, u64 ino, unsigned dtype);
0031 static int afs_create(struct user_namespace *mnt_userns, struct inode *dir,
0032               struct dentry *dentry, umode_t mode, bool excl);
0033 static int afs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
0034              struct dentry *dentry, umode_t mode);
0035 static int afs_rmdir(struct inode *dir, struct dentry *dentry);
0036 static int afs_unlink(struct inode *dir, struct dentry *dentry);
0037 static int afs_link(struct dentry *from, struct inode *dir,
0038             struct dentry *dentry);
0039 static int afs_symlink(struct user_namespace *mnt_userns, struct inode *dir,
0040                struct dentry *dentry, const char *content);
0041 static int afs_rename(struct user_namespace *mnt_userns, struct inode *old_dir,
0042               struct dentry *old_dentry, struct inode *new_dir,
0043               struct dentry *new_dentry, unsigned int flags);
0044 static bool afs_dir_release_folio(struct folio *folio, gfp_t gfp_flags);
0045 static void afs_dir_invalidate_folio(struct folio *folio, size_t offset,
0046                    size_t length);
0047 
0048 static bool afs_dir_dirty_folio(struct address_space *mapping,
0049         struct folio *folio)
0050 {
0051     BUG(); /* This should never happen. */
0052 }
0053 
0054 const struct file_operations afs_dir_file_operations = {
0055     .open       = afs_dir_open,
0056     .release    = afs_release,
0057     .iterate_shared = afs_readdir,
0058     .lock       = afs_lock,
0059     .llseek     = generic_file_llseek,
0060 };
0061 
0062 const struct inode_operations afs_dir_inode_operations = {
0063     .create     = afs_create,
0064     .lookup     = afs_lookup,
0065     .link       = afs_link,
0066     .unlink     = afs_unlink,
0067     .symlink    = afs_symlink,
0068     .mkdir      = afs_mkdir,
0069     .rmdir      = afs_rmdir,
0070     .rename     = afs_rename,
0071     .permission = afs_permission,
0072     .getattr    = afs_getattr,
0073     .setattr    = afs_setattr,
0074 };
0075 
0076 const struct address_space_operations afs_dir_aops = {
0077     .dirty_folio    = afs_dir_dirty_folio,
0078     .release_folio  = afs_dir_release_folio,
0079     .invalidate_folio = afs_dir_invalidate_folio,
0080 };
0081 
0082 const struct dentry_operations afs_fs_dentry_operations = {
0083     .d_revalidate   = afs_d_revalidate,
0084     .d_delete   = afs_d_delete,
0085     .d_release  = afs_d_release,
0086     .d_automount    = afs_d_automount,
0087     .d_iput     = afs_d_iput,
0088 };
0089 
0090 struct afs_lookup_one_cookie {
0091     struct dir_context  ctx;
0092     struct qstr     name;
0093     bool            found;
0094     struct afs_fid      fid;
0095 };
0096 
0097 struct afs_lookup_cookie {
0098     struct dir_context  ctx;
0099     struct qstr     name;
0100     bool            found;
0101     bool            one_only;
0102     unsigned short      nr_fids;
0103     struct afs_fid      fids[50];
0104 };
0105 
0106 /*
0107  * Drop the refs that we're holding on the folios we were reading into.  We've
0108  * got refs on the first nr_pages pages.
0109  */
0110 static void afs_dir_read_cleanup(struct afs_read *req)
0111 {
0112     struct address_space *mapping = req->vnode->netfs.inode.i_mapping;
0113     struct folio *folio;
0114     pgoff_t last = req->nr_pages - 1;
0115 
0116     XA_STATE(xas, &mapping->i_pages, 0);
0117 
0118     if (unlikely(!req->nr_pages))
0119         return;
0120 
0121     rcu_read_lock();
0122     xas_for_each(&xas, folio, last) {
0123         if (xas_retry(&xas, folio))
0124             continue;
0125         BUG_ON(xa_is_value(folio));
0126         ASSERTCMP(folio_file_mapping(folio), ==, mapping);
0127 
0128         folio_put(folio);
0129     }
0130 
0131     rcu_read_unlock();
0132 }
0133 
0134 /*
0135  * check that a directory folio is valid
0136  */
0137 static bool afs_dir_check_folio(struct afs_vnode *dvnode, struct folio *folio,
0138                 loff_t i_size)
0139 {
0140     union afs_xdr_dir_block *block;
0141     size_t offset, size;
0142     loff_t pos;
0143 
0144     /* Determine how many magic numbers there should be in this folio, but
0145      * we must take care because the directory may change size under us.
0146      */
0147     pos = folio_pos(folio);
0148     if (i_size <= pos)
0149         goto checked;
0150 
0151     size = min_t(loff_t, folio_size(folio), i_size - pos);
0152     for (offset = 0; offset < size; offset += sizeof(*block)) {
0153         block = kmap_local_folio(folio, offset);
0154         if (block->hdr.magic != AFS_DIR_MAGIC) {
0155             printk("kAFS: %s(%lx): [%llx] bad magic %zx/%zx is %04hx\n",
0156                    __func__, dvnode->netfs.inode.i_ino,
0157                    pos, offset, size, ntohs(block->hdr.magic));
0158             trace_afs_dir_check_failed(dvnode, pos + offset, i_size);
0159             kunmap_local(block);
0160             trace_afs_file_error(dvnode, -EIO, afs_file_error_dir_bad_magic);
0161             goto error;
0162         }
0163 
0164         /* Make sure each block is NUL terminated so we can reasonably
0165          * use string functions on it.  The filenames in the folio
0166          * *should* be NUL-terminated anyway.
0167          */
0168         ((u8 *)block)[AFS_DIR_BLOCK_SIZE - 1] = 0;
0169 
0170         kunmap_local(block);
0171     }
0172 checked:
0173     afs_stat_v(dvnode, n_read_dir);
0174     return true;
0175 
0176 error:
0177     return false;
0178 }
0179 
0180 /*
0181  * Dump the contents of a directory.
0182  */
0183 static void afs_dir_dump(struct afs_vnode *dvnode, struct afs_read *req)
0184 {
0185     union afs_xdr_dir_block *block;
0186     struct address_space *mapping = dvnode->netfs.inode.i_mapping;
0187     struct folio *folio;
0188     pgoff_t last = req->nr_pages - 1;
0189     size_t offset, size;
0190 
0191     XA_STATE(xas, &mapping->i_pages, 0);
0192 
0193     pr_warn("DIR %llx:%llx f=%llx l=%llx al=%llx\n",
0194         dvnode->fid.vid, dvnode->fid.vnode,
0195         req->file_size, req->len, req->actual_len);
0196     pr_warn("DIR %llx %x %zx %zx\n",
0197         req->pos, req->nr_pages,
0198         req->iter->iov_offset,  iov_iter_count(req->iter));
0199 
0200     xas_for_each(&xas, folio, last) {
0201         if (xas_retry(&xas, folio))
0202             continue;
0203 
0204         BUG_ON(folio_file_mapping(folio) != mapping);
0205 
0206         size = min_t(loff_t, folio_size(folio), req->actual_len - folio_pos(folio));
0207         for (offset = 0; offset < size; offset += sizeof(*block)) {
0208             block = kmap_local_folio(folio, offset);
0209             pr_warn("[%02lx] %32phN\n", folio_index(folio) + offset, block);
0210             kunmap_local(block);
0211         }
0212     }
0213 }
0214 
0215 /*
0216  * Check all the blocks in a directory.  All the folios are held pinned.
0217  */
0218 static int afs_dir_check(struct afs_vnode *dvnode, struct afs_read *req)
0219 {
0220     struct address_space *mapping = dvnode->netfs.inode.i_mapping;
0221     struct folio *folio;
0222     pgoff_t last = req->nr_pages - 1;
0223     int ret = 0;
0224 
0225     XA_STATE(xas, &mapping->i_pages, 0);
0226 
0227     if (unlikely(!req->nr_pages))
0228         return 0;
0229 
0230     rcu_read_lock();
0231     xas_for_each(&xas, folio, last) {
0232         if (xas_retry(&xas, folio))
0233             continue;
0234 
0235         BUG_ON(folio_file_mapping(folio) != mapping);
0236 
0237         if (!afs_dir_check_folio(dvnode, folio, req->actual_len)) {
0238             afs_dir_dump(dvnode, req);
0239             ret = -EIO;
0240             break;
0241         }
0242     }
0243 
0244     rcu_read_unlock();
0245     return ret;
0246 }
0247 
0248 /*
0249  * open an AFS directory file
0250  */
0251 static int afs_dir_open(struct inode *inode, struct file *file)
0252 {
0253     _enter("{%lu}", inode->i_ino);
0254 
0255     BUILD_BUG_ON(sizeof(union afs_xdr_dir_block) != 2048);
0256     BUILD_BUG_ON(sizeof(union afs_xdr_dirent) != 32);
0257 
0258     if (test_bit(AFS_VNODE_DELETED, &AFS_FS_I(inode)->flags))
0259         return -ENOENT;
0260 
0261     return afs_open(inode, file);
0262 }
0263 
0264 /*
0265  * Read the directory into the pagecache in one go, scrubbing the previous
0266  * contents.  The list of folios is returned, pinning them so that they don't
0267  * get reclaimed during the iteration.
0268  */
0269 static struct afs_read *afs_read_dir(struct afs_vnode *dvnode, struct key *key)
0270     __acquires(&dvnode->validate_lock)
0271 {
0272     struct address_space *mapping = dvnode->netfs.inode.i_mapping;
0273     struct afs_read *req;
0274     loff_t i_size;
0275     int nr_pages, i;
0276     int ret;
0277 
0278     _enter("");
0279 
0280     req = kzalloc(sizeof(*req), GFP_KERNEL);
0281     if (!req)
0282         return ERR_PTR(-ENOMEM);
0283 
0284     refcount_set(&req->usage, 1);
0285     req->vnode = dvnode;
0286     req->key = key_get(key);
0287     req->cleanup = afs_dir_read_cleanup;
0288 
0289 expand:
0290     i_size = i_size_read(&dvnode->netfs.inode);
0291     if (i_size < 2048) {
0292         ret = afs_bad(dvnode, afs_file_error_dir_small);
0293         goto error;
0294     }
0295     if (i_size > 2048 * 1024) {
0296         trace_afs_file_error(dvnode, -EFBIG, afs_file_error_dir_big);
0297         ret = -EFBIG;
0298         goto error;
0299     }
0300 
0301     _enter("%llu", i_size);
0302 
0303     nr_pages = (i_size + PAGE_SIZE - 1) / PAGE_SIZE;
0304 
0305     req->actual_len = i_size; /* May change */
0306     req->len = nr_pages * PAGE_SIZE; /* We can ask for more than there is */
0307     req->data_version = dvnode->status.data_version; /* May change */
0308     iov_iter_xarray(&req->def_iter, READ, &dvnode->netfs.inode.i_mapping->i_pages,
0309             0, i_size);
0310     req->iter = &req->def_iter;
0311 
0312     /* Fill in any gaps that we might find where the memory reclaimer has
0313      * been at work and pin all the folios.  If there are any gaps, we will
0314      * need to reread the entire directory contents.
0315      */
0316     i = req->nr_pages;
0317     while (i < nr_pages) {
0318         struct folio *folio;
0319 
0320         folio = filemap_get_folio(mapping, i);
0321         if (!folio) {
0322             if (test_and_clear_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
0323                 afs_stat_v(dvnode, n_inval);
0324 
0325             ret = -ENOMEM;
0326             folio = __filemap_get_folio(mapping,
0327                             i, FGP_LOCK | FGP_CREAT,
0328                             mapping->gfp_mask);
0329             if (!folio)
0330                 goto error;
0331             folio_attach_private(folio, (void *)1);
0332             folio_unlock(folio);
0333         }
0334 
0335         req->nr_pages += folio_nr_pages(folio);
0336         i += folio_nr_pages(folio);
0337     }
0338 
0339     /* If we're going to reload, we need to lock all the pages to prevent
0340      * races.
0341      */
0342     ret = -ERESTARTSYS;
0343     if (down_read_killable(&dvnode->validate_lock) < 0)
0344         goto error;
0345 
0346     if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
0347         goto success;
0348 
0349     up_read(&dvnode->validate_lock);
0350     if (down_write_killable(&dvnode->validate_lock) < 0)
0351         goto error;
0352 
0353     if (!test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags)) {
0354         trace_afs_reload_dir(dvnode);
0355         ret = afs_fetch_data(dvnode, req);
0356         if (ret < 0)
0357             goto error_unlock;
0358 
0359         task_io_account_read(PAGE_SIZE * req->nr_pages);
0360 
0361         if (req->len < req->file_size) {
0362             /* The content has grown, so we need to expand the
0363              * buffer.
0364              */
0365             up_write(&dvnode->validate_lock);
0366             goto expand;
0367         }
0368 
0369         /* Validate the data we just read. */
0370         ret = afs_dir_check(dvnode, req);
0371         if (ret < 0)
0372             goto error_unlock;
0373 
0374         // TODO: Trim excess pages
0375 
0376         set_bit(AFS_VNODE_DIR_VALID, &dvnode->flags);
0377     }
0378 
0379     downgrade_write(&dvnode->validate_lock);
0380 success:
0381     return req;
0382 
0383 error_unlock:
0384     up_write(&dvnode->validate_lock);
0385 error:
0386     afs_put_read(req);
0387     _leave(" = %d", ret);
0388     return ERR_PTR(ret);
0389 }
0390 
0391 /*
0392  * deal with one block in an AFS directory
0393  */
0394 static int afs_dir_iterate_block(struct afs_vnode *dvnode,
0395                  struct dir_context *ctx,
0396                  union afs_xdr_dir_block *block,
0397                  unsigned blkoff)
0398 {
0399     union afs_xdr_dirent *dire;
0400     unsigned offset, next, curr, nr_slots;
0401     size_t nlen;
0402     int tmp;
0403 
0404     _enter("%llx,%x", ctx->pos, blkoff);
0405 
0406     curr = (ctx->pos - blkoff) / sizeof(union afs_xdr_dirent);
0407 
0408     /* walk through the block, an entry at a time */
0409     for (offset = (blkoff == 0 ? AFS_DIR_RESV_BLOCKS0 : AFS_DIR_RESV_BLOCKS);
0410          offset < AFS_DIR_SLOTS_PER_BLOCK;
0411          offset = next
0412          ) {
0413         /* skip entries marked unused in the bitmap */
0414         if (!(block->hdr.bitmap[offset / 8] &
0415               (1 << (offset % 8)))) {
0416             _debug("ENT[%zu.%u]: unused",
0417                    blkoff / sizeof(union afs_xdr_dir_block), offset);
0418             next = offset + 1;
0419             if (offset >= curr)
0420                 ctx->pos = blkoff +
0421                     next * sizeof(union afs_xdr_dirent);
0422             continue;
0423         }
0424 
0425         /* got a valid entry */
0426         dire = &block->dirents[offset];
0427         nlen = strnlen(dire->u.name,
0428                    sizeof(*block) -
0429                    offset * sizeof(union afs_xdr_dirent));
0430         if (nlen > AFSNAMEMAX - 1) {
0431             _debug("ENT[%zu]: name too long (len %u/%zu)",
0432                    blkoff / sizeof(union afs_xdr_dir_block),
0433                    offset, nlen);
0434             return afs_bad(dvnode, afs_file_error_dir_name_too_long);
0435         }
0436 
0437         _debug("ENT[%zu.%u]: %s %zu \"%s\"",
0438                blkoff / sizeof(union afs_xdr_dir_block), offset,
0439                (offset < curr ? "skip" : "fill"),
0440                nlen, dire->u.name);
0441 
0442         nr_slots = afs_dir_calc_slots(nlen);
0443         next = offset + nr_slots;
0444         if (next > AFS_DIR_SLOTS_PER_BLOCK) {
0445             _debug("ENT[%zu.%u]:"
0446                    " %u extends beyond end dir block"
0447                    " (len %zu)",
0448                    blkoff / sizeof(union afs_xdr_dir_block),
0449                    offset, next, nlen);
0450             return afs_bad(dvnode, afs_file_error_dir_over_end);
0451         }
0452 
0453         /* Check that the name-extension dirents are all allocated */
0454         for (tmp = 1; tmp < nr_slots; tmp++) {
0455             unsigned int ix = offset + tmp;
0456             if (!(block->hdr.bitmap[ix / 8] & (1 << (ix % 8)))) {
0457                 _debug("ENT[%zu.u]:"
0458                        " %u unmarked extension (%u/%u)",
0459                        blkoff / sizeof(union afs_xdr_dir_block),
0460                        offset, tmp, nr_slots);
0461                 return afs_bad(dvnode, afs_file_error_dir_unmarked_ext);
0462             }
0463         }
0464 
0465         /* skip if starts before the current position */
0466         if (offset < curr) {
0467             if (next > curr)
0468                 ctx->pos = blkoff + next * sizeof(union afs_xdr_dirent);
0469             continue;
0470         }
0471 
0472         /* found the next entry */
0473         if (!dir_emit(ctx, dire->u.name, nlen,
0474                   ntohl(dire->u.vnode),
0475                   (ctx->actor == afs_lookup_filldir ||
0476                    ctx->actor == afs_lookup_one_filldir)?
0477                   ntohl(dire->u.unique) : DT_UNKNOWN)) {
0478             _leave(" = 0 [full]");
0479             return 0;
0480         }
0481 
0482         ctx->pos = blkoff + next * sizeof(union afs_xdr_dirent);
0483     }
0484 
0485     _leave(" = 1 [more]");
0486     return 1;
0487 }
0488 
0489 /*
0490  * iterate through the data blob that lists the contents of an AFS directory
0491  */
0492 static int afs_dir_iterate(struct inode *dir, struct dir_context *ctx,
0493                struct key *key, afs_dataversion_t *_dir_version)
0494 {
0495     struct afs_vnode *dvnode = AFS_FS_I(dir);
0496     union afs_xdr_dir_block *dblock;
0497     struct afs_read *req;
0498     struct folio *folio;
0499     unsigned offset, size;
0500     int ret;
0501 
0502     _enter("{%lu},%u,,", dir->i_ino, (unsigned)ctx->pos);
0503 
0504     if (test_bit(AFS_VNODE_DELETED, &AFS_FS_I(dir)->flags)) {
0505         _leave(" = -ESTALE");
0506         return -ESTALE;
0507     }
0508 
0509     req = afs_read_dir(dvnode, key);
0510     if (IS_ERR(req))
0511         return PTR_ERR(req);
0512     *_dir_version = req->data_version;
0513 
0514     /* round the file position up to the next entry boundary */
0515     ctx->pos += sizeof(union afs_xdr_dirent) - 1;
0516     ctx->pos &= ~(sizeof(union afs_xdr_dirent) - 1);
0517 
0518     /* walk through the blocks in sequence */
0519     ret = 0;
0520     while (ctx->pos < req->actual_len) {
0521         /* Fetch the appropriate folio from the directory and re-add it
0522          * to the LRU.  We have all the pages pinned with an extra ref.
0523          */
0524         folio = __filemap_get_folio(dir->i_mapping, ctx->pos / PAGE_SIZE,
0525                         FGP_ACCESSED, 0);
0526         if (!folio) {
0527             ret = afs_bad(dvnode, afs_file_error_dir_missing_page);
0528             break;
0529         }
0530 
0531         offset = round_down(ctx->pos, sizeof(*dblock)) - folio_file_pos(folio);
0532         size = min_t(loff_t, folio_size(folio),
0533                  req->actual_len - folio_file_pos(folio));
0534 
0535         do {
0536             dblock = kmap_local_folio(folio, offset);
0537             ret = afs_dir_iterate_block(dvnode, ctx, dblock,
0538                             folio_file_pos(folio) + offset);
0539             kunmap_local(dblock);
0540             if (ret != 1)
0541                 goto out;
0542 
0543         } while (offset += sizeof(*dblock), offset < size);
0544 
0545         ret = 0;
0546     }
0547 
0548 out:
0549     up_read(&dvnode->validate_lock);
0550     afs_put_read(req);
0551     _leave(" = %d", ret);
0552     return ret;
0553 }
0554 
0555 /*
0556  * read an AFS directory
0557  */
0558 static int afs_readdir(struct file *file, struct dir_context *ctx)
0559 {
0560     afs_dataversion_t dir_version;
0561 
0562     return afs_dir_iterate(file_inode(file), ctx, afs_file_key(file),
0563                    &dir_version);
0564 }
0565 
0566 /*
0567  * Search the directory for a single name
0568  * - if afs_dir_iterate_block() spots this function, it'll pass the FID
0569  *   uniquifier through dtype
0570  */
0571 static int afs_lookup_one_filldir(struct dir_context *ctx, const char *name,
0572                   int nlen, loff_t fpos, u64 ino, unsigned dtype)
0573 {
0574     struct afs_lookup_one_cookie *cookie =
0575         container_of(ctx, struct afs_lookup_one_cookie, ctx);
0576 
0577     _enter("{%s,%u},%s,%u,,%llu,%u",
0578            cookie->name.name, cookie->name.len, name, nlen,
0579            (unsigned long long) ino, dtype);
0580 
0581     /* insanity checks first */
0582     BUILD_BUG_ON(sizeof(union afs_xdr_dir_block) != 2048);
0583     BUILD_BUG_ON(sizeof(union afs_xdr_dirent) != 32);
0584 
0585     if (cookie->name.len != nlen ||
0586         memcmp(cookie->name.name, name, nlen) != 0) {
0587         _leave(" = 0 [no]");
0588         return 0;
0589     }
0590 
0591     cookie->fid.vnode = ino;
0592     cookie->fid.unique = dtype;
0593     cookie->found = 1;
0594 
0595     _leave(" = -1 [found]");
0596     return -1;
0597 }
0598 
0599 /*
0600  * Do a lookup of a single name in a directory
0601  * - just returns the FID the dentry name maps to if found
0602  */
0603 static int afs_do_lookup_one(struct inode *dir, struct dentry *dentry,
0604                  struct afs_fid *fid, struct key *key,
0605                  afs_dataversion_t *_dir_version)
0606 {
0607     struct afs_super_info *as = dir->i_sb->s_fs_info;
0608     struct afs_lookup_one_cookie cookie = {
0609         .ctx.actor = afs_lookup_one_filldir,
0610         .name = dentry->d_name,
0611         .fid.vid = as->volume->vid
0612     };
0613     int ret;
0614 
0615     _enter("{%lu},%p{%pd},", dir->i_ino, dentry, dentry);
0616 
0617     /* search the directory */
0618     ret = afs_dir_iterate(dir, &cookie.ctx, key, _dir_version);
0619     if (ret < 0) {
0620         _leave(" = %d [iter]", ret);
0621         return ret;
0622     }
0623 
0624     if (!cookie.found) {
0625         _leave(" = -ENOENT [not found]");
0626         return -ENOENT;
0627     }
0628 
0629     *fid = cookie.fid;
0630     _leave(" = 0 { vn=%llu u=%u }", fid->vnode, fid->unique);
0631     return 0;
0632 }
0633 
0634 /*
0635  * search the directory for a name
0636  * - if afs_dir_iterate_block() spots this function, it'll pass the FID
0637  *   uniquifier through dtype
0638  */
0639 static int afs_lookup_filldir(struct dir_context *ctx, const char *name,
0640                   int nlen, loff_t fpos, u64 ino, unsigned dtype)
0641 {
0642     struct afs_lookup_cookie *cookie =
0643         container_of(ctx, struct afs_lookup_cookie, ctx);
0644     int ret;
0645 
0646     _enter("{%s,%u},%s,%u,,%llu,%u",
0647            cookie->name.name, cookie->name.len, name, nlen,
0648            (unsigned long long) ino, dtype);
0649 
0650     /* insanity checks first */
0651     BUILD_BUG_ON(sizeof(union afs_xdr_dir_block) != 2048);
0652     BUILD_BUG_ON(sizeof(union afs_xdr_dirent) != 32);
0653 
0654     if (cookie->found) {
0655         if (cookie->nr_fids < 50) {
0656             cookie->fids[cookie->nr_fids].vnode = ino;
0657             cookie->fids[cookie->nr_fids].unique    = dtype;
0658             cookie->nr_fids++;
0659         }
0660     } else if (cookie->name.len == nlen &&
0661            memcmp(cookie->name.name, name, nlen) == 0) {
0662         cookie->fids[1].vnode   = ino;
0663         cookie->fids[1].unique  = dtype;
0664         cookie->found = 1;
0665         if (cookie->one_only)
0666             return -1;
0667     }
0668 
0669     ret = cookie->nr_fids >= 50 ? -1 : 0;
0670     _leave(" = %d", ret);
0671     return ret;
0672 }
0673 
0674 /*
0675  * Deal with the result of a successful lookup operation.  Turn all the files
0676  * into inodes and save the first one - which is the one we actually want.
0677  */
0678 static void afs_do_lookup_success(struct afs_operation *op)
0679 {
0680     struct afs_vnode_param *vp;
0681     struct afs_vnode *vnode;
0682     struct inode *inode;
0683     u32 abort_code;
0684     int i;
0685 
0686     _enter("");
0687 
0688     for (i = 0; i < op->nr_files; i++) {
0689         switch (i) {
0690         case 0:
0691             vp = &op->file[0];
0692             abort_code = vp->scb.status.abort_code;
0693             if (abort_code != 0) {
0694                 op->ac.abort_code = abort_code;
0695                 op->error = afs_abort_to_error(abort_code);
0696             }
0697             break;
0698 
0699         case 1:
0700             vp = &op->file[1];
0701             break;
0702 
0703         default:
0704             vp = &op->more_files[i - 2];
0705             break;
0706         }
0707 
0708         if (!vp->scb.have_status && !vp->scb.have_error)
0709             continue;
0710 
0711         _debug("do [%u]", i);
0712         if (vp->vnode) {
0713             if (!test_bit(AFS_VNODE_UNSET, &vp->vnode->flags))
0714                 afs_vnode_commit_status(op, vp);
0715         } else if (vp->scb.status.abort_code == 0) {
0716             inode = afs_iget(op, vp);
0717             if (!IS_ERR(inode)) {
0718                 vnode = AFS_FS_I(inode);
0719                 afs_cache_permit(vnode, op->key,
0720                          0 /* Assume vnode->cb_break is 0 */ +
0721                          op->cb_v_break,
0722                          &vp->scb);
0723                 vp->vnode = vnode;
0724                 vp->put_vnode = true;
0725             }
0726         } else {
0727             _debug("- abort %d %llx:%llx.%x",
0728                    vp->scb.status.abort_code,
0729                    vp->fid.vid, vp->fid.vnode, vp->fid.unique);
0730         }
0731     }
0732 
0733     _leave("");
0734 }
0735 
0736 static const struct afs_operation_ops afs_inline_bulk_status_operation = {
0737     .issue_afs_rpc  = afs_fs_inline_bulk_status,
0738     .issue_yfs_rpc  = yfs_fs_inline_bulk_status,
0739     .success    = afs_do_lookup_success,
0740 };
0741 
0742 static const struct afs_operation_ops afs_lookup_fetch_status_operation = {
0743     .issue_afs_rpc  = afs_fs_fetch_status,
0744     .issue_yfs_rpc  = yfs_fs_fetch_status,
0745     .success    = afs_do_lookup_success,
0746     .aborted    = afs_check_for_remote_deletion,
0747 };
0748 
0749 /*
0750  * See if we know that the server we expect to use doesn't support
0751  * FS.InlineBulkStatus.
0752  */
0753 static bool afs_server_supports_ibulk(struct afs_vnode *dvnode)
0754 {
0755     struct afs_server_list *slist;
0756     struct afs_volume *volume = dvnode->volume;
0757     struct afs_server *server;
0758     bool ret = true;
0759     int i;
0760 
0761     if (!test_bit(AFS_VOLUME_MAYBE_NO_IBULK, &volume->flags))
0762         return true;
0763 
0764     rcu_read_lock();
0765     slist = rcu_dereference(volume->servers);
0766 
0767     for (i = 0; i < slist->nr_servers; i++) {
0768         server = slist->servers[i].server;
0769         if (server == dvnode->cb_server) {
0770             if (test_bit(AFS_SERVER_FL_NO_IBULK, &server->flags))
0771                 ret = false;
0772             break;
0773         }
0774     }
0775 
0776     rcu_read_unlock();
0777     return ret;
0778 }
0779 
0780 /*
0781  * Do a lookup in a directory.  We make use of bulk lookup to query a slew of
0782  * files in one go and create inodes for them.  The inode of the file we were
0783  * asked for is returned.
0784  */
0785 static struct inode *afs_do_lookup(struct inode *dir, struct dentry *dentry,
0786                    struct key *key)
0787 {
0788     struct afs_lookup_cookie *cookie;
0789     struct afs_vnode_param *vp;
0790     struct afs_operation *op;
0791     struct afs_vnode *dvnode = AFS_FS_I(dir), *vnode;
0792     struct inode *inode = NULL, *ti;
0793     afs_dataversion_t data_version = READ_ONCE(dvnode->status.data_version);
0794     long ret;
0795     int i;
0796 
0797     _enter("{%lu},%p{%pd},", dir->i_ino, dentry, dentry);
0798 
0799     cookie = kzalloc(sizeof(struct afs_lookup_cookie), GFP_KERNEL);
0800     if (!cookie)
0801         return ERR_PTR(-ENOMEM);
0802 
0803     for (i = 0; i < ARRAY_SIZE(cookie->fids); i++)
0804         cookie->fids[i].vid = dvnode->fid.vid;
0805     cookie->ctx.actor = afs_lookup_filldir;
0806     cookie->name = dentry->d_name;
0807     cookie->nr_fids = 2; /* slot 0 is saved for the fid we actually want
0808                   * and slot 1 for the directory */
0809 
0810     if (!afs_server_supports_ibulk(dvnode))
0811         cookie->one_only = true;
0812 
0813     /* search the directory */
0814     ret = afs_dir_iterate(dir, &cookie->ctx, key, &data_version);
0815     if (ret < 0)
0816         goto out;
0817 
0818     dentry->d_fsdata = (void *)(unsigned long)data_version;
0819 
0820     ret = -ENOENT;
0821     if (!cookie->found)
0822         goto out;
0823 
0824     /* Check to see if we already have an inode for the primary fid. */
0825     inode = ilookup5(dir->i_sb, cookie->fids[1].vnode,
0826              afs_ilookup5_test_by_fid, &cookie->fids[1]);
0827     if (inode)
0828         goto out; /* We do */
0829 
0830     /* Okay, we didn't find it.  We need to query the server - and whilst
0831      * we're doing that, we're going to attempt to look up a bunch of other
0832      * vnodes also.
0833      */
0834     op = afs_alloc_operation(NULL, dvnode->volume);
0835     if (IS_ERR(op)) {
0836         ret = PTR_ERR(op);
0837         goto out;
0838     }
0839 
0840     afs_op_set_vnode(op, 0, dvnode);
0841     afs_op_set_fid(op, 1, &cookie->fids[1]);
0842 
0843     op->nr_files = cookie->nr_fids;
0844     _debug("nr_files %u", op->nr_files);
0845 
0846     /* Need space for examining all the selected files */
0847     op->error = -ENOMEM;
0848     if (op->nr_files > 2) {
0849         op->more_files = kvcalloc(op->nr_files - 2,
0850                       sizeof(struct afs_vnode_param),
0851                       GFP_KERNEL);
0852         if (!op->more_files)
0853             goto out_op;
0854 
0855         for (i = 2; i < op->nr_files; i++) {
0856             vp = &op->more_files[i - 2];
0857             vp->fid = cookie->fids[i];
0858 
0859             /* Find any inodes that already exist and get their
0860              * callback counters.
0861              */
0862             ti = ilookup5_nowait(dir->i_sb, vp->fid.vnode,
0863                          afs_ilookup5_test_by_fid, &vp->fid);
0864             if (!IS_ERR_OR_NULL(ti)) {
0865                 vnode = AFS_FS_I(ti);
0866                 vp->dv_before = vnode->status.data_version;
0867                 vp->cb_break_before = afs_calc_vnode_cb_break(vnode);
0868                 vp->vnode = vnode;
0869                 vp->put_vnode = true;
0870                 vp->speculative = true; /* vnode not locked */
0871             }
0872         }
0873     }
0874 
0875     /* Try FS.InlineBulkStatus first.  Abort codes for the individual
0876      * lookups contained therein are stored in the reply without aborting
0877      * the whole operation.
0878      */
0879     op->error = -ENOTSUPP;
0880     if (!cookie->one_only) {
0881         op->ops = &afs_inline_bulk_status_operation;
0882         afs_begin_vnode_operation(op);
0883         afs_wait_for_operation(op);
0884     }
0885 
0886     if (op->error == -ENOTSUPP) {
0887         /* We could try FS.BulkStatus next, but this aborts the entire
0888          * op if any of the lookups fails - so, for the moment, revert
0889          * to FS.FetchStatus for op->file[1].
0890          */
0891         op->fetch_status.which = 1;
0892         op->ops = &afs_lookup_fetch_status_operation;
0893         afs_begin_vnode_operation(op);
0894         afs_wait_for_operation(op);
0895     }
0896     inode = ERR_PTR(op->error);
0897 
0898 out_op:
0899     if (op->error == 0) {
0900         inode = &op->file[1].vnode->netfs.inode;
0901         op->file[1].vnode = NULL;
0902     }
0903 
0904     if (op->file[0].scb.have_status)
0905         dentry->d_fsdata = (void *)(unsigned long)op->file[0].scb.status.data_version;
0906     else
0907         dentry->d_fsdata = (void *)(unsigned long)op->file[0].dv_before;
0908     ret = afs_put_operation(op);
0909 out:
0910     kfree(cookie);
0911     _leave("");
0912     return inode ?: ERR_PTR(ret);
0913 }
0914 
0915 /*
0916  * Look up an entry in a directory with @sys substitution.
0917  */
0918 static struct dentry *afs_lookup_atsys(struct inode *dir, struct dentry *dentry,
0919                        struct key *key)
0920 {
0921     struct afs_sysnames *subs;
0922     struct afs_net *net = afs_i2net(dir);
0923     struct dentry *ret;
0924     char *buf, *p, *name;
0925     int len, i;
0926 
0927     _enter("");
0928 
0929     ret = ERR_PTR(-ENOMEM);
0930     p = buf = kmalloc(AFSNAMEMAX, GFP_KERNEL);
0931     if (!buf)
0932         goto out_p;
0933     if (dentry->d_name.len > 4) {
0934         memcpy(p, dentry->d_name.name, dentry->d_name.len - 4);
0935         p += dentry->d_name.len - 4;
0936     }
0937 
0938     /* There is an ordered list of substitutes that we have to try. */
0939     read_lock(&net->sysnames_lock);
0940     subs = net->sysnames;
0941     refcount_inc(&subs->usage);
0942     read_unlock(&net->sysnames_lock);
0943 
0944     for (i = 0; i < subs->nr; i++) {
0945         name = subs->subs[i];
0946         len = dentry->d_name.len - 4 + strlen(name);
0947         if (len >= AFSNAMEMAX) {
0948             ret = ERR_PTR(-ENAMETOOLONG);
0949             goto out_s;
0950         }
0951 
0952         strcpy(p, name);
0953         ret = lookup_one_len(buf, dentry->d_parent, len);
0954         if (IS_ERR(ret) || d_is_positive(ret))
0955             goto out_s;
0956         dput(ret);
0957     }
0958 
0959     /* We don't want to d_add() the @sys dentry here as we don't want to
0960      * the cached dentry to hide changes to the sysnames list.
0961      */
0962     ret = NULL;
0963 out_s:
0964     afs_put_sysnames(subs);
0965     kfree(buf);
0966 out_p:
0967     key_put(key);
0968     return ret;
0969 }
0970 
0971 /*
0972  * look up an entry in a directory
0973  */
0974 static struct dentry *afs_lookup(struct inode *dir, struct dentry *dentry,
0975                  unsigned int flags)
0976 {
0977     struct afs_vnode *dvnode = AFS_FS_I(dir);
0978     struct afs_fid fid = {};
0979     struct inode *inode;
0980     struct dentry *d;
0981     struct key *key;
0982     int ret;
0983 
0984     _enter("{%llx:%llu},%p{%pd},",
0985            dvnode->fid.vid, dvnode->fid.vnode, dentry, dentry);
0986 
0987     ASSERTCMP(d_inode(dentry), ==, NULL);
0988 
0989     if (dentry->d_name.len >= AFSNAMEMAX) {
0990         _leave(" = -ENAMETOOLONG");
0991         return ERR_PTR(-ENAMETOOLONG);
0992     }
0993 
0994     if (test_bit(AFS_VNODE_DELETED, &dvnode->flags)) {
0995         _leave(" = -ESTALE");
0996         return ERR_PTR(-ESTALE);
0997     }
0998 
0999     key = afs_request_key(dvnode->volume->cell);
1000     if (IS_ERR(key)) {
1001         _leave(" = %ld [key]", PTR_ERR(key));
1002         return ERR_CAST(key);
1003     }
1004 
1005     ret = afs_validate(dvnode, key);
1006     if (ret < 0) {
1007         key_put(key);
1008         _leave(" = %d [val]", ret);
1009         return ERR_PTR(ret);
1010     }
1011 
1012     if (dentry->d_name.len >= 4 &&
1013         dentry->d_name.name[dentry->d_name.len - 4] == '@' &&
1014         dentry->d_name.name[dentry->d_name.len - 3] == 's' &&
1015         dentry->d_name.name[dentry->d_name.len - 2] == 'y' &&
1016         dentry->d_name.name[dentry->d_name.len - 1] == 's')
1017         return afs_lookup_atsys(dir, dentry, key);
1018 
1019     afs_stat_v(dvnode, n_lookup);
1020     inode = afs_do_lookup(dir, dentry, key);
1021     key_put(key);
1022     if (inode == ERR_PTR(-ENOENT))
1023         inode = afs_try_auto_mntpt(dentry, dir);
1024 
1025     if (!IS_ERR_OR_NULL(inode))
1026         fid = AFS_FS_I(inode)->fid;
1027 
1028     _debug("splice %p", dentry->d_inode);
1029     d = d_splice_alias(inode, dentry);
1030     if (!IS_ERR_OR_NULL(d)) {
1031         d->d_fsdata = dentry->d_fsdata;
1032         trace_afs_lookup(dvnode, &d->d_name, &fid);
1033     } else {
1034         trace_afs_lookup(dvnode, &dentry->d_name, &fid);
1035     }
1036     _leave("");
1037     return d;
1038 }
1039 
1040 /*
1041  * Check the validity of a dentry under RCU conditions.
1042  */
1043 static int afs_d_revalidate_rcu(struct dentry *dentry)
1044 {
1045     struct afs_vnode *dvnode;
1046     struct dentry *parent;
1047     struct inode *dir;
1048     long dir_version, de_version;
1049 
1050     _enter("%p", dentry);
1051 
1052     /* Check the parent directory is still valid first. */
1053     parent = READ_ONCE(dentry->d_parent);
1054     dir = d_inode_rcu(parent);
1055     if (!dir)
1056         return -ECHILD;
1057     dvnode = AFS_FS_I(dir);
1058     if (test_bit(AFS_VNODE_DELETED, &dvnode->flags))
1059         return -ECHILD;
1060 
1061     if (!afs_check_validity(dvnode))
1062         return -ECHILD;
1063 
1064     /* We only need to invalidate a dentry if the server's copy changed
1065      * behind our back.  If we made the change, it's no problem.  Note that
1066      * on a 32-bit system, we only have 32 bits in the dentry to store the
1067      * version.
1068      */
1069     dir_version = (long)READ_ONCE(dvnode->status.data_version);
1070     de_version = (long)READ_ONCE(dentry->d_fsdata);
1071     if (de_version != dir_version) {
1072         dir_version = (long)READ_ONCE(dvnode->invalid_before);
1073         if (de_version - dir_version < 0)
1074             return -ECHILD;
1075     }
1076 
1077     return 1; /* Still valid */
1078 }
1079 
1080 /*
1081  * check that a dentry lookup hit has found a valid entry
1082  * - NOTE! the hit can be a negative hit too, so we can't assume we have an
1083  *   inode
1084  */
1085 static int afs_d_revalidate(struct dentry *dentry, unsigned int flags)
1086 {
1087     struct afs_vnode *vnode, *dir;
1088     struct afs_fid fid;
1089     struct dentry *parent;
1090     struct inode *inode;
1091     struct key *key;
1092     afs_dataversion_t dir_version, invalid_before;
1093     long de_version;
1094     int ret;
1095 
1096     if (flags & LOOKUP_RCU)
1097         return afs_d_revalidate_rcu(dentry);
1098 
1099     if (d_really_is_positive(dentry)) {
1100         vnode = AFS_FS_I(d_inode(dentry));
1101         _enter("{v={%llx:%llu} n=%pd fl=%lx},",
1102                vnode->fid.vid, vnode->fid.vnode, dentry,
1103                vnode->flags);
1104     } else {
1105         _enter("{neg n=%pd}", dentry);
1106     }
1107 
1108     key = afs_request_key(AFS_FS_S(dentry->d_sb)->volume->cell);
1109     if (IS_ERR(key))
1110         key = NULL;
1111 
1112     /* Hold the parent dentry so we can peer at it */
1113     parent = dget_parent(dentry);
1114     dir = AFS_FS_I(d_inode(parent));
1115 
1116     /* validate the parent directory */
1117     afs_validate(dir, key);
1118 
1119     if (test_bit(AFS_VNODE_DELETED, &dir->flags)) {
1120         _debug("%pd: parent dir deleted", dentry);
1121         goto not_found;
1122     }
1123 
1124     /* We only need to invalidate a dentry if the server's copy changed
1125      * behind our back.  If we made the change, it's no problem.  Note that
1126      * on a 32-bit system, we only have 32 bits in the dentry to store the
1127      * version.
1128      */
1129     dir_version = dir->status.data_version;
1130     de_version = (long)dentry->d_fsdata;
1131     if (de_version == (long)dir_version)
1132         goto out_valid_noupdate;
1133 
1134     invalid_before = dir->invalid_before;
1135     if (de_version - (long)invalid_before >= 0)
1136         goto out_valid;
1137 
1138     _debug("dir modified");
1139     afs_stat_v(dir, n_reval);
1140 
1141     /* search the directory for this vnode */
1142     ret = afs_do_lookup_one(&dir->netfs.inode, dentry, &fid, key, &dir_version);
1143     switch (ret) {
1144     case 0:
1145         /* the filename maps to something */
1146         if (d_really_is_negative(dentry))
1147             goto not_found;
1148         inode = d_inode(dentry);
1149         if (is_bad_inode(inode)) {
1150             printk("kAFS: afs_d_revalidate: %pd2 has bad inode\n",
1151                    dentry);
1152             goto not_found;
1153         }
1154 
1155         vnode = AFS_FS_I(inode);
1156 
1157         /* if the vnode ID has changed, then the dirent points to a
1158          * different file */
1159         if (fid.vnode != vnode->fid.vnode) {
1160             _debug("%pd: dirent changed [%llu != %llu]",
1161                    dentry, fid.vnode,
1162                    vnode->fid.vnode);
1163             goto not_found;
1164         }
1165 
1166         /* if the vnode ID uniqifier has changed, then the file has
1167          * been deleted and replaced, and the original vnode ID has
1168          * been reused */
1169         if (fid.unique != vnode->fid.unique) {
1170             _debug("%pd: file deleted (uq %u -> %u I:%u)",
1171                    dentry, fid.unique,
1172                    vnode->fid.unique,
1173                    vnode->netfs.inode.i_generation);
1174             goto not_found;
1175         }
1176         goto out_valid;
1177 
1178     case -ENOENT:
1179         /* the filename is unknown */
1180         _debug("%pd: dirent not found", dentry);
1181         if (d_really_is_positive(dentry))
1182             goto not_found;
1183         goto out_valid;
1184 
1185     default:
1186         _debug("failed to iterate dir %pd: %d",
1187                parent, ret);
1188         goto not_found;
1189     }
1190 
1191 out_valid:
1192     dentry->d_fsdata = (void *)(unsigned long)dir_version;
1193 out_valid_noupdate:
1194     dput(parent);
1195     key_put(key);
1196     _leave(" = 1 [valid]");
1197     return 1;
1198 
1199 not_found:
1200     _debug("dropping dentry %pd2", dentry);
1201     dput(parent);
1202     key_put(key);
1203 
1204     _leave(" = 0 [bad]");
1205     return 0;
1206 }
1207 
1208 /*
1209  * allow the VFS to enquire as to whether a dentry should be unhashed (mustn't
1210  * sleep)
1211  * - called from dput() when d_count is going to 0.
1212  * - return 1 to request dentry be unhashed, 0 otherwise
1213  */
1214 static int afs_d_delete(const struct dentry *dentry)
1215 {
1216     _enter("%pd", dentry);
1217 
1218     if (dentry->d_flags & DCACHE_NFSFS_RENAMED)
1219         goto zap;
1220 
1221     if (d_really_is_positive(dentry) &&
1222         (test_bit(AFS_VNODE_DELETED,   &AFS_FS_I(d_inode(dentry))->flags) ||
1223          test_bit(AFS_VNODE_PSEUDODIR, &AFS_FS_I(d_inode(dentry))->flags)))
1224         goto zap;
1225 
1226     _leave(" = 0 [keep]");
1227     return 0;
1228 
1229 zap:
1230     _leave(" = 1 [zap]");
1231     return 1;
1232 }
1233 
1234 /*
1235  * Clean up sillyrename files on dentry removal.
1236  */
1237 static void afs_d_iput(struct dentry *dentry, struct inode *inode)
1238 {
1239     if (dentry->d_flags & DCACHE_NFSFS_RENAMED)
1240         afs_silly_iput(dentry, inode);
1241     iput(inode);
1242 }
1243 
1244 /*
1245  * handle dentry release
1246  */
1247 void afs_d_release(struct dentry *dentry)
1248 {
1249     _enter("%pd", dentry);
1250 }
1251 
1252 void afs_check_for_remote_deletion(struct afs_operation *op)
1253 {
1254     struct afs_vnode *vnode = op->file[0].vnode;
1255 
1256     switch (op->ac.abort_code) {
1257     case VNOVNODE:
1258         set_bit(AFS_VNODE_DELETED, &vnode->flags);
1259         afs_break_callback(vnode, afs_cb_break_for_deleted);
1260     }
1261 }
1262 
1263 /*
1264  * Create a new inode for create/mkdir/symlink
1265  */
1266 static void afs_vnode_new_inode(struct afs_operation *op)
1267 {
1268     struct afs_vnode_param *vp = &op->file[1];
1269     struct afs_vnode *vnode;
1270     struct inode *inode;
1271 
1272     _enter("");
1273 
1274     ASSERTCMP(op->error, ==, 0);
1275 
1276     inode = afs_iget(op, vp);
1277     if (IS_ERR(inode)) {
1278         /* ENOMEM or EINTR at a really inconvenient time - just abandon
1279          * the new directory on the server.
1280          */
1281         op->error = PTR_ERR(inode);
1282         return;
1283     }
1284 
1285     vnode = AFS_FS_I(inode);
1286     set_bit(AFS_VNODE_NEW_CONTENT, &vnode->flags);
1287     if (!op->error)
1288         afs_cache_permit(vnode, op->key, vnode->cb_break, &vp->scb);
1289     d_instantiate(op->dentry, inode);
1290 }
1291 
1292 static void afs_create_success(struct afs_operation *op)
1293 {
1294     _enter("op=%08x", op->debug_id);
1295     op->ctime = op->file[0].scb.status.mtime_client;
1296     afs_vnode_commit_status(op, &op->file[0]);
1297     afs_update_dentry_version(op, &op->file[0], op->dentry);
1298     afs_vnode_new_inode(op);
1299 }
1300 
1301 static void afs_create_edit_dir(struct afs_operation *op)
1302 {
1303     struct afs_vnode_param *dvp = &op->file[0];
1304     struct afs_vnode_param *vp = &op->file[1];
1305     struct afs_vnode *dvnode = dvp->vnode;
1306 
1307     _enter("op=%08x", op->debug_id);
1308 
1309     down_write(&dvnode->validate_lock);
1310     if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags) &&
1311         dvnode->status.data_version == dvp->dv_before + dvp->dv_delta)
1312         afs_edit_dir_add(dvnode, &op->dentry->d_name, &vp->fid,
1313                  op->create.reason);
1314     up_write(&dvnode->validate_lock);
1315 }
1316 
1317 static void afs_create_put(struct afs_operation *op)
1318 {
1319     _enter("op=%08x", op->debug_id);
1320 
1321     if (op->error)
1322         d_drop(op->dentry);
1323 }
1324 
1325 static const struct afs_operation_ops afs_mkdir_operation = {
1326     .issue_afs_rpc  = afs_fs_make_dir,
1327     .issue_yfs_rpc  = yfs_fs_make_dir,
1328     .success    = afs_create_success,
1329     .aborted    = afs_check_for_remote_deletion,
1330     .edit_dir   = afs_create_edit_dir,
1331     .put        = afs_create_put,
1332 };
1333 
1334 /*
1335  * create a directory on an AFS filesystem
1336  */
1337 static int afs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
1338              struct dentry *dentry, umode_t mode)
1339 {
1340     struct afs_operation *op;
1341     struct afs_vnode *dvnode = AFS_FS_I(dir);
1342 
1343     _enter("{%llx:%llu},{%pd},%ho",
1344            dvnode->fid.vid, dvnode->fid.vnode, dentry, mode);
1345 
1346     op = afs_alloc_operation(NULL, dvnode->volume);
1347     if (IS_ERR(op)) {
1348         d_drop(dentry);
1349         return PTR_ERR(op);
1350     }
1351 
1352     afs_op_set_vnode(op, 0, dvnode);
1353     op->file[0].dv_delta = 1;
1354     op->file[0].modification = true;
1355     op->file[0].update_ctime = true;
1356     op->dentry  = dentry;
1357     op->create.mode = S_IFDIR | mode;
1358     op->create.reason = afs_edit_dir_for_mkdir;
1359     op->ops     = &afs_mkdir_operation;
1360     return afs_do_sync_operation(op);
1361 }
1362 
1363 /*
1364  * Remove a subdir from a directory.
1365  */
1366 static void afs_dir_remove_subdir(struct dentry *dentry)
1367 {
1368     if (d_really_is_positive(dentry)) {
1369         struct afs_vnode *vnode = AFS_FS_I(d_inode(dentry));
1370 
1371         clear_nlink(&vnode->netfs.inode);
1372         set_bit(AFS_VNODE_DELETED, &vnode->flags);
1373         clear_bit(AFS_VNODE_CB_PROMISED, &vnode->flags);
1374         clear_bit(AFS_VNODE_DIR_VALID, &vnode->flags);
1375     }
1376 }
1377 
1378 static void afs_rmdir_success(struct afs_operation *op)
1379 {
1380     _enter("op=%08x", op->debug_id);
1381     op->ctime = op->file[0].scb.status.mtime_client;
1382     afs_vnode_commit_status(op, &op->file[0]);
1383     afs_update_dentry_version(op, &op->file[0], op->dentry);
1384 }
1385 
1386 static void afs_rmdir_edit_dir(struct afs_operation *op)
1387 {
1388     struct afs_vnode_param *dvp = &op->file[0];
1389     struct afs_vnode *dvnode = dvp->vnode;
1390 
1391     _enter("op=%08x", op->debug_id);
1392     afs_dir_remove_subdir(op->dentry);
1393 
1394     down_write(&dvnode->validate_lock);
1395     if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags) &&
1396         dvnode->status.data_version == dvp->dv_before + dvp->dv_delta)
1397         afs_edit_dir_remove(dvnode, &op->dentry->d_name,
1398                     afs_edit_dir_for_rmdir);
1399     up_write(&dvnode->validate_lock);
1400 }
1401 
1402 static void afs_rmdir_put(struct afs_operation *op)
1403 {
1404     _enter("op=%08x", op->debug_id);
1405     if (op->file[1].vnode)
1406         up_write(&op->file[1].vnode->rmdir_lock);
1407 }
1408 
1409 static const struct afs_operation_ops afs_rmdir_operation = {
1410     .issue_afs_rpc  = afs_fs_remove_dir,
1411     .issue_yfs_rpc  = yfs_fs_remove_dir,
1412     .success    = afs_rmdir_success,
1413     .aborted    = afs_check_for_remote_deletion,
1414     .edit_dir   = afs_rmdir_edit_dir,
1415     .put        = afs_rmdir_put,
1416 };
1417 
1418 /*
1419  * remove a directory from an AFS filesystem
1420  */
1421 static int afs_rmdir(struct inode *dir, struct dentry *dentry)
1422 {
1423     struct afs_operation *op;
1424     struct afs_vnode *dvnode = AFS_FS_I(dir), *vnode = NULL;
1425     int ret;
1426 
1427     _enter("{%llx:%llu},{%pd}",
1428            dvnode->fid.vid, dvnode->fid.vnode, dentry);
1429 
1430     op = afs_alloc_operation(NULL, dvnode->volume);
1431     if (IS_ERR(op))
1432         return PTR_ERR(op);
1433 
1434     afs_op_set_vnode(op, 0, dvnode);
1435     op->file[0].dv_delta = 1;
1436     op->file[0].modification = true;
1437     op->file[0].update_ctime = true;
1438 
1439     op->dentry  = dentry;
1440     op->ops     = &afs_rmdir_operation;
1441 
1442     /* Try to make sure we have a callback promise on the victim. */
1443     if (d_really_is_positive(dentry)) {
1444         vnode = AFS_FS_I(d_inode(dentry));
1445         ret = afs_validate(vnode, op->key);
1446         if (ret < 0)
1447             goto error;
1448     }
1449 
1450     if (vnode) {
1451         ret = down_write_killable(&vnode->rmdir_lock);
1452         if (ret < 0)
1453             goto error;
1454         op->file[1].vnode = vnode;
1455     }
1456 
1457     return afs_do_sync_operation(op);
1458 
1459 error:
1460     return afs_put_operation(op);
1461 }
1462 
1463 /*
1464  * Remove a link to a file or symlink from a directory.
1465  *
1466  * If the file was not deleted due to excess hard links, the fileserver will
1467  * break the callback promise on the file - if it had one - before it returns
1468  * to us, and if it was deleted, it won't
1469  *
1470  * However, if we didn't have a callback promise outstanding, or it was
1471  * outstanding on a different server, then it won't break it either...
1472  */
1473 static void afs_dir_remove_link(struct afs_operation *op)
1474 {
1475     struct afs_vnode *dvnode = op->file[0].vnode;
1476     struct afs_vnode *vnode = op->file[1].vnode;
1477     struct dentry *dentry = op->dentry;
1478     int ret;
1479 
1480     if (op->error != 0 ||
1481         (op->file[1].scb.have_status && op->file[1].scb.have_error))
1482         return;
1483     if (d_really_is_positive(dentry))
1484         return;
1485 
1486     if (test_bit(AFS_VNODE_DELETED, &vnode->flags)) {
1487         /* Already done */
1488     } else if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags)) {
1489         write_seqlock(&vnode->cb_lock);
1490         drop_nlink(&vnode->netfs.inode);
1491         if (vnode->netfs.inode.i_nlink == 0) {
1492             set_bit(AFS_VNODE_DELETED, &vnode->flags);
1493             __afs_break_callback(vnode, afs_cb_break_for_unlink);
1494         }
1495         write_sequnlock(&vnode->cb_lock);
1496     } else {
1497         afs_break_callback(vnode, afs_cb_break_for_unlink);
1498 
1499         if (test_bit(AFS_VNODE_DELETED, &vnode->flags))
1500             _debug("AFS_VNODE_DELETED");
1501 
1502         ret = afs_validate(vnode, op->key);
1503         if (ret != -ESTALE)
1504             op->error = ret;
1505     }
1506 
1507     _debug("nlink %d [val %d]", vnode->netfs.inode.i_nlink, op->error);
1508 }
1509 
1510 static void afs_unlink_success(struct afs_operation *op)
1511 {
1512     _enter("op=%08x", op->debug_id);
1513     op->ctime = op->file[0].scb.status.mtime_client;
1514     afs_check_dir_conflict(op, &op->file[0]);
1515     afs_vnode_commit_status(op, &op->file[0]);
1516     afs_vnode_commit_status(op, &op->file[1]);
1517     afs_update_dentry_version(op, &op->file[0], op->dentry);
1518     afs_dir_remove_link(op);
1519 }
1520 
1521 static void afs_unlink_edit_dir(struct afs_operation *op)
1522 {
1523     struct afs_vnode_param *dvp = &op->file[0];
1524     struct afs_vnode *dvnode = dvp->vnode;
1525 
1526     _enter("op=%08x", op->debug_id);
1527     down_write(&dvnode->validate_lock);
1528     if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags) &&
1529         dvnode->status.data_version == dvp->dv_before + dvp->dv_delta)
1530         afs_edit_dir_remove(dvnode, &op->dentry->d_name,
1531                     afs_edit_dir_for_unlink);
1532     up_write(&dvnode->validate_lock);
1533 }
1534 
1535 static void afs_unlink_put(struct afs_operation *op)
1536 {
1537     _enter("op=%08x", op->debug_id);
1538     if (op->unlink.need_rehash && op->error < 0 && op->error != -ENOENT)
1539         d_rehash(op->dentry);
1540 }
1541 
1542 static const struct afs_operation_ops afs_unlink_operation = {
1543     .issue_afs_rpc  = afs_fs_remove_file,
1544     .issue_yfs_rpc  = yfs_fs_remove_file,
1545     .success    = afs_unlink_success,
1546     .aborted    = afs_check_for_remote_deletion,
1547     .edit_dir   = afs_unlink_edit_dir,
1548     .put        = afs_unlink_put,
1549 };
1550 
1551 /*
1552  * Remove a file or symlink from an AFS filesystem.
1553  */
1554 static int afs_unlink(struct inode *dir, struct dentry *dentry)
1555 {
1556     struct afs_operation *op;
1557     struct afs_vnode *dvnode = AFS_FS_I(dir);
1558     struct afs_vnode *vnode = AFS_FS_I(d_inode(dentry));
1559     int ret;
1560 
1561     _enter("{%llx:%llu},{%pd}",
1562            dvnode->fid.vid, dvnode->fid.vnode, dentry);
1563 
1564     if (dentry->d_name.len >= AFSNAMEMAX)
1565         return -ENAMETOOLONG;
1566 
1567     op = afs_alloc_operation(NULL, dvnode->volume);
1568     if (IS_ERR(op))
1569         return PTR_ERR(op);
1570 
1571     afs_op_set_vnode(op, 0, dvnode);
1572     op->file[0].dv_delta = 1;
1573     op->file[0].modification = true;
1574     op->file[0].update_ctime = true;
1575 
1576     /* Try to make sure we have a callback promise on the victim. */
1577     ret = afs_validate(vnode, op->key);
1578     if (ret < 0) {
1579         op->error = ret;
1580         goto error;
1581     }
1582 
1583     spin_lock(&dentry->d_lock);
1584     if (d_count(dentry) > 1) {
1585         spin_unlock(&dentry->d_lock);
1586         /* Start asynchronous writeout of the inode */
1587         write_inode_now(d_inode(dentry), 0);
1588         op->error = afs_sillyrename(dvnode, vnode, dentry, op->key);
1589         goto error;
1590     }
1591     if (!d_unhashed(dentry)) {
1592         /* Prevent a race with RCU lookup. */
1593         __d_drop(dentry);
1594         op->unlink.need_rehash = true;
1595     }
1596     spin_unlock(&dentry->d_lock);
1597 
1598     op->file[1].vnode = vnode;
1599     op->file[1].update_ctime = true;
1600     op->file[1].op_unlinked = true;
1601     op->dentry  = dentry;
1602     op->ops     = &afs_unlink_operation;
1603     afs_begin_vnode_operation(op);
1604     afs_wait_for_operation(op);
1605 
1606     /* If there was a conflict with a third party, check the status of the
1607      * unlinked vnode.
1608      */
1609     if (op->error == 0 && (op->flags & AFS_OPERATION_DIR_CONFLICT)) {
1610         op->file[1].update_ctime = false;
1611         op->fetch_status.which = 1;
1612         op->ops = &afs_fetch_status_operation;
1613         afs_begin_vnode_operation(op);
1614         afs_wait_for_operation(op);
1615     }
1616 
1617     return afs_put_operation(op);
1618 
1619 error:
1620     return afs_put_operation(op);
1621 }
1622 
1623 static const struct afs_operation_ops afs_create_operation = {
1624     .issue_afs_rpc  = afs_fs_create_file,
1625     .issue_yfs_rpc  = yfs_fs_create_file,
1626     .success    = afs_create_success,
1627     .aborted    = afs_check_for_remote_deletion,
1628     .edit_dir   = afs_create_edit_dir,
1629     .put        = afs_create_put,
1630 };
1631 
1632 /*
1633  * create a regular file on an AFS filesystem
1634  */
1635 static int afs_create(struct user_namespace *mnt_userns, struct inode *dir,
1636               struct dentry *dentry, umode_t mode, bool excl)
1637 {
1638     struct afs_operation *op;
1639     struct afs_vnode *dvnode = AFS_FS_I(dir);
1640     int ret = -ENAMETOOLONG;
1641 
1642     _enter("{%llx:%llu},{%pd},%ho",
1643            dvnode->fid.vid, dvnode->fid.vnode, dentry, mode);
1644 
1645     if (dentry->d_name.len >= AFSNAMEMAX)
1646         goto error;
1647 
1648     op = afs_alloc_operation(NULL, dvnode->volume);
1649     if (IS_ERR(op)) {
1650         ret = PTR_ERR(op);
1651         goto error;
1652     }
1653 
1654     afs_op_set_vnode(op, 0, dvnode);
1655     op->file[0].dv_delta = 1;
1656     op->file[0].modification = true;
1657     op->file[0].update_ctime = true;
1658 
1659     op->dentry  = dentry;
1660     op->create.mode = S_IFREG | mode;
1661     op->create.reason = afs_edit_dir_for_create;
1662     op->ops     = &afs_create_operation;
1663     return afs_do_sync_operation(op);
1664 
1665 error:
1666     d_drop(dentry);
1667     _leave(" = %d", ret);
1668     return ret;
1669 }
1670 
1671 static void afs_link_success(struct afs_operation *op)
1672 {
1673     struct afs_vnode_param *dvp = &op->file[0];
1674     struct afs_vnode_param *vp = &op->file[1];
1675 
1676     _enter("op=%08x", op->debug_id);
1677     op->ctime = dvp->scb.status.mtime_client;
1678     afs_vnode_commit_status(op, dvp);
1679     afs_vnode_commit_status(op, vp);
1680     afs_update_dentry_version(op, dvp, op->dentry);
1681     if (op->dentry_2->d_parent == op->dentry->d_parent)
1682         afs_update_dentry_version(op, dvp, op->dentry_2);
1683     ihold(&vp->vnode->netfs.inode);
1684     d_instantiate(op->dentry, &vp->vnode->netfs.inode);
1685 }
1686 
1687 static void afs_link_put(struct afs_operation *op)
1688 {
1689     _enter("op=%08x", op->debug_id);
1690     if (op->error)
1691         d_drop(op->dentry);
1692 }
1693 
1694 static const struct afs_operation_ops afs_link_operation = {
1695     .issue_afs_rpc  = afs_fs_link,
1696     .issue_yfs_rpc  = yfs_fs_link,
1697     .success    = afs_link_success,
1698     .aborted    = afs_check_for_remote_deletion,
1699     .edit_dir   = afs_create_edit_dir,
1700     .put        = afs_link_put,
1701 };
1702 
1703 /*
1704  * create a hard link between files in an AFS filesystem
1705  */
1706 static int afs_link(struct dentry *from, struct inode *dir,
1707             struct dentry *dentry)
1708 {
1709     struct afs_operation *op;
1710     struct afs_vnode *dvnode = AFS_FS_I(dir);
1711     struct afs_vnode *vnode = AFS_FS_I(d_inode(from));
1712     int ret = -ENAMETOOLONG;
1713 
1714     _enter("{%llx:%llu},{%llx:%llu},{%pd}",
1715            vnode->fid.vid, vnode->fid.vnode,
1716            dvnode->fid.vid, dvnode->fid.vnode,
1717            dentry);
1718 
1719     if (dentry->d_name.len >= AFSNAMEMAX)
1720         goto error;
1721 
1722     op = afs_alloc_operation(NULL, dvnode->volume);
1723     if (IS_ERR(op)) {
1724         ret = PTR_ERR(op);
1725         goto error;
1726     }
1727 
1728     ret = afs_validate(vnode, op->key);
1729     if (ret < 0)
1730         goto error_op;
1731 
1732     afs_op_set_vnode(op, 0, dvnode);
1733     afs_op_set_vnode(op, 1, vnode);
1734     op->file[0].dv_delta = 1;
1735     op->file[0].modification = true;
1736     op->file[0].update_ctime = true;
1737     op->file[1].update_ctime = true;
1738 
1739     op->dentry      = dentry;
1740     op->dentry_2        = from;
1741     op->ops         = &afs_link_operation;
1742     op->create.reason   = afs_edit_dir_for_link;
1743     return afs_do_sync_operation(op);
1744 
1745 error_op:
1746     afs_put_operation(op);
1747 error:
1748     d_drop(dentry);
1749     _leave(" = %d", ret);
1750     return ret;
1751 }
1752 
1753 static const struct afs_operation_ops afs_symlink_operation = {
1754     .issue_afs_rpc  = afs_fs_symlink,
1755     .issue_yfs_rpc  = yfs_fs_symlink,
1756     .success    = afs_create_success,
1757     .aborted    = afs_check_for_remote_deletion,
1758     .edit_dir   = afs_create_edit_dir,
1759     .put        = afs_create_put,
1760 };
1761 
1762 /*
1763  * create a symlink in an AFS filesystem
1764  */
1765 static int afs_symlink(struct user_namespace *mnt_userns, struct inode *dir,
1766                struct dentry *dentry, const char *content)
1767 {
1768     struct afs_operation *op;
1769     struct afs_vnode *dvnode = AFS_FS_I(dir);
1770     int ret;
1771 
1772     _enter("{%llx:%llu},{%pd},%s",
1773            dvnode->fid.vid, dvnode->fid.vnode, dentry,
1774            content);
1775 
1776     ret = -ENAMETOOLONG;
1777     if (dentry->d_name.len >= AFSNAMEMAX)
1778         goto error;
1779 
1780     ret = -EINVAL;
1781     if (strlen(content) >= AFSPATHMAX)
1782         goto error;
1783 
1784     op = afs_alloc_operation(NULL, dvnode->volume);
1785     if (IS_ERR(op)) {
1786         ret = PTR_ERR(op);
1787         goto error;
1788     }
1789 
1790     afs_op_set_vnode(op, 0, dvnode);
1791     op->file[0].dv_delta = 1;
1792 
1793     op->dentry      = dentry;
1794     op->ops         = &afs_symlink_operation;
1795     op->create.reason   = afs_edit_dir_for_symlink;
1796     op->create.symlink  = content;
1797     return afs_do_sync_operation(op);
1798 
1799 error:
1800     d_drop(dentry);
1801     _leave(" = %d", ret);
1802     return ret;
1803 }
1804 
1805 static void afs_rename_success(struct afs_operation *op)
1806 {
1807     _enter("op=%08x", op->debug_id);
1808 
1809     op->ctime = op->file[0].scb.status.mtime_client;
1810     afs_check_dir_conflict(op, &op->file[1]);
1811     afs_vnode_commit_status(op, &op->file[0]);
1812     if (op->file[1].vnode != op->file[0].vnode) {
1813         op->ctime = op->file[1].scb.status.mtime_client;
1814         afs_vnode_commit_status(op, &op->file[1]);
1815     }
1816 }
1817 
1818 static void afs_rename_edit_dir(struct afs_operation *op)
1819 {
1820     struct afs_vnode_param *orig_dvp = &op->file[0];
1821     struct afs_vnode_param *new_dvp = &op->file[1];
1822     struct afs_vnode *orig_dvnode = orig_dvp->vnode;
1823     struct afs_vnode *new_dvnode = new_dvp->vnode;
1824     struct afs_vnode *vnode = AFS_FS_I(d_inode(op->dentry));
1825     struct dentry *old_dentry = op->dentry;
1826     struct dentry *new_dentry = op->dentry_2;
1827     struct inode *new_inode;
1828 
1829     _enter("op=%08x", op->debug_id);
1830 
1831     if (op->rename.rehash) {
1832         d_rehash(op->rename.rehash);
1833         op->rename.rehash = NULL;
1834     }
1835 
1836     down_write(&orig_dvnode->validate_lock);
1837     if (test_bit(AFS_VNODE_DIR_VALID, &orig_dvnode->flags) &&
1838         orig_dvnode->status.data_version == orig_dvp->dv_before + orig_dvp->dv_delta)
1839         afs_edit_dir_remove(orig_dvnode, &old_dentry->d_name,
1840                     afs_edit_dir_for_rename_0);
1841 
1842     if (new_dvnode != orig_dvnode) {
1843         up_write(&orig_dvnode->validate_lock);
1844         down_write(&new_dvnode->validate_lock);
1845     }
1846 
1847     if (test_bit(AFS_VNODE_DIR_VALID, &new_dvnode->flags) &&
1848         new_dvnode->status.data_version == new_dvp->dv_before + new_dvp->dv_delta) {
1849         if (!op->rename.new_negative)
1850             afs_edit_dir_remove(new_dvnode, &new_dentry->d_name,
1851                         afs_edit_dir_for_rename_1);
1852 
1853         afs_edit_dir_add(new_dvnode, &new_dentry->d_name,
1854                  &vnode->fid, afs_edit_dir_for_rename_2);
1855     }
1856 
1857     new_inode = d_inode(new_dentry);
1858     if (new_inode) {
1859         spin_lock(&new_inode->i_lock);
1860         if (S_ISDIR(new_inode->i_mode))
1861             clear_nlink(new_inode);
1862         else if (new_inode->i_nlink > 0)
1863             drop_nlink(new_inode);
1864         spin_unlock(&new_inode->i_lock);
1865     }
1866 
1867     /* Now we can update d_fsdata on the dentries to reflect their
1868      * new parent's data_version.
1869      *
1870      * Note that if we ever implement RENAME_EXCHANGE, we'll have
1871      * to update both dentries with opposing dir versions.
1872      */
1873     afs_update_dentry_version(op, new_dvp, op->dentry);
1874     afs_update_dentry_version(op, new_dvp, op->dentry_2);
1875 
1876     d_move(old_dentry, new_dentry);
1877 
1878     up_write(&new_dvnode->validate_lock);
1879 }
1880 
1881 static void afs_rename_put(struct afs_operation *op)
1882 {
1883     _enter("op=%08x", op->debug_id);
1884     if (op->rename.rehash)
1885         d_rehash(op->rename.rehash);
1886     dput(op->rename.tmp);
1887     if (op->error)
1888         d_rehash(op->dentry);
1889 }
1890 
1891 static const struct afs_operation_ops afs_rename_operation = {
1892     .issue_afs_rpc  = afs_fs_rename,
1893     .issue_yfs_rpc  = yfs_fs_rename,
1894     .success    = afs_rename_success,
1895     .edit_dir   = afs_rename_edit_dir,
1896     .put        = afs_rename_put,
1897 };
1898 
1899 /*
1900  * rename a file in an AFS filesystem and/or move it between directories
1901  */
1902 static int afs_rename(struct user_namespace *mnt_userns, struct inode *old_dir,
1903               struct dentry *old_dentry, struct inode *new_dir,
1904               struct dentry *new_dentry, unsigned int flags)
1905 {
1906     struct afs_operation *op;
1907     struct afs_vnode *orig_dvnode, *new_dvnode, *vnode;
1908     int ret;
1909 
1910     if (flags)
1911         return -EINVAL;
1912 
1913     /* Don't allow silly-rename files be moved around. */
1914     if (old_dentry->d_flags & DCACHE_NFSFS_RENAMED)
1915         return -EINVAL;
1916 
1917     vnode = AFS_FS_I(d_inode(old_dentry));
1918     orig_dvnode = AFS_FS_I(old_dir);
1919     new_dvnode = AFS_FS_I(new_dir);
1920 
1921     _enter("{%llx:%llu},{%llx:%llu},{%llx:%llu},{%pd}",
1922            orig_dvnode->fid.vid, orig_dvnode->fid.vnode,
1923            vnode->fid.vid, vnode->fid.vnode,
1924            new_dvnode->fid.vid, new_dvnode->fid.vnode,
1925            new_dentry);
1926 
1927     op = afs_alloc_operation(NULL, orig_dvnode->volume);
1928     if (IS_ERR(op))
1929         return PTR_ERR(op);
1930 
1931     ret = afs_validate(vnode, op->key);
1932     op->error = ret;
1933     if (ret < 0)
1934         goto error;
1935 
1936     afs_op_set_vnode(op, 0, orig_dvnode);
1937     afs_op_set_vnode(op, 1, new_dvnode); /* May be same as orig_dvnode */
1938     op->file[0].dv_delta = 1;
1939     op->file[1].dv_delta = 1;
1940     op->file[0].modification = true;
1941     op->file[1].modification = true;
1942     op->file[0].update_ctime = true;
1943     op->file[1].update_ctime = true;
1944 
1945     op->dentry      = old_dentry;
1946     op->dentry_2        = new_dentry;
1947     op->rename.new_negative = d_is_negative(new_dentry);
1948     op->ops         = &afs_rename_operation;
1949 
1950     /* For non-directories, check whether the target is busy and if so,
1951      * make a copy of the dentry and then do a silly-rename.  If the
1952      * silly-rename succeeds, the copied dentry is hashed and becomes the
1953      * new target.
1954      */
1955     if (d_is_positive(new_dentry) && !d_is_dir(new_dentry)) {
1956         /* To prevent any new references to the target during the
1957          * rename, we unhash the dentry in advance.
1958          */
1959         if (!d_unhashed(new_dentry)) {
1960             d_drop(new_dentry);
1961             op->rename.rehash = new_dentry;
1962         }
1963 
1964         if (d_count(new_dentry) > 2) {
1965             /* copy the target dentry's name */
1966             op->rename.tmp = d_alloc(new_dentry->d_parent,
1967                          &new_dentry->d_name);
1968             if (!op->rename.tmp) {
1969                 op->error = -ENOMEM;
1970                 goto error;
1971             }
1972 
1973             ret = afs_sillyrename(new_dvnode,
1974                           AFS_FS_I(d_inode(new_dentry)),
1975                           new_dentry, op->key);
1976             if (ret) {
1977                 op->error = ret;
1978                 goto error;
1979             }
1980 
1981             op->dentry_2 = op->rename.tmp;
1982             op->rename.rehash = NULL;
1983             op->rename.new_negative = true;
1984         }
1985     }
1986 
1987     /* This bit is potentially nasty as there's a potential race with
1988      * afs_d_revalidate{,_rcu}().  We have to change d_fsdata on the dentry
1989      * to reflect it's new parent's new data_version after the op, but
1990      * d_revalidate may see old_dentry between the op having taken place
1991      * and the version being updated.
1992      *
1993      * So drop the old_dentry for now to make other threads go through
1994      * lookup instead - which we hold a lock against.
1995      */
1996     d_drop(old_dentry);
1997 
1998     return afs_do_sync_operation(op);
1999 
2000 error:
2001     return afs_put_operation(op);
2002 }
2003 
2004 /*
2005  * Release a directory folio and clean up its private state if it's not busy
2006  * - return true if the folio can now be released, false if not
2007  */
2008 static bool afs_dir_release_folio(struct folio *folio, gfp_t gfp_flags)
2009 {
2010     struct afs_vnode *dvnode = AFS_FS_I(folio_inode(folio));
2011 
2012     _enter("{{%llx:%llu}[%lu]}", dvnode->fid.vid, dvnode->fid.vnode, folio_index(folio));
2013 
2014     folio_detach_private(folio);
2015 
2016     /* The directory will need reloading. */
2017     if (test_and_clear_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
2018         afs_stat_v(dvnode, n_relpg);
2019     return true;
2020 }
2021 
2022 /*
2023  * Invalidate part or all of a folio.
2024  */
2025 static void afs_dir_invalidate_folio(struct folio *folio, size_t offset,
2026                    size_t length)
2027 {
2028     struct afs_vnode *dvnode = AFS_FS_I(folio_inode(folio));
2029 
2030     _enter("{%lu},%zu,%zu", folio->index, offset, length);
2031 
2032     BUG_ON(!folio_test_locked(folio));
2033 
2034     /* The directory will need reloading. */
2035     if (test_and_clear_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
2036         afs_stat_v(dvnode, n_inval);
2037 
2038     /* we clean up only if the entire folio is being invalidated */
2039     if (offset == 0 && length == folio_size(folio))
2040         folio_detach_private(folio);
2041 }