Lines Matching refs:dentry

22 int ovl_get_write_access(struct dentry *dentry)
24 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
29 void ovl_start_write(struct dentry *dentry)
31 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
35 int ovl_want_write(struct dentry *dentry)
37 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
41 void ovl_put_write_access(struct dentry *dentry)
43 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
47 void ovl_end_write(struct dentry *dentry)
49 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
53 void ovl_drop_write(struct dentry *dentry)
55 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
59 struct dentry *ovl_workdir(struct dentry *dentry)
61 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
94 struct dentry *ovl_indexdir(struct super_block *sb)
128 dget(src[i].dentry);
136 dput(stack[i].dentry);
164 bool ovl_dentry_remote(struct dentry *dentry)
166 return dentry->d_flags & OVL_D_REVALIDATE;
169 void ovl_dentry_update_reval(struct dentry *dentry, struct dentry *realdentry)
174 spin_lock(&dentry->d_lock);
175 dentry->d_flags |= realdentry->d_flags & OVL_D_REVALIDATE;
176 spin_unlock(&dentry->d_lock);
179 void ovl_dentry_init_reval(struct dentry *dentry, struct dentry *upperdentry,
182 return ovl_dentry_init_flags(dentry, upperdentry, oe, OVL_D_REVALIDATE);
185 void ovl_dentry_init_flags(struct dentry *dentry, struct dentry *upperdentry,
193 for (i = 0; i < ovl_numlower(oe) && lowerstack[i].dentry; i++)
194 flags |= lowerstack[i].dentry->d_flags;
196 spin_lock(&dentry->d_lock);
197 dentry->d_flags &= ~mask;
198 dentry->d_flags |= flags & mask;
199 spin_unlock(&dentry->d_lock);
202 bool ovl_dentry_weird(struct dentry *dentry)
204 if (!d_can_lookup(dentry) && !d_is_file(dentry) && !d_is_symlink(dentry))
207 if (dentry->d_flags & (DCACHE_NEED_AUTOMOUNT | DCACHE_MANAGE_TRANSIT))
214 if (sb_has_encoding(dentry->d_sb))
217 return dentry->d_flags & (DCACHE_OP_HASH | DCACHE_OP_COMPARE);
220 enum ovl_path_type ovl_path_type(struct dentry *dentry)
222 struct ovl_entry *oe = OVL_E(dentry);
225 if (ovl_dentry_upper(dentry)) {
229 * Non-dir dentry can hold lower dentry of its copy up origin.
232 if (ovl_test_flag(OVL_CONST_INO, d_inode(dentry)))
234 if (d_is_dir(dentry) ||
235 !ovl_has_upperdata(d_inode(dentry)))
245 void ovl_path_upper(struct dentry *dentry, struct path *path)
247 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
250 path->dentry = ovl_dentry_upper(dentry);
253 void ovl_path_lower(struct dentry *dentry, struct path *path)
255 struct ovl_entry *oe = OVL_E(dentry);
260 path->dentry = lowerpath->dentry;
266 void ovl_path_lowerdata(struct dentry *dentry, struct path *path)
268 struct ovl_entry *oe = OVL_E(dentry);
270 struct dentry *lowerdata_dentry = ovl_lowerdata_dentry(oe);
273 path->dentry = lowerdata_dentry;
276 * Make sure that if lowerdata->dentry is visible, then
286 enum ovl_path_type ovl_path_real(struct dentry *dentry, struct path *path)
288 enum ovl_path_type type = ovl_path_type(dentry);
291 ovl_path_lower(dentry, path);
293 ovl_path_upper(dentry, path);
298 enum ovl_path_type ovl_path_realdata(struct dentry *dentry, struct path *path)
300 enum ovl_path_type type = ovl_path_type(dentry);
302 WARN_ON_ONCE(d_is_dir(dentry));
305 ovl_path_lowerdata(dentry, path);
307 ovl_path_upper(dentry, path);
312 struct dentry *ovl_dentry_upper(struct dentry *dentry)
314 struct inode *inode = d_inode(dentry);
319 struct dentry *ovl_dentry_lower(struct dentry *dentry)
321 struct ovl_entry *oe = OVL_E(dentry);
323 return ovl_numlower(oe) ? ovl_lowerstack(oe)->dentry : NULL;
326 const struct ovl_layer *ovl_layer_lower(struct dentry *dentry)
328 struct ovl_entry *oe = OVL_E(dentry);
334 * ovl_dentry_lower() could return either a data dentry or metacopy dentry
336 * lower dentry which has data (and not metacopy dentry). This helper
337 * returns the lower data dentry.
339 struct dentry *ovl_dentry_lowerdata(struct dentry *dentry)
341 return ovl_lowerdata_dentry(OVL_E(dentry));
344 int ovl_dentry_set_lowerdata(struct dentry *dentry, struct ovl_path *datapath)
346 struct ovl_entry *oe = OVL_E(dentry);
348 struct dentry *datadentry = datapath->dentry;
356 * Make sure that if lowerdata->dentry is visible, then
360 WRITE_ONCE(lowerdata->dentry, dget(datadentry));
362 ovl_dentry_update_reval(dentry, datadentry);
367 struct dentry *ovl_dentry_real(struct dentry *dentry)
369 return ovl_dentry_upper(dentry) ?: ovl_dentry_lower(dentry);
372 struct dentry *ovl_i_dentry_upper(struct inode *inode)
381 path->dentry = ovl_i_dentry_upper(inode);
382 if (!path->dentry) {
383 path->dentry = lowerpath->dentry;
389 return path->dentry ? d_inode_rcu(path->dentry) : NULL;
394 struct dentry *upperdentry = ovl_i_dentry_upper(inode);
403 return lowerpath ? d_inode(lowerpath->dentry) : NULL;
414 struct dentry *lowerdata = ovl_lowerdata_dentry(OVL_I_E(inode));
450 void ovl_dentry_set_flag(unsigned long flag, struct dentry *dentry)
452 set_bit(flag, OVL_E_FLAGS(dentry));
455 void ovl_dentry_clear_flag(unsigned long flag, struct dentry *dentry)
457 clear_bit(flag, OVL_E_FLAGS(dentry));
460 bool ovl_dentry_test_flag(unsigned long flag, struct dentry *dentry)
462 return test_bit(flag, OVL_E_FLAGS(dentry));
465 bool ovl_dentry_is_opaque(struct dentry *dentry)
467 return ovl_dentry_test_flag(OVL_E_OPAQUE, dentry);
470 bool ovl_dentry_is_whiteout(struct dentry *dentry)
472 return !dentry->d_inode && ovl_dentry_is_opaque(dentry);
475 void ovl_dentry_set_opaque(struct dentry *dentry)
477 ovl_dentry_set_flag(OVL_E_OPAQUE, dentry);
480 bool ovl_dentry_has_xwhiteouts(struct dentry *dentry)
482 return ovl_dentry_test_flag(OVL_E_XWHITEOUTS, dentry);
485 void ovl_dentry_set_xwhiteouts(struct dentry *dentry)
487 ovl_dentry_set_flag(OVL_E_XWHITEOUTS, dentry);
492 * dentry to dcache, while readdir of that same directory happens after
493 * the overlay dir dentry is in dcache, so if some cpu observes that
513 bool ovl_dentry_has_upper_alias(struct dentry *dentry)
515 return ovl_dentry_test_flag(OVL_E_UPPER_ALIAS, dentry);
518 void ovl_dentry_set_upper_alias(struct dentry *dentry)
520 ovl_dentry_set_flag(OVL_E_UPPER_ALIAS, dentry);
563 bool ovl_dentry_needs_data_copy_up_locked(struct dentry *dentry, int flags)
568 return !ovl_test_flag(OVL_UPPERDATA, d_inode(dentry));
571 bool ovl_dentry_needs_data_copy_up(struct dentry *dentry, int flags)
576 return !ovl_has_upperdata(d_inode(dentry));
579 const char *ovl_dentry_get_redirect(struct dentry *dentry)
581 return OVL_I(d_inode(dentry))->redirect;
584 void ovl_dentry_set_redirect(struct dentry *dentry, const char *redirect)
586 struct ovl_inode *oi = OVL_I(d_inode(dentry));
592 void ovl_inode_update(struct inode *inode, struct dentry *upperdentry)
609 static void ovl_dir_version_inc(struct dentry *dentry, bool impurity)
611 struct inode *inode = d_inode(dentry);
614 WARN_ON(!d_is_dir(dentry));
626 void ovl_dir_modified(struct dentry *dentry, bool impurity)
629 ovl_copyattr(d_inode(dentry));
631 ovl_dir_version_inc(dentry, impurity);
640 bool ovl_is_whiteout(struct dentry *dentry)
642 struct inode *inode = dentry->d_inode;
653 return ovl_is_whiteout(path->dentry) ||
659 struct inode *inode = d_inode(path->dentry);
689 static bool ovl_already_copied_up_locked(struct dentry *dentry, int flags)
691 bool disconnected = dentry->d_flags & DCACHE_DISCONNECTED;
693 if (ovl_dentry_upper(dentry) &&
694 (ovl_dentry_has_upper_alias(dentry) || disconnected) &&
695 !ovl_dentry_needs_data_copy_up_locked(dentry, flags))
701 bool ovl_already_copied_up(struct dentry *dentry, int flags)
703 bool disconnected = dentry->d_flags & DCACHE_DISCONNECTED;
713 * upper dentry is up-to-date
718 if (ovl_dentry_upper(dentry) &&
719 (ovl_dentry_has_upper_alias(dentry) || disconnected) &&
720 !ovl_dentry_needs_data_copy_up(dentry, flags))
730 int ovl_copy_up_start(struct dentry *dentry, int flags)
732 struct inode *inode = d_inode(dentry);
739 if (ovl_already_copied_up_locked(dentry, flags))
742 err = ovl_get_write_access(dentry);
753 void ovl_copy_up_end(struct dentry *dentry)
755 ovl_put_write_access(dentry);
756 ovl_inode_unlock(d_inode(dentry));
774 struct dentry *dentry = path->dentry;
778 if (!d_is_reg(dentry) || i_size_read(d_inode(dentry)) != 0)
832 res = ovl_setxattr(ofs, upperpath->dentry, OVL_XATTR_UUID, uuid.b,
844 set ? "set" : "get", upperpath->dentry, res);
854 if (!d_is_dir(path->dentry))
889 int ovl_check_setxattr(struct ovl_fs *ofs, struct dentry *upperdentry,
909 int ovl_set_impure(struct dentry *dentry, struct dentry *upperdentry)
911 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
914 if (ovl_test_flag(OVL_IMPURE, d_inode(dentry)))
923 ovl_set_flag(OVL_IMPURE, d_inode(dentry));
931 void ovl_check_protattr(struct inode *inode, struct dentry *upper)
966 int ovl_set_protattr(struct inode *inode, struct dentry *upper,
1014 bool ovl_inuse_trylock(struct dentry *dentry)
1016 struct inode *inode = d_inode(dentry);
1029 void ovl_inuse_unlock(struct dentry *dentry)
1031 if (dentry) {
1032 struct inode *inode = d_inode(dentry);
1041 bool ovl_is_inuse(struct dentry *dentry)
1043 struct inode *inode = d_inode(dentry);
1054 * Does this overlay dentry need to be indexed on copy up?
1056 bool ovl_need_index(struct dentry *dentry)
1058 struct dentry *lower = ovl_dentry_lower(dentry);
1060 if (!lower || !ovl_indexdir(dentry->d_sb))
1064 if (ovl_index_all(dentry->d_sb))
1075 static void ovl_cleanup_index(struct dentry *dentry)
1077 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
1078 struct dentry *indexdir = ovl_indexdir(dentry->d_sb);
1079 struct dentry *lowerdentry = ovl_dentry_lower(dentry);
1080 struct dentry *upperdentry = ovl_dentry_upper(dentry);
1081 struct dentry *index = NULL;
1091 err = ovl_want_write(dentry);
1109 set_nlink(d_inode(dentry), inode->i_nlink - 1);
1110 ovl_set_nlink_upper(dentry);
1118 } else if (ovl_index_all(dentry->d_sb)) {
1120 err = ovl_cleanup_and_whiteout(OVL_FS(dentry->d_sb),
1131 ovl_drop_write(dentry);
1137 pr_err("cleanup index of '%pd2' failed (%i)\n", dentry, err);
1145 int ovl_nlink_start(struct dentry *dentry)
1147 struct inode *inode = d_inode(dentry);
1165 * ovl_copy_up_flags(dentry, O_PATH).
1167 if (ovl_need_index(dentry) && !ovl_dentry_has_upper_alias(dentry)) {
1168 err = ovl_copy_up(dentry);
1177 err = ovl_want_write(dentry);
1181 if (d_is_dir(dentry) || !ovl_test_flag(OVL_INDEX, inode))
1190 with_ovl_creds(dentry->d_sb)
1191 err = ovl_set_nlink_upper(dentry);
1198 ovl_drop_write(dentry);
1205 void ovl_nlink_end(struct dentry *dentry)
1207 struct inode *inode = d_inode(dentry);
1209 ovl_drop_write(dentry);
1212 with_ovl_creds(dentry->d_sb)
1213 ovl_cleanup_index(dentry);
1219 int ovl_lock_rename_workdir(struct dentry *workdir, struct dentry *work,
1220 struct dentry *upperdir, struct dentry *upper)
1222 struct dentry *trap;
1254 if (!S_ISREG(d_inode(path->dentry)->i_mode))
1281 path->dentry);
1286 path->dentry);
1291 path->dentry);
1302 int ovl_set_metacopy_xattr(struct ovl_fs *ofs, struct dentry *d, struct ovl_metacopy *metacopy)
1314 bool ovl_is_metacopy_dentry(struct dentry *dentry)
1316 struct ovl_entry *oe = OVL_E(dentry);
1318 if (!d_is_reg(dentry))
1321 if (ovl_dentry_upper(dentry)) {
1322 if (!ovl_has_upperdata(d_inode(dentry)))
1379 struct inode *inode = d_inode(datapath->dentry);
1408 !S_ISREG(d_inode(metapath->dentry)->i_mode))
1418 metapath->dentry);
1429 datapath->dentry);
1433 digest_size = fsverity_get_digest(d_inode(datapath->dentry), actual_digest,
1436 pr_warn_ratelimited("lower file '%pd' has no fs-verity digest\n", datapath->dentry);
1444 datapath->dentry);
1456 if (!ofs->config.verity_mode || !S_ISREG(d_inode(src->dentry)->i_mode))
1462 src->dentry);
1466 digest_size = fsverity_get_digest(d_inode(src->dentry),
1472 src->dentry);