Lines Matching refs:dentry
37 struct inode *inode = d_inode(path->dentry); in simple_getattr()
44 int simple_statfs(struct dentry *dentry, struct kstatfs *buf) in simple_statfs() argument
46 u64 id = huge_encode_dev(dentry->d_sb->s_dev); in simple_statfs()
49 buf->f_type = dentry->d_sb->s_magic; in simple_statfs()
60 int always_delete_dentry(const struct dentry *dentry) in always_delete_dentry() argument
70 struct dentry *simple_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags) in simple_lookup() argument
72 if (dentry->d_name.len > NAME_MAX) in simple_lookup()
74 if (!dentry->d_op && !(dentry->d_flags & DCACHE_DONTCACHE)) { in simple_lookup()
75 spin_lock(&dentry->d_lock); in simple_lookup()
76 dentry->d_flags |= DCACHE_DONTCACHE; in simple_lookup()
77 spin_unlock(&dentry->d_lock); in simple_lookup()
82 d_add(dentry, NULL); in simple_lookup()
89 file->private_data = d_alloc_cursor(file->f_path.dentry); in dcache_dir_open()
109 static struct dentry *scan_positives(struct dentry *cursor, in scan_positives()
112 struct dentry *last) in scan_positives()
114 struct dentry *dentry = cursor->d_parent, *found = NULL; in scan_positives() local
116 spin_lock(&dentry->d_lock); in scan_positives()
118 struct dentry *d = hlist_entry(*p, struct dentry, d_sib); in scan_positives()
137 spin_unlock(&dentry->d_lock); in scan_positives()
139 spin_lock(&dentry->d_lock); in scan_positives()
142 spin_unlock(&dentry->d_lock); in scan_positives()
149 struct dentry *dentry = file->f_path.dentry; in dcache_dir_lseek() local
162 struct dentry *cursor = file->private_data; in dcache_dir_lseek()
163 struct dentry *to = NULL; in dcache_dir_lseek()
165 inode_lock_shared(dentry->d_inode); in dcache_dir_lseek()
168 to = scan_positives(cursor, &dentry->d_children.first, in dcache_dir_lseek()
170 spin_lock(&dentry->d_lock); in dcache_dir_lseek()
174 spin_unlock(&dentry->d_lock); in dcache_dir_lseek()
179 inode_unlock_shared(dentry->d_inode); in dcache_dir_lseek()
193 struct dentry *dentry = file->f_path.dentry; in dcache_readdir() local
194 struct dentry *cursor = file->private_data; in dcache_readdir()
195 struct dentry *next = NULL; in dcache_readdir()
202 p = &dentry->d_children.first; in dcache_readdir()
214 spin_lock(&dentry->d_lock); in dcache_readdir()
218 spin_unlock(&dentry->d_lock); in dcache_readdir()
258 static void offset_set(struct dentry *dentry, long offset) in offset_set() argument
260 dentry->d_fsdata = (void *)offset; in offset_set()
263 static long dentry2offset(struct dentry *dentry) in dentry2offset() argument
265 return (long)dentry->d_fsdata; in dentry2offset()
290 int simple_offset_add(struct offset_ctx *octx, struct dentry *dentry) in simple_offset_add() argument
295 if (dentry2offset(dentry) != 0) in simple_offset_add()
298 ret = mtree_alloc_cyclic(&octx->mt, &offset, dentry, DIR_OFFSET_MIN, in simple_offset_add()
304 offset_set(dentry, offset); in simple_offset_add()
308 static int simple_offset_replace(struct offset_ctx *octx, struct dentry *dentry, in simple_offset_replace() argument
313 ret = mtree_store(&octx->mt, offset, dentry, GFP_KERNEL); in simple_offset_replace()
316 offset_set(dentry, offset); in simple_offset_replace()
326 void simple_offset_remove(struct offset_ctx *octx, struct dentry *dentry) in simple_offset_remove() argument
330 offset = dentry2offset(dentry); in simple_offset_remove()
335 offset_set(dentry, 0); in simple_offset_remove()
353 void simple_offset_rename(struct inode *old_dir, struct dentry *old_dentry, in simple_offset_rename()
354 struct inode *new_dir, struct dentry *new_dentry) in simple_offset_rename()
382 struct dentry *old_dentry, in simple_offset_rename_exchange()
384 struct dentry *new_dentry) in simple_offset_rename_exchange()
451 static struct dentry *find_positive_dentry(struct dentry *parent, in find_positive_dentry()
452 struct dentry *dentry, in find_positive_dentry() argument
455 struct dentry *found = NULL; in find_positive_dentry()
459 dentry = d_next_sibling(dentry); in find_positive_dentry()
460 else if (!dentry) in find_positive_dentry()
461 dentry = d_first_child(parent); in find_positive_dentry()
462 hlist_for_each_entry_from(dentry, d_sib) { in find_positive_dentry()
463 if (!simple_positive(dentry)) in find_positive_dentry()
465 spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED); in find_positive_dentry()
466 if (simple_positive(dentry)) in find_positive_dentry()
467 found = dget_dlock(dentry); in find_positive_dentry()
468 spin_unlock(&dentry->d_lock); in find_positive_dentry()
476 static noinline_for_stack struct dentry *
477 offset_dir_lookup(struct dentry *parent, loff_t offset) in offset_dir_lookup()
481 struct dentry *child, *found = NULL; in offset_dir_lookup()
496 static bool offset_dir_emit(struct dir_context *ctx, struct dentry *dentry) in offset_dir_emit() argument
498 struct inode *inode = d_inode(dentry); in offset_dir_emit()
500 return dir_emit(ctx, dentry->d_name.name, dentry->d_name.len, in offset_dir_emit()
506 struct dentry *dir = file->f_path.dentry; in offset_iterate_dir()
507 struct dentry *dentry; in offset_iterate_dir() local
509 dentry = offset_dir_lookup(dir, ctx->pos); in offset_iterate_dir()
510 if (!dentry) in offset_iterate_dir()
513 struct dentry *next; in offset_iterate_dir()
515 ctx->pos = dentry2offset(dentry); in offset_iterate_dir()
516 if (!offset_dir_emit(ctx, dentry)) in offset_iterate_dir()
519 next = find_positive_dentry(dir, dentry, true); in offset_iterate_dir()
520 dput(dentry); in offset_iterate_dir()
524 dentry = next; in offset_iterate_dir()
526 dput(dentry); in offset_iterate_dir()
558 struct dentry *dir = file->f_path.dentry; in offset_readdir()
577 struct dentry *find_next_child(struct dentry *parent, struct dentry *prev) in find_next_child()
579 struct dentry *child = NULL, *d; in find_next_child()
599 static void __simple_recursive_removal(struct dentry *dentry, in __simple_recursive_removal() argument
600 void (*callback)(struct dentry *), in __simple_recursive_removal() argument
603 struct dentry *this = dget(dentry); in __simple_recursive_removal()
605 struct dentry *victim = NULL, *child; in __simple_recursive_removal()
620 if (!locked || victim != dentry) in __simple_recursive_removal()
629 if (victim == dentry) { in __simple_recursive_removal()
632 if (d_is_dir(dentry)) in __simple_recursive_removal()
636 dput(dentry); in __simple_recursive_removal()
645 void simple_recursive_removal(struct dentry *dentry, in simple_recursive_removal() argument
646 void (*callback)(struct dentry *)) in simple_recursive_removal() argument
648 return __simple_recursive_removal(dentry, callback, false); in simple_recursive_removal()
652 void simple_remove_by_name(struct dentry *parent, const char *name, in simple_remove_by_name()
653 void (*callback)(struct dentry *)) in simple_remove_by_name() argument
655 struct dentry *dentry; in simple_remove_by_name() local
657 dentry = lookup_noperm_positive_unlocked(&QSTR(name), parent); in simple_remove_by_name()
658 if (!IS_ERR(dentry)) { in simple_remove_by_name()
659 simple_recursive_removal(dentry, callback); in simple_remove_by_name()
660 dput(dentry); // paired with lookup_noperm_positive_unlocked() in simple_remove_by_name()
666 void locked_recursive_removal(struct dentry *dentry, in locked_recursive_removal() argument
667 void (*callback)(struct dentry *)) in locked_recursive_removal() argument
669 return __simple_recursive_removal(dentry, callback, true); in locked_recursive_removal()
754 int simple_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) in simple_link() argument
762 d_make_persistent(dentry, inode); in simple_link()
767 int simple_empty(struct dentry *dentry) in simple_empty() argument
769 struct dentry *child; in simple_empty()
772 spin_lock(&dentry->d_lock); in simple_empty()
773 hlist_for_each_entry(child, &dentry->d_children, d_sib) { in simple_empty()
783 spin_unlock(&dentry->d_lock); in simple_empty()
788 void __simple_unlink(struct inode *dir, struct dentry *dentry) in __simple_unlink() argument
790 struct inode *inode = d_inode(dentry); in __simple_unlink()
798 void __simple_rmdir(struct inode *dir, struct dentry *dentry) in __simple_rmdir() argument
800 drop_nlink(d_inode(dentry)); in __simple_rmdir()
801 __simple_unlink(dir, dentry); in __simple_rmdir()
806 int simple_unlink(struct inode *dir, struct dentry *dentry) in simple_unlink() argument
808 __simple_unlink(dir, dentry); in simple_unlink()
809 d_make_discardable(dentry); in simple_unlink()
814 int simple_rmdir(struct inode *dir, struct dentry *dentry) in simple_rmdir() argument
816 if (!simple_empty(dentry)) in simple_rmdir()
819 __simple_rmdir(dir, dentry); in simple_rmdir()
820 d_make_discardable(dentry); in simple_rmdir()
836 void simple_rename_timestamp(struct inode *old_dir, struct dentry *old_dentry, in simple_rename_timestamp()
837 struct inode *new_dir, struct dentry *new_dentry) in simple_rename_timestamp()
851 int simple_rename_exchange(struct inode *old_dir, struct dentry *old_dentry, in simple_rename_exchange()
852 struct inode *new_dir, struct dentry *new_dentry) in simple_rename_exchange()
872 struct dentry *old_dentry, struct inode *new_dir, in simple_rename()
873 struct dentry *new_dentry, unsigned int flags) in simple_rename()
917 int simple_setattr(struct mnt_idmap *idmap, struct dentry *dentry, in simple_setattr() argument
920 struct inode *inode = d_inode(dentry); in simple_setattr()
923 error = setattr_prepare(idmap, dentry, iattr); in simple_setattr()
1041 struct dentry *dentry; in simple_fill_super() local
1076 dentry = d_alloc_name(s->s_root, files->name); in simple_fill_super()
1077 if (!dentry) in simple_fill_super()
1081 dput(dentry); in simple_fill_super()
1088 d_make_persistent(dentry, inode); in simple_fill_super()
1089 dput(dentry); in simple_fill_super()
1488 struct dentry *generic_fh_to_dentry(struct super_block *sb, struct fid *fid, in generic_fh_to_dentry()
1521 struct dentry *generic_fh_to_parent(struct super_block *sb, struct fid *fid, in generic_fh_to_parent()
1716 const char *simple_get_link(struct dentry *dentry, struct inode *inode, in simple_get_link() argument
1731 static struct dentry *empty_dir_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags) in empty_dir_lookup() argument
1737 struct dentry *dentry, struct iattr *attr) in empty_dir_setattr() argument
1742 static ssize_t empty_dir_listxattr(struct dentry *dentry, char *list, size_t size) in empty_dir_listxattr() argument
1805 int generic_ci_d_compare(const struct dentry *dentry, unsigned int len, in generic_ci_d_compare() argument
1808 const struct dentry *parent; in generic_ci_d_compare()
1825 parent = READ_ONCE(dentry->d_parent); in generic_ci_d_compare()
1841 if (qstr.name == dentry->d_shortname.string) { in generic_ci_d_compare()
1842 strbuf = dentry->d_shortname; // NUL is guaranteed to be in there in generic_ci_d_compare()
1848 return utf8_strncasecmp(dentry->d_sb->s_encoding, name, &qstr); in generic_ci_d_compare()
1859 int generic_ci_d_hash(const struct dentry *dentry, struct qstr *str) in generic_ci_d_hash() argument
1861 const struct inode *dir = READ_ONCE(dentry->d_inode); in generic_ci_d_hash()
1862 struct super_block *sb = dentry->d_sb; in generic_ci_d_hash()
1869 ret = utf8_casefold_hash(um, dentry, str); in generic_ci_d_hash()
2141 struct dentry *stashed_dentry_get(struct dentry **stashed) in stashed_dentry_get()
2143 struct dentry *dentry; in stashed_dentry_get() local
2146 dentry = rcu_dereference(*stashed); in stashed_dentry_get()
2147 if (!dentry) in stashed_dentry_get()
2149 if (IS_ERR(dentry)) in stashed_dentry_get()
2150 return dentry; in stashed_dentry_get()
2151 if (!lockref_get_not_dead(&dentry->d_lockref)) in stashed_dentry_get()
2153 return dentry; in stashed_dentry_get()
2156 static struct dentry *prepare_anon_dentry(struct dentry **stashed, in prepare_anon_dentry()
2160 struct dentry *dentry; in prepare_anon_dentry() local
2184 dentry = d_alloc_anon(sb); in prepare_anon_dentry()
2185 if (!dentry) { in prepare_anon_dentry()
2191 dentry->d_fsdata = stashed; in prepare_anon_dentry()
2194 d_instantiate(dentry, inode); in prepare_anon_dentry()
2195 return dentry; in prepare_anon_dentry()
2198 struct dentry *stash_dentry(struct dentry **stashed, struct dentry *dentry) in stash_dentry() argument
2202 struct dentry *old; in stash_dentry()
2205 old = cmpxchg(stashed, NULL, dentry); in stash_dentry()
2207 return dentry; in stash_dentry()
2214 if (likely(try_cmpxchg(stashed, &old, dentry))) in stash_dentry()
2215 return dentry; in stash_dentry()
2236 int path_from_stashed(struct dentry **stashed, struct vfsmount *mnt, void *data, in path_from_stashed()
2239 struct dentry *dentry, *res; in path_from_stashed() local
2252 dentry = prepare_anon_dentry(stashed, mnt->mnt_sb, data); in path_from_stashed()
2253 if (IS_ERR(dentry)) in path_from_stashed()
2254 return PTR_ERR(dentry); in path_from_stashed()
2258 res = sops->stash_dentry(stashed, dentry); in path_from_stashed()
2260 res = stash_dentry(stashed, dentry); in path_from_stashed()
2262 dput(dentry); in path_from_stashed()
2265 if (res != dentry) in path_from_stashed()
2266 dput(dentry); in path_from_stashed()
2269 path->dentry = res; in path_from_stashed()
2271 VFS_WARN_ON_ONCE(path->dentry->d_fsdata != stashed); in path_from_stashed()
2272 VFS_WARN_ON_ONCE(d_inode(path->dentry)->i_private != data); in path_from_stashed()
2276 void stashed_dentry_prune(struct dentry *dentry) in stashed_dentry_prune() argument
2278 struct dentry **stashed = dentry->d_fsdata; in stashed_dentry_prune()
2279 struct inode *inode = d_inode(dentry); in stashed_dentry_prune()
2292 cmpxchg(stashed, dentry, NULL); in stashed_dentry_prune()
2306 struct dentry *simple_start_creating(struct dentry *parent, const char *name) in simple_start_creating()
2319 void simple_done_creating(struct dentry *child) in simple_done_creating()