0001
0002
0003
0004
0005
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();
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
0108
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
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
0145
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
0165
0166
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
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
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
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
0266
0267
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;
0306 req->len = nr_pages * PAGE_SIZE;
0307 req->data_version = dvnode->status.data_version;
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
0313
0314
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
0340
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
0363
0364
0365 up_write(&dvnode->validate_lock);
0366 goto expand;
0367 }
0368
0369
0370 ret = afs_dir_check(dvnode, req);
0371 if (ret < 0)
0372 goto error_unlock;
0373
0374
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
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
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
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
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
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
0466 if (offset < curr) {
0467 if (next > curr)
0468 ctx->pos = blkoff + next * sizeof(union afs_xdr_dirent);
0469 continue;
0470 }
0471
0472
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
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
0515 ctx->pos += sizeof(union afs_xdr_dirent) - 1;
0516 ctx->pos &= ~(sizeof(union afs_xdr_dirent) - 1);
0517
0518
0519 ret = 0;
0520 while (ctx->pos < req->actual_len) {
0521
0522
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
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
0568
0569
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
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
0601
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
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
0636
0637
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
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
0676
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 +
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
0751
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
0782
0783
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;
0808
0809
0810 if (!afs_server_supports_ibulk(dvnode))
0811 cookie->one_only = true;
0812
0813
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
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;
0829
0830
0831
0832
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
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
0860
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;
0871 }
0872 }
0873 }
0874
0875
0876
0877
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
0888
0889
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
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
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
0960
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
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
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
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
1065
1066
1067
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;
1078 }
1079
1080
1081
1082
1083
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
1113 parent = dget_parent(dentry);
1114 dir = AFS_FS_I(d_inode(parent));
1115
1116
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
1125
1126
1127
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
1142 ret = afs_do_lookup_one(&dir->netfs.inode, dentry, &fid, key, &dir_version);
1143 switch (ret) {
1144 case 0:
1145
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
1158
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
1167
1168
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
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
1210
1211
1212
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
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
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
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
1279
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
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
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
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
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
1465
1466
1467
1468
1469
1470
1471
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
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
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
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
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
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
1607
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
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
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
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
1868
1869
1870
1871
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
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
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);
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
1951
1952
1953
1954
1955 if (d_is_positive(new_dentry) && !d_is_dir(new_dentry)) {
1956
1957
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
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
1988
1989
1990
1991
1992
1993
1994
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
2006
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
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
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
2035 if (test_and_clear_bit(AFS_VNODE_DIR_VALID, &dvnode->flags))
2036 afs_stat_v(dvnode, n_inval);
2037
2038
2039 if (offset == 0 && length == folio_size(folio))
2040 folio_detach_private(folio);
2041 }