Lines Matching refs:dentry

20 int ovl_want_write(struct dentry *dentry)
22 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
26 void ovl_drop_write(struct dentry *dentry)
28 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
32 struct dentry *ovl_workdir(struct dentry *dentry)
34 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
64 struct dentry *ovl_indexdir(struct super_block *sb)
98 dget(src[i].dentry);
106 dput(stack[i].dentry);
134 bool ovl_dentry_remote(struct dentry *dentry)
136 return dentry->d_flags & OVL_D_REVALIDATE;
139 void ovl_dentry_update_reval(struct dentry *dentry, struct dentry *realdentry)
144 spin_lock(&dentry->d_lock);
145 dentry->d_flags |= realdentry->d_flags & OVL_D_REVALIDATE;
146 spin_unlock(&dentry->d_lock);
149 void ovl_dentry_init_reval(struct dentry *dentry, struct dentry *upperdentry,
152 return ovl_dentry_init_flags(dentry, upperdentry, oe, OVL_D_REVALIDATE);
155 void ovl_dentry_init_flags(struct dentry *dentry, struct dentry *upperdentry,
163 for (i = 0; i < ovl_numlower(oe) && lowerstack[i].dentry; i++)
164 flags |= lowerstack[i].dentry->d_flags;
166 spin_lock(&dentry->d_lock);
167 dentry->d_flags &= ~mask;
168 dentry->d_flags |= flags & mask;
169 spin_unlock(&dentry->d_lock);
172 bool ovl_dentry_weird(struct dentry *dentry)
174 return dentry->d_flags & (DCACHE_NEED_AUTOMOUNT |
180 enum ovl_path_type ovl_path_type(struct dentry *dentry)
182 struct ovl_entry *oe = OVL_E(dentry);
185 if (ovl_dentry_upper(dentry)) {
189 * Non-dir dentry can hold lower dentry of its copy up origin.
192 if (ovl_test_flag(OVL_CONST_INO, d_inode(dentry)))
194 if (d_is_dir(dentry) ||
195 !ovl_has_upperdata(d_inode(dentry)))
205 void ovl_path_upper(struct dentry *dentry, struct path *path)
207 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
210 path->dentry = ovl_dentry_upper(dentry);
213 void ovl_path_lower(struct dentry *dentry, struct path *path)
215 struct ovl_entry *oe = OVL_E(dentry);
220 path->dentry = lowerpath->dentry;
226 void ovl_path_lowerdata(struct dentry *dentry, struct path *path)
228 struct ovl_entry *oe = OVL_E(dentry);
230 struct dentry *lowerdata_dentry = ovl_lowerdata_dentry(oe);
233 path->dentry = lowerdata_dentry;
236 * Make sure that if lowerdata->dentry is visible, then
246 enum ovl_path_type ovl_path_real(struct dentry *dentry, struct path *path)
248 enum ovl_path_type type = ovl_path_type(dentry);
251 ovl_path_lower(dentry, path);
253 ovl_path_upper(dentry, path);
258 enum ovl_path_type ovl_path_realdata(struct dentry *dentry, struct path *path)
260 enum ovl_path_type type = ovl_path_type(dentry);
262 WARN_ON_ONCE(d_is_dir(dentry));
265 ovl_path_lowerdata(dentry, path);
267 ovl_path_upper(dentry, path);
272 struct dentry *ovl_dentry_upper(struct dentry *dentry)
274 return ovl_upperdentry_dereference(OVL_I(d_inode(dentry)));
277 struct dentry *ovl_dentry_lower(struct dentry *dentry)
279 struct ovl_entry *oe = OVL_E(dentry);
281 return ovl_numlower(oe) ? ovl_lowerstack(oe)->dentry : NULL;
284 const struct ovl_layer *ovl_layer_lower(struct dentry *dentry)
286 struct ovl_entry *oe = OVL_E(dentry);
292 * ovl_dentry_lower() could return either a data dentry or metacopy dentry
294 * lower dentry which has data (and not metacopy dentry). This helper
295 * returns the lower data dentry.
297 struct dentry *ovl_dentry_lowerdata(struct dentry *dentry)
299 return ovl_lowerdata_dentry(OVL_E(dentry));
302 int ovl_dentry_set_lowerdata(struct dentry *dentry, struct ovl_path *datapath)
304 struct ovl_entry *oe = OVL_E(dentry);
306 struct dentry *datadentry = datapath->dentry;
314 * Make sure that if lowerdata->dentry is visible, then
318 WRITE_ONCE(lowerdata->dentry, dget(datadentry));
320 ovl_dentry_update_reval(dentry, datadentry);
325 struct dentry *ovl_dentry_real(struct dentry *dentry)
327 return ovl_dentry_upper(dentry) ?: ovl_dentry_lower(dentry);
330 struct dentry *ovl_i_dentry_upper(struct inode *inode)
339 path->dentry = ovl_i_dentry_upper(inode);
340 if (!path->dentry) {
341 path->dentry = lowerpath->dentry;
347 return path->dentry ? d_inode_rcu(path->dentry) : NULL;
352 struct dentry *upperdentry = ovl_i_dentry_upper(inode);
361 return lowerpath ? d_inode(lowerpath->dentry) : NULL;
372 struct dentry *lowerdata = ovl_lowerdata_dentry(OVL_I_E(inode));
408 void ovl_dentry_set_flag(unsigned long flag, struct dentry *dentry)
410 set_bit(flag, OVL_E_FLAGS(dentry));
413 void ovl_dentry_clear_flag(unsigned long flag, struct dentry *dentry)
415 clear_bit(flag, OVL_E_FLAGS(dentry));
418 bool ovl_dentry_test_flag(unsigned long flag, struct dentry *dentry)
420 return test_bit(flag, OVL_E_FLAGS(dentry));
423 bool ovl_dentry_is_opaque(struct dentry *dentry)
425 return ovl_dentry_test_flag(OVL_E_OPAQUE, dentry);
428 bool ovl_dentry_is_whiteout(struct dentry *dentry)
430 return !dentry->d_inode && ovl_dentry_is_opaque(dentry);
433 void ovl_dentry_set_opaque(struct dentry *dentry)
435 ovl_dentry_set_flag(OVL_E_OPAQUE, dentry);
444 bool ovl_dentry_has_upper_alias(struct dentry *dentry)
446 return ovl_dentry_test_flag(OVL_E_UPPER_ALIAS, dentry);
449 void ovl_dentry_set_upper_alias(struct dentry *dentry)
451 ovl_dentry_set_flag(OVL_E_UPPER_ALIAS, dentry);
494 bool ovl_dentry_needs_data_copy_up_locked(struct dentry *dentry, int flags)
499 return !ovl_test_flag(OVL_UPPERDATA, d_inode(dentry));
502 bool ovl_dentry_needs_data_copy_up(struct dentry *dentry, int flags)
507 return !ovl_has_upperdata(d_inode(dentry));
510 const char *ovl_dentry_get_redirect(struct dentry *dentry)
512 return OVL_I(d_inode(dentry))->redirect;
515 void ovl_dentry_set_redirect(struct dentry *dentry, const char *redirect)
517 struct ovl_inode *oi = OVL_I(d_inode(dentry));
523 void ovl_inode_update(struct inode *inode, struct dentry *upperdentry)
540 static void ovl_dir_version_inc(struct dentry *dentry, bool impurity)
542 struct inode *inode = d_inode(dentry);
545 WARN_ON(!d_is_dir(dentry));
557 void ovl_dir_modified(struct dentry *dentry, bool impurity)
560 ovl_copyattr(d_inode(dentry));
562 ovl_dir_version_inc(dentry, impurity);
571 bool ovl_is_whiteout(struct dentry *dentry)
573 struct inode *inode = dentry->d_inode;
580 struct inode *inode = d_inode(path->dentry);
610 static bool ovl_already_copied_up_locked(struct dentry *dentry, int flags)
612 bool disconnected = dentry->d_flags & DCACHE_DISCONNECTED;
614 if (ovl_dentry_upper(dentry) &&
615 (ovl_dentry_has_upper_alias(dentry) || disconnected) &&
616 !ovl_dentry_needs_data_copy_up_locked(dentry, flags))
622 bool ovl_already_copied_up(struct dentry *dentry, int flags)
624 bool disconnected = dentry->d_flags & DCACHE_DISCONNECTED;
634 * upper dentry is up-to-date
639 if (ovl_dentry_upper(dentry) &&
640 (ovl_dentry_has_upper_alias(dentry) || disconnected) &&
641 !ovl_dentry_needs_data_copy_up(dentry, flags))
647 int ovl_copy_up_start(struct dentry *dentry, int flags)
649 struct inode *inode = d_inode(dentry);
653 if (!err && ovl_already_copied_up_locked(dentry, flags)) {
661 void ovl_copy_up_end(struct dentry *dentry)
663 ovl_inode_unlock(d_inode(dentry));
725 res = ovl_setxattr(ofs, upperpath->dentry, OVL_XATTR_UUID, sb->s_uuid.b,
734 set ? "set" : "get", upperpath->dentry, res);
744 if (!d_is_dir(path->dentry))
780 int ovl_check_setxattr(struct ovl_fs *ofs, struct dentry *upperdentry,
800 int ovl_set_impure(struct dentry *dentry, struct dentry *upperdentry)
802 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
805 if (ovl_test_flag(OVL_IMPURE, d_inode(dentry)))
814 ovl_set_flag(OVL_IMPURE, d_inode(dentry));
822 void ovl_check_protattr(struct inode *inode, struct dentry *upper)
857 int ovl_set_protattr(struct inode *inode, struct dentry *upper,
905 bool ovl_inuse_trylock(struct dentry *dentry)
907 struct inode *inode = d_inode(dentry);
920 void ovl_inuse_unlock(struct dentry *dentry)
922 if (dentry) {
923 struct inode *inode = d_inode(dentry);
932 bool ovl_is_inuse(struct dentry *dentry)
934 struct inode *inode = d_inode(dentry);
945 * Does this overlay dentry need to be indexed on copy up?
947 bool ovl_need_index(struct dentry *dentry)
949 struct dentry *lower = ovl_dentry_lower(dentry);
951 if (!lower || !ovl_indexdir(dentry->d_sb))
955 if (ovl_index_all(dentry->d_sb))
966 static void ovl_cleanup_index(struct dentry *dentry)
968 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
969 struct dentry *indexdir = ovl_indexdir(dentry->d_sb);
971 struct dentry *lowerdentry = ovl_dentry_lower(dentry);
972 struct dentry *upperdentry = ovl_dentry_upper(dentry);
973 struct dentry *index = NULL;
995 set_nlink(d_inode(dentry), inode->i_nlink - 1);
996 ovl_set_nlink_upper(dentry);
1005 } else if (ovl_index_all(dentry->d_sb)) {
1007 err = ovl_cleanup_and_whiteout(OVL_FS(dentry->d_sb),
1024 pr_err("cleanup index of '%pd2' failed (%i)\n", dentry, err);
1032 int ovl_nlink_start(struct dentry *dentry)
1034 struct inode *inode = d_inode(dentry);
1053 * ovl_copy_up_flags(dentry, O_PATH).
1055 if (ovl_need_index(dentry) && !ovl_dentry_has_upper_alias(dentry)) {
1056 err = ovl_copy_up(dentry);
1065 if (d_is_dir(dentry) || !ovl_test_flag(OVL_INDEX, inode))
1068 old_cred = ovl_override_creds(dentry->d_sb);
1075 err = ovl_set_nlink_upper(dentry);
1085 void ovl_nlink_end(struct dentry *dentry)
1087 struct inode *inode = d_inode(dentry);
1092 old_cred = ovl_override_creds(dentry->d_sb);
1093 ovl_cleanup_index(dentry);
1100 int ovl_lock_rename_workdir(struct dentry *workdir, struct dentry *upperdir)
1129 if (!S_ISREG(d_inode(path->dentry)->i_mode))
1156 path->dentry);
1161 path->dentry);
1166 path->dentry);
1177 int ovl_set_metacopy_xattr(struct ovl_fs *ofs, struct dentry *d, struct ovl_metacopy *metacopy)
1189 bool ovl_is_metacopy_dentry(struct dentry *dentry)
1191 struct ovl_entry *oe = OVL_E(dentry);
1193 if (!d_is_reg(dentry))
1196 if (ovl_dentry_upper(dentry)) {
1197 if (!ovl_has_upperdata(d_inode(dentry)))
1254 struct inode *inode = d_inode(datapath->dentry);
1283 !S_ISREG(d_inode(metapath->dentry)->i_mode))
1293 metapath->dentry);
1304 datapath->dentry);
1308 digest_size = fsverity_get_digest(d_inode(datapath->dentry), actual_digest,
1311 pr_warn_ratelimited("lower file '%pd' has no fs-verity digest\n", datapath->dentry);
1319 datapath->dentry);
1331 if (!ofs->config.verity_mode || !S_ISREG(d_inode(src->dentry)->i_mode))
1337 src->dentry);
1341 digest_size = fsverity_get_digest(d_inode(src->dentry),
1347 src->dentry);