Lines Matching +full:slew +full:- +full:time +full:- +full:us

1 // SPDX-License-Identifier: GPL-2.0-or-later
100 loff_t i_size = i_size_read(&dvnode->netfs.inode); in afs_dir_unuse_cookie()
122 len -= AFS_DIR_BLOCK_SIZE; in afs_dir_dump_step()
134 unsigned long long i_size = i_size_read(&dvnode->netfs.inode); in afs_dir_dump()
137 dvnode->fid.vid, dvnode->fid.vnode, i_size); in afs_dir_dump()
139 iov_iter_folio_queue(&iter, ITER_SOURCE, dvnode->directory, 0, 0, i_size); in afs_dir_dump()
150 if (block->hdr.magic != AFS_DIR_MAGIC) { in afs_dir_check_block()
152 __func__, dvnode->netfs.inode.i_ino, in afs_dir_check_block()
153 progress, ntohs(block->hdr.magic)); in afs_dir_check_block()
155 trace_afs_file_error(dvnode, -EIO, afs_file_error_dir_bad_magic); in afs_dir_check_block()
161 * *should* be NUL-terminated anyway. in afs_dir_check_block()
163 ((u8 *)block)[AFS_DIR_BLOCK_SIZE - 1] = 0; in afs_dir_check_block()
184 len -= AFS_DIR_BLOCK_SIZE; in afs_dir_check_step()
196 unsigned long long i_size = i_size_read(&dvnode->netfs.inode); in afs_dir_check()
202 iov_iter_folio_queue(&iter, ITER_SOURCE, dvnode->directory, 0, 0, i_size); in afs_dir_check()
207 return -EIO; in afs_dir_check()
217 _enter("{%lu}", inode->i_ino); in afs_dir_open()
222 if (test_bit(AFS_VNODE_DELETED, &AFS_FS_I(inode)->flags)) in afs_dir_open()
223 return -ENOENT; in afs_dir_open()
236 bool is_dir = (S_ISDIR(dvnode->netfs.inode.i_mode) && in afs_do_read_single()
237 !test_bit(AFS_VNODE_MOUNTPOINT, &dvnode->flags)); in afs_do_read_single()
239 i_size = i_size_read(&dvnode->netfs.inode); in afs_do_read_single()
244 trace_afs_file_error(dvnode, -EFBIG, afs_file_error_dir_big); in afs_do_read_single()
245 return -EFBIG; in afs_do_read_single()
249 trace_afs_file_error(dvnode, -EFBIG, afs_file_error_dir_big); in afs_do_read_single()
250 return -EFBIG; in afs_do_read_single()
255 if (dvnode->directory_size < i_size) { in afs_do_read_single()
256 size_t cur_size = dvnode->directory_size; in afs_do_read_single()
259 &dvnode->directory, &cur_size, i_size, in afs_do_read_single()
260 mapping_gfp_mask(dvnode->netfs.inode.i_mapping)); in afs_do_read_single()
261 dvnode->directory_size = cur_size; in afs_do_read_single()
266 iov_iter_folio_queue(&iter, ITER_DEST, dvnode->directory, 0, 0, dvnode->directory_size); in afs_do_read_single()
268 /* AFS requires us to perform the read of a directory synchronously as in afs_do_read_single()
272 ret = netfs_read_single(&dvnode->netfs.inode, file, &iter); in afs_do_read_single()
274 i_size = i_size_read(&dvnode->netfs.inode); in afs_do_read_single()
279 ret = -ESTALE; in afs_do_read_single()
285 } else if (i_size < folioq_folio_size(dvnode->directory, 0)) { in afs_do_read_single()
286 /* NUL-terminate a symlink. */ in afs_do_read_single()
287 char *symlink = kmap_local_folio(folioq_folio(dvnode->directory, 0), 0); in afs_do_read_single()
309 * previous contents. We return -ESTALE if the caller needs to call us again.
312 __acquires(&dvnode->validate_lock) in afs_read_dir()
317 i_size = i_size_read(&dvnode->netfs.inode); in afs_read_dir()
319 ret = -ERESTARTSYS; in afs_read_dir()
320 if (down_read_killable(&dvnode->validate_lock) < 0) in afs_read_dir()
323 /* We only need to reread the data if it became invalid - or if we in afs_read_dir()
326 if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags) && in afs_read_dir()
327 test_bit(AFS_VNODE_DIR_READ, &dvnode->flags)) { in afs_read_dir()
332 up_read(&dvnode->validate_lock); in afs_read_dir()
333 if (down_write_killable(&dvnode->validate_lock) < 0) in afs_read_dir()
336 if (!test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags)) in afs_read_dir()
339 if (!test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags) || in afs_read_dir()
340 !test_bit(AFS_VNODE_DIR_READ, &dvnode->flags)) { in afs_read_dir()
348 set_bit(AFS_VNODE_DIR_VALID, &dvnode->flags); in afs_read_dir()
349 set_bit(AFS_VNODE_DIR_READ, &dvnode->flags); in afs_read_dir()
354 downgrade_write(&dvnode->validate_lock); in afs_read_dir()
359 up_write(&dvnode->validate_lock); in afs_read_dir()
377 blknum = ctx->pos / AFS_DIR_BLOCK_SIZE; in afs_dir_iterate_block()
380 pos = DIV_ROUND_UP(ctx->pos, AFS_DIR_DIRENT_SIZE) - base; in afs_dir_iterate_block()
382 _enter("%llx,%x", ctx->pos, blknum); in afs_dir_iterate_block()
384 /* walk through the block, an entry at a time */ in afs_dir_iterate_block()
387 if (!(block->hdr.bitmap[slot / 8] & in afs_dir_iterate_block()
392 ctx->pos = (base + next) * sizeof(union afs_xdr_dirent); in afs_dir_iterate_block()
397 dire = &block->dirents[slot]; in afs_dir_iterate_block()
398 nlen = strnlen(dire->u.name, in afs_dir_iterate_block()
399 (unsigned long)(block + 1) - (unsigned long)dire->u.name - 1); in afs_dir_iterate_block()
400 if (nlen > AFSNAMEMAX - 1) { in afs_dir_iterate_block()
408 nlen, dire->u.name); in afs_dir_iterate_block()
418 /* Check that the name-extension dirents are all allocated */ in afs_dir_iterate_block()
422 if (!(block->hdr.bitmap[xslot / 8] & (1 << (xslot % 8)))) { in afs_dir_iterate_block()
432 ctx->pos = (base + next) * sizeof(union afs_xdr_dirent); in afs_dir_iterate_block()
437 if (!dir_emit(ctx, dire->u.name, nlen, in afs_dir_iterate_block()
438 ntohl(dire->u.vnode), in afs_dir_iterate_block()
439 (ctx->actor == afs_lookup_filldir || in afs_dir_iterate_block()
440 ctx->actor == afs_lookup_one_filldir)? in afs_dir_iterate_block()
441 ntohl(dire->u.unique) : DT_UNKNOWN)) { in afs_dir_iterate_block()
446 ctx->pos = (base + next) * sizeof(union afs_xdr_dirent); in afs_dir_iterate_block()
470 pr_err("Mis-iteration prog=%zx len=%zx\n", in afs_dir_iterate_step()
477 ret = afs_dir_iterate_block(dvnode, ctx->dir_ctx, iter_base); in afs_dir_iterate_step()
481 ctx->dir_ctx->pos = round_up(ctx->dir_ctx->pos, AFS_DIR_BLOCK_SIZE); in afs_dir_iterate_step()
483 len -= AFS_DIR_BLOCK_SIZE; in afs_dir_iterate_step()
500 dir_ctx->pos = round_up(dir_ctx->pos, sizeof(union afs_xdr_dirent)); in afs_dir_iterate_contents()
502 if (i_size <= 0 || dir_ctx->pos >= i_size) in afs_dir_iterate_contents()
505 iov_iter_folio_queue(&iter, ITER_SOURCE, dvnode->directory, 0, 0, i_size); in afs_dir_iterate_contents()
506 iov_iter_advance(&iter, round_down(dir_ctx->pos, AFS_DIR_BLOCK_SIZE)); in afs_dir_iterate_contents()
511 if (ctx.error == -ESTALE) in afs_dir_iterate_contents()
526 _enter("{%lu},%llx,,", dir->i_ino, ctx->pos); in afs_dir_iterate()
529 if (--retry_limit < 0) { in afs_dir_iterate()
531 ret = -ESTALE; in afs_dir_iterate()
536 if (ret != -ESTALE) in afs_dir_iterate()
538 if (test_bit(AFS_VNODE_DELETED, &AFS_FS_I(dir)->flags)) { in afs_dir_iterate()
539 ret = -ESTALE; in afs_dir_iterate()
547 up_read(&dvnode->validate_lock); in afs_dir_iterate()
548 } while (ret == -ESTALE); in afs_dir_iterate()
566 * - if afs_dir_iterate_block() spots this function, it'll pass the FID
576 cookie->name.name, cookie->name.len, name, nlen, in afs_lookup_one_filldir()
583 if (cookie->name.len != nlen || in afs_lookup_one_filldir()
584 memcmp(cookie->name.name, name, nlen) != 0) { in afs_lookup_one_filldir()
589 cookie->fid.vnode = ino; in afs_lookup_one_filldir()
590 cookie->fid.unique = dtype; in afs_lookup_one_filldir()
591 cookie->found = 1; in afs_lookup_one_filldir()
599 * - just returns the FID the dentry name maps to if found
605 struct afs_super_info *as = dir->i_sb->s_fs_info; in afs_do_lookup_one()
609 .fid.vid = as->volume->vid in afs_do_lookup_one()
613 _enter("{%lu},{%.*s},", dir->i_ino, name->len, name->name); in afs_do_lookup_one()
623 _leave(" = -ENOENT [not found]"); in afs_do_lookup_one()
624 return -ENOENT; in afs_do_lookup_one()
628 _leave(" = 0 { vn=%llu u=%u }", fid->vnode, fid->unique); in afs_do_lookup_one()
634 * - if afs_dir_iterate_block() spots this function, it'll pass the FID
644 cookie->name.name, cookie->name.len, name, nlen, in afs_lookup_filldir()
651 if (cookie->nr_fids < 50) { in afs_lookup_filldir()
652 cookie->fids[cookie->nr_fids].vnode = ino; in afs_lookup_filldir()
653 cookie->fids[cookie->nr_fids].unique = dtype; in afs_lookup_filldir()
654 cookie->nr_fids++; in afs_lookup_filldir()
657 return cookie->nr_fids < 50; in afs_lookup_filldir()
662 * into inodes and save the first one - which is the one we actually want.
674 for (i = 0; i < op->nr_files; i++) { in afs_do_lookup_success()
677 vp = &op->file[0]; in afs_do_lookup_success()
678 abort_code = vp->scb.status.abort_code; in afs_do_lookup_success()
680 op->call_abort_code = abort_code; in afs_do_lookup_success()
682 op->cumul_error.abort_code = abort_code; in afs_do_lookup_success()
687 vp = &op->file[1]; in afs_do_lookup_success()
691 vp = &op->more_files[i - 2]; in afs_do_lookup_success()
695 if (vp->scb.status.abort_code) in afs_do_lookup_success()
696 trace_afs_bulkstat_error(op, &vp->fid, i, vp->scb.status.abort_code); in afs_do_lookup_success()
697 if (!vp->scb.have_status && !vp->scb.have_error) in afs_do_lookup_success()
701 if (vp->vnode) { in afs_do_lookup_success()
702 if (!test_bit(AFS_VNODE_UNSET, &vp->vnode->flags)) in afs_do_lookup_success()
704 } else if (vp->scb.status.abort_code == 0) { in afs_do_lookup_success()
708 afs_cache_permit(vnode, op->key, in afs_do_lookup_success()
709 0 /* Assume vnode->cb_break is 0 */ + in afs_do_lookup_success()
710 op->cb_v_break, in afs_do_lookup_success()
711 &vp->scb); in afs_do_lookup_success()
712 vp->vnode = vnode; in afs_do_lookup_success()
713 vp->put_vnode = true; in afs_do_lookup_success()
716 _debug("- abort %d %llx:%llx.%x", in afs_do_lookup_success()
717 vp->scb.status.abort_code, in afs_do_lookup_success()
718 vp->fid.vid, vp->fid.vnode, vp->fid.unique); in afs_do_lookup_success()
745 struct afs_volume *volume = dvnode->volume; in afs_server_supports_ibulk()
750 if (!test_bit(AFS_VOLUME_MAYBE_NO_IBULK, &volume->flags)) in afs_server_supports_ibulk()
754 slist = rcu_dereference(volume->servers); in afs_server_supports_ibulk()
756 for (i = 0; i < slist->nr_servers; i++) { in afs_server_supports_ibulk()
757 server = slist->servers[i].server; in afs_server_supports_ibulk()
758 if (server == dvnode->cb_server) { in afs_server_supports_ibulk()
759 if (test_bit(AFS_SERVER_FL_NO_IBULK, &server->flags)) in afs_server_supports_ibulk()
770 * Do a lookup in a directory. We make use of bulk lookup to query a slew of
781 afs_dataversion_t data_version = READ_ONCE(dvnode->status.data_version); in afs_do_lookup()
786 _enter("{%lu},%p{%pd},", dir->i_ino, dentry, dentry); in afs_do_lookup()
790 return ERR_PTR(-ENOMEM); in afs_do_lookup()
792 for (i = 0; i < ARRAY_SIZE(cookie->fids); i++) in afs_do_lookup()
793 cookie->fids[i].vid = dvnode->fid.vid; in afs_do_lookup()
794 cookie->ctx.actor = afs_lookup_filldir; in afs_do_lookup()
795 cookie->name = dentry->d_name; in afs_do_lookup()
796 cookie->nr_fids = 2; /* slot 1 is saved for the fid we actually want in afs_do_lookup()
800 ret = afs_dir_search(dvnode, &dentry->d_name, &cookie->fids[1], &data_version); in afs_do_lookup()
806 /* ...then scan linearly from that point for entries to lookup-ahead. */ in afs_do_lookup()
807 cookie->ctx.pos = (ret + 1) * AFS_DIR_DIRENT_SIZE; in afs_do_lookup()
808 afs_dir_iterate(dir, &cookie->ctx, NULL, &data_version); in afs_do_lookup()
811 dentry->d_fsdata = (void *)(unsigned long)data_version; in afs_do_lookup()
814 inode = ilookup5(dir->i_sb, cookie->fids[1].vnode, in afs_do_lookup()
815 afs_ilookup5_test_by_fid, &cookie->fids[1]); in afs_do_lookup()
819 /* Okay, we didn't find it. We need to query the server - and whilst in afs_do_lookup()
823 op = afs_alloc_operation(NULL, dvnode->volume); in afs_do_lookup()
830 afs_op_set_fid(op, 1, &cookie->fids[1]); in afs_do_lookup()
832 op->nr_files = cookie->nr_fids; in afs_do_lookup()
833 _debug("nr_files %u", op->nr_files); in afs_do_lookup()
836 if (op->nr_files > 2) { in afs_do_lookup()
837 op->more_files = kvcalloc(op->nr_files - 2, in afs_do_lookup()
840 if (!op->more_files) { in afs_do_lookup()
845 for (i = 2; i < op->nr_files; i++) { in afs_do_lookup()
846 vp = &op->more_files[i - 2]; in afs_do_lookup()
847 vp->fid = cookie->fids[i]; in afs_do_lookup()
852 ti = ilookup5_nowait(dir->i_sb, vp->fid.vnode, in afs_do_lookup()
853 afs_ilookup5_test_by_fid, &vp->fid); in afs_do_lookup()
856 vp->dv_before = vnode->status.data_version; in afs_do_lookup()
857 vp->cb_break_before = afs_calc_vnode_cb_break(vnode); in afs_do_lookup()
858 vp->vnode = vnode; in afs_do_lookup()
859 vp->put_vnode = true; in afs_do_lookup()
860 vp->speculative = true; /* vnode not locked */ in afs_do_lookup()
869 afs_op_set_error(op, -ENOTSUPP); in afs_do_lookup()
871 op->ops = &afs_inline_bulk_status_operation; in afs_do_lookup()
876 if (afs_op_error(op) == -ENOTSUPP) { in afs_do_lookup()
878 * op if any of the lookups fails - so, for the moment, revert in afs_do_lookup()
879 * to FS.FetchStatus for op->file[1]. in afs_do_lookup()
881 op->fetch_status.which = 1; in afs_do_lookup()
882 op->ops = &afs_lookup_fetch_status_operation; in afs_do_lookup()
889 if (op->file[1].scb.status.abort_code) { in afs_do_lookup()
890 afs_op_accumulate_error(op, -ECONNABORTED, in afs_do_lookup()
891 op->file[1].scb.status.abort_code); in afs_do_lookup()
893 inode = &op->file[1].vnode->netfs.inode; in afs_do_lookup()
894 op->file[1].vnode = NULL; in afs_do_lookup()
898 if (op->file[0].scb.have_status) in afs_do_lookup()
899 dentry->d_fsdata = (void *)(unsigned long)op->file[0].scb.status.data_version; in afs_do_lookup()
901 dentry->d_fsdata = (void *)(unsigned long)op->file[0].dv_before; in afs_do_lookup()
922 ret = ERR_PTR(-ENOMEM); in afs_lookup_atsys()
926 if (dentry->d_name.len > 4) { in afs_lookup_atsys()
927 memcpy(p, dentry->d_name.name, dentry->d_name.len - 4); in afs_lookup_atsys()
928 p += dentry->d_name.len - 4; in afs_lookup_atsys()
932 read_lock(&net->sysnames_lock); in afs_lookup_atsys()
933 subs = net->sysnames; in afs_lookup_atsys()
934 refcount_inc(&subs->usage); in afs_lookup_atsys()
935 read_unlock(&net->sysnames_lock); in afs_lookup_atsys()
937 for (i = 0; i < subs->nr; i++) { in afs_lookup_atsys()
938 name = subs->subs[i]; in afs_lookup_atsys()
939 len = dentry->d_name.len - 4 + strlen(name); in afs_lookup_atsys()
941 ret = ERR_PTR(-ENAMETOOLONG); in afs_lookup_atsys()
946 ret = lookup_one_len(buf, dentry->d_parent, len); in afs_lookup_atsys()
976 dvnode->fid.vid, dvnode->fid.vnode, dentry, dentry); in afs_lookup()
980 if (dentry->d_name.len >= AFSNAMEMAX) { in afs_lookup()
981 _leave(" = -ENAMETOOLONG"); in afs_lookup()
982 return ERR_PTR(-ENAMETOOLONG); in afs_lookup()
985 if (test_bit(AFS_VNODE_DELETED, &dvnode->flags)) { in afs_lookup()
986 _leave(" = -ESTALE"); in afs_lookup()
987 return ERR_PTR(-ESTALE); in afs_lookup()
997 if (dentry->d_name.len >= 4 && in afs_lookup()
998 dentry->d_name.name[dentry->d_name.len - 4] == '@' && in afs_lookup()
999 dentry->d_name.name[dentry->d_name.len - 3] == 's' && in afs_lookup()
1000 dentry->d_name.name[dentry->d_name.len - 2] == 'y' && in afs_lookup()
1001 dentry->d_name.name[dentry->d_name.len - 1] == 's') in afs_lookup()
1006 if (inode == ERR_PTR(-ENOENT)) in afs_lookup()
1010 fid = AFS_FS_I(inode)->fid; in afs_lookup()
1012 _debug("splice %p", dentry->d_inode); in afs_lookup()
1015 d->d_fsdata = dentry->d_fsdata; in afs_lookup()
1016 trace_afs_lookup(dvnode, &d->d_name, &fid); in afs_lookup()
1018 trace_afs_lookup(dvnode, &dentry->d_name, &fid); in afs_lookup()
1033 if (test_bit(AFS_VNODE_DELETED, &dvnode->flags)) in afs_d_revalidate_rcu()
1034 return -ECHILD; in afs_d_revalidate_rcu()
1037 return -ECHILD; in afs_d_revalidate_rcu()
1041 * on a 32-bit system, we only have 32 bits in the dentry to store the in afs_d_revalidate_rcu()
1044 dir_version = (long)READ_ONCE(dvnode->status.data_version); in afs_d_revalidate_rcu()
1045 de_version = (long)READ_ONCE(dentry->d_fsdata); in afs_d_revalidate_rcu()
1047 dir_version = (long)READ_ONCE(dvnode->invalid_before); in afs_d_revalidate_rcu()
1048 if (de_version - dir_version < 0) in afs_d_revalidate_rcu()
1049 return -ECHILD; in afs_d_revalidate_rcu()
1057 * - NOTE! the hit can be a negative hit too, so we can't assume we have an
1077 vnode->fid.vid, vnode->fid.vnode, dentry, in afs_d_revalidate()
1078 vnode->flags); in afs_d_revalidate()
1083 key = afs_request_key(AFS_FS_S(dentry->d_sb)->volume->cell); in afs_d_revalidate()
1089 if (ret == -ERESTARTSYS) { in afs_d_revalidate()
1094 if (test_bit(AFS_VNODE_DELETED, &dir->flags)) { in afs_d_revalidate()
1101 * on a 32-bit system, we only have 32 bits in the dentry to store the in afs_d_revalidate()
1104 dir_version = dir->status.data_version; in afs_d_revalidate()
1105 de_version = (long)dentry->d_fsdata; in afs_d_revalidate()
1109 invalid_before = dir->invalid_before; in afs_d_revalidate()
1110 if (de_version - (long)invalid_before >= 0) in afs_d_revalidate()
1117 ret = afs_do_lookup_one(&dir->netfs.inode, name, &fid, &dir_version); in afs_d_revalidate()
1134 if (fid.vnode != vnode->fid.vnode) { in afs_d_revalidate()
1137 vnode->fid.vnode); in afs_d_revalidate()
1144 if (fid.unique != vnode->fid.unique) { in afs_d_revalidate()
1145 _debug("%pd: file deleted (uq %u -> %u I:%u)", in afs_d_revalidate()
1147 vnode->fid.unique, in afs_d_revalidate()
1148 vnode->netfs.inode.i_generation); in afs_d_revalidate()
1153 case -ENOENT: in afs_d_revalidate()
1166 dentry->d_fsdata = (void *)(unsigned long)dir_version; in afs_d_revalidate()
1183 * - called from dput() when d_count is going to 0.
1184 * - return 1 to request dentry be unhashed, 0 otherwise
1190 if (dentry->d_flags & DCACHE_NFSFS_RENAMED) in afs_d_delete()
1194 (test_bit(AFS_VNODE_DELETED, &AFS_FS_I(d_inode(dentry))->flags) || in afs_d_delete()
1195 test_bit(AFS_VNODE_PSEUDODIR, &AFS_FS_I(d_inode(dentry))->flags))) in afs_d_delete()
1211 if (dentry->d_flags & DCACHE_NFSFS_RENAMED) in afs_d_iput()
1226 struct afs_vnode *vnode = op->file[0].vnode; in afs_check_for_remote_deletion()
1230 set_bit(AFS_VNODE_DELETED, &vnode->flags); in afs_check_for_remote_deletion()
1231 clear_nlink(&vnode->netfs.inode); in afs_check_for_remote_deletion()
1241 struct afs_vnode_param *dvp = &op->file[0]; in afs_vnode_new_inode()
1242 struct afs_vnode_param *vp = &op->file[1]; in afs_vnode_new_inode()
1252 /* ENOMEM or EINTR at a really inconvenient time - just abandon in afs_vnode_new_inode()
1260 set_bit(AFS_VNODE_NEW_CONTENT, &vnode->flags); in afs_vnode_new_inode()
1261 if (S_ISDIR(inode->i_mode)) in afs_vnode_new_inode()
1262 afs_mkdir_init_dir(vnode, dvp->vnode); in afs_vnode_new_inode()
1263 else if (S_ISLNK(inode->i_mode)) in afs_vnode_new_inode()
1266 afs_cache_permit(vnode, op->key, vnode->cb_break, &vp->scb); in afs_vnode_new_inode()
1267 d_instantiate(op->dentry, inode); in afs_vnode_new_inode()
1272 _enter("op=%08x", op->debug_id); in afs_create_success()
1273 op->ctime = op->file[0].scb.status.mtime_client; in afs_create_success()
1274 afs_vnode_commit_status(op, &op->file[0]); in afs_create_success()
1275 afs_update_dentry_version(op, &op->file[0], op->dentry); in afs_create_success()
1282 struct afs_vnode_param *dvp = &op->file[0]; in afs_create_edit_dir()
1283 struct afs_vnode_param *vp = &op->file[1]; in afs_create_edit_dir()
1284 struct afs_vnode *dvnode = dvp->vnode; in afs_create_edit_dir()
1286 _enter("op=%08x", op->debug_id); in afs_create_edit_dir()
1289 down_write(&dvnode->validate_lock); in afs_create_edit_dir()
1290 if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags) && in afs_create_edit_dir()
1291 dvnode->status.data_version == dvp->dv_before + dvp->dv_delta) in afs_create_edit_dir()
1292 afs_edit_dir_add(dvnode, &op->dentry->d_name, &vp->fid, in afs_create_edit_dir()
1293 op->create.reason); in afs_create_edit_dir()
1294 up_write(&dvnode->validate_lock); in afs_create_edit_dir()
1300 _enter("op=%08x", op->debug_id); in afs_create_put()
1303 d_drop(op->dentry); in afs_create_put()
1326 dvnode->fid.vid, dvnode->fid.vnode, dentry, mode); in afs_mkdir()
1328 op = afs_alloc_operation(NULL, dvnode->volume); in afs_mkdir()
1337 op->file[0].dv_delta = 1; in afs_mkdir()
1338 op->file[0].modification = true; in afs_mkdir()
1339 op->file[0].update_ctime = true; in afs_mkdir()
1340 op->dentry = dentry; in afs_mkdir()
1341 op->create.mode = S_IFDIR | mode; in afs_mkdir()
1342 op->create.reason = afs_edit_dir_for_mkdir; in afs_mkdir()
1343 op->mtime = current_time(dir); in afs_mkdir()
1344 op->ops = &afs_mkdir_operation; in afs_mkdir()
1358 clear_nlink(&vnode->netfs.inode); in afs_dir_remove_subdir()
1359 set_bit(AFS_VNODE_DELETED, &vnode->flags); in afs_dir_remove_subdir()
1367 _enter("op=%08x", op->debug_id); in afs_rmdir_success()
1368 op->ctime = op->file[0].scb.status.mtime_client; in afs_rmdir_success()
1369 afs_vnode_commit_status(op, &op->file[0]); in afs_rmdir_success()
1370 afs_update_dentry_version(op, &op->file[0], op->dentry); in afs_rmdir_success()
1376 struct afs_vnode_param *dvp = &op->file[0]; in afs_rmdir_edit_dir()
1377 struct afs_vnode *dvnode = dvp->vnode; in afs_rmdir_edit_dir()
1379 _enter("op=%08x", op->debug_id); in afs_rmdir_edit_dir()
1380 afs_dir_remove_subdir(op->dentry); in afs_rmdir_edit_dir()
1383 down_write(&dvnode->validate_lock); in afs_rmdir_edit_dir()
1384 if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags) && in afs_rmdir_edit_dir()
1385 dvnode->status.data_version == dvp->dv_before + dvp->dv_delta) in afs_rmdir_edit_dir()
1386 afs_edit_dir_remove(dvnode, &op->dentry->d_name, in afs_rmdir_edit_dir()
1388 up_write(&dvnode->validate_lock); in afs_rmdir_edit_dir()
1394 _enter("op=%08x", op->debug_id); in afs_rmdir_put()
1395 if (op->file[1].vnode) in afs_rmdir_put()
1396 up_write(&op->file[1].vnode->rmdir_lock); in afs_rmdir_put()
1418 dvnode->fid.vid, dvnode->fid.vnode, dentry); in afs_rmdir()
1420 op = afs_alloc_operation(NULL, dvnode->volume); in afs_rmdir()
1427 op->file[0].dv_delta = 1; in afs_rmdir()
1428 op->file[0].modification = true; in afs_rmdir()
1429 op->file[0].update_ctime = true; in afs_rmdir()
1431 op->dentry = dentry; in afs_rmdir()
1432 op->ops = &afs_rmdir_operation; in afs_rmdir()
1437 ret = afs_validate(vnode, op->key); in afs_rmdir()
1443 ret = down_write_killable(&vnode->rmdir_lock); in afs_rmdir()
1446 op->file[1].vnode = vnode; in afs_rmdir()
1452 if (ret == -EEXIST) in afs_rmdir()
1453 ret = -ENOTEMPTY; in afs_rmdir()
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
1475 struct afs_vnode *dvnode = op->file[0].vnode; in afs_dir_remove_link()
1476 struct afs_vnode *vnode = op->file[1].vnode; in afs_dir_remove_link()
1477 struct dentry *dentry = op->dentry; in afs_dir_remove_link()
1481 (op->file[1].scb.have_status && op->file[1].scb.have_error)) in afs_dir_remove_link()
1486 if (test_bit(AFS_VNODE_DELETED, &vnode->flags)) { in afs_dir_remove_link()
1488 } else if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags)) { in afs_dir_remove_link()
1489 write_seqlock(&vnode->cb_lock); in afs_dir_remove_link()
1490 drop_nlink(&vnode->netfs.inode); in afs_dir_remove_link()
1491 if (vnode->netfs.inode.i_nlink == 0) { in afs_dir_remove_link()
1492 set_bit(AFS_VNODE_DELETED, &vnode->flags); in afs_dir_remove_link()
1495 write_sequnlock(&vnode->cb_lock); in afs_dir_remove_link()
1499 if (test_bit(AFS_VNODE_DELETED, &vnode->flags)) in afs_dir_remove_link()
1502 ret = afs_validate(vnode, op->key); in afs_dir_remove_link()
1503 if (ret != -ESTALE) in afs_dir_remove_link()
1507 _debug("nlink %d [val %d]", vnode->netfs.inode.i_nlink, afs_op_error(op)); in afs_dir_remove_link()
1512 _enter("op=%08x", op->debug_id); in afs_unlink_success()
1513 op->ctime = op->file[0].scb.status.mtime_client; in afs_unlink_success()
1514 afs_check_dir_conflict(op, &op->file[0]); in afs_unlink_success()
1515 afs_vnode_commit_status(op, &op->file[0]); in afs_unlink_success()
1516 afs_vnode_commit_status(op, &op->file[1]); in afs_unlink_success()
1517 afs_update_dentry_version(op, &op->file[0], op->dentry); in afs_unlink_success()
1524 struct afs_vnode_param *dvp = &op->file[0]; in afs_unlink_edit_dir()
1525 struct afs_vnode *dvnode = dvp->vnode; in afs_unlink_edit_dir()
1527 _enter("op=%08x", op->debug_id); in afs_unlink_edit_dir()
1529 down_write(&dvnode->validate_lock); in afs_unlink_edit_dir()
1530 if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags) && in afs_unlink_edit_dir()
1531 dvnode->status.data_version == dvp->dv_before + dvp->dv_delta) in afs_unlink_edit_dir()
1532 afs_edit_dir_remove(dvnode, &op->dentry->d_name, in afs_unlink_edit_dir()
1534 up_write(&dvnode->validate_lock); in afs_unlink_edit_dir()
1540 _enter("op=%08x", op->debug_id); in afs_unlink_put()
1541 if (op->unlink.need_rehash && afs_op_error(op) < 0 && afs_op_error(op) != -ENOENT) in afs_unlink_put()
1542 d_rehash(op->dentry); in afs_unlink_put()
1565 dvnode->fid.vid, dvnode->fid.vnode, dentry); in afs_unlink()
1567 if (dentry->d_name.len >= AFSNAMEMAX) in afs_unlink()
1568 return -ENAMETOOLONG; in afs_unlink()
1570 op = afs_alloc_operation(NULL, dvnode->volume); in afs_unlink()
1577 op->file[0].dv_delta = 1; in afs_unlink()
1578 op->file[0].modification = true; in afs_unlink()
1579 op->file[0].update_ctime = true; in afs_unlink()
1582 ret = afs_validate(vnode, op->key); in afs_unlink()
1588 spin_lock(&dentry->d_lock); in afs_unlink()
1590 spin_unlock(&dentry->d_lock); in afs_unlink()
1593 afs_op_set_error(op, afs_sillyrename(dvnode, vnode, dentry, op->key)); in afs_unlink()
1599 op->unlink.need_rehash = true; in afs_unlink()
1601 spin_unlock(&dentry->d_lock); in afs_unlink()
1603 op->file[1].vnode = vnode; in afs_unlink()
1604 op->file[1].update_ctime = true; in afs_unlink()
1605 op->file[1].op_unlinked = true; in afs_unlink()
1606 op->dentry = dentry; in afs_unlink()
1607 op->ops = &afs_unlink_operation; in afs_unlink()
1614 if (afs_op_error(op) == 0 && (op->flags & AFS_OPERATION_DIR_CONFLICT)) { in afs_unlink()
1615 op->file[1].update_ctime = false; in afs_unlink()
1616 op->fetch_status.which = 1; in afs_unlink()
1617 op->ops = &afs_fetch_status_operation; in afs_unlink()
1645 int ret = -ENAMETOOLONG; in afs_create()
1648 dvnode->fid.vid, dvnode->fid.vnode, dentry, mode); in afs_create()
1650 if (dentry->d_name.len >= AFSNAMEMAX) in afs_create()
1653 op = afs_alloc_operation(NULL, dvnode->volume); in afs_create()
1662 op->file[0].dv_delta = 1; in afs_create()
1663 op->file[0].modification = true; in afs_create()
1664 op->file[0].update_ctime = true; in afs_create()
1666 op->dentry = dentry; in afs_create()
1667 op->create.mode = S_IFREG | mode; in afs_create()
1668 op->create.reason = afs_edit_dir_for_create; in afs_create()
1669 op->mtime = current_time(dir); in afs_create()
1670 op->ops = &afs_create_operation; in afs_create()
1683 struct afs_vnode_param *dvp = &op->file[0]; in afs_link_success()
1684 struct afs_vnode_param *vp = &op->file[1]; in afs_link_success()
1686 _enter("op=%08x", op->debug_id); in afs_link_success()
1687 op->ctime = dvp->scb.status.mtime_client; in afs_link_success()
1690 afs_update_dentry_version(op, dvp, op->dentry); in afs_link_success()
1691 if (op->dentry_2->d_parent == op->dentry->d_parent) in afs_link_success()
1692 afs_update_dentry_version(op, dvp, op->dentry_2); in afs_link_success()
1693 ihold(&vp->vnode->netfs.inode); in afs_link_success()
1694 d_instantiate(op->dentry, &vp->vnode->netfs.inode); in afs_link_success()
1699 _enter("op=%08x", op->debug_id); in afs_link_put()
1701 d_drop(op->dentry); in afs_link_put()
1722 int ret = -ENAMETOOLONG; in afs_link()
1725 vnode->fid.vid, vnode->fid.vnode, in afs_link()
1726 dvnode->fid.vid, dvnode->fid.vnode, in afs_link()
1729 if (dentry->d_name.len >= AFSNAMEMAX) in afs_link()
1732 op = afs_alloc_operation(NULL, dvnode->volume); in afs_link()
1740 ret = afs_validate(vnode, op->key); in afs_link()
1746 op->file[0].dv_delta = 1; in afs_link()
1747 op->file[0].modification = true; in afs_link()
1748 op->file[0].update_ctime = true; in afs_link()
1749 op->file[1].update_ctime = true; in afs_link()
1751 op->dentry = dentry; in afs_link()
1752 op->dentry_2 = from; in afs_link()
1753 op->ops = &afs_link_operation; in afs_link()
1754 op->create.reason = afs_edit_dir_for_link; in afs_link()
1788 dvnode->fid.vid, dvnode->fid.vnode, dentry, in afs_symlink()
1791 ret = -ENAMETOOLONG; in afs_symlink()
1792 if (dentry->d_name.len >= AFSNAMEMAX) in afs_symlink()
1795 ret = -EINVAL; in afs_symlink()
1799 op = afs_alloc_operation(NULL, dvnode->volume); in afs_symlink()
1808 op->file[0].dv_delta = 1; in afs_symlink()
1810 op->dentry = dentry; in afs_symlink()
1811 op->ops = &afs_symlink_operation; in afs_symlink()
1812 op->create.reason = afs_edit_dir_for_symlink; in afs_symlink()
1813 op->create.symlink = content; in afs_symlink()
1814 op->mtime = current_time(dir); in afs_symlink()
1827 struct afs_vnode *vnode = AFS_FS_I(d_inode(op->dentry)); in afs_rename_success()
1829 _enter("op=%08x", op->debug_id); in afs_rename_success()
1831 op->ctime = op->file[0].scb.status.mtime_client; in afs_rename_success()
1832 afs_check_dir_conflict(op, &op->file[1]); in afs_rename_success()
1833 afs_vnode_commit_status(op, &op->file[0]); in afs_rename_success()
1834 if (op->file[1].vnode != op->file[0].vnode) { in afs_rename_success()
1835 op->ctime = op->file[1].scb.status.mtime_client; in afs_rename_success()
1836 afs_vnode_commit_status(op, &op->file[1]); in afs_rename_success()
1842 if (S_ISDIR(vnode->netfs.inode.i_mode) && in afs_rename_success()
1843 op->file[0].vnode != op->file[1].vnode) { in afs_rename_success()
1846 write_seqlock(&vnode->cb_lock); in afs_rename_success()
1848 new_dv = vnode->status.data_version + 1; in afs_rename_success()
1850 vnode->status.data_version = new_dv; in afs_rename_success()
1851 inode_set_iversion_raw(&vnode->netfs.inode, new_dv); in afs_rename_success()
1853 write_sequnlock(&vnode->cb_lock); in afs_rename_success()
1860 struct afs_vnode_param *orig_dvp = &op->file[0]; in afs_rename_edit_dir()
1861 struct afs_vnode_param *new_dvp = &op->file[1]; in afs_rename_edit_dir()
1862 struct afs_vnode *orig_dvnode = orig_dvp->vnode; in afs_rename_edit_dir()
1863 struct afs_vnode *new_dvnode = new_dvp->vnode; in afs_rename_edit_dir()
1864 struct afs_vnode *vnode = AFS_FS_I(d_inode(op->dentry)); in afs_rename_edit_dir()
1865 struct dentry *old_dentry = op->dentry; in afs_rename_edit_dir()
1866 struct dentry *new_dentry = op->dentry_2; in afs_rename_edit_dir()
1869 _enter("op=%08x", op->debug_id); in afs_rename_edit_dir()
1871 if (op->rename.rehash) { in afs_rename_edit_dir()
1872 d_rehash(op->rename.rehash); in afs_rename_edit_dir()
1873 op->rename.rehash = NULL; in afs_rename_edit_dir()
1880 down_write(&orig_dvnode->validate_lock); in afs_rename_edit_dir()
1881 if (test_bit(AFS_VNODE_DIR_VALID, &orig_dvnode->flags) && in afs_rename_edit_dir()
1882 orig_dvnode->status.data_version == orig_dvp->dv_before + orig_dvp->dv_delta) in afs_rename_edit_dir()
1883 afs_edit_dir_remove(orig_dvnode, &old_dentry->d_name, in afs_rename_edit_dir()
1887 up_write(&orig_dvnode->validate_lock); in afs_rename_edit_dir()
1888 down_write(&new_dvnode->validate_lock); in afs_rename_edit_dir()
1891 if (test_bit(AFS_VNODE_DIR_VALID, &new_dvnode->flags) && in afs_rename_edit_dir()
1892 new_dvnode->status.data_version == new_dvp->dv_before + new_dvp->dv_delta) { in afs_rename_edit_dir()
1893 if (!op->rename.new_negative) in afs_rename_edit_dir()
1894 afs_edit_dir_remove(new_dvnode, &new_dentry->d_name, in afs_rename_edit_dir()
1897 afs_edit_dir_add(new_dvnode, &new_dentry->d_name, in afs_rename_edit_dir()
1898 &vnode->fid, afs_edit_dir_for_rename_2); in afs_rename_edit_dir()
1901 if (S_ISDIR(vnode->netfs.inode.i_mode) && in afs_rename_edit_dir()
1903 test_bit(AFS_VNODE_DIR_VALID, &vnode->flags)) in afs_rename_edit_dir()
1909 spin_lock(&new_inode->i_lock); in afs_rename_edit_dir()
1910 if (S_ISDIR(new_inode->i_mode)) in afs_rename_edit_dir()
1912 else if (new_inode->i_nlink > 0) in afs_rename_edit_dir()
1914 spin_unlock(&new_inode->i_lock); in afs_rename_edit_dir()
1923 afs_update_dentry_version(op, new_dvp, op->dentry); in afs_rename_edit_dir()
1924 afs_update_dentry_version(op, new_dvp, op->dentry_2); in afs_rename_edit_dir()
1928 up_write(&new_dvnode->validate_lock); in afs_rename_edit_dir()
1936 _enter("op=%08x", op->debug_id); in afs_rename_put()
1937 if (op->rename.rehash) in afs_rename_put()
1938 d_rehash(op->rename.rehash); in afs_rename_put()
1939 dput(op->rename.tmp); in afs_rename_put()
1941 d_rehash(op->dentry); in afs_rename_put()
1964 return -EINVAL; in afs_rename()
1966 /* Don't allow silly-rename files be moved around. */ in afs_rename()
1967 if (old_dentry->d_flags & DCACHE_NFSFS_RENAMED) in afs_rename()
1968 return -EINVAL; in afs_rename()
1975 orig_dvnode->fid.vid, orig_dvnode->fid.vnode, in afs_rename()
1976 vnode->fid.vid, vnode->fid.vnode, in afs_rename()
1977 new_dvnode->fid.vid, new_dvnode->fid.vnode, in afs_rename()
1980 op = afs_alloc_operation(NULL, orig_dvnode->volume); in afs_rename()
1988 ret = afs_validate(vnode, op->key); in afs_rename()
1995 op->file[0].dv_delta = 1; in afs_rename()
1996 op->file[1].dv_delta = 1; in afs_rename()
1997 op->file[0].modification = true; in afs_rename()
1998 op->file[1].modification = true; in afs_rename()
1999 op->file[0].update_ctime = true; in afs_rename()
2000 op->file[1].update_ctime = true; in afs_rename()
2002 op->dentry = old_dentry; in afs_rename()
2003 op->dentry_2 = new_dentry; in afs_rename()
2004 op->rename.new_negative = d_is_negative(new_dentry); in afs_rename()
2005 op->ops = &afs_rename_operation; in afs_rename()
2007 /* For non-directories, check whether the target is busy and if so, in afs_rename()
2008 * make a copy of the dentry and then do a silly-rename. If the in afs_rename()
2009 * silly-rename succeeds, the copied dentry is hashed and becomes the in afs_rename()
2018 op->rename.rehash = new_dentry; in afs_rename()
2023 op->rename.tmp = d_alloc(new_dentry->d_parent, in afs_rename()
2024 &new_dentry->d_name); in afs_rename()
2025 if (!op->rename.tmp) { in afs_rename()
2032 new_dentry, op->key); in afs_rename()
2038 op->dentry_2 = op->rename.tmp; in afs_rename()
2039 op->rename.rehash = NULL; in afs_rename()
2040 op->rename.new_negative = true; in afs_rename()
2051 * lookup instead - which we hold a lock against. in afs_rename()
2073 struct afs_vnode *dvnode = AFS_FS_I(mapping->host); in afs_single_writepages()
2075 bool is_dir = (S_ISDIR(dvnode->netfs.inode.i_mode) && in afs_single_writepages()
2076 !test_bit(AFS_VNODE_MOUNTPOINT, &dvnode->flags)); in afs_single_writepages()
2082 down_read(&dvnode->validate_lock); in afs_single_writepages()
2085 test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags) : in afs_single_writepages()
2086 atomic64_read(&dvnode->cb_expires_at) != AFS_NO_CB_PROMISE) { in afs_single_writepages()
2087 iov_iter_folio_queue(&iter, ITER_SOURCE, dvnode->directory, 0, 0, in afs_single_writepages()
2088 i_size_read(&dvnode->netfs.inode)); in afs_single_writepages()
2092 up_read(&dvnode->validate_lock); in afs_single_writepages()