cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

dir.c (54092B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/* dir.c: AFS filesystem directory handling
      3 *
      4 * Copyright (C) 2002, 2018 Red Hat, Inc. All Rights Reserved.
      5 * Written by David Howells (dhowells@redhat.com)
      6 */
      7
      8#include <linux/kernel.h>
      9#include <linux/fs.h>
     10#include <linux/namei.h>
     11#include <linux/pagemap.h>
     12#include <linux/swap.h>
     13#include <linux/ctype.h>
     14#include <linux/sched.h>
     15#include <linux/task_io_accounting_ops.h>
     16#include "internal.h"
     17#include "afs_fs.h"
     18#include "xdr_fs.h"
     19
     20static struct dentry *afs_lookup(struct inode *dir, struct dentry *dentry,
     21				 unsigned int flags);
     22static int afs_dir_open(struct inode *inode, struct file *file);
     23static int afs_readdir(struct file *file, struct dir_context *ctx);
     24static int afs_d_revalidate(struct dentry *dentry, unsigned int flags);
     25static int afs_d_delete(const struct dentry *dentry);
     26static void afs_d_iput(struct dentry *dentry, struct inode *inode);
     27static int afs_lookup_one_filldir(struct dir_context *ctx, const char *name, int nlen,
     28				  loff_t fpos, u64 ino, unsigned dtype);
     29static int afs_lookup_filldir(struct dir_context *ctx, const char *name, int nlen,
     30			      loff_t fpos, u64 ino, unsigned dtype);
     31static int afs_create(struct user_namespace *mnt_userns, struct inode *dir,
     32		      struct dentry *dentry, umode_t mode, bool excl);
     33static int afs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
     34		     struct dentry *dentry, umode_t mode);
     35static int afs_rmdir(struct inode *dir, struct dentry *dentry);
     36static int afs_unlink(struct inode *dir, struct dentry *dentry);
     37static int afs_link(struct dentry *from, struct inode *dir,
     38		    struct dentry *dentry);
     39static int afs_symlink(struct user_namespace *mnt_userns, struct inode *dir,
     40		       struct dentry *dentry, const char *content);
     41static int afs_rename(struct user_namespace *mnt_userns, struct inode *old_dir,
     42		      struct dentry *old_dentry, struct inode *new_dir,
     43		      struct dentry *new_dentry, unsigned int flags);
     44static bool afs_dir_release_folio(struct folio *folio, gfp_t gfp_flags);
     45static void afs_dir_invalidate_folio(struct folio *folio, size_t offset,
     46				   size_t length);
     47
     48static bool afs_dir_dirty_folio(struct address_space *mapping,
     49		struct folio *folio)
     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};
     75
     76const struct address_space_operations afs_dir_aops = {
     77	.dirty_folio	= afs_dir_dirty_folio,
     78	.release_folio	= afs_dir_release_folio,
     79	.invalidate_folio = afs_dir_invalidate_folio,
     80};
     81
     82const struct dentry_operations afs_fs_dentry_operations = {
     83	.d_revalidate	= afs_d_revalidate,
     84	.d_delete	= afs_d_delete,
     85	.d_release	= afs_d_release,
     86	.d_automount	= afs_d_automount,
     87	.d_iput		= afs_d_iput,
     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_fid		fids[50];
    104};
    105
    106/*
    107 * Drop the refs that we're holding on the folios we were reading into.  We've
    108 * got refs on the first nr_pages pages.
    109 */
    110static void afs_dir_read_cleanup(struct afs_read *req)
    111{
    112	struct address_space *mapping = req->vnode->netfs.inode.i_mapping;
    113	struct folio *folio;
    114	pgoff_t last = req->nr_pages - 1;
    115
    116	XA_STATE(xas, &mapping->i_pages, 0);
    117
    118	if (unlikely(!req->nr_pages))
    119		return;
    120
    121	rcu_read_lock();
    122	xas_for_each(&xas, folio, last) {
    123		if (xas_retry(&xas, folio))
    124			continue;
    125		BUG_ON(xa_is_value(folio));
    126		ASSERTCMP(folio_file_mapping(folio), ==, mapping);
    127
    128		folio_put(folio);
    129	}
    130
    131	rcu_read_unlock();
    132}
    133
    134/*
    135 * check that a directory folio is valid
    136 */
    137static bool afs_dir_check_folio(struct afs_vnode *dvnode, struct folio *folio,
    138				loff_t i_size)
    139{
    140	union afs_xdr_dir_block *block;
    141	size_t offset, size;
    142	loff_t pos;
    143
    144	/* Determine how many magic numbers there should be in this folio, but
    145	 * we must take care because the directory may change size under us.
    146	 */
    147	pos = folio_pos(folio);
    148	if (i_size <= pos)
    149		goto checked;
    150
    151	size = min_t(loff_t, folio_size(folio), i_size - pos);
    152	for (offset = 0; offset < size; offset += sizeof(*block)) {
    153		block = kmap_local_folio(folio, offset);
    154		if (block->hdr.magic != AFS_DIR_MAGIC) {
    155			printk("kAFS: %s(%lx): [%llx] bad magic %zx/%zx is %04hx\n",
    156			       __func__, dvnode->netfs.inode.i_ino,
    157			       pos, offset, size, ntohs(block->hdr.magic));
    158			trace_afs_dir_check_failed(dvnode, pos + offset, i_size);
    159			kunmap_local(block);
    160			trace_afs_file_error(dvnode, -EIO, afs_file_error_dir_bad_magic);
    161			goto error;
    162		}
    163
    164		/* Make sure each block is NUL terminated so we can reasonably
    165		 * use string functions on it.  The filenames in the folio
    166		 * *should* be NUL-terminated anyway.
    167		 */
    168		((u8 *)block)[AFS_DIR_BLOCK_SIZE - 1] = 0;
    169
    170		kunmap_local(block);
    171	}
    172checked:
    173	afs_stat_v(dvnode, n_read_dir);
    174	return true;
    175
    176error:
    177	return false;
    178}
    179
    180/*
    181 * Dump the contents of a directory.
    182 */
    183static void afs_dir_dump(struct afs_vnode *dvnode, struct afs_read *req)
    184{
    185	union afs_xdr_dir_block *block;
    186	struct address_space *mapping = dvnode->netfs.inode.i_mapping;
    187	struct folio *folio;
    188	pgoff_t last = req->nr_pages - 1;
    189	size_t offset, size;
    190
    191	XA_STATE(xas, &mapping->i_pages, 0);
    192
    193	pr_warn("DIR %llx:%llx f=%llx l=%llx al=%llx\n",
    194		dvnode->fid.vid, dvnode->fid.vnode,
    195		req->file_size, req->len, req->actual_len);
    196	pr_warn("DIR %llx %x %zx %zx\n",
    197		req->pos, req->nr_pages,
    198		req->iter->iov_offset,  iov_iter_count(req->iter));
    199
    200	xas_for_each(&xas, folio, last) {
    201		if (xas_retry(&xas, folio))
    202			continue;
    203
    204		BUG_ON(folio_file_mapping(folio) != mapping);
    205
    206		size = min_t(loff_t, folio_size(folio), req->actual_len - folio_pos(folio));
    207		for (offset = 0; offset < size; offset += sizeof(*block)) {
    208			block = kmap_local_folio(folio, offset);
    209			pr_warn("[%02lx] %32phN\n", folio_index(folio) + offset, block);
    210			kunmap_local(block);
    211		}
    212	}
    213}
    214
    215/*
    216 * Check all the blocks in a directory.  All the folios are held pinned.
    217 */
    218static int afs_dir_check(struct afs_vnode *dvnode, struct afs_read *req)
    219{
    220	struct address_space *mapping = dvnode->netfs.inode.i_mapping;
    221	struct folio *folio;
    222	pgoff_t last = req->nr_pages - 1;
    223	int ret = 0;
    224
    225	XA_STATE(xas, &mapping->i_pages, 0);
    226
    227	if (unlikely(!req->nr_pages))
    228		return 0;
    229
    230	rcu_read_lock();
    231	xas_for_each(&xas, folio, last) {
    232		if (xas_retry(&xas, folio))
    233			continue;
    234
    235		BUG_ON(folio_file_mapping(folio) != mapping);
    236
    237		if (!afs_dir_check_folio(dvnode, folio, req->actual_len)) {
    238			afs_dir_dump(dvnode, req);
    239			ret = -EIO;
    240			break;
    241		}
    242	}
    243
    244	rcu_read_unlock();
    245	return ret;
    246}
    247
    248/*
    249 * open an AFS directory file
    250 */
    251static int afs_dir_open(struct inode *inode, struct file *file)
    252{
    253	_enter("{%lu}", inode->i_ino);
    254
    255	BUILD_BUG_ON(sizeof(union afs_xdr_dir_block) != 2048);
    256	BUILD_BUG_ON(sizeof(union afs_xdr_dirent) != 32);
    257
    258	if (test_bit(AFS_VNODE_DELETED, &AFS_FS_I(inode)->flags))
    259		return -ENOENT;
    260
    261	return afs_open(inode, file);
    262}
    263
    264/*
    265 * Read the directory into the pagecache in one go, scrubbing the previous
    266 * contents.  The list of folios is returned, pinning them so that they don't
    267 * get reclaimed during the iteration.
    268 */
    269static struct afs_read *afs_read_dir(struct afs_vnode *dvnode, struct key *key)
    270	__acquires(&dvnode->validate_lock)
    271{
    272	struct address_space *mapping = dvnode->netfs.inode.i_mapping;
    273	struct afs_read *req;
    274	loff_t i_size;
    275	int nr_pages, i;
    276	int ret;
    277
    278	_enter("");
    279
    280	req = kzalloc(sizeof(*req), GFP_KERNEL);
    281	if (!req)
    282		return ERR_PTR(-ENOMEM);
    283
    284	refcount_set(&req->usage, 1);
    285	req->vnode = dvnode;
    286	req->key = key_get(key);
    287	req->cleanup = afs_dir_read_cleanup;
    288
    289expand:
    290	i_size = i_size_read(&dvnode->netfs.inode);
    291	if (i_size < 2048) {
    292		ret = afs_bad(dvnode, afs_file_error_dir_small);
    293		goto error;
    294	}
    295	if (i_size > 2048 * 1024) {
    296		trace_afs_file_error(dvnode, -EFBIG, afs_file_error_dir_big);
    297		ret = -EFBIG;
    298		goto error;
    299	}
    300
    301	_enter("%llu", i_size);
    302
    303	nr_pages = (i_size + PAGE_SIZE - 1) / PAGE_SIZE;
    304
    305	req->actual_len = i_size; /* May change */
    306	req->len = nr_pages * PAGE_SIZE; /* We can ask for more than there is */
    307	req->data_version = dvnode->status.data_version; /* May change */
    308	iov_iter_xarray(&req->def_iter, READ, &dvnode->netfs.inode.i_mapping->i_pages,
    309			0, i_size);
    310	req->iter = &req->def_iter;
    311
    312	/* Fill in any gaps that we might find where the memory reclaimer has
    313	 * been at work and pin all the folios.  If there are any gaps, we will
    314	 * need to reread the entire directory contents.
    315	 */
    316	i = req->nr_pages;
    317	while (i < nr_pages) {
    318		struct folio *folio;
    319
    320		folio = filemap_get_folio(mapping, i);
    321		if (!folio) {
    322			if (test_and_clear_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
    323				afs_stat_v(dvnode, n_inval);
    324
    325			ret = -ENOMEM;
    326			folio = __filemap_get_folio(mapping,
    327						    i, FGP_LOCK | FGP_CREAT,
    328						    mapping->gfp_mask);
    329			if (!folio)
    330				goto error;
    331			folio_attach_private(folio, (void *)1);
    332			folio_unlock(folio);
    333		}
    334
    335		req->nr_pages += folio_nr_pages(folio);
    336		i += folio_nr_pages(folio);
    337	}
    338
    339	/* If we're going to reload, we need to lock all the pages to prevent
    340	 * races.
    341	 */
    342	ret = -ERESTARTSYS;
    343	if (down_read_killable(&dvnode->validate_lock) < 0)
    344		goto error;
    345
    346	if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
    347		goto success;
    348
    349	up_read(&dvnode->validate_lock);
    350	if (down_write_killable(&dvnode->validate_lock) < 0)
    351		goto error;
    352
    353	if (!test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags)) {
    354		trace_afs_reload_dir(dvnode);
    355		ret = afs_fetch_data(dvnode, req);
    356		if (ret < 0)
    357			goto error_unlock;
    358
    359		task_io_account_read(PAGE_SIZE * req->nr_pages);
    360
    361		if (req->len < req->file_size) {
    362			/* The content has grown, so we need to expand the
    363			 * buffer.
    364			 */
    365			up_write(&dvnode->validate_lock);
    366			goto expand;
    367		}
    368
    369		/* Validate the data we just read. */
    370		ret = afs_dir_check(dvnode, req);
    371		if (ret < 0)
    372			goto error_unlock;
    373
    374		// TODO: Trim excess pages
    375
    376		set_bit(AFS_VNODE_DIR_VALID, &dvnode->flags);
    377	}
    378
    379	downgrade_write(&dvnode->validate_lock);
    380success:
    381	return req;
    382
    383error_unlock:
    384	up_write(&dvnode->validate_lock);
    385error:
    386	afs_put_read(req);
    387	_leave(" = %d", ret);
    388	return ERR_PTR(ret);
    389}
    390
    391/*
    392 * deal with one block in an AFS directory
    393 */
    394static int afs_dir_iterate_block(struct afs_vnode *dvnode,
    395				 struct dir_context *ctx,
    396				 union afs_xdr_dir_block *block,
    397				 unsigned blkoff)
    398{
    399	union afs_xdr_dirent *dire;
    400	unsigned offset, next, curr, nr_slots;
    401	size_t nlen;
    402	int tmp;
    403
    404	_enter("%llx,%x", ctx->pos, blkoff);
    405
    406	curr = (ctx->pos - blkoff) / sizeof(union afs_xdr_dirent);
    407
    408	/* walk through the block, an entry at a time */
    409	for (offset = (blkoff == 0 ? AFS_DIR_RESV_BLOCKS0 : AFS_DIR_RESV_BLOCKS);
    410	     offset < AFS_DIR_SLOTS_PER_BLOCK;
    411	     offset = next
    412	     ) {
    413		/* skip entries marked unused in the bitmap */
    414		if (!(block->hdr.bitmap[offset / 8] &
    415		      (1 << (offset % 8)))) {
    416			_debug("ENT[%zu.%u]: unused",
    417			       blkoff / sizeof(union afs_xdr_dir_block), offset);
    418			next = offset + 1;
    419			if (offset >= curr)
    420				ctx->pos = blkoff +
    421					next * sizeof(union afs_xdr_dirent);
    422			continue;
    423		}
    424
    425		/* got a valid entry */
    426		dire = &block->dirents[offset];
    427		nlen = strnlen(dire->u.name,
    428			       sizeof(*block) -
    429			       offset * sizeof(union afs_xdr_dirent));
    430		if (nlen > AFSNAMEMAX - 1) {
    431			_debug("ENT[%zu]: name too long (len %u/%zu)",
    432			       blkoff / sizeof(union afs_xdr_dir_block),
    433			       offset, nlen);
    434			return afs_bad(dvnode, afs_file_error_dir_name_too_long);
    435		}
    436
    437		_debug("ENT[%zu.%u]: %s %zu \"%s\"",
    438		       blkoff / sizeof(union afs_xdr_dir_block), offset,
    439		       (offset < curr ? "skip" : "fill"),
    440		       nlen, dire->u.name);
    441
    442		nr_slots = afs_dir_calc_slots(nlen);
    443		next = offset + nr_slots;
    444		if (next > AFS_DIR_SLOTS_PER_BLOCK) {
    445			_debug("ENT[%zu.%u]:"
    446			       " %u extends beyond end dir block"
    447			       " (len %zu)",
    448			       blkoff / sizeof(union afs_xdr_dir_block),
    449			       offset, next, nlen);
    450			return afs_bad(dvnode, afs_file_error_dir_over_end);
    451		}
    452
    453		/* Check that the name-extension dirents are all allocated */
    454		for (tmp = 1; tmp < nr_slots; tmp++) {
    455			unsigned int ix = offset + tmp;
    456			if (!(block->hdr.bitmap[ix / 8] & (1 << (ix % 8)))) {
    457				_debug("ENT[%zu.u]:"
    458				       " %u unmarked extension (%u/%u)",
    459				       blkoff / sizeof(union afs_xdr_dir_block),
    460				       offset, tmp, nr_slots);
    461				return afs_bad(dvnode, afs_file_error_dir_unmarked_ext);
    462			}
    463		}
    464
    465		/* skip if starts before the current position */
    466		if (offset < curr) {
    467			if (next > curr)
    468				ctx->pos = blkoff + next * sizeof(union afs_xdr_dirent);
    469			continue;
    470		}
    471
    472		/* found the next entry */
    473		if (!dir_emit(ctx, dire->u.name, nlen,
    474			      ntohl(dire->u.vnode),
    475			      (ctx->actor == afs_lookup_filldir ||
    476			       ctx->actor == afs_lookup_one_filldir)?
    477			      ntohl(dire->u.unique) : DT_UNKNOWN)) {
    478			_leave(" = 0 [full]");
    479			return 0;
    480		}
    481
    482		ctx->pos = blkoff + next * sizeof(union afs_xdr_dirent);
    483	}
    484
    485	_leave(" = 1 [more]");
    486	return 1;
    487}
    488
    489/*
    490 * iterate through the data blob that lists the contents of an AFS directory
    491 */
    492static int afs_dir_iterate(struct inode *dir, struct dir_context *ctx,
    493			   struct key *key, afs_dataversion_t *_dir_version)
    494{
    495	struct afs_vnode *dvnode = AFS_FS_I(dir);
    496	union afs_xdr_dir_block *dblock;
    497	struct afs_read *req;
    498	struct folio *folio;
    499	unsigned offset, size;
    500	int ret;
    501
    502	_enter("{%lu},%u,,", dir->i_ino, (unsigned)ctx->pos);
    503
    504	if (test_bit(AFS_VNODE_DELETED, &AFS_FS_I(dir)->flags)) {
    505		_leave(" = -ESTALE");
    506		return -ESTALE;
    507	}
    508
    509	req = afs_read_dir(dvnode, key);
    510	if (IS_ERR(req))
    511		return PTR_ERR(req);
    512	*_dir_version = req->data_version;
    513
    514	/* round the file position up to the next entry boundary */
    515	ctx->pos += sizeof(union afs_xdr_dirent) - 1;
    516	ctx->pos &= ~(sizeof(union afs_xdr_dirent) - 1);
    517
    518	/* walk through the blocks in sequence */
    519	ret = 0;
    520	while (ctx->pos < req->actual_len) {
    521		/* Fetch the appropriate folio from the directory and re-add it
    522		 * to the LRU.  We have all the pages pinned with an extra ref.
    523		 */
    524		folio = __filemap_get_folio(dir->i_mapping, ctx->pos / PAGE_SIZE,
    525					    FGP_ACCESSED, 0);
    526		if (!folio) {
    527			ret = afs_bad(dvnode, afs_file_error_dir_missing_page);
    528			break;
    529		}
    530
    531		offset = round_down(ctx->pos, sizeof(*dblock)) - folio_file_pos(folio);
    532		size = min_t(loff_t, folio_size(folio),
    533			     req->actual_len - folio_file_pos(folio));
    534
    535		do {
    536			dblock = kmap_local_folio(folio, offset);
    537			ret = afs_dir_iterate_block(dvnode, ctx, dblock,
    538						    folio_file_pos(folio) + offset);
    539			kunmap_local(dblock);
    540			if (ret != 1)
    541				goto out;
    542
    543		} while (offset += sizeof(*dblock), offset < size);
    544
    545		ret = 0;
    546	}
    547
    548out:
    549	up_read(&dvnode->validate_lock);
    550	afs_put_read(req);
    551	_leave(" = %d", ret);
    552	return ret;
    553}
    554
    555/*
    556 * read an AFS directory
    557 */
    558static int afs_readdir(struct file *file, struct dir_context *ctx)
    559{
    560	afs_dataversion_t dir_version;
    561
    562	return afs_dir_iterate(file_inode(file), ctx, afs_file_key(file),
    563			       &dir_version);
    564}
    565
    566/*
    567 * Search the directory for a single name
    568 * - if afs_dir_iterate_block() spots this function, it'll pass the FID
    569 *   uniquifier through dtype
    570 */
    571static int afs_lookup_one_filldir(struct dir_context *ctx, const char *name,
    572				  int nlen, loff_t fpos, u64 ino, unsigned dtype)
    573{
    574	struct afs_lookup_one_cookie *cookie =
    575		container_of(ctx, struct afs_lookup_one_cookie, ctx);
    576
    577	_enter("{%s,%u},%s,%u,,%llu,%u",
    578	       cookie->name.name, cookie->name.len, name, nlen,
    579	       (unsigned long long) ino, dtype);
    580
    581	/* insanity checks first */
    582	BUILD_BUG_ON(sizeof(union afs_xdr_dir_block) != 2048);
    583	BUILD_BUG_ON(sizeof(union afs_xdr_dirent) != 32);
    584
    585	if (cookie->name.len != nlen ||
    586	    memcmp(cookie->name.name, name, nlen) != 0) {
    587		_leave(" = 0 [no]");
    588		return 0;
    589	}
    590
    591	cookie->fid.vnode = ino;
    592	cookie->fid.unique = dtype;
    593	cookie->found = 1;
    594
    595	_leave(" = -1 [found]");
    596	return -1;
    597}
    598
    599/*
    600 * Do a lookup of a single name in a directory
    601 * - just returns the FID the dentry name maps to if found
    602 */
    603static int afs_do_lookup_one(struct inode *dir, struct dentry *dentry,
    604			     struct afs_fid *fid, struct key *key,
    605			     afs_dataversion_t *_dir_version)
    606{
    607	struct afs_super_info *as = dir->i_sb->s_fs_info;
    608	struct afs_lookup_one_cookie cookie = {
    609		.ctx.actor = afs_lookup_one_filldir,
    610		.name = dentry->d_name,
    611		.fid.vid = as->volume->vid
    612	};
    613	int ret;
    614
    615	_enter("{%lu},%p{%pd},", dir->i_ino, dentry, dentry);
    616
    617	/* search the directory */
    618	ret = afs_dir_iterate(dir, &cookie.ctx, key, _dir_version);
    619	if (ret < 0) {
    620		_leave(" = %d [iter]", ret);
    621		return ret;
    622	}
    623
    624	if (!cookie.found) {
    625		_leave(" = -ENOENT [not found]");
    626		return -ENOENT;
    627	}
    628
    629	*fid = cookie.fid;
    630	_leave(" = 0 { vn=%llu u=%u }", fid->vnode, fid->unique);
    631	return 0;
    632}
    633
    634/*
    635 * search the directory for a name
    636 * - if afs_dir_iterate_block() spots this function, it'll pass the FID
    637 *   uniquifier through dtype
    638 */
    639static int afs_lookup_filldir(struct dir_context *ctx, const char *name,
    640			      int nlen, loff_t fpos, u64 ino, unsigned dtype)
    641{
    642	struct afs_lookup_cookie *cookie =
    643		container_of(ctx, struct afs_lookup_cookie, ctx);
    644	int ret;
    645
    646	_enter("{%s,%u},%s,%u,,%llu,%u",
    647	       cookie->name.name, cookie->name.len, name, nlen,
    648	       (unsigned long long) ino, dtype);
    649
    650	/* insanity checks first */
    651	BUILD_BUG_ON(sizeof(union afs_xdr_dir_block) != 2048);
    652	BUILD_BUG_ON(sizeof(union afs_xdr_dirent) != 32);
    653
    654	if (cookie->found) {
    655		if (cookie->nr_fids < 50) {
    656			cookie->fids[cookie->nr_fids].vnode	= ino;
    657			cookie->fids[cookie->nr_fids].unique	= dtype;
    658			cookie->nr_fids++;
    659		}
    660	} else if (cookie->name.len == nlen &&
    661		   memcmp(cookie->name.name, name, nlen) == 0) {
    662		cookie->fids[1].vnode	= ino;
    663		cookie->fids[1].unique	= dtype;
    664		cookie->found = 1;
    665		if (cookie->one_only)
    666			return -1;
    667	}
    668
    669	ret = cookie->nr_fids >= 50 ? -1 : 0;
    670	_leave(" = %d", ret);
    671	return ret;
    672}
    673
    674/*
    675 * Deal with the result of a successful lookup operation.  Turn all the files
    676 * into inodes and save the first one - which is the one we actually want.
    677 */
    678static void afs_do_lookup_success(struct afs_operation *op)
    679{
    680	struct afs_vnode_param *vp;
    681	struct afs_vnode *vnode;
    682	struct inode *inode;
    683	u32 abort_code;
    684	int i;
    685
    686	_enter("");
    687
    688	for (i = 0; i < op->nr_files; i++) {
    689		switch (i) {
    690		case 0:
    691			vp = &op->file[0];
    692			abort_code = vp->scb.status.abort_code;
    693			if (abort_code != 0) {
    694				op->ac.abort_code = abort_code;
    695				op->error = afs_abort_to_error(abort_code);
    696			}
    697			break;
    698
    699		case 1:
    700			vp = &op->file[1];
    701			break;
    702
    703		default:
    704			vp = &op->more_files[i - 2];
    705			break;
    706		}
    707
    708		if (!vp->scb.have_status && !vp->scb.have_error)
    709			continue;
    710
    711		_debug("do [%u]", i);
    712		if (vp->vnode) {
    713			if (!test_bit(AFS_VNODE_UNSET, &vp->vnode->flags))
    714				afs_vnode_commit_status(op, vp);
    715		} else if (vp->scb.status.abort_code == 0) {
    716			inode = afs_iget(op, vp);
    717			if (!IS_ERR(inode)) {
    718				vnode = AFS_FS_I(inode);
    719				afs_cache_permit(vnode, op->key,
    720						 0 /* Assume vnode->cb_break is 0 */ +
    721						 op->cb_v_break,
    722						 &vp->scb);
    723				vp->vnode = vnode;
    724				vp->put_vnode = true;
    725			}
    726		} else {
    727			_debug("- abort %d %llx:%llx.%x",
    728			       vp->scb.status.abort_code,
    729			       vp->fid.vid, vp->fid.vnode, vp->fid.unique);
    730		}
    731	}
    732
    733	_leave("");
    734}
    735
    736static const struct afs_operation_ops afs_inline_bulk_status_operation = {
    737	.issue_afs_rpc	= afs_fs_inline_bulk_status,
    738	.issue_yfs_rpc	= yfs_fs_inline_bulk_status,
    739	.success	= afs_do_lookup_success,
    740};
    741
    742static const struct afs_operation_ops afs_lookup_fetch_status_operation = {
    743	.issue_afs_rpc	= afs_fs_fetch_status,
    744	.issue_yfs_rpc	= yfs_fs_fetch_status,
    745	.success	= afs_do_lookup_success,
    746	.aborted	= afs_check_for_remote_deletion,
    747};
    748
    749/*
    750 * See if we know that the server we expect to use doesn't support
    751 * FS.InlineBulkStatus.
    752 */
    753static bool afs_server_supports_ibulk(struct afs_vnode *dvnode)
    754{
    755	struct afs_server_list *slist;
    756	struct afs_volume *volume = dvnode->volume;
    757	struct afs_server *server;
    758	bool ret = true;
    759	int i;
    760
    761	if (!test_bit(AFS_VOLUME_MAYBE_NO_IBULK, &volume->flags))
    762		return true;
    763
    764	rcu_read_lock();
    765	slist = rcu_dereference(volume->servers);
    766
    767	for (i = 0; i < slist->nr_servers; i++) {
    768		server = slist->servers[i].server;
    769		if (server == dvnode->cb_server) {
    770			if (test_bit(AFS_SERVER_FL_NO_IBULK, &server->flags))
    771				ret = false;
    772			break;
    773		}
    774	}
    775
    776	rcu_read_unlock();
    777	return ret;
    778}
    779
    780/*
    781 * Do a lookup in a directory.  We make use of bulk lookup to query a slew of
    782 * files in one go and create inodes for them.  The inode of the file we were
    783 * asked for is returned.
    784 */
    785static struct inode *afs_do_lookup(struct inode *dir, struct dentry *dentry,
    786				   struct key *key)
    787{
    788	struct afs_lookup_cookie *cookie;
    789	struct afs_vnode_param *vp;
    790	struct afs_operation *op;
    791	struct afs_vnode *dvnode = AFS_FS_I(dir), *vnode;
    792	struct inode *inode = NULL, *ti;
    793	afs_dataversion_t data_version = READ_ONCE(dvnode->status.data_version);
    794	long ret;
    795	int i;
    796
    797	_enter("{%lu},%p{%pd},", dir->i_ino, dentry, dentry);
    798
    799	cookie = kzalloc(sizeof(struct afs_lookup_cookie), GFP_KERNEL);
    800	if (!cookie)
    801		return ERR_PTR(-ENOMEM);
    802
    803	for (i = 0; i < ARRAY_SIZE(cookie->fids); i++)
    804		cookie->fids[i].vid = dvnode->fid.vid;
    805	cookie->ctx.actor = afs_lookup_filldir;
    806	cookie->name = dentry->d_name;
    807	cookie->nr_fids = 2; /* slot 0 is saved for the fid we actually want
    808			      * and slot 1 for the directory */
    809
    810	if (!afs_server_supports_ibulk(dvnode))
    811		cookie->one_only = true;
    812
    813	/* search the directory */
    814	ret = afs_dir_iterate(dir, &cookie->ctx, key, &data_version);
    815	if (ret < 0)
    816		goto out;
    817
    818	dentry->d_fsdata = (void *)(unsigned long)data_version;
    819
    820	ret = -ENOENT;
    821	if (!cookie->found)
    822		goto out;
    823
    824	/* Check to see if we already have an inode for the primary fid. */
    825	inode = ilookup5(dir->i_sb, cookie->fids[1].vnode,
    826			 afs_ilookup5_test_by_fid, &cookie->fids[1]);
    827	if (inode)
    828		goto out; /* We do */
    829
    830	/* Okay, we didn't find it.  We need to query the server - and whilst
    831	 * we're doing that, we're going to attempt to look up a bunch of other
    832	 * vnodes also.
    833	 */
    834	op = afs_alloc_operation(NULL, dvnode->volume);
    835	if (IS_ERR(op)) {
    836		ret = PTR_ERR(op);
    837		goto out;
    838	}
    839
    840	afs_op_set_vnode(op, 0, dvnode);
    841	afs_op_set_fid(op, 1, &cookie->fids[1]);
    842
    843	op->nr_files = cookie->nr_fids;
    844	_debug("nr_files %u", op->nr_files);
    845
    846	/* Need space for examining all the selected files */
    847	op->error = -ENOMEM;
    848	if (op->nr_files > 2) {
    849		op->more_files = kvcalloc(op->nr_files - 2,
    850					  sizeof(struct afs_vnode_param),
    851					  GFP_KERNEL);
    852		if (!op->more_files)
    853			goto out_op;
    854
    855		for (i = 2; i < op->nr_files; i++) {
    856			vp = &op->more_files[i - 2];
    857			vp->fid = cookie->fids[i];
    858
    859			/* Find any inodes that already exist and get their
    860			 * callback counters.
    861			 */
    862			ti = ilookup5_nowait(dir->i_sb, vp->fid.vnode,
    863					     afs_ilookup5_test_by_fid, &vp->fid);
    864			if (!IS_ERR_OR_NULL(ti)) {
    865				vnode = AFS_FS_I(ti);
    866				vp->dv_before = vnode->status.data_version;
    867				vp->cb_break_before = afs_calc_vnode_cb_break(vnode);
    868				vp->vnode = vnode;
    869				vp->put_vnode = true;
    870				vp->speculative = true; /* vnode not locked */
    871			}
    872		}
    873	}
    874
    875	/* Try FS.InlineBulkStatus first.  Abort codes for the individual
    876	 * lookups contained therein are stored in the reply without aborting
    877	 * the whole operation.
    878	 */
    879	op->error = -ENOTSUPP;
    880	if (!cookie->one_only) {
    881		op->ops = &afs_inline_bulk_status_operation;
    882		afs_begin_vnode_operation(op);
    883		afs_wait_for_operation(op);
    884	}
    885
    886	if (op->error == -ENOTSUPP) {
    887		/* We could try FS.BulkStatus next, but this aborts the entire
    888		 * op if any of the lookups fails - so, for the moment, revert
    889		 * to FS.FetchStatus for op->file[1].
    890		 */
    891		op->fetch_status.which = 1;
    892		op->ops = &afs_lookup_fetch_status_operation;
    893		afs_begin_vnode_operation(op);
    894		afs_wait_for_operation(op);
    895	}
    896	inode = ERR_PTR(op->error);
    897
    898out_op:
    899	if (op->error == 0) {
    900		inode = &op->file[1].vnode->netfs.inode;
    901		op->file[1].vnode = NULL;
    902	}
    903
    904	if (op->file[0].scb.have_status)
    905		dentry->d_fsdata = (void *)(unsigned long)op->file[0].scb.status.data_version;
    906	else
    907		dentry->d_fsdata = (void *)(unsigned long)op->file[0].dv_before;
    908	ret = afs_put_operation(op);
    909out:
    910	kfree(cookie);
    911	_leave("");
    912	return inode ?: ERR_PTR(ret);
    913}
    914
    915/*
    916 * Look up an entry in a directory with @sys substitution.
    917 */
    918static struct dentry *afs_lookup_atsys(struct inode *dir, struct dentry *dentry,
    919				       struct key *key)
    920{
    921	struct afs_sysnames *subs;
    922	struct afs_net *net = afs_i2net(dir);
    923	struct dentry *ret;
    924	char *buf, *p, *name;
    925	int len, i;
    926
    927	_enter("");
    928
    929	ret = ERR_PTR(-ENOMEM);
    930	p = buf = kmalloc(AFSNAMEMAX, GFP_KERNEL);
    931	if (!buf)
    932		goto out_p;
    933	if (dentry->d_name.len > 4) {
    934		memcpy(p, dentry->d_name.name, dentry->d_name.len - 4);
    935		p += dentry->d_name.len - 4;
    936	}
    937
    938	/* There is an ordered list of substitutes that we have to try. */
    939	read_lock(&net->sysnames_lock);
    940	subs = net->sysnames;
    941	refcount_inc(&subs->usage);
    942	read_unlock(&net->sysnames_lock);
    943
    944	for (i = 0; i < subs->nr; i++) {
    945		name = subs->subs[i];
    946		len = dentry->d_name.len - 4 + strlen(name);
    947		if (len >= AFSNAMEMAX) {
    948			ret = ERR_PTR(-ENAMETOOLONG);
    949			goto out_s;
    950		}
    951
    952		strcpy(p, name);
    953		ret = lookup_one_len(buf, dentry->d_parent, len);
    954		if (IS_ERR(ret) || d_is_positive(ret))
    955			goto out_s;
    956		dput(ret);
    957	}
    958
    959	/* We don't want to d_add() the @sys dentry here as we don't want to
    960	 * the cached dentry to hide changes to the sysnames list.
    961	 */
    962	ret = NULL;
    963out_s:
    964	afs_put_sysnames(subs);
    965	kfree(buf);
    966out_p:
    967	key_put(key);
    968	return ret;
    969}
    970
    971/*
    972 * look up an entry in a directory
    973 */
    974static struct dentry *afs_lookup(struct inode *dir, struct dentry *dentry,
    975				 unsigned int flags)
    976{
    977	struct afs_vnode *dvnode = AFS_FS_I(dir);
    978	struct afs_fid fid = {};
    979	struct inode *inode;
    980	struct dentry *d;
    981	struct key *key;
    982	int ret;
    983
    984	_enter("{%llx:%llu},%p{%pd},",
    985	       dvnode->fid.vid, dvnode->fid.vnode, dentry, dentry);
    986
    987	ASSERTCMP(d_inode(dentry), ==, NULL);
    988
    989	if (dentry->d_name.len >= AFSNAMEMAX) {
    990		_leave(" = -ENAMETOOLONG");
    991		return ERR_PTR(-ENAMETOOLONG);
    992	}
    993
    994	if (test_bit(AFS_VNODE_DELETED, &dvnode->flags)) {
    995		_leave(" = -ESTALE");
    996		return ERR_PTR(-ESTALE);
    997	}
    998
    999	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 */
   1043static 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 */
   1085static 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
   1191out_valid:
   1192	dentry->d_fsdata = (void *)(unsigned long)dir_version;
   1193out_valid_noupdate:
   1194	dput(parent);
   1195	key_put(key);
   1196	_leave(" = 1 [valid]");
   1197	return 1;
   1198
   1199not_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 */
   1214static 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
   1229zap:
   1230	_leave(" = 1 [zap]");
   1231	return 1;
   1232}
   1233
   1234/*
   1235 * Clean up sillyrename files on dentry removal.
   1236 */
   1237static 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 */
   1247void afs_d_release(struct dentry *dentry)
   1248{
   1249	_enter("%pd", dentry);
   1250}
   1251
   1252void 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 */
   1266static 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
   1292static 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
   1301static 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
   1317static 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
   1325static 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 */
   1337static 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 */
   1366static 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
   1378static 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
   1386static 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
   1402static 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
   1409static 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 */
   1421static 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
   1459error:
   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 */
   1473static 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
   1510static 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
   1521static 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
   1535static 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
   1542static 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 */
   1554static 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
   1619error:
   1620	return afs_put_operation(op);
   1621}
   1622
   1623static 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 */
   1635static 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
   1665error:
   1666	d_drop(dentry);
   1667	_leave(" = %d", ret);
   1668	return ret;
   1669}
   1670
   1671static 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
   1687static 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
   1694static 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 */
   1706static 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
   1745error_op:
   1746	afs_put_operation(op);
   1747error:
   1748	d_drop(dentry);
   1749	_leave(" = %d", ret);
   1750	return ret;
   1751}
   1752
   1753static 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 */
   1765static 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
   1799error:
   1800	d_drop(dentry);
   1801	_leave(" = %d", ret);
   1802	return ret;
   1803}
   1804
   1805static 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
   1818static 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
   1881static 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
   1891static 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 */
   1902static 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
   2000error:
   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 */
   2008static 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 */
   2025static 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}