Lines Matching refs:dentry
22 int ovl_get_write_access(struct dentry *dentry) in ovl_get_write_access() argument
24 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_get_write_access()
29 void ovl_start_write(struct dentry *dentry) in ovl_start_write() argument
31 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_start_write()
35 int ovl_want_write(struct dentry *dentry) in ovl_want_write() argument
37 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_want_write()
41 void ovl_put_write_access(struct dentry *dentry) in ovl_put_write_access() argument
43 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_put_write_access()
47 void ovl_end_write(struct dentry *dentry) in ovl_end_write() argument
49 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_end_write()
53 void ovl_drop_write(struct dentry *dentry) in ovl_drop_write() argument
55 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_drop_write()
59 struct dentry *ovl_workdir(struct dentry *dentry) in ovl_workdir() argument
61 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_workdir()
96 struct dentry *ovl_indexdir(struct super_block *sb) in ovl_indexdir()
130 dget(src[i].dentry); in ovl_stack_cpy()
138 dput(stack[i].dentry); in ovl_stack_put()
166 bool ovl_dentry_remote(struct dentry *dentry) in ovl_dentry_remote() argument
168 return dentry->d_flags & OVL_D_REVALIDATE; in ovl_dentry_remote()
171 void ovl_dentry_update_reval(struct dentry *dentry, struct dentry *realdentry) in ovl_dentry_update_reval() argument
176 spin_lock(&dentry->d_lock); in ovl_dentry_update_reval()
177 dentry->d_flags |= realdentry->d_flags & OVL_D_REVALIDATE; in ovl_dentry_update_reval()
178 spin_unlock(&dentry->d_lock); in ovl_dentry_update_reval()
181 void ovl_dentry_init_reval(struct dentry *dentry, struct dentry *upperdentry, in ovl_dentry_init_reval() argument
184 return ovl_dentry_init_flags(dentry, upperdentry, oe, OVL_D_REVALIDATE); in ovl_dentry_init_reval()
187 void ovl_dentry_init_flags(struct dentry *dentry, struct dentry *upperdentry, in ovl_dentry_init_flags() argument
195 for (i = 0; i < ovl_numlower(oe) && lowerstack[i].dentry; i++) in ovl_dentry_init_flags()
196 flags |= lowerstack[i].dentry->d_flags; in ovl_dentry_init_flags()
198 spin_lock(&dentry->d_lock); in ovl_dentry_init_flags()
199 dentry->d_flags &= ~mask; in ovl_dentry_init_flags()
200 dentry->d_flags |= flags & mask; in ovl_dentry_init_flags()
201 spin_unlock(&dentry->d_lock); in ovl_dentry_init_flags()
204 bool ovl_dentry_weird(struct dentry *dentry) in ovl_dentry_weird() argument
206 if (!d_can_lookup(dentry) && !d_is_file(dentry) && !d_is_symlink(dentry)) in ovl_dentry_weird()
209 if (dentry->d_flags & (DCACHE_NEED_AUTOMOUNT | DCACHE_MANAGE_TRANSIT)) in ovl_dentry_weird()
216 if (sb_has_encoding(dentry->d_sb)) in ovl_dentry_weird()
217 return IS_CASEFOLDED(d_inode(dentry)); in ovl_dentry_weird()
219 return dentry->d_flags & (DCACHE_OP_HASH | DCACHE_OP_COMPARE); in ovl_dentry_weird()
222 enum ovl_path_type ovl_path_type(struct dentry *dentry) in ovl_path_type() argument
224 struct ovl_entry *oe = OVL_E(dentry); in ovl_path_type()
227 if (ovl_dentry_upper(dentry)) { in ovl_path_type()
234 if (ovl_test_flag(OVL_CONST_INO, d_inode(dentry))) in ovl_path_type()
236 if (d_is_dir(dentry) || in ovl_path_type()
237 !ovl_has_upperdata(d_inode(dentry))) in ovl_path_type()
247 void ovl_path_upper(struct dentry *dentry, struct path *path) in ovl_path_upper() argument
249 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_path_upper()
252 path->dentry = ovl_dentry_upper(dentry); in ovl_path_upper()
255 void ovl_path_lower(struct dentry *dentry, struct path *path) in ovl_path_lower() argument
257 struct ovl_entry *oe = OVL_E(dentry); in ovl_path_lower()
262 path->dentry = lowerpath->dentry; in ovl_path_lower()
268 void ovl_path_lowerdata(struct dentry *dentry, struct path *path) in ovl_path_lowerdata() argument
270 struct ovl_entry *oe = OVL_E(dentry); in ovl_path_lowerdata()
272 struct dentry *lowerdata_dentry = ovl_lowerdata_dentry(oe); in ovl_path_lowerdata()
275 path->dentry = lowerdata_dentry; in ovl_path_lowerdata()
288 enum ovl_path_type ovl_path_real(struct dentry *dentry, struct path *path) in ovl_path_real() argument
290 enum ovl_path_type type = ovl_path_type(dentry); in ovl_path_real()
293 ovl_path_lower(dentry, path); in ovl_path_real()
295 ovl_path_upper(dentry, path); in ovl_path_real()
300 enum ovl_path_type ovl_path_realdata(struct dentry *dentry, struct path *path) in ovl_path_realdata() argument
302 enum ovl_path_type type = ovl_path_type(dentry); in ovl_path_realdata()
304 WARN_ON_ONCE(d_is_dir(dentry)); in ovl_path_realdata()
307 ovl_path_lowerdata(dentry, path); in ovl_path_realdata()
309 ovl_path_upper(dentry, path); in ovl_path_realdata()
314 struct dentry *ovl_dentry_upper(struct dentry *dentry) in ovl_dentry_upper() argument
316 struct inode *inode = d_inode(dentry); in ovl_dentry_upper()
321 struct dentry *ovl_dentry_lower(struct dentry *dentry) in ovl_dentry_lower() argument
323 struct ovl_entry *oe = OVL_E(dentry); in ovl_dentry_lower()
325 return ovl_numlower(oe) ? ovl_lowerstack(oe)->dentry : NULL; in ovl_dentry_lower()
328 const struct ovl_layer *ovl_layer_lower(struct dentry *dentry) in ovl_layer_lower() argument
330 struct ovl_entry *oe = OVL_E(dentry); in ovl_layer_lower()
341 struct dentry *ovl_dentry_lowerdata(struct dentry *dentry) in ovl_dentry_lowerdata() argument
343 return ovl_lowerdata_dentry(OVL_E(dentry)); in ovl_dentry_lowerdata()
346 int ovl_dentry_set_lowerdata(struct dentry *dentry, struct ovl_path *datapath) in ovl_dentry_set_lowerdata() argument
348 struct ovl_entry *oe = OVL_E(dentry); in ovl_dentry_set_lowerdata()
350 struct dentry *datadentry = datapath->dentry; in ovl_dentry_set_lowerdata()
362 WRITE_ONCE(lowerdata->dentry, dget(datadentry)); in ovl_dentry_set_lowerdata()
364 ovl_dentry_update_reval(dentry, datadentry); in ovl_dentry_set_lowerdata()
369 struct dentry *ovl_dentry_real(struct dentry *dentry) in ovl_dentry_real() argument
371 return ovl_dentry_upper(dentry) ?: ovl_dentry_lower(dentry); in ovl_dentry_real()
374 struct dentry *ovl_i_dentry_upper(struct inode *inode) in ovl_i_dentry_upper()
383 path->dentry = ovl_i_dentry_upper(inode); in ovl_i_path_real()
384 if (!path->dentry) { in ovl_i_path_real()
385 path->dentry = lowerpath->dentry; in ovl_i_path_real()
391 return path->dentry ? d_inode_rcu(path->dentry) : NULL; in ovl_i_path_real()
396 struct dentry *upperdentry = ovl_i_dentry_upper(inode); in ovl_inode_upper()
405 return lowerpath ? d_inode(lowerpath->dentry) : NULL; in ovl_inode_lower()
416 struct dentry *lowerdata = ovl_lowerdata_dentry(OVL_I_E(inode)); in ovl_inode_lowerdata()
452 void ovl_dentry_set_flag(unsigned long flag, struct dentry *dentry) in ovl_dentry_set_flag() argument
454 set_bit(flag, OVL_E_FLAGS(dentry)); in ovl_dentry_set_flag()
457 void ovl_dentry_clear_flag(unsigned long flag, struct dentry *dentry) in ovl_dentry_clear_flag() argument
459 clear_bit(flag, OVL_E_FLAGS(dentry)); in ovl_dentry_clear_flag()
462 bool ovl_dentry_test_flag(unsigned long flag, struct dentry *dentry) in ovl_dentry_test_flag() argument
464 return test_bit(flag, OVL_E_FLAGS(dentry)); in ovl_dentry_test_flag()
467 bool ovl_dentry_is_opaque(struct dentry *dentry) in ovl_dentry_is_opaque() argument
469 return ovl_dentry_test_flag(OVL_E_OPAQUE, dentry); in ovl_dentry_is_opaque()
472 bool ovl_dentry_is_whiteout(struct dentry *dentry) in ovl_dentry_is_whiteout() argument
474 return !dentry->d_inode && ovl_dentry_is_opaque(dentry); in ovl_dentry_is_whiteout()
477 void ovl_dentry_set_opaque(struct dentry *dentry) in ovl_dentry_set_opaque() argument
479 ovl_dentry_set_flag(OVL_E_OPAQUE, dentry); in ovl_dentry_set_opaque()
482 bool ovl_dentry_has_xwhiteouts(struct dentry *dentry) in ovl_dentry_has_xwhiteouts() argument
484 return ovl_dentry_test_flag(OVL_E_XWHITEOUTS, dentry); in ovl_dentry_has_xwhiteouts()
487 void ovl_dentry_set_xwhiteouts(struct dentry *dentry) in ovl_dentry_set_xwhiteouts() argument
489 ovl_dentry_set_flag(OVL_E_XWHITEOUTS, dentry); in ovl_dentry_set_xwhiteouts()
515 bool ovl_dentry_has_upper_alias(struct dentry *dentry) in ovl_dentry_has_upper_alias() argument
517 return ovl_dentry_test_flag(OVL_E_UPPER_ALIAS, dentry); in ovl_dentry_has_upper_alias()
520 void ovl_dentry_set_upper_alias(struct dentry *dentry) in ovl_dentry_set_upper_alias() argument
522 ovl_dentry_set_flag(OVL_E_UPPER_ALIAS, dentry); in ovl_dentry_set_upper_alias()
565 bool ovl_dentry_needs_data_copy_up_locked(struct dentry *dentry, int flags) in ovl_dentry_needs_data_copy_up_locked() argument
570 return !ovl_test_flag(OVL_UPPERDATA, d_inode(dentry)); in ovl_dentry_needs_data_copy_up_locked()
573 bool ovl_dentry_needs_data_copy_up(struct dentry *dentry, int flags) in ovl_dentry_needs_data_copy_up() argument
578 return !ovl_has_upperdata(d_inode(dentry)); in ovl_dentry_needs_data_copy_up()
581 const char *ovl_dentry_get_redirect(struct dentry *dentry) in ovl_dentry_get_redirect() argument
583 return OVL_I(d_inode(dentry))->redirect; in ovl_dentry_get_redirect()
586 void ovl_dentry_set_redirect(struct dentry *dentry, const char *redirect) in ovl_dentry_set_redirect() argument
588 struct ovl_inode *oi = OVL_I(d_inode(dentry)); in ovl_dentry_set_redirect()
594 void ovl_inode_update(struct inode *inode, struct dentry *upperdentry) in ovl_inode_update()
611 static void ovl_dir_version_inc(struct dentry *dentry, bool impurity) in ovl_dir_version_inc() argument
613 struct inode *inode = d_inode(dentry); in ovl_dir_version_inc()
616 WARN_ON(!d_is_dir(dentry)); in ovl_dir_version_inc()
628 void ovl_dir_modified(struct dentry *dentry, bool impurity) in ovl_dir_modified() argument
631 ovl_copyattr(d_inode(dentry)); in ovl_dir_modified()
633 ovl_dir_version_inc(dentry, impurity); in ovl_dir_modified()
642 bool ovl_is_whiteout(struct dentry *dentry) in ovl_is_whiteout() argument
644 struct inode *inode = dentry->d_inode; in ovl_is_whiteout()
655 return ovl_is_whiteout(path->dentry) || in ovl_path_is_whiteout()
661 struct inode *inode = d_inode(path->dentry); in ovl_path_open()
691 static bool ovl_already_copied_up_locked(struct dentry *dentry, int flags) in ovl_already_copied_up_locked() argument
693 bool disconnected = dentry->d_flags & DCACHE_DISCONNECTED; in ovl_already_copied_up_locked()
695 if (ovl_dentry_upper(dentry) && in ovl_already_copied_up_locked()
696 (ovl_dentry_has_upper_alias(dentry) || disconnected) && in ovl_already_copied_up_locked()
697 !ovl_dentry_needs_data_copy_up_locked(dentry, flags)) in ovl_already_copied_up_locked()
703 bool ovl_already_copied_up(struct dentry *dentry, int flags) in ovl_already_copied_up() argument
705 bool disconnected = dentry->d_flags & DCACHE_DISCONNECTED; in ovl_already_copied_up()
720 if (ovl_dentry_upper(dentry) && in ovl_already_copied_up()
721 (ovl_dentry_has_upper_alias(dentry) || disconnected) && in ovl_already_copied_up()
722 !ovl_dentry_needs_data_copy_up(dentry, flags)) in ovl_already_copied_up()
732 int ovl_copy_up_start(struct dentry *dentry, int flags) in ovl_copy_up_start() argument
734 struct inode *inode = d_inode(dentry); in ovl_copy_up_start()
741 if (ovl_already_copied_up_locked(dentry, flags)) in ovl_copy_up_start()
744 err = ovl_get_write_access(dentry); in ovl_copy_up_start()
755 void ovl_copy_up_end(struct dentry *dentry) in ovl_copy_up_end() argument
757 ovl_put_write_access(dentry); in ovl_copy_up_end()
758 ovl_inode_unlock(d_inode(dentry)); in ovl_copy_up_end()
776 struct dentry *dentry = path->dentry; in ovl_path_check_xwhiteout_xattr() local
780 if (!d_is_reg(dentry) || i_size_read(d_inode(dentry)) != 0) in ovl_path_check_xwhiteout_xattr()
834 res = ovl_setxattr(ofs, upperpath->dentry, OVL_XATTR_UUID, uuid.b, in ovl_init_uuid_xattr()
846 set ? "set" : "get", upperpath->dentry, res); in ovl_init_uuid_xattr()
856 if (!d_is_dir(path->dentry)) in ovl_get_dir_xattr_val()
891 int ovl_check_setxattr(struct ovl_fs *ofs, struct dentry *upperdentry, in ovl_check_setxattr()
911 int ovl_set_impure(struct dentry *dentry, struct dentry *upperdentry) in ovl_set_impure() argument
913 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_set_impure()
916 if (ovl_test_flag(OVL_IMPURE, d_inode(dentry))) in ovl_set_impure()
925 ovl_set_flag(OVL_IMPURE, d_inode(dentry)); in ovl_set_impure()
933 void ovl_check_protattr(struct inode *inode, struct dentry *upper) in ovl_check_protattr()
968 int ovl_set_protattr(struct inode *inode, struct dentry *upper, in ovl_set_protattr()
1016 bool ovl_inuse_trylock(struct dentry *dentry) in ovl_inuse_trylock() argument
1018 struct inode *inode = d_inode(dentry); in ovl_inuse_trylock()
1031 void ovl_inuse_unlock(struct dentry *dentry) in ovl_inuse_unlock() argument
1033 if (dentry) { in ovl_inuse_unlock()
1034 struct inode *inode = d_inode(dentry); in ovl_inuse_unlock()
1043 bool ovl_is_inuse(struct dentry *dentry) in ovl_is_inuse() argument
1045 struct inode *inode = d_inode(dentry); in ovl_is_inuse()
1058 bool ovl_need_index(struct dentry *dentry) in ovl_need_index() argument
1060 struct dentry *lower = ovl_dentry_lower(dentry); in ovl_need_index()
1062 if (!lower || !ovl_indexdir(dentry->d_sb)) in ovl_need_index()
1066 if (ovl_index_all(dentry->d_sb)) in ovl_need_index()
1077 static void ovl_cleanup_index(struct dentry *dentry) in ovl_cleanup_index() argument
1079 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_cleanup_index()
1080 struct dentry *indexdir = ovl_indexdir(dentry->d_sb); in ovl_cleanup_index()
1081 struct dentry *lowerdentry = ovl_dentry_lower(dentry); in ovl_cleanup_index()
1082 struct dentry *upperdentry = ovl_dentry_upper(dentry); in ovl_cleanup_index()
1083 struct dentry *index = NULL; in ovl_cleanup_index()
1093 err = ovl_want_write(dentry); in ovl_cleanup_index()
1111 set_nlink(d_inode(dentry), inode->i_nlink - 1); in ovl_cleanup_index()
1112 ovl_set_nlink_upper(dentry); in ovl_cleanup_index()
1120 } else if (ovl_index_all(dentry->d_sb)) { in ovl_cleanup_index()
1122 err = ovl_cleanup_and_whiteout(OVL_FS(dentry->d_sb), in ovl_cleanup_index()
1133 ovl_drop_write(dentry); in ovl_cleanup_index()
1139 pr_err("cleanup index of '%pd2' failed (%i)\n", dentry, err); in ovl_cleanup_index()
1147 int ovl_nlink_start(struct dentry *dentry) in ovl_nlink_start() argument
1149 struct inode *inode = d_inode(dentry); in ovl_nlink_start()
1170 if (ovl_need_index(dentry) && !ovl_dentry_has_upper_alias(dentry)) { in ovl_nlink_start()
1171 err = ovl_copy_up(dentry); in ovl_nlink_start()
1180 err = ovl_want_write(dentry); in ovl_nlink_start()
1184 if (d_is_dir(dentry) || !ovl_test_flag(OVL_INDEX, inode)) in ovl_nlink_start()
1187 old_cred = ovl_override_creds(dentry->d_sb); in ovl_nlink_start()
1194 err = ovl_set_nlink_upper(dentry); in ovl_nlink_start()
1202 ovl_drop_write(dentry); in ovl_nlink_start()
1209 void ovl_nlink_end(struct dentry *dentry) in ovl_nlink_end() argument
1211 struct inode *inode = d_inode(dentry); in ovl_nlink_end()
1213 ovl_drop_write(dentry); in ovl_nlink_end()
1218 old_cred = ovl_override_creds(dentry->d_sb); in ovl_nlink_end()
1219 ovl_cleanup_index(dentry); in ovl_nlink_end()
1226 int ovl_lock_rename_workdir(struct dentry *workdir, struct dentry *work, in ovl_lock_rename_workdir()
1227 struct dentry *upperdir, struct dentry *upper) in ovl_lock_rename_workdir()
1229 struct dentry *trap; in ovl_lock_rename_workdir()
1261 if (!S_ISREG(d_inode(path->dentry)->i_mode)) in ovl_check_metacopy_xattr()
1288 path->dentry); in ovl_check_metacopy_xattr()
1293 path->dentry); in ovl_check_metacopy_xattr()
1298 path->dentry); in ovl_check_metacopy_xattr()
1309 int ovl_set_metacopy_xattr(struct ovl_fs *ofs, struct dentry *d, struct ovl_metacopy *metacopy) in ovl_set_metacopy_xattr()
1321 bool ovl_is_metacopy_dentry(struct dentry *dentry) in ovl_is_metacopy_dentry() argument
1323 struct ovl_entry *oe = OVL_E(dentry); in ovl_is_metacopy_dentry()
1325 if (!d_is_reg(dentry)) in ovl_is_metacopy_dentry()
1328 if (ovl_dentry_upper(dentry)) { in ovl_is_metacopy_dentry()
1329 if (!ovl_has_upperdata(d_inode(dentry))) in ovl_is_metacopy_dentry()
1386 struct inode *inode = d_inode(datapath->dentry); in ovl_ensure_verity_loaded()
1415 !S_ISREG(d_inode(metapath->dentry)->i_mode)) in ovl_validate_verity()
1425 metapath->dentry); in ovl_validate_verity()
1436 datapath->dentry); in ovl_validate_verity()
1440 digest_size = fsverity_get_digest(d_inode(datapath->dentry), actual_digest, in ovl_validate_verity()
1443 pr_warn_ratelimited("lower file '%pd' has no fs-verity digest\n", datapath->dentry); in ovl_validate_verity()
1451 datapath->dentry); in ovl_validate_verity()
1463 if (!ofs->config.verity_mode || !S_ISREG(d_inode(src->dentry)->i_mode)) in ovl_get_verity_digest()
1469 src->dentry); in ovl_get_verity_digest()
1473 digest_size = fsverity_get_digest(d_inode(src->dentry), in ovl_get_verity_digest()
1479 src->dentry); in ovl_get_verity_digest()
1552 int ovl_parent_lock(struct dentry *parent, struct dentry *child) in ovl_parent_lock()