Lines Matching refs:dentry
22 static int get_name(const struct path *path, char *name, struct dentry *child);
25 static int exportfs_get_name(struct vfsmount *mnt, struct dentry *dir, in exportfs_get_name()
26 char *name, struct dentry *child) in exportfs_get_name()
29 struct path path = {.mnt = mnt, .dentry = dir}; in exportfs_get_name()
40 static struct dentry *
41 find_acceptable_alias(struct dentry *result, in find_acceptable_alias()
42 int (*acceptable)(void *context, struct dentry *dentry), in find_acceptable_alias() argument
45 struct dentry *dentry, *toput = NULL; in find_acceptable_alias() local
53 hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) { in find_acceptable_alias()
54 dget(dentry); in find_acceptable_alias()
58 if (dentry != result && acceptable(context, dentry)) { in find_acceptable_alias()
60 return dentry; in find_acceptable_alias()
63 toput = dentry; in find_acceptable_alias()
72 static bool dentry_connected(struct dentry *dentry) in dentry_connected() argument
74 dget(dentry); in dentry_connected()
75 while (dentry->d_flags & DCACHE_DISCONNECTED) { in dentry_connected()
76 struct dentry *parent = dget_parent(dentry); in dentry_connected()
78 dput(dentry); in dentry_connected()
79 if (IS_ROOT(dentry)) { in dentry_connected()
83 dentry = parent; in dentry_connected()
85 dput(dentry); in dentry_connected()
89 static void clear_disconnected(struct dentry *dentry) in clear_disconnected() argument
91 dget(dentry); in clear_disconnected()
92 while (dentry->d_flags & DCACHE_DISCONNECTED) { in clear_disconnected()
93 struct dentry *parent = dget_parent(dentry); in clear_disconnected()
95 WARN_ON_ONCE(IS_ROOT(dentry)); in clear_disconnected()
97 spin_lock(&dentry->d_lock); in clear_disconnected()
98 dentry->d_flags &= ~DCACHE_DISCONNECTED; in clear_disconnected()
99 spin_unlock(&dentry->d_lock); in clear_disconnected()
101 dput(dentry); in clear_disconnected()
102 dentry = parent; in clear_disconnected()
104 dput(dentry); in clear_disconnected()
119 static struct dentry *reconnect_one(struct vfsmount *mnt, in reconnect_one()
120 struct dentry *dentry, char *nbuf) in reconnect_one() argument
122 struct dentry *parent; in reconnect_one()
123 struct dentry *tmp; in reconnect_one()
127 mutex_lock(&dentry->d_inode->i_mutex); in reconnect_one()
129 parent = mnt->mnt_sb->s_export_op->get_parent(dentry); in reconnect_one()
130 mutex_unlock(&dentry->d_inode->i_mutex); in reconnect_one()
134 __func__, dentry->d_inode->i_ino, PTR_ERR(parent)); in reconnect_one()
139 dentry->d_inode->i_ino, parent->d_inode->i_ino); in reconnect_one()
140 err = exportfs_get_name(mnt, parent, nbuf, dentry); in reconnect_one()
153 if (tmp != dentry) { in reconnect_one()
158 if (IS_ROOT(dentry)) { in reconnect_one()
182 if (!dentry_connected(dentry)) in reconnect_one()
205 reconnect_path(struct vfsmount *mnt, struct dentry *target_dir, char *nbuf) in reconnect_path()
207 struct dentry *dentry, *parent; in reconnect_path() local
209 dentry = dget(target_dir); in reconnect_path()
211 while (dentry->d_flags & DCACHE_DISCONNECTED) { in reconnect_path()
212 BUG_ON(dentry == mnt->mnt_sb->s_root); in reconnect_path()
214 if (IS_ROOT(dentry)) in reconnect_path()
215 parent = reconnect_one(mnt, dentry, nbuf); in reconnect_path()
217 parent = dget_parent(dentry); in reconnect_path()
221 dput(dentry); in reconnect_path()
224 dentry = parent; in reconnect_path()
226 dput(dentry); in reconnect_path()
270 static int get_name(const struct path *path, char *name, struct dentry *child) in get_name()
273 struct inode *dir = path->dentry->d_inode; in get_name()
279 .dentry = child, in get_name()
389 int exportfs_encode_fh(struct dentry *dentry, struct fid *fid, int *max_len, in exportfs_encode_fh() argument
393 struct dentry *p = NULL; in exportfs_encode_fh()
394 struct inode *inode = dentry->d_inode, *parent = NULL; in exportfs_encode_fh()
397 p = dget_parent(dentry); in exportfs_encode_fh()
412 struct dentry *exportfs_decode_fh(struct vfsmount *mnt, struct fid *fid, in exportfs_decode_fh()
414 int (*acceptable)(void *, struct dentry *), void *context) in exportfs_decode_fh() argument
417 struct dentry *result, *alias; in exportfs_decode_fh()
457 struct dentry *target_dir, *nresult; in exportfs_decode_fh()