Lines Matching +full:slew +full:- +full:time +full:- +full:us
1 // SPDX-License-Identifier: GPL-2.0-or-later
112 struct address_space *mapping = req->vnode->netfs.inode.i_mapping; in afs_dir_read_cleanup()
114 pgoff_t last = req->nr_pages - 1; in afs_dir_read_cleanup()
116 XA_STATE(xas, &mapping->i_pages, 0); in afs_dir_read_cleanup()
118 if (unlikely(!req->nr_pages)) in afs_dir_read_cleanup()
145 * we must take care because the directory may change size under us. in afs_dir_check_folio()
151 size = min_t(loff_t, folio_size(folio), i_size - pos); in afs_dir_check_folio()
154 if (block->hdr.magic != AFS_DIR_MAGIC) { in afs_dir_check_folio()
156 __func__, dvnode->netfs.inode.i_ino, in afs_dir_check_folio()
157 pos, offset, size, ntohs(block->hdr.magic)); in afs_dir_check_folio()
160 trace_afs_file_error(dvnode, -EIO, afs_file_error_dir_bad_magic); in afs_dir_check_folio()
166 * *should* be NUL-terminated anyway. in afs_dir_check_folio()
168 ((u8 *)block)[AFS_DIR_BLOCK_SIZE - 1] = 0; in afs_dir_check_folio()
186 struct address_space *mapping = dvnode->netfs.inode.i_mapping; in afs_dir_dump()
188 pgoff_t last = req->nr_pages - 1; in afs_dir_dump()
191 XA_STATE(xas, &mapping->i_pages, 0); in afs_dir_dump()
194 dvnode->fid.vid, dvnode->fid.vnode, in afs_dir_dump()
195 req->file_size, req->len, req->actual_len); in afs_dir_dump()
197 req->pos, req->nr_pages, in afs_dir_dump()
198 req->iter->iov_offset, iov_iter_count(req->iter)); in afs_dir_dump()
206 size = min_t(loff_t, folio_size(folio), req->actual_len - folio_pos(folio)); in afs_dir_dump()
220 struct address_space *mapping = dvnode->netfs.inode.i_mapping; in afs_dir_check()
222 pgoff_t last = req->nr_pages - 1; in afs_dir_check()
225 XA_STATE(xas, &mapping->i_pages, 0); in afs_dir_check()
227 if (unlikely(!req->nr_pages)) in afs_dir_check()
237 if (!afs_dir_check_folio(dvnode, folio, req->actual_len)) { in afs_dir_check()
239 ret = -EIO; in afs_dir_check()
253 _enter("{%lu}", inode->i_ino); in afs_dir_open()
258 if (test_bit(AFS_VNODE_DELETED, &AFS_FS_I(inode)->flags)) in afs_dir_open()
259 return -ENOENT; in afs_dir_open()
270 __acquires(&dvnode->validate_lock) in afs_read_dir()
272 struct address_space *mapping = dvnode->netfs.inode.i_mapping; in afs_read_dir()
282 return ERR_PTR(-ENOMEM); in afs_read_dir()
284 refcount_set(&req->usage, 1); in afs_read_dir()
285 req->vnode = dvnode; in afs_read_dir()
286 req->key = key_get(key); in afs_read_dir()
287 req->cleanup = afs_dir_read_cleanup; in afs_read_dir()
290 i_size = i_size_read(&dvnode->netfs.inode); in afs_read_dir()
296 trace_afs_file_error(dvnode, -EFBIG, afs_file_error_dir_big); in afs_read_dir()
297 ret = -EFBIG; in afs_read_dir()
303 nr_pages = (i_size + PAGE_SIZE - 1) / PAGE_SIZE; in afs_read_dir()
305 req->actual_len = i_size; /* May change */ in afs_read_dir()
306 req->len = nr_pages * PAGE_SIZE; /* We can ask for more than there is */ in afs_read_dir()
307 req->data_version = dvnode->status.data_version; /* May change */ in afs_read_dir()
308 iov_iter_xarray(&req->def_iter, READ, &dvnode->netfs.inode.i_mapping->i_pages, in afs_read_dir()
310 req->iter = &req->def_iter; in afs_read_dir()
316 i = req->nr_pages; in afs_read_dir()
322 if (test_and_clear_bit(AFS_VNODE_DIR_VALID, &dvnode->flags)) in afs_read_dir()
325 ret = -ENOMEM; in afs_read_dir()
328 mapping->gfp_mask); in afs_read_dir()
335 req->nr_pages += folio_nr_pages(folio); in afs_read_dir()
342 ret = -ERESTARTSYS; in afs_read_dir()
343 if (down_read_killable(&dvnode->validate_lock) < 0) in afs_read_dir()
346 if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags)) in afs_read_dir()
349 up_read(&dvnode->validate_lock); in afs_read_dir()
350 if (down_write_killable(&dvnode->validate_lock) < 0) in afs_read_dir()
353 if (!test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags)) { in afs_read_dir()
359 task_io_account_read(PAGE_SIZE * req->nr_pages); in afs_read_dir()
361 if (req->len < req->file_size) { in afs_read_dir()
365 up_write(&dvnode->validate_lock); in afs_read_dir()
376 set_bit(AFS_VNODE_DIR_VALID, &dvnode->flags); in afs_read_dir()
379 downgrade_write(&dvnode->validate_lock); in afs_read_dir()
384 up_write(&dvnode->validate_lock); in afs_read_dir()
404 _enter("%llx,%x", ctx->pos, blkoff); in afs_dir_iterate_block()
406 curr = (ctx->pos - blkoff) / sizeof(union afs_xdr_dirent); in afs_dir_iterate_block()
408 /* walk through the block, an entry at a time */ in afs_dir_iterate_block()
414 if (!(block->hdr.bitmap[offset / 8] & in afs_dir_iterate_block()
420 ctx->pos = blkoff + in afs_dir_iterate_block()
426 dire = &block->dirents[offset]; in afs_dir_iterate_block()
427 nlen = strnlen(dire->u.name, in afs_dir_iterate_block()
428 sizeof(*block) - in afs_dir_iterate_block()
430 if (nlen > AFSNAMEMAX - 1) { in afs_dir_iterate_block()
440 nlen, dire->u.name); in afs_dir_iterate_block()
453 /* Check that the name-extension dirents are all allocated */ in afs_dir_iterate_block()
456 if (!(block->hdr.bitmap[ix / 8] & (1 << (ix % 8)))) { in afs_dir_iterate_block()
468 ctx->pos = blkoff + next * sizeof(union afs_xdr_dirent); in afs_dir_iterate_block()
473 if (!dir_emit(ctx, dire->u.name, nlen, in afs_dir_iterate_block()
474 ntohl(dire->u.vnode), in afs_dir_iterate_block()
475 (ctx->actor == afs_lookup_filldir || in afs_dir_iterate_block()
476 ctx->actor == afs_lookup_one_filldir)? in afs_dir_iterate_block()
477 ntohl(dire->u.unique) : DT_UNKNOWN)) { in afs_dir_iterate_block()
482 ctx->pos = blkoff + next * sizeof(union afs_xdr_dirent); in afs_dir_iterate_block()
502 _enter("{%lu},%u,,", dir->i_ino, (unsigned)ctx->pos); in afs_dir_iterate()
504 if (test_bit(AFS_VNODE_DELETED, &AFS_FS_I(dir)->flags)) { in afs_dir_iterate()
505 _leave(" = -ESTALE"); in afs_dir_iterate()
506 return -ESTALE; in afs_dir_iterate()
512 *_dir_version = req->data_version; in afs_dir_iterate()
515 ctx->pos += sizeof(union afs_xdr_dirent) - 1; in afs_dir_iterate()
516 ctx->pos &= ~(sizeof(union afs_xdr_dirent) - 1); in afs_dir_iterate()
520 while (ctx->pos < req->actual_len) { in afs_dir_iterate()
521 /* Fetch the appropriate folio from the directory and re-add it in afs_dir_iterate()
524 folio = __filemap_get_folio(dir->i_mapping, ctx->pos / PAGE_SIZE, in afs_dir_iterate()
531 offset = round_down(ctx->pos, sizeof(*dblock)) - folio_file_pos(folio); in afs_dir_iterate()
533 req->actual_len - folio_file_pos(folio)); in afs_dir_iterate()
549 up_read(&dvnode->validate_lock); in afs_dir_iterate()
568 * - if afs_dir_iterate_block() spots this function, it'll pass the FID
578 cookie->name.name, cookie->name.len, name, nlen, in afs_lookup_one_filldir()
585 if (cookie->name.len != nlen || in afs_lookup_one_filldir()
586 memcmp(cookie->name.name, name, nlen) != 0) { in afs_lookup_one_filldir()
591 cookie->fid.vnode = ino; in afs_lookup_one_filldir()
592 cookie->fid.unique = dtype; in afs_lookup_one_filldir()
593 cookie->found = 1; in afs_lookup_one_filldir()
601 * - just returns the FID the dentry name maps to if found
607 struct afs_super_info *as = dir->i_sb->s_fs_info; in afs_do_lookup_one()
610 .name = dentry->d_name, in afs_do_lookup_one()
611 .fid.vid = as->volume->vid in afs_do_lookup_one()
615 _enter("{%lu},%p{%pd},", dir->i_ino, dentry, dentry); in afs_do_lookup_one()
625 _leave(" = -ENOENT [not found]"); in afs_do_lookup_one()
626 return -ENOENT; in afs_do_lookup_one()
630 _leave(" = 0 { vn=%llu u=%u }", fid->vnode, fid->unique); in afs_do_lookup_one()
636 * - if afs_dir_iterate_block() spots this function, it'll pass the FID
646 cookie->name.name, cookie->name.len, name, nlen, in afs_lookup_filldir()
653 if (cookie->found) { in afs_lookup_filldir()
654 if (cookie->nr_fids < 50) { in afs_lookup_filldir()
655 cookie->fids[cookie->nr_fids].vnode = ino; in afs_lookup_filldir()
656 cookie->fids[cookie->nr_fids].unique = dtype; in afs_lookup_filldir()
657 cookie->nr_fids++; in afs_lookup_filldir()
659 } else if (cookie->name.len == nlen && in afs_lookup_filldir()
660 memcmp(cookie->name.name, name, nlen) == 0) { in afs_lookup_filldir()
661 cookie->fids[1].vnode = ino; in afs_lookup_filldir()
662 cookie->fids[1].unique = dtype; in afs_lookup_filldir()
663 cookie->found = 1; in afs_lookup_filldir()
664 if (cookie->one_only) in afs_lookup_filldir()
668 return cookie->nr_fids < 50; in afs_lookup_filldir()
673 * into inodes and save the first one - which is the one we actually want.
685 for (i = 0; i < op->nr_files; i++) { in afs_do_lookup_success()
688 vp = &op->file[0]; in afs_do_lookup_success()
689 abort_code = vp->scb.status.abort_code; in afs_do_lookup_success()
691 op->ac.abort_code = abort_code; in afs_do_lookup_success()
692 op->error = afs_abort_to_error(abort_code); in afs_do_lookup_success()
697 vp = &op->file[1]; in afs_do_lookup_success()
701 vp = &op->more_files[i - 2]; in afs_do_lookup_success()
705 if (!vp->scb.have_status && !vp->scb.have_error) in afs_do_lookup_success()
709 if (vp->vnode) { in afs_do_lookup_success()
710 if (!test_bit(AFS_VNODE_UNSET, &vp->vnode->flags)) in afs_do_lookup_success()
712 } else if (vp->scb.status.abort_code == 0) { in afs_do_lookup_success()
716 afs_cache_permit(vnode, op->key, in afs_do_lookup_success()
717 0 /* Assume vnode->cb_break is 0 */ + in afs_do_lookup_success()
718 op->cb_v_break, in afs_do_lookup_success()
719 &vp->scb); in afs_do_lookup_success()
720 vp->vnode = vnode; in afs_do_lookup_success()
721 vp->put_vnode = true; in afs_do_lookup_success()
724 _debug("- abort %d %llx:%llx.%x", in afs_do_lookup_success()
725 vp->scb.status.abort_code, in afs_do_lookup_success()
726 vp->fid.vid, vp->fid.vnode, vp->fid.unique); in afs_do_lookup_success()
753 struct afs_volume *volume = dvnode->volume; in afs_server_supports_ibulk()
758 if (!test_bit(AFS_VOLUME_MAYBE_NO_IBULK, &volume->flags)) in afs_server_supports_ibulk()
762 slist = rcu_dereference(volume->servers); in afs_server_supports_ibulk()
764 for (i = 0; i < slist->nr_servers; i++) { in afs_server_supports_ibulk()
765 server = slist->servers[i].server; in afs_server_supports_ibulk()
766 if (server == dvnode->cb_server) { in afs_server_supports_ibulk()
767 if (test_bit(AFS_SERVER_FL_NO_IBULK, &server->flags)) in afs_server_supports_ibulk()
778 * Do a lookup in a directory. We make use of bulk lookup to query a slew of
790 afs_dataversion_t data_version = READ_ONCE(dvnode->status.data_version); in afs_do_lookup()
794 _enter("{%lu},%p{%pd},", dir->i_ino, dentry, dentry); in afs_do_lookup()
798 return ERR_PTR(-ENOMEM); in afs_do_lookup()
800 for (i = 0; i < ARRAY_SIZE(cookie->fids); i++) in afs_do_lookup()
801 cookie->fids[i].vid = dvnode->fid.vid; in afs_do_lookup()
802 cookie->ctx.actor = afs_lookup_filldir; in afs_do_lookup()
803 cookie->name = dentry->d_name; in afs_do_lookup()
804 cookie->nr_fids = 2; /* slot 0 is saved for the fid we actually want in afs_do_lookup()
808 cookie->one_only = true; in afs_do_lookup()
811 ret = afs_dir_iterate(dir, &cookie->ctx, key, &data_version); in afs_do_lookup()
815 dentry->d_fsdata = (void *)(unsigned long)data_version; in afs_do_lookup()
817 ret = -ENOENT; in afs_do_lookup()
818 if (!cookie->found) in afs_do_lookup()
822 inode = ilookup5(dir->i_sb, cookie->fids[1].vnode, in afs_do_lookup()
823 afs_ilookup5_test_by_fid, &cookie->fids[1]); in afs_do_lookup()
827 /* Okay, we didn't find it. We need to query the server - and whilst in afs_do_lookup()
831 op = afs_alloc_operation(NULL, dvnode->volume); in afs_do_lookup()
838 afs_op_set_fid(op, 1, &cookie->fids[1]); in afs_do_lookup()
840 op->nr_files = cookie->nr_fids; in afs_do_lookup()
841 _debug("nr_files %u", op->nr_files); in afs_do_lookup()
844 op->error = -ENOMEM; in afs_do_lookup()
845 if (op->nr_files > 2) { in afs_do_lookup()
846 op->more_files = kvcalloc(op->nr_files - 2, in afs_do_lookup()
849 if (!op->more_files) in afs_do_lookup()
852 for (i = 2; i < op->nr_files; i++) { in afs_do_lookup()
853 vp = &op->more_files[i - 2]; in afs_do_lookup()
854 vp->fid = cookie->fids[i]; in afs_do_lookup()
859 ti = ilookup5_nowait(dir->i_sb, vp->fid.vnode, in afs_do_lookup()
860 afs_ilookup5_test_by_fid, &vp->fid); in afs_do_lookup()
863 vp->dv_before = vnode->status.data_version; in afs_do_lookup()
864 vp->cb_break_before = afs_calc_vnode_cb_break(vnode); in afs_do_lookup()
865 vp->vnode = vnode; in afs_do_lookup()
866 vp->put_vnode = true; in afs_do_lookup()
867 vp->speculative = true; /* vnode not locked */ in afs_do_lookup()
876 op->error = -ENOTSUPP; in afs_do_lookup()
877 if (!cookie->one_only) { in afs_do_lookup()
878 op->ops = &afs_inline_bulk_status_operation; in afs_do_lookup()
883 if (op->error == -ENOTSUPP) { in afs_do_lookup()
885 * op if any of the lookups fails - so, for the moment, revert in afs_do_lookup()
886 * to FS.FetchStatus for op->file[1]. in afs_do_lookup()
888 op->fetch_status.which = 1; in afs_do_lookup()
889 op->ops = &afs_lookup_fetch_status_operation; in afs_do_lookup()
893 inode = ERR_PTR(op->error); in afs_do_lookup()
896 if (op->error == 0) { in afs_do_lookup()
897 inode = &op->file[1].vnode->netfs.inode; in afs_do_lookup()
898 op->file[1].vnode = NULL; in afs_do_lookup()
901 if (op->file[0].scb.have_status) in afs_do_lookup()
902 dentry->d_fsdata = (void *)(unsigned long)op->file[0].scb.status.data_version; in afs_do_lookup()
904 dentry->d_fsdata = (void *)(unsigned long)op->file[0].dv_before; in afs_do_lookup()
926 ret = ERR_PTR(-ENOMEM); in afs_lookup_atsys()
930 if (dentry->d_name.len > 4) { in afs_lookup_atsys()
931 memcpy(p, dentry->d_name.name, dentry->d_name.len - 4); in afs_lookup_atsys()
932 p += dentry->d_name.len - 4; in afs_lookup_atsys()
936 read_lock(&net->sysnames_lock); in afs_lookup_atsys()
937 subs = net->sysnames; in afs_lookup_atsys()
938 refcount_inc(&subs->usage); in afs_lookup_atsys()
939 read_unlock(&net->sysnames_lock); in afs_lookup_atsys()
941 for (i = 0; i < subs->nr; i++) { in afs_lookup_atsys()
942 name = subs->subs[i]; in afs_lookup_atsys()
943 len = dentry->d_name.len - 4 + strlen(name); in afs_lookup_atsys()
945 ret = ERR_PTR(-ENAMETOOLONG); in afs_lookup_atsys()
950 ret = lookup_one_len(buf, dentry->d_parent, len); in afs_lookup_atsys()
982 dvnode->fid.vid, dvnode->fid.vnode, dentry, dentry); in afs_lookup()
986 if (dentry->d_name.len >= AFSNAMEMAX) { in afs_lookup()
987 _leave(" = -ENAMETOOLONG"); in afs_lookup()
988 return ERR_PTR(-ENAMETOOLONG); in afs_lookup()
991 if (test_bit(AFS_VNODE_DELETED, &dvnode->flags)) { in afs_lookup()
992 _leave(" = -ESTALE"); in afs_lookup()
993 return ERR_PTR(-ESTALE); in afs_lookup()
996 key = afs_request_key(dvnode->volume->cell); in afs_lookup()
1009 if (dentry->d_name.len >= 4 && in afs_lookup()
1010 dentry->d_name.name[dentry->d_name.len - 4] == '@' && in afs_lookup()
1011 dentry->d_name.name[dentry->d_name.len - 3] == 's' && in afs_lookup()
1012 dentry->d_name.name[dentry->d_name.len - 2] == 'y' && in afs_lookup()
1013 dentry->d_name.name[dentry->d_name.len - 1] == 's') in afs_lookup()
1019 if (inode == ERR_PTR(-ENOENT)) in afs_lookup()
1023 fid = AFS_FS_I(inode)->fid; in afs_lookup()
1025 _debug("splice %p", dentry->d_inode); in afs_lookup()
1028 d->d_fsdata = dentry->d_fsdata; in afs_lookup()
1029 trace_afs_lookup(dvnode, &d->d_name, &fid); in afs_lookup()
1031 trace_afs_lookup(dvnode, &dentry->d_name, &fid); in afs_lookup()
1050 parent = READ_ONCE(dentry->d_parent); in afs_d_revalidate_rcu()
1053 return -ECHILD; in afs_d_revalidate_rcu()
1055 if (test_bit(AFS_VNODE_DELETED, &dvnode->flags)) in afs_d_revalidate_rcu()
1056 return -ECHILD; in afs_d_revalidate_rcu()
1059 return -ECHILD; in afs_d_revalidate_rcu()
1063 * on a 32-bit system, we only have 32 bits in the dentry to store the in afs_d_revalidate_rcu()
1066 dir_version = (long)READ_ONCE(dvnode->status.data_version); in afs_d_revalidate_rcu()
1067 de_version = (long)READ_ONCE(dentry->d_fsdata); in afs_d_revalidate_rcu()
1069 dir_version = (long)READ_ONCE(dvnode->invalid_before); in afs_d_revalidate_rcu()
1070 if (de_version - dir_version < 0) in afs_d_revalidate_rcu()
1071 return -ECHILD; in afs_d_revalidate_rcu()
1079 * - NOTE! the hit can be a negative hit too, so we can't assume we have an
1099 vnode->fid.vid, vnode->fid.vnode, dentry, in afs_d_revalidate()
1100 vnode->flags); in afs_d_revalidate()
1105 key = afs_request_key(AFS_FS_S(dentry->d_sb)->volume->cell); in afs_d_revalidate()
1116 if (test_bit(AFS_VNODE_DELETED, &dir->flags)) { in afs_d_revalidate()
1123 * on a 32-bit system, we only have 32 bits in the dentry to store the in afs_d_revalidate()
1126 dir_version = dir->status.data_version; in afs_d_revalidate()
1127 de_version = (long)dentry->d_fsdata; in afs_d_revalidate()
1131 invalid_before = dir->invalid_before; in afs_d_revalidate()
1132 if (de_version - (long)invalid_before >= 0) in afs_d_revalidate()
1139 ret = afs_do_lookup_one(&dir->netfs.inode, dentry, &fid, key, &dir_version); in afs_d_revalidate()
1156 if (fid.vnode != vnode->fid.vnode) { in afs_d_revalidate()
1159 vnode->fid.vnode); in afs_d_revalidate()
1166 if (fid.unique != vnode->fid.unique) { in afs_d_revalidate()
1167 _debug("%pd: file deleted (uq %u -> %u I:%u)", in afs_d_revalidate()
1169 vnode->fid.unique, in afs_d_revalidate()
1170 vnode->netfs.inode.i_generation); in afs_d_revalidate()
1175 case -ENOENT: in afs_d_revalidate()
1189 dentry->d_fsdata = (void *)(unsigned long)dir_version; in afs_d_revalidate()
1208 * - called from dput() when d_count is going to 0.
1209 * - return 1 to request dentry be unhashed, 0 otherwise
1215 if (dentry->d_flags & DCACHE_NFSFS_RENAMED) in afs_d_delete()
1219 (test_bit(AFS_VNODE_DELETED, &AFS_FS_I(d_inode(dentry))->flags) || in afs_d_delete()
1220 test_bit(AFS_VNODE_PSEUDODIR, &AFS_FS_I(d_inode(dentry))->flags))) in afs_d_delete()
1236 if (dentry->d_flags & DCACHE_NFSFS_RENAMED) in afs_d_iput()
1251 struct afs_vnode *vnode = op->file[0].vnode; in afs_check_for_remote_deletion()
1253 switch (op->ac.abort_code) { in afs_check_for_remote_deletion()
1255 set_bit(AFS_VNODE_DELETED, &vnode->flags); in afs_check_for_remote_deletion()
1265 struct afs_vnode_param *vp = &op->file[1]; in afs_vnode_new_inode()
1271 ASSERTCMP(op->error, ==, 0); in afs_vnode_new_inode()
1275 /* ENOMEM or EINTR at a really inconvenient time - just abandon in afs_vnode_new_inode()
1278 op->error = PTR_ERR(inode); in afs_vnode_new_inode()
1283 set_bit(AFS_VNODE_NEW_CONTENT, &vnode->flags); in afs_vnode_new_inode()
1284 if (!op->error) in afs_vnode_new_inode()
1285 afs_cache_permit(vnode, op->key, vnode->cb_break, &vp->scb); in afs_vnode_new_inode()
1286 d_instantiate(op->dentry, inode); in afs_vnode_new_inode()
1291 _enter("op=%08x", op->debug_id); in afs_create_success()
1292 op->ctime = op->file[0].scb.status.mtime_client; in afs_create_success()
1293 afs_vnode_commit_status(op, &op->file[0]); in afs_create_success()
1294 afs_update_dentry_version(op, &op->file[0], op->dentry); in afs_create_success()
1300 struct afs_vnode_param *dvp = &op->file[0]; in afs_create_edit_dir()
1301 struct afs_vnode_param *vp = &op->file[1]; in afs_create_edit_dir()
1302 struct afs_vnode *dvnode = dvp->vnode; in afs_create_edit_dir()
1304 _enter("op=%08x", op->debug_id); in afs_create_edit_dir()
1306 down_write(&dvnode->validate_lock); in afs_create_edit_dir()
1307 if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags) && in afs_create_edit_dir()
1308 dvnode->status.data_version == dvp->dv_before + dvp->dv_delta) in afs_create_edit_dir()
1309 afs_edit_dir_add(dvnode, &op->dentry->d_name, &vp->fid, in afs_create_edit_dir()
1310 op->create.reason); in afs_create_edit_dir()
1311 up_write(&dvnode->validate_lock); in afs_create_edit_dir()
1316 _enter("op=%08x", op->debug_id); in afs_create_put()
1318 if (op->error) in afs_create_put()
1319 d_drop(op->dentry); in afs_create_put()
1341 dvnode->fid.vid, dvnode->fid.vnode, dentry, mode); in afs_mkdir()
1343 op = afs_alloc_operation(NULL, dvnode->volume); in afs_mkdir()
1350 op->file[0].dv_delta = 1; in afs_mkdir()
1351 op->file[0].modification = true; in afs_mkdir()
1352 op->file[0].update_ctime = true; in afs_mkdir()
1353 op->dentry = dentry; in afs_mkdir()
1354 op->create.mode = S_IFDIR | mode; in afs_mkdir()
1355 op->create.reason = afs_edit_dir_for_mkdir; in afs_mkdir()
1356 op->ops = &afs_mkdir_operation; in afs_mkdir()
1368 clear_nlink(&vnode->netfs.inode); in afs_dir_remove_subdir()
1369 set_bit(AFS_VNODE_DELETED, &vnode->flags); in afs_dir_remove_subdir()
1370 clear_bit(AFS_VNODE_CB_PROMISED, &vnode->flags); in afs_dir_remove_subdir()
1371 clear_bit(AFS_VNODE_DIR_VALID, &vnode->flags); in afs_dir_remove_subdir()
1377 _enter("op=%08x", op->debug_id); in afs_rmdir_success()
1378 op->ctime = op->file[0].scb.status.mtime_client; in afs_rmdir_success()
1379 afs_vnode_commit_status(op, &op->file[0]); in afs_rmdir_success()
1380 afs_update_dentry_version(op, &op->file[0], op->dentry); in afs_rmdir_success()
1385 struct afs_vnode_param *dvp = &op->file[0]; in afs_rmdir_edit_dir()
1386 struct afs_vnode *dvnode = dvp->vnode; in afs_rmdir_edit_dir()
1388 _enter("op=%08x", op->debug_id); in afs_rmdir_edit_dir()
1389 afs_dir_remove_subdir(op->dentry); in afs_rmdir_edit_dir()
1391 down_write(&dvnode->validate_lock); in afs_rmdir_edit_dir()
1392 if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags) && in afs_rmdir_edit_dir()
1393 dvnode->status.data_version == dvp->dv_before + dvp->dv_delta) in afs_rmdir_edit_dir()
1394 afs_edit_dir_remove(dvnode, &op->dentry->d_name, in afs_rmdir_edit_dir()
1396 up_write(&dvnode->validate_lock); in afs_rmdir_edit_dir()
1401 _enter("op=%08x", op->debug_id); in afs_rmdir_put()
1402 if (op->file[1].vnode) in afs_rmdir_put()
1403 up_write(&op->file[1].vnode->rmdir_lock); in afs_rmdir_put()
1425 dvnode->fid.vid, dvnode->fid.vnode, dentry); in afs_rmdir()
1427 op = afs_alloc_operation(NULL, dvnode->volume); in afs_rmdir()
1432 op->file[0].dv_delta = 1; in afs_rmdir()
1433 op->file[0].modification = true; in afs_rmdir()
1434 op->file[0].update_ctime = true; in afs_rmdir()
1436 op->dentry = dentry; in afs_rmdir()
1437 op->ops = &afs_rmdir_operation; in afs_rmdir()
1442 ret = afs_validate(vnode, op->key); in afs_rmdir()
1448 ret = down_write_killable(&vnode->rmdir_lock); in afs_rmdir()
1451 op->file[1].vnode = vnode; in afs_rmdir()
1464 * break the callback promise on the file - if it had one - before it returns
1465 * to us, and if it was deleted, it won't
1472 struct afs_vnode *dvnode = op->file[0].vnode; in afs_dir_remove_link()
1473 struct afs_vnode *vnode = op->file[1].vnode; in afs_dir_remove_link()
1474 struct dentry *dentry = op->dentry; in afs_dir_remove_link()
1477 if (op->error != 0 || in afs_dir_remove_link()
1478 (op->file[1].scb.have_status && op->file[1].scb.have_error)) in afs_dir_remove_link()
1483 if (test_bit(AFS_VNODE_DELETED, &vnode->flags)) { in afs_dir_remove_link()
1485 } else if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags)) { in afs_dir_remove_link()
1486 write_seqlock(&vnode->cb_lock); in afs_dir_remove_link()
1487 drop_nlink(&vnode->netfs.inode); in afs_dir_remove_link()
1488 if (vnode->netfs.inode.i_nlink == 0) { in afs_dir_remove_link()
1489 set_bit(AFS_VNODE_DELETED, &vnode->flags); in afs_dir_remove_link()
1492 write_sequnlock(&vnode->cb_lock); in afs_dir_remove_link()
1496 if (test_bit(AFS_VNODE_DELETED, &vnode->flags)) in afs_dir_remove_link()
1499 ret = afs_validate(vnode, op->key); in afs_dir_remove_link()
1500 if (ret != -ESTALE) in afs_dir_remove_link()
1501 op->error = ret; in afs_dir_remove_link()
1504 _debug("nlink %d [val %d]", vnode->netfs.inode.i_nlink, op->error); in afs_dir_remove_link()
1509 _enter("op=%08x", op->debug_id); in afs_unlink_success()
1510 op->ctime = op->file[0].scb.status.mtime_client; in afs_unlink_success()
1511 afs_check_dir_conflict(op, &op->file[0]); in afs_unlink_success()
1512 afs_vnode_commit_status(op, &op->file[0]); in afs_unlink_success()
1513 afs_vnode_commit_status(op, &op->file[1]); in afs_unlink_success()
1514 afs_update_dentry_version(op, &op->file[0], op->dentry); in afs_unlink_success()
1520 struct afs_vnode_param *dvp = &op->file[0]; in afs_unlink_edit_dir()
1521 struct afs_vnode *dvnode = dvp->vnode; in afs_unlink_edit_dir()
1523 _enter("op=%08x", op->debug_id); in afs_unlink_edit_dir()
1524 down_write(&dvnode->validate_lock); in afs_unlink_edit_dir()
1525 if (test_bit(AFS_VNODE_DIR_VALID, &dvnode->flags) && in afs_unlink_edit_dir()
1526 dvnode->status.data_version == dvp->dv_before + dvp->dv_delta) in afs_unlink_edit_dir()
1527 afs_edit_dir_remove(dvnode, &op->dentry->d_name, in afs_unlink_edit_dir()
1529 up_write(&dvnode->validate_lock); in afs_unlink_edit_dir()
1534 _enter("op=%08x", op->debug_id); in afs_unlink_put()
1535 if (op->unlink.need_rehash && op->error < 0 && op->error != -ENOENT) in afs_unlink_put()
1536 d_rehash(op->dentry); in afs_unlink_put()
1559 dvnode->fid.vid, dvnode->fid.vnode, dentry); in afs_unlink()
1561 if (dentry->d_name.len >= AFSNAMEMAX) in afs_unlink()
1562 return -ENAMETOOLONG; in afs_unlink()
1564 op = afs_alloc_operation(NULL, dvnode->volume); in afs_unlink()
1569 op->file[0].dv_delta = 1; in afs_unlink()
1570 op->file[0].modification = true; in afs_unlink()
1571 op->file[0].update_ctime = true; in afs_unlink()
1574 ret = afs_validate(vnode, op->key); in afs_unlink()
1576 op->error = ret; in afs_unlink()
1580 spin_lock(&dentry->d_lock); in afs_unlink()
1582 spin_unlock(&dentry->d_lock); in afs_unlink()
1585 op->error = afs_sillyrename(dvnode, vnode, dentry, op->key); in afs_unlink()
1591 op->unlink.need_rehash = true; in afs_unlink()
1593 spin_unlock(&dentry->d_lock); in afs_unlink()
1595 op->file[1].vnode = vnode; in afs_unlink()
1596 op->file[1].update_ctime = true; in afs_unlink()
1597 op->file[1].op_unlinked = true; in afs_unlink()
1598 op->dentry = dentry; in afs_unlink()
1599 op->ops = &afs_unlink_operation; in afs_unlink()
1606 if (op->error == 0 && (op->flags & AFS_OPERATION_DIR_CONFLICT)) { in afs_unlink()
1607 op->file[1].update_ctime = false; in afs_unlink()
1608 op->fetch_status.which = 1; in afs_unlink()
1609 op->ops = &afs_fetch_status_operation; in afs_unlink()
1637 int ret = -ENAMETOOLONG; in afs_create()
1640 dvnode->fid.vid, dvnode->fid.vnode, dentry, mode); in afs_create()
1642 if (dentry->d_name.len >= AFSNAMEMAX) in afs_create()
1645 op = afs_alloc_operation(NULL, dvnode->volume); in afs_create()
1652 op->file[0].dv_delta = 1; in afs_create()
1653 op->file[0].modification = true; in afs_create()
1654 op->file[0].update_ctime = true; in afs_create()
1656 op->dentry = dentry; in afs_create()
1657 op->create.mode = S_IFREG | mode; in afs_create()
1658 op->create.reason = afs_edit_dir_for_create; in afs_create()
1659 op->ops = &afs_create_operation; in afs_create()
1670 struct afs_vnode_param *dvp = &op->file[0]; in afs_link_success()
1671 struct afs_vnode_param *vp = &op->file[1]; in afs_link_success()
1673 _enter("op=%08x", op->debug_id); in afs_link_success()
1674 op->ctime = dvp->scb.status.mtime_client; in afs_link_success()
1677 afs_update_dentry_version(op, dvp, op->dentry); in afs_link_success()
1678 if (op->dentry_2->d_parent == op->dentry->d_parent) in afs_link_success()
1679 afs_update_dentry_version(op, dvp, op->dentry_2); in afs_link_success()
1680 ihold(&vp->vnode->netfs.inode); in afs_link_success()
1681 d_instantiate(op->dentry, &vp->vnode->netfs.inode); in afs_link_success()
1686 _enter("op=%08x", op->debug_id); in afs_link_put()
1687 if (op->error) in afs_link_put()
1688 d_drop(op->dentry); in afs_link_put()
1709 int ret = -ENAMETOOLONG; in afs_link()
1712 vnode->fid.vid, vnode->fid.vnode, in afs_link()
1713 dvnode->fid.vid, dvnode->fid.vnode, in afs_link()
1716 if (dentry->d_name.len >= AFSNAMEMAX) in afs_link()
1719 op = afs_alloc_operation(NULL, dvnode->volume); in afs_link()
1725 ret = afs_validate(vnode, op->key); in afs_link()
1731 op->file[0].dv_delta = 1; in afs_link()
1732 op->file[0].modification = true; in afs_link()
1733 op->file[0].update_ctime = true; in afs_link()
1734 op->file[1].update_ctime = true; in afs_link()
1736 op->dentry = dentry; in afs_link()
1737 op->dentry_2 = from; in afs_link()
1738 op->ops = &afs_link_operation; in afs_link()
1739 op->create.reason = afs_edit_dir_for_link; in afs_link()
1770 dvnode->fid.vid, dvnode->fid.vnode, dentry, in afs_symlink()
1773 ret = -ENAMETOOLONG; in afs_symlink()
1774 if (dentry->d_name.len >= AFSNAMEMAX) in afs_symlink()
1777 ret = -EINVAL; in afs_symlink()
1781 op = afs_alloc_operation(NULL, dvnode->volume); in afs_symlink()
1788 op->file[0].dv_delta = 1; in afs_symlink()
1790 op->dentry = dentry; in afs_symlink()
1791 op->ops = &afs_symlink_operation; in afs_symlink()
1792 op->create.reason = afs_edit_dir_for_symlink; in afs_symlink()
1793 op->create.symlink = content; in afs_symlink()
1804 _enter("op=%08x", op->debug_id); in afs_rename_success()
1806 op->ctime = op->file[0].scb.status.mtime_client; in afs_rename_success()
1807 afs_check_dir_conflict(op, &op->file[1]); in afs_rename_success()
1808 afs_vnode_commit_status(op, &op->file[0]); in afs_rename_success()
1809 if (op->file[1].vnode != op->file[0].vnode) { in afs_rename_success()
1810 op->ctime = op->file[1].scb.status.mtime_client; in afs_rename_success()
1811 afs_vnode_commit_status(op, &op->file[1]); in afs_rename_success()
1817 struct afs_vnode_param *orig_dvp = &op->file[0]; in afs_rename_edit_dir()
1818 struct afs_vnode_param *new_dvp = &op->file[1]; in afs_rename_edit_dir()
1819 struct afs_vnode *orig_dvnode = orig_dvp->vnode; in afs_rename_edit_dir()
1820 struct afs_vnode *new_dvnode = new_dvp->vnode; in afs_rename_edit_dir()
1821 struct afs_vnode *vnode = AFS_FS_I(d_inode(op->dentry)); in afs_rename_edit_dir()
1822 struct dentry *old_dentry = op->dentry; in afs_rename_edit_dir()
1823 struct dentry *new_dentry = op->dentry_2; in afs_rename_edit_dir()
1826 _enter("op=%08x", op->debug_id); in afs_rename_edit_dir()
1828 if (op->rename.rehash) { in afs_rename_edit_dir()
1829 d_rehash(op->rename.rehash); in afs_rename_edit_dir()
1830 op->rename.rehash = NULL; in afs_rename_edit_dir()
1833 down_write(&orig_dvnode->validate_lock); in afs_rename_edit_dir()
1834 if (test_bit(AFS_VNODE_DIR_VALID, &orig_dvnode->flags) && in afs_rename_edit_dir()
1835 orig_dvnode->status.data_version == orig_dvp->dv_before + orig_dvp->dv_delta) in afs_rename_edit_dir()
1836 afs_edit_dir_remove(orig_dvnode, &old_dentry->d_name, in afs_rename_edit_dir()
1840 up_write(&orig_dvnode->validate_lock); in afs_rename_edit_dir()
1841 down_write(&new_dvnode->validate_lock); in afs_rename_edit_dir()
1844 if (test_bit(AFS_VNODE_DIR_VALID, &new_dvnode->flags) && in afs_rename_edit_dir()
1845 new_dvnode->status.data_version == new_dvp->dv_before + new_dvp->dv_delta) { in afs_rename_edit_dir()
1846 if (!op->rename.new_negative) in afs_rename_edit_dir()
1847 afs_edit_dir_remove(new_dvnode, &new_dentry->d_name, in afs_rename_edit_dir()
1850 afs_edit_dir_add(new_dvnode, &new_dentry->d_name, in afs_rename_edit_dir()
1851 &vnode->fid, afs_edit_dir_for_rename_2); in afs_rename_edit_dir()
1856 spin_lock(&new_inode->i_lock); in afs_rename_edit_dir()
1857 if (S_ISDIR(new_inode->i_mode)) in afs_rename_edit_dir()
1859 else if (new_inode->i_nlink > 0) in afs_rename_edit_dir()
1861 spin_unlock(&new_inode->i_lock); in afs_rename_edit_dir()
1870 afs_update_dentry_version(op, new_dvp, op->dentry); in afs_rename_edit_dir()
1871 afs_update_dentry_version(op, new_dvp, op->dentry_2); in afs_rename_edit_dir()
1875 up_write(&new_dvnode->validate_lock); in afs_rename_edit_dir()
1880 _enter("op=%08x", op->debug_id); in afs_rename_put()
1881 if (op->rename.rehash) in afs_rename_put()
1882 d_rehash(op->rename.rehash); in afs_rename_put()
1883 dput(op->rename.tmp); in afs_rename_put()
1884 if (op->error) in afs_rename_put()
1885 d_rehash(op->dentry); in afs_rename_put()
1908 return -EINVAL; in afs_rename()
1910 /* Don't allow silly-rename files be moved around. */ in afs_rename()
1911 if (old_dentry->d_flags & DCACHE_NFSFS_RENAMED) in afs_rename()
1912 return -EINVAL; in afs_rename()
1919 orig_dvnode->fid.vid, orig_dvnode->fid.vnode, in afs_rename()
1920 vnode->fid.vid, vnode->fid.vnode, in afs_rename()
1921 new_dvnode->fid.vid, new_dvnode->fid.vnode, in afs_rename()
1924 op = afs_alloc_operation(NULL, orig_dvnode->volume); in afs_rename()
1928 ret = afs_validate(vnode, op->key); in afs_rename()
1929 op->error = ret; in afs_rename()
1935 op->file[0].dv_delta = 1; in afs_rename()
1936 op->file[1].dv_delta = 1; in afs_rename()
1937 op->file[0].modification = true; in afs_rename()
1938 op->file[1].modification = true; in afs_rename()
1939 op->file[0].update_ctime = true; in afs_rename()
1940 op->file[1].update_ctime = true; in afs_rename()
1942 op->dentry = old_dentry; in afs_rename()
1943 op->dentry_2 = new_dentry; in afs_rename()
1944 op->rename.new_negative = d_is_negative(new_dentry); in afs_rename()
1945 op->ops = &afs_rename_operation; in afs_rename()
1947 /* For non-directories, check whether the target is busy and if so, in afs_rename()
1948 * make a copy of the dentry and then do a silly-rename. If the in afs_rename()
1949 * silly-rename succeeds, the copied dentry is hashed and becomes the in afs_rename()
1958 op->rename.rehash = new_dentry; in afs_rename()
1963 op->rename.tmp = d_alloc(new_dentry->d_parent, in afs_rename()
1964 &new_dentry->d_name); in afs_rename()
1965 if (!op->rename.tmp) { in afs_rename()
1966 op->error = -ENOMEM; in afs_rename()
1972 new_dentry, op->key); in afs_rename()
1974 op->error = ret; in afs_rename()
1978 op->dentry_2 = op->rename.tmp; in afs_rename()
1979 op->rename.rehash = NULL; in afs_rename()
1980 op->rename.new_negative = true; in afs_rename()
1991 * lookup instead - which we hold a lock against. in afs_rename()
2003 * - return true if the folio can now be released, false if not
2009 _enter("{{%llx:%llu}[%lu]}", dvnode->fid.vid, dvnode->fid.vnode, folio_index(folio)); in afs_dir_release_folio()
2014 if (test_and_clear_bit(AFS_VNODE_DIR_VALID, &dvnode->flags)) in afs_dir_release_folio()
2027 _enter("{%lu},%zu,%zu", folio->index, offset, length); in afs_dir_invalidate_folio()
2032 if (test_and_clear_bit(AFS_VNODE_DIR_VALID, &dvnode->flags)) in afs_dir_invalidate_folio()