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
74 struct dentry *simple_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags) in simple_lookup() argument
76 if (dentry->d_name.len > NAME_MAX) in simple_lookup()
78 if (!dentry->d_sb->s_d_op) in simple_lookup()
79 d_set_d_op(dentry, &simple_dentry_operations); in simple_lookup()
80 d_add(dentry, NULL); in simple_lookup()
87 file->private_data = d_alloc_cursor(file->f_path.dentry); in dcache_dir_open()
107 static struct dentry *scan_positives(struct dentry *cursor, in scan_positives()
110 struct dentry *last) in scan_positives()
112 struct dentry *dentry = cursor->d_parent, *found = NULL; in scan_positives() local
114 spin_lock(&dentry->d_lock); in scan_positives()
116 struct dentry *d = hlist_entry(*p, struct dentry, d_sib); in scan_positives()
135 spin_unlock(&dentry->d_lock); in scan_positives()
137 spin_lock(&dentry->d_lock); in scan_positives()
140 spin_unlock(&dentry->d_lock); in scan_positives()
147 struct dentry *dentry = file->f_path.dentry; in dcache_dir_lseek() local
160 struct dentry *cursor = file->private_data; in dcache_dir_lseek()
161 struct dentry *to = NULL; in dcache_dir_lseek()
163 inode_lock_shared(dentry->d_inode); in dcache_dir_lseek()
166 to = scan_positives(cursor, &dentry->d_children.first, in dcache_dir_lseek()
168 spin_lock(&dentry->d_lock); in dcache_dir_lseek()
172 spin_unlock(&dentry->d_lock); in dcache_dir_lseek()
177 inode_unlock_shared(dentry->d_inode); in dcache_dir_lseek()
191 struct dentry *dentry = file->f_path.dentry; in dcache_readdir() local
192 struct dentry *cursor = file->private_data; in dcache_readdir()
193 struct dentry *next = NULL; in dcache_readdir()
200 p = &dentry->d_children.first; in dcache_readdir()
212 spin_lock(&dentry->d_lock); in dcache_readdir()
216 spin_unlock(&dentry->d_lock); in dcache_readdir()
249 static void offset_set(struct dentry *dentry, long offset) in offset_set() argument
251 dentry->d_fsdata = (void *)offset; in offset_set()
254 static long dentry2offset(struct dentry *dentry) in dentry2offset() argument
256 return (long)dentry->d_fsdata; in dentry2offset()
281 int simple_offset_add(struct offset_ctx *octx, struct dentry *dentry) in simple_offset_add() argument
286 if (dentry2offset(dentry) != 0) in simple_offset_add()
289 ret = mtree_alloc_cyclic(&octx->mt, &offset, dentry, DIR_OFFSET_MIN, in simple_offset_add()
294 offset_set(dentry, offset); in simple_offset_add()
298 static int simple_offset_replace(struct offset_ctx *octx, struct dentry *dentry, in simple_offset_replace() argument
303 ret = mtree_store(&octx->mt, offset, dentry, GFP_KERNEL); in simple_offset_replace()
306 offset_set(dentry, offset); in simple_offset_replace()
316 void simple_offset_remove(struct offset_ctx *octx, struct dentry *dentry) in simple_offset_remove() argument
320 offset = dentry2offset(dentry); in simple_offset_remove()
325 offset_set(dentry, 0); in simple_offset_remove()
334 int simple_offset_empty(struct dentry *dentry) in simple_offset_empty() argument
336 struct inode *inode = d_inode(dentry); in simple_offset_empty()
338 struct dentry *child; in simple_offset_empty()
374 int simple_offset_rename(struct inode *old_dir, struct dentry *old_dentry, in simple_offset_rename()
375 struct inode *new_dir, struct dentry *new_dentry) in simple_offset_rename()
404 struct dentry *old_dentry, in simple_offset_rename_exchange()
406 struct dentry *new_dentry) in simple_offset_rename_exchange()
495 static struct dentry *offset_find_next(struct offset_ctx *octx, loff_t offset) in offset_find_next()
498 struct dentry *child, *found = NULL; in offset_find_next()
513 static bool offset_dir_emit(struct dir_context *ctx, struct dentry *dentry) in offset_dir_emit() argument
515 struct inode *inode = d_inode(dentry); in offset_dir_emit()
516 long offset = dentry2offset(dentry); in offset_dir_emit()
518 return ctx->actor(ctx, dentry->d_name.name, dentry->d_name.len, offset, in offset_dir_emit()
525 struct dentry *dentry; in offset_iterate_dir() local
528 dentry = offset_find_next(octx, ctx->pos); in offset_iterate_dir()
529 if (!dentry) in offset_iterate_dir()
532 if (dentry2offset(dentry) >= last_index) { in offset_iterate_dir()
533 dput(dentry); in offset_iterate_dir()
537 if (!offset_dir_emit(ctx, dentry)) { in offset_iterate_dir()
538 dput(dentry); in offset_iterate_dir()
542 ctx->pos = dentry2offset(dentry) + 1; in offset_iterate_dir()
543 dput(dentry); in offset_iterate_dir()
570 struct dentry *dir = file->f_path.dentry; in offset_readdir()
590 static struct dentry *find_next_child(struct dentry *parent, struct dentry *prev) in find_next_child()
592 struct dentry *child = NULL, *d; in find_next_child()
611 void simple_recursive_removal(struct dentry *dentry, in simple_recursive_removal() argument
612 void (*callback)(struct dentry *)) in simple_recursive_removal() argument
614 struct dentry *this = dget(dentry); in simple_recursive_removal()
616 struct dentry *victim = NULL, *child; in simple_recursive_removal()
642 if (victim == dentry) { in simple_recursive_removal()
645 if (d_is_dir(dentry)) in simple_recursive_removal()
648 dput(dentry); in simple_recursive_removal()
737 int simple_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) in simple_link() argument
745 dget(dentry); in simple_link()
746 d_instantiate(dentry, inode); in simple_link()
751 int simple_empty(struct dentry *dentry) in simple_empty() argument
753 struct dentry *child; in simple_empty()
756 spin_lock(&dentry->d_lock); in simple_empty()
757 hlist_for_each_entry(child, &dentry->d_children, d_sib) { in simple_empty()
767 spin_unlock(&dentry->d_lock); in simple_empty()
772 int simple_unlink(struct inode *dir, struct dentry *dentry) in simple_unlink() argument
774 struct inode *inode = d_inode(dentry); in simple_unlink()
779 dput(dentry); in simple_unlink()
784 int simple_rmdir(struct inode *dir, struct dentry *dentry) in simple_rmdir() argument
786 if (!simple_empty(dentry)) in simple_rmdir()
789 drop_nlink(d_inode(dentry)); in simple_rmdir()
790 simple_unlink(dir, dentry); in simple_rmdir()
807 void simple_rename_timestamp(struct inode *old_dir, struct dentry *old_dentry, in simple_rename_timestamp()
808 struct inode *new_dir, struct dentry *new_dentry) in simple_rename_timestamp()
822 int simple_rename_exchange(struct inode *old_dir, struct dentry *old_dentry, in simple_rename_exchange()
823 struct inode *new_dir, struct dentry *new_dentry) in simple_rename_exchange()
843 struct dentry *old_dentry, struct inode *new_dir, in simple_rename()
844 struct dentry *new_dentry, unsigned int flags) in simple_rename()
888 int simple_setattr(struct mnt_idmap *idmap, struct dentry *dentry, in simple_setattr() argument
891 struct inode *inode = d_inode(dentry); in simple_setattr()
894 error = setattr_prepare(idmap, dentry, iattr); in simple_setattr()
1010 struct dentry *dentry; in simple_fill_super() local
1045 dentry = d_alloc_name(s->s_root, files->name); in simple_fill_super()
1046 if (!dentry) in simple_fill_super()
1050 dput(dentry); in simple_fill_super()
1057 d_add(dentry, inode); in simple_fill_super()
1456 struct dentry *generic_fh_to_dentry(struct super_block *sb, struct fid *fid, in generic_fh_to_dentry()
1489 struct dentry *generic_fh_to_parent(struct super_block *sb, struct fid *fid, in generic_fh_to_parent()
1694 const char *simple_get_link(struct dentry *dentry, struct inode *inode, in simple_get_link() argument
1709 static struct dentry *empty_dir_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags) in empty_dir_lookup() argument
1718 struct inode *inode = d_inode(path->dentry); in empty_dir_getattr()
1724 struct dentry *dentry, struct iattr *attr) in empty_dir_setattr() argument
1729 static ssize_t empty_dir_listxattr(struct dentry *dentry, char *list, size_t size) in empty_dir_listxattr() argument
1794 static int generic_ci_d_compare(const struct dentry *dentry, unsigned int len, in generic_ci_d_compare() argument
1797 const struct dentry *parent; in generic_ci_d_compare()
1814 parent = READ_ONCE(dentry->d_parent); in generic_ci_d_compare()
1836 return utf8_strncasecmp(dentry->d_sb->s_encoding, name, &qstr); in generic_ci_d_compare()
1846 static int generic_ci_d_hash(const struct dentry *dentry, struct qstr *str) in generic_ci_d_hash() argument
1848 const struct inode *dir = READ_ONCE(dentry->d_inode); in generic_ci_d_hash()
1849 struct super_block *sb = dentry->d_sb; in generic_ci_d_hash()
1856 ret = utf8_casefold_hash(um, dentry, str); in generic_ci_d_hash()
2127 static inline struct dentry *get_stashed_dentry(struct dentry **stashed) in get_stashed_dentry()
2129 struct dentry *dentry; in get_stashed_dentry() local
2132 dentry = rcu_dereference(*stashed); in get_stashed_dentry()
2133 if (!dentry) in get_stashed_dentry()
2135 if (!lockref_get_not_dead(&dentry->d_lockref)) in get_stashed_dentry()
2137 return dentry; in get_stashed_dentry()
2140 static struct dentry *prepare_anon_dentry(struct dentry **stashed, in prepare_anon_dentry()
2144 struct dentry *dentry; in prepare_anon_dentry() local
2169 dentry = d_alloc_anon(sb); in prepare_anon_dentry()
2170 if (!dentry) { in prepare_anon_dentry()
2176 dentry->d_fsdata = stashed; in prepare_anon_dentry()
2179 d_instantiate(dentry, inode); in prepare_anon_dentry()
2180 return dentry; in prepare_anon_dentry()
2183 static struct dentry *stash_dentry(struct dentry **stashed, in stash_dentry()
2184 struct dentry *dentry) in stash_dentry() argument
2188 struct dentry *old; in stash_dentry()
2191 old = cmpxchg(stashed, NULL, dentry); in stash_dentry()
2193 return dentry; in stash_dentry()
2200 if (likely(try_cmpxchg(stashed, &old, dentry))) in stash_dentry()
2201 return dentry; in stash_dentry()
2222 int path_from_stashed(struct dentry **stashed, struct vfsmount *mnt, void *data, in path_from_stashed()
2225 struct dentry *dentry; in path_from_stashed() local
2229 path->dentry = get_stashed_dentry(stashed); in path_from_stashed()
2230 if (path->dentry) { in path_from_stashed()
2236 dentry = prepare_anon_dentry(stashed, mnt->mnt_sb, data); in path_from_stashed()
2237 if (IS_ERR(dentry)) in path_from_stashed()
2238 return PTR_ERR(dentry); in path_from_stashed()
2241 path->dentry = stash_dentry(stashed, dentry); in path_from_stashed()
2242 if (path->dentry != dentry) in path_from_stashed()
2243 dput(dentry); in path_from_stashed()
2246 WARN_ON_ONCE(path->dentry->d_fsdata != stashed); in path_from_stashed()
2247 WARN_ON_ONCE(d_inode(path->dentry)->i_private != data); in path_from_stashed()
2252 void stashed_dentry_prune(struct dentry *dentry) in stashed_dentry_prune() argument
2254 struct dentry **stashed = dentry->d_fsdata; in stashed_dentry_prune()
2255 struct inode *inode = d_inode(dentry); in stashed_dentry_prune()
2268 cmpxchg(stashed, dentry, NULL); in stashed_dentry_prune()