Lines Matching refs:dentry

36 	struct inode *inode = d_inode(path->dentry);  in simple_getattr()
43 int simple_statfs(struct dentry *dentry, struct kstatfs *buf) in simple_statfs() argument
45 u64 id = huge_encode_dev(dentry->d_sb->s_dev); in simple_statfs()
48 buf->f_type = dentry->d_sb->s_magic; in simple_statfs()
59 int always_delete_dentry(const struct dentry *dentry) in always_delete_dentry() argument
69 struct dentry *simple_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags) in simple_lookup() argument
71 if (dentry->d_name.len > NAME_MAX) in simple_lookup()
73 if (!dentry->d_op && !(dentry->d_flags & DCACHE_DONTCACHE)) { in simple_lookup()
74 spin_lock(&dentry->d_lock); in simple_lookup()
75 dentry->d_flags |= DCACHE_DONTCACHE; in simple_lookup()
76 spin_unlock(&dentry->d_lock); in simple_lookup()
81 d_add(dentry, NULL); in simple_lookup()
88 file->private_data = d_alloc_cursor(file->f_path.dentry); in dcache_dir_open()
108 static struct dentry *scan_positives(struct dentry *cursor, in scan_positives()
111 struct dentry *last) in scan_positives()
113 struct dentry *dentry = cursor->d_parent, *found = NULL; in scan_positives() local
115 spin_lock(&dentry->d_lock); in scan_positives()
117 struct dentry *d = hlist_entry(*p, struct dentry, d_sib); in scan_positives()
136 spin_unlock(&dentry->d_lock); in scan_positives()
138 spin_lock(&dentry->d_lock); in scan_positives()
141 spin_unlock(&dentry->d_lock); in scan_positives()
148 struct dentry *dentry = file->f_path.dentry; in dcache_dir_lseek() local
161 struct dentry *cursor = file->private_data; in dcache_dir_lseek()
162 struct dentry *to = NULL; in dcache_dir_lseek()
164 inode_lock_shared(dentry->d_inode); in dcache_dir_lseek()
167 to = scan_positives(cursor, &dentry->d_children.first, in dcache_dir_lseek()
169 spin_lock(&dentry->d_lock); in dcache_dir_lseek()
173 spin_unlock(&dentry->d_lock); in dcache_dir_lseek()
178 inode_unlock_shared(dentry->d_inode); in dcache_dir_lseek()
192 struct dentry *dentry = file->f_path.dentry; in dcache_readdir() local
193 struct dentry *cursor = file->private_data; in dcache_readdir()
194 struct dentry *next = NULL; in dcache_readdir()
201 p = &dentry->d_children.first; in dcache_readdir()
213 spin_lock(&dentry->d_lock); in dcache_readdir()
217 spin_unlock(&dentry->d_lock); in dcache_readdir()
257 static void offset_set(struct dentry *dentry, long offset) in offset_set() argument
259 dentry->d_fsdata = (void *)offset; in offset_set()
262 static long dentry2offset(struct dentry *dentry) in dentry2offset() argument
264 return (long)dentry->d_fsdata; in dentry2offset()
289 int simple_offset_add(struct offset_ctx *octx, struct dentry *dentry) in simple_offset_add() argument
294 if (dentry2offset(dentry) != 0) in simple_offset_add()
297 ret = mtree_alloc_cyclic(&octx->mt, &offset, dentry, DIR_OFFSET_MIN, in simple_offset_add()
303 offset_set(dentry, offset); in simple_offset_add()
307 static int simple_offset_replace(struct offset_ctx *octx, struct dentry *dentry, in simple_offset_replace() argument
312 ret = mtree_store(&octx->mt, offset, dentry, GFP_KERNEL); in simple_offset_replace()
315 offset_set(dentry, offset); in simple_offset_replace()
325 void simple_offset_remove(struct offset_ctx *octx, struct dentry *dentry) in simple_offset_remove() argument
329 offset = dentry2offset(dentry); in simple_offset_remove()
334 offset_set(dentry, 0); in simple_offset_remove()
351 int simple_offset_rename(struct inode *old_dir, struct dentry *old_dentry, in simple_offset_rename()
352 struct inode *new_dir, struct dentry *new_dentry) in simple_offset_rename()
381 struct dentry *old_dentry, in simple_offset_rename_exchange()
383 struct dentry *new_dentry) in simple_offset_rename_exchange()
458 static struct dentry *find_positive_dentry(struct dentry *parent, in find_positive_dentry()
459 struct dentry *dentry, in find_positive_dentry() argument
462 struct dentry *found = NULL; in find_positive_dentry()
466 dentry = d_next_sibling(dentry); in find_positive_dentry()
467 else if (!dentry) in find_positive_dentry()
468 dentry = d_first_child(parent); in find_positive_dentry()
469 hlist_for_each_entry_from(dentry, d_sib) { in find_positive_dentry()
470 if (!simple_positive(dentry)) in find_positive_dentry()
472 spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED); in find_positive_dentry()
473 if (simple_positive(dentry)) in find_positive_dentry()
474 found = dget_dlock(dentry); in find_positive_dentry()
475 spin_unlock(&dentry->d_lock); in find_positive_dentry()
483 static noinline_for_stack struct dentry *
484 offset_dir_lookup(struct dentry *parent, loff_t offset) in offset_dir_lookup()
488 struct dentry *child, *found = NULL; in offset_dir_lookup()
503 static bool offset_dir_emit(struct dir_context *ctx, struct dentry *dentry) in offset_dir_emit() argument
505 struct inode *inode = d_inode(dentry); in offset_dir_emit()
507 return dir_emit(ctx, dentry->d_name.name, dentry->d_name.len, in offset_dir_emit()
513 struct dentry *dir = file->f_path.dentry; in offset_iterate_dir()
514 struct dentry *dentry; in offset_iterate_dir() local
516 dentry = offset_dir_lookup(dir, ctx->pos); in offset_iterate_dir()
517 if (!dentry) in offset_iterate_dir()
520 struct dentry *next; in offset_iterate_dir()
522 ctx->pos = dentry2offset(dentry); in offset_iterate_dir()
523 if (!offset_dir_emit(ctx, dentry)) in offset_iterate_dir()
526 next = find_positive_dentry(dir, dentry, true); in offset_iterate_dir()
527 dput(dentry); in offset_iterate_dir()
531 dentry = next; in offset_iterate_dir()
533 dput(dentry); in offset_iterate_dir()
565 struct dentry *dir = file->f_path.dentry; in offset_readdir()
583 struct dentry *find_next_child(struct dentry *parent, struct dentry *prev) in find_next_child()
585 struct dentry *child = NULL, *d; in find_next_child()
605 static void __simple_recursive_removal(struct dentry *dentry, in __simple_recursive_removal() argument
606 void (*callback)(struct dentry *), in __simple_recursive_removal() argument
609 struct dentry *this = dget(dentry); in __simple_recursive_removal()
611 struct dentry *victim = NULL, *child; in __simple_recursive_removal()
626 if (!locked || victim != dentry) in __simple_recursive_removal()
635 if (victim == dentry) { in __simple_recursive_removal()
638 if (d_is_dir(dentry)) in __simple_recursive_removal()
642 dput(dentry); in __simple_recursive_removal()
651 void simple_recursive_removal(struct dentry *dentry, in simple_recursive_removal() argument
652 void (*callback)(struct dentry *)) in simple_recursive_removal() argument
654 return __simple_recursive_removal(dentry, callback, false); in simple_recursive_removal()
659 void locked_recursive_removal(struct dentry *dentry, in locked_recursive_removal() argument
660 void (*callback)(struct dentry *)) in locked_recursive_removal() argument
662 return __simple_recursive_removal(dentry, callback, true); in locked_recursive_removal()
746 int simple_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) in simple_link() argument
754 dget(dentry); in simple_link()
755 d_instantiate(dentry, inode); in simple_link()
760 int simple_empty(struct dentry *dentry) in simple_empty() argument
762 struct dentry *child; in simple_empty()
765 spin_lock(&dentry->d_lock); in simple_empty()
766 hlist_for_each_entry(child, &dentry->d_children, d_sib) { in simple_empty()
776 spin_unlock(&dentry->d_lock); in simple_empty()
781 int simple_unlink(struct inode *dir, struct dentry *dentry) in simple_unlink() argument
783 struct inode *inode = d_inode(dentry); in simple_unlink()
788 dput(dentry); in simple_unlink()
793 int simple_rmdir(struct inode *dir, struct dentry *dentry) in simple_rmdir() argument
795 if (!simple_empty(dentry)) in simple_rmdir()
798 drop_nlink(d_inode(dentry)); in simple_rmdir()
799 simple_unlink(dir, dentry); in simple_rmdir()
816 void simple_rename_timestamp(struct inode *old_dir, struct dentry *old_dentry, in simple_rename_timestamp()
817 struct inode *new_dir, struct dentry *new_dentry) in simple_rename_timestamp()
831 int simple_rename_exchange(struct inode *old_dir, struct dentry *old_dentry, in simple_rename_exchange()
832 struct inode *new_dir, struct dentry *new_dentry) in simple_rename_exchange()
852 struct dentry *old_dentry, struct inode *new_dir, in simple_rename()
853 struct dentry *new_dentry, unsigned int flags) in simple_rename()
897 int simple_setattr(struct mnt_idmap *idmap, struct dentry *dentry, in simple_setattr() argument
900 struct inode *inode = d_inode(dentry); in simple_setattr()
903 error = setattr_prepare(idmap, dentry, iattr); in simple_setattr()
1021 struct dentry *dentry; in simple_fill_super() local
1056 dentry = d_alloc_name(s->s_root, files->name); in simple_fill_super()
1057 if (!dentry) in simple_fill_super()
1061 dput(dentry); in simple_fill_super()
1068 d_add(dentry, inode); in simple_fill_super()
1467 struct dentry *generic_fh_to_dentry(struct super_block *sb, struct fid *fid, in generic_fh_to_dentry()
1500 struct dentry *generic_fh_to_parent(struct super_block *sb, struct fid *fid, in generic_fh_to_parent()
1713 const char *simple_get_link(struct dentry *dentry, struct inode *inode, in simple_get_link() argument
1728 static struct dentry *empty_dir_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags) in empty_dir_lookup() argument
1734 struct dentry *dentry, struct iattr *attr) in empty_dir_setattr() argument
1739 static ssize_t empty_dir_listxattr(struct dentry *dentry, char *list, size_t size) in empty_dir_listxattr() argument
1802 int generic_ci_d_compare(const struct dentry *dentry, unsigned int len, in generic_ci_d_compare() argument
1805 const struct dentry *parent; in generic_ci_d_compare()
1822 parent = READ_ONCE(dentry->d_parent); in generic_ci_d_compare()
1838 if (qstr.name == dentry->d_shortname.string) { in generic_ci_d_compare()
1839 strbuf = dentry->d_shortname; // NUL is guaranteed to be in there in generic_ci_d_compare()
1845 return utf8_strncasecmp(dentry->d_sb->s_encoding, name, &qstr); in generic_ci_d_compare()
1856 int generic_ci_d_hash(const struct dentry *dentry, struct qstr *str) in generic_ci_d_hash() argument
1858 const struct inode *dir = READ_ONCE(dentry->d_inode); in generic_ci_d_hash()
1859 struct super_block *sb = dentry->d_sb; in generic_ci_d_hash()
1866 ret = utf8_casefold_hash(um, dentry, str); in generic_ci_d_hash()
2138 struct dentry *stashed_dentry_get(struct dentry **stashed) in stashed_dentry_get()
2140 struct dentry *dentry; in stashed_dentry_get() local
2143 dentry = rcu_dereference(*stashed); in stashed_dentry_get()
2144 if (!dentry) in stashed_dentry_get()
2146 if (IS_ERR(dentry)) in stashed_dentry_get()
2147 return dentry; in stashed_dentry_get()
2148 if (!lockref_get_not_dead(&dentry->d_lockref)) in stashed_dentry_get()
2150 return dentry; in stashed_dentry_get()
2153 static struct dentry *prepare_anon_dentry(struct dentry **stashed, in prepare_anon_dentry()
2157 struct dentry *dentry; in prepare_anon_dentry() local
2181 dentry = d_alloc_anon(sb); in prepare_anon_dentry()
2182 if (!dentry) { in prepare_anon_dentry()
2188 dentry->d_fsdata = stashed; in prepare_anon_dentry()
2191 d_instantiate(dentry, inode); in prepare_anon_dentry()
2192 return dentry; in prepare_anon_dentry()
2195 struct dentry *stash_dentry(struct dentry **stashed, struct dentry *dentry) in stash_dentry() argument
2199 struct dentry *old; in stash_dentry()
2202 old = cmpxchg(stashed, NULL, dentry); in stash_dentry()
2204 return dentry; in stash_dentry()
2211 if (likely(try_cmpxchg(stashed, &old, dentry))) in stash_dentry()
2212 return dentry; in stash_dentry()
2233 int path_from_stashed(struct dentry **stashed, struct vfsmount *mnt, void *data, in path_from_stashed()
2236 struct dentry *dentry, *res; in path_from_stashed() local
2249 dentry = prepare_anon_dentry(stashed, mnt->mnt_sb, data); in path_from_stashed()
2250 if (IS_ERR(dentry)) in path_from_stashed()
2251 return PTR_ERR(dentry); in path_from_stashed()
2255 res = sops->stash_dentry(stashed, dentry); in path_from_stashed()
2257 res = stash_dentry(stashed, dentry); in path_from_stashed()
2259 dput(dentry); in path_from_stashed()
2262 if (res != dentry) in path_from_stashed()
2263 dput(dentry); in path_from_stashed()
2266 path->dentry = res; in path_from_stashed()
2268 VFS_WARN_ON_ONCE(path->dentry->d_fsdata != stashed); in path_from_stashed()
2269 VFS_WARN_ON_ONCE(d_inode(path->dentry)->i_private != data); in path_from_stashed()
2273 void stashed_dentry_prune(struct dentry *dentry) in stashed_dentry_prune() argument
2275 struct dentry **stashed = dentry->d_fsdata; in stashed_dentry_prune()
2276 struct inode *inode = d_inode(dentry); in stashed_dentry_prune()
2289 cmpxchg(stashed, dentry, NULL); in stashed_dentry_prune()
2293 struct dentry *simple_start_creating(struct dentry *parent, const char *name) in simple_start_creating()
2295 struct dentry *dentry; in simple_start_creating() local
2303 dentry = lookup_noperm(&QSTR(name), parent); in simple_start_creating()
2304 if (IS_ERR(dentry)) { in simple_start_creating()
2306 return dentry; in simple_start_creating()
2308 if (dentry->d_inode) { in simple_start_creating()
2309 dput(dentry); in simple_start_creating()
2313 return dentry; in simple_start_creating()