Lines Matching refs:dentry
25 static int ovl_set_redirect(struct dentry *dentry, bool samedir);
28 struct dentry *wdentry) in ovl_cleanup_locked()
47 int ovl_cleanup(struct ovl_fs *ofs, struct dentry *workdir, in ovl_cleanup()
48 struct dentry *wdentry) in ovl_cleanup()
68 static struct dentry *ovl_start_creating_temp(struct ovl_fs *ofs, in ovl_start_creating_temp()
69 struct dentry *workdir) in ovl_start_creating_temp()
78 static struct dentry *ovl_whiteout(struct ovl_fs *ofs) in ovl_whiteout()
81 struct dentry *whiteout, *link; in ovl_whiteout()
82 struct dentry *workdir = ofs->workdir; in ovl_whiteout()
122 int ovl_cleanup_and_whiteout(struct ovl_fs *ofs, struct dentry *dir, in ovl_cleanup_and_whiteout()
123 struct dentry *dentry) in ovl_cleanup_and_whiteout() argument
125 struct dentry *whiteout; in ovl_cleanup_and_whiteout()
135 if (d_is_dir(dentry)) in ovl_cleanup_and_whiteout()
142 err = start_renaming_two_dentries(&rd, whiteout, dentry); in ovl_cleanup_and_whiteout()
150 ovl_cleanup(ofs, ofs->workdir, dentry); in ovl_cleanup_and_whiteout()
161 struct dentry *ovl_create_real(struct ovl_fs *ofs, struct dentry *parent, in ovl_create_real()
162 struct dentry *newdentry, struct ovl_cattr *attr) in ovl_create_real()
221 struct dentry *d; in ovl_create_real()
246 struct dentry *ovl_create_temp(struct ovl_fs *ofs, struct dentry *workdir, in ovl_create_temp()
249 struct dentry *ret; in ovl_create_temp()
257 static int ovl_set_opaque_xerr(struct dentry *dentry, struct dentry *upper, in ovl_set_opaque_xerr() argument
260 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_set_opaque_xerr()
265 ovl_dentry_set_opaque(dentry); in ovl_set_opaque_xerr()
270 static int ovl_set_opaque(struct dentry *dentry, struct dentry *upperdentry) in ovl_set_opaque() argument
277 return ovl_set_opaque_xerr(dentry, upperdentry, -EIO); in ovl_set_opaque()
285 static int ovl_instantiate(struct dentry *dentry, struct inode *inode, in ovl_instantiate() argument
286 struct dentry *newdentry, bool hardlink, struct file *tmpfile) in ovl_instantiate()
293 ovl_dentry_set_upper_alias(dentry); in ovl_instantiate()
294 ovl_dentry_init_reval(dentry, newdentry, NULL); in ovl_instantiate()
310 inode = ovl_get_inode(dentry->d_sb, &oip); in ovl_instantiate()
324 d_instantiate(dentry, inode); in ovl_instantiate()
327 dentry); in ovl_instantiate()
332 d_drop(dentry); in ovl_instantiate()
337 static bool ovl_type_merge(struct dentry *dentry) in ovl_type_merge() argument
339 return OVL_TYPE_MERGE(ovl_path_type(dentry)); in ovl_type_merge()
342 static bool ovl_type_origin(struct dentry *dentry) in ovl_type_origin() argument
344 return OVL_TYPE_ORIGIN(ovl_path_type(dentry)); in ovl_type_origin()
347 static int ovl_create_upper(struct dentry *dentry, struct inode *inode, in ovl_create_upper() argument
350 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_create_upper()
351 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent); in ovl_create_upper()
352 struct dentry *newdentry; in ovl_create_upper()
356 &QSTR_LEN(dentry->d_name.name, in ovl_create_upper()
357 dentry->d_name.len)); in ovl_create_upper()
366 if (ovl_type_merge(dentry->d_parent) && d_is_dir(newdentry) && in ovl_create_upper()
369 ovl_set_opaque(dentry, newdentry); in ovl_create_upper()
372 ovl_dir_modified(dentry->d_parent, false); in ovl_create_upper()
373 err = ovl_instantiate(dentry, inode, newdentry, !!attr->hardlink, NULL); in ovl_create_upper()
384 static struct dentry *ovl_clear_empty(struct dentry *dentry, in ovl_clear_empty() argument
387 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_clear_empty()
388 struct dentry *workdir = ovl_workdir(dentry); in ovl_clear_empty()
389 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent); in ovl_clear_empty()
392 struct dentry *upper; in ovl_clear_empty()
393 struct dentry *opaquedir; in ovl_clear_empty()
400 ovl_path_upper(dentry, &upperpath); in ovl_clear_empty()
409 upper = upperpath.dentry; in ovl_clear_empty()
424 err = ovl_copy_xattr(dentry->d_sb, &upperpath, opaquedir); in ovl_clear_empty()
428 err = ovl_set_opaque(dentry, opaquedir); in ovl_clear_empty()
447 d_drop(dentry); in ovl_clear_empty()
460 static int ovl_set_upper_acl(struct ovl_fs *ofs, struct dentry *upperdentry, in ovl_set_upper_acl()
469 static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode, in ovl_create_over_whiteout() argument
472 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_create_over_whiteout()
473 struct dentry *workdir = ovl_workdir(dentry); in ovl_create_over_whiteout()
474 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent); in ovl_create_over_whiteout()
476 struct dentry *upper; in ovl_create_over_whiteout()
477 struct dentry *newdentry; in ovl_create_over_whiteout()
486 err = posix_acl_create(dentry->d_parent->d_inode, in ovl_create_over_whiteout()
492 upper = ovl_lookup_upper_unlocked(ofs, dentry->d_name.name, upperdir, in ovl_create_over_whiteout()
493 dentry->d_name.len); in ovl_create_over_whiteout()
544 err = ovl_set_opaque(dentry, newdentry); in ovl_create_over_whiteout()
561 ovl_dir_modified(dentry->d_parent, false); in ovl_create_over_whiteout()
562 err = ovl_instantiate(dentry, inode, newdentry, hardlink, NULL); in ovl_create_over_whiteout()
585 struct dentry *dentry, struct inode *inode, umode_t mode) in ovl_override_creator_creds() argument
589 if (WARN_ON_ONCE(current->cred != ovl_creds(dentry->d_sb))) in ovl_override_creator_creds()
599 err = security_dentry_create_files_as(dentry, mode, &dentry->d_name, in ovl_override_creator_creds()
618 ovl_override_creator_creds(original_creds, dentry, inode, mode),
620 struct dentry *dentry,
624 static int ovl_create_handle_whiteouts(struct dentry *dentry, in ovl_create_handle_whiteouts() argument
628 if (!ovl_dentry_is_whiteout(dentry)) in ovl_create_handle_whiteouts()
629 return ovl_create_upper(dentry, inode, attr); in ovl_create_handle_whiteouts()
631 return ovl_create_over_whiteout(dentry, inode, attr); in ovl_create_handle_whiteouts()
634 static int ovl_create_or_link(struct dentry *dentry, struct inode *inode, in ovl_create_or_link() argument
638 struct dentry *parent = dentry->d_parent; in ovl_create_or_link()
640 scoped_class(override_creds_ovl, original_creds, dentry->d_sb) { in ovl_create_or_link()
666 return ovl_create_handle_whiteouts(dentry, inode, attr); in ovl_create_or_link()
668 scoped_class(ovl_override_creator_creds, cred, original_creds, dentry, inode, attr->mode) { in ovl_create_or_link()
671 return ovl_create_handle_whiteouts(dentry, inode, attr); in ovl_create_or_link()
677 static int ovl_create_object(struct dentry *dentry, int mode, dev_t rdev, in ovl_create_object() argument
687 err = ovl_copy_up(dentry->d_parent); in ovl_create_object()
691 err = ovl_want_write(dentry); in ovl_create_object()
697 inode = ovl_new_inode(dentry->d_sb, mode, rdev); in ovl_create_object()
705 inode_init_owner(&nop_mnt_idmap, inode, dentry->d_parent->d_inode, mode); in ovl_create_object()
708 err = ovl_create_or_link(dentry, inode, &attr, false); in ovl_create_object()
710 if (inode != d_inode(dentry)) in ovl_create_object()
714 ovl_drop_write(dentry); in ovl_create_object()
720 struct dentry *dentry, umode_t mode, bool excl) in ovl_create() argument
722 return ovl_create_object(dentry, (mode & 07777) | S_IFREG, 0, NULL); in ovl_create()
725 static struct dentry *ovl_mkdir(struct mnt_idmap *idmap, struct inode *dir, in ovl_mkdir()
726 struct dentry *dentry, umode_t mode) in ovl_mkdir() argument
728 return ERR_PTR(ovl_create_object(dentry, (mode & 07777) | S_IFDIR, 0, NULL)); in ovl_mkdir()
732 struct dentry *dentry, umode_t mode, dev_t rdev) in ovl_mknod() argument
738 return ovl_create_object(dentry, mode, rdev, NULL); in ovl_mknod()
742 struct dentry *dentry, const char *link) in ovl_symlink() argument
744 return ovl_create_object(dentry, S_IFLNK, 0, link); in ovl_symlink()
747 static int ovl_set_link_redirect(struct dentry *dentry) in ovl_set_link_redirect() argument
749 with_ovl_creds(dentry->d_sb) in ovl_set_link_redirect()
750 return ovl_set_redirect(dentry, false); in ovl_set_link_redirect()
753 static int ovl_link(struct dentry *old, struct inode *newdir, in ovl_link()
754 struct dentry *new) in ovl_link()
792 static bool ovl_matches_upper(struct dentry *dentry, struct dentry *upper) in ovl_matches_upper() argument
794 return d_inode(ovl_dentry_upper(dentry)) == d_inode(upper); in ovl_matches_upper()
797 static int ovl_remove_and_whiteout(struct dentry *dentry, in ovl_remove_and_whiteout() argument
800 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_remove_and_whiteout()
801 struct dentry *workdir = ovl_workdir(dentry); in ovl_remove_and_whiteout()
802 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent); in ovl_remove_and_whiteout()
803 struct dentry *upper; in ovl_remove_and_whiteout()
804 struct dentry *opaquedir = NULL; in ovl_remove_and_whiteout()
811 opaquedir = ovl_clear_empty(dentry, list); in ovl_remove_and_whiteout()
817 upper = ovl_lookup_upper_unlocked(ofs, dentry->d_name.name, upperdir, in ovl_remove_and_whiteout()
818 dentry->d_name.len); in ovl_remove_and_whiteout()
825 (!opaquedir && ovl_dentry_upper(dentry) && in ovl_remove_and_whiteout()
826 !ovl_matches_upper(dentry, upper))) { in ovl_remove_and_whiteout()
832 ovl_dir_modified(dentry->d_parent, true); in ovl_remove_and_whiteout()
834 d_drop(dentry); in ovl_remove_and_whiteout()
843 static int ovl_remove_upper(struct dentry *dentry, bool is_dir, in ovl_remove_upper() argument
846 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_remove_upper()
847 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent); in ovl_remove_upper()
849 struct dentry *upper; in ovl_remove_upper()
850 struct dentry *opaquedir = NULL; in ovl_remove_upper()
854 opaquedir = ovl_clear_empty(dentry, list); in ovl_remove_upper()
861 &QSTR_LEN(dentry->d_name.name, in ovl_remove_upper()
862 dentry->d_name.len)); in ovl_remove_upper()
869 (!opaquedir && !ovl_matches_upper(dentry, upper))) in ovl_remove_upper()
876 ovl_dir_modified(dentry->d_parent, ovl_type_origin(dentry)); in ovl_remove_upper()
885 d_drop(dentry); in ovl_remove_upper()
894 static bool ovl_pure_upper(struct dentry *dentry) in ovl_pure_upper() argument
896 return !ovl_dentry_lower(dentry) && in ovl_pure_upper()
897 !ovl_test_flag(OVL_WHITEOUTS, d_inode(dentry)); in ovl_pure_upper()
900 static void ovl_drop_nlink(struct dentry *dentry) in ovl_drop_nlink() argument
902 struct inode *inode = d_inode(dentry); in ovl_drop_nlink()
903 struct dentry *alias; in ovl_drop_nlink()
908 if (alias != dentry && !d_unhashed(alias)) in ovl_drop_nlink()
922 static int ovl_do_remove(struct dentry *dentry, bool is_dir) in ovl_do_remove() argument
925 bool lower_positive = ovl_lower_positive(dentry); in ovl_do_remove()
929 if (is_dir && (lower_positive || !ovl_pure_upper(dentry))) { in ovl_do_remove()
930 err = ovl_check_empty_dir(dentry, &list); in ovl_do_remove()
935 err = ovl_copy_up(dentry->d_parent); in ovl_do_remove()
939 err = ovl_nlink_start(dentry); in ovl_do_remove()
943 with_ovl_creds(dentry->d_sb) { in ovl_do_remove()
945 err = ovl_remove_upper(dentry, is_dir, &list); in ovl_do_remove()
947 err = ovl_remove_and_whiteout(dentry, &list); in ovl_do_remove()
951 clear_nlink(dentry->d_inode); in ovl_do_remove()
953 ovl_drop_nlink(dentry); in ovl_do_remove()
955 ovl_nlink_end(dentry); in ovl_do_remove()
963 if (ovl_dentry_upper(dentry)) in ovl_do_remove()
964 ovl_copyattr(d_inode(dentry)); in ovl_do_remove()
971 static int ovl_unlink(struct inode *dir, struct dentry *dentry) in ovl_unlink() argument
973 return ovl_do_remove(dentry, false); in ovl_unlink()
976 static int ovl_rmdir(struct inode *dir, struct dentry *dentry) in ovl_rmdir() argument
978 return ovl_do_remove(dentry, true); in ovl_rmdir()
981 static bool ovl_type_merge_or_lower(struct dentry *dentry) in ovl_type_merge_or_lower() argument
983 enum ovl_path_type type = ovl_path_type(dentry); in ovl_type_merge_or_lower()
988 static bool ovl_can_move(struct dentry *dentry) in ovl_can_move() argument
990 return ovl_redirect_dir(OVL_FS(dentry->d_sb)) || in ovl_can_move()
991 !d_is_dir(dentry) || !ovl_type_merge_or_lower(dentry); in ovl_can_move()
994 static char *ovl_get_redirect(struct dentry *dentry, bool abs_redirect) in ovl_get_redirect() argument
997 struct dentry *d, *tmp; in ovl_get_redirect()
1001 ret = kstrndup(dentry->d_name.name, dentry->d_name.len, in ovl_get_redirect()
1012 for (d = dget(dentry); !IS_ROOT(d);) { in ovl_get_redirect()
1054 static bool ovl_need_absolute_redirect(struct dentry *dentry, bool samedir) in ovl_need_absolute_redirect() argument
1056 struct dentry *lowerdentry; in ovl_need_absolute_redirect()
1061 if (d_is_dir(dentry)) in ovl_need_absolute_redirect()
1077 lowerdentry = ovl_dentry_lower(dentry); in ovl_need_absolute_redirect()
1081 static int ovl_set_redirect(struct dentry *dentry, bool samedir) in ovl_set_redirect() argument
1084 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_set_redirect()
1085 const char *redirect = ovl_dentry_get_redirect(dentry); in ovl_set_redirect()
1086 bool absolute_redirect = ovl_need_absolute_redirect(dentry, samedir); in ovl_set_redirect()
1091 redirect = ovl_get_redirect(dentry, absolute_redirect); in ovl_set_redirect()
1095 err = ovl_check_setxattr(ofs, ovl_dentry_upper(dentry), in ovl_set_redirect()
1099 spin_lock(&dentry->d_lock); in ovl_set_redirect()
1100 ovl_dentry_set_redirect(dentry, redirect); in ovl_set_redirect()
1101 spin_unlock(&dentry->d_lock); in ovl_set_redirect()
1114 struct dentry *opaquedir;
1122 struct dentry *old = ovlrd->old_dentry; in ovl_rename_start()
1123 struct dentry *new = ovlrd->new_dentry; in ovl_rename_start()
1193 struct dentry *old = ovlrd->old_dentry; in ovl_rename_upper()
1194 struct dentry *new = ovlrd->new_dentry; in ovl_rename_upper()
1196 struct dentry *old_upperdir = ovl_dentry_upper(old->d_parent); in ovl_rename_upper()
1197 struct dentry *new_upperdir = ovl_dentry_upper(new->d_parent); in ovl_rename_upper()
1202 struct dentry *de; in ovl_rename_upper()
1203 struct dentry *whiteout = NULL; in ovl_rename_upper()
1334 struct dentry *old, struct inode *newdir, in ovl_rename()
1335 struct dentry *new, unsigned int flags) in ovl_rename()
1360 static int ovl_create_tmpfile(struct file *file, struct dentry *dentry, in ovl_create_tmpfile() argument
1366 struct dentry *newdentry; in ovl_create_tmpfile()
1371 scoped_class(override_creds_ovl, original_creds, dentry->d_sb) { in ovl_create_tmpfile()
1372 scoped_class(ovl_override_creator_creds, cred, original_creds, dentry, inode, mode) { in ovl_create_tmpfile()
1376 ovl_path_upper(dentry->d_parent, &realparentpath); in ovl_create_tmpfile()
1380 pr_debug("tmpfile/open(%pd2, 0%o) = %i\n", realparentpath.dentry, mode, err); in ovl_create_tmpfile()
1391 newdentry = dget(realfile->f_path.dentry); in ovl_create_tmpfile()
1392 err = ovl_instantiate(dentry, inode, newdentry, false, file); in ovl_create_tmpfile()
1413 struct dentry *dentry = file->f_path.dentry; in ovl_tmpfile() local
1416 if (!OVL_FS(dentry->d_sb)->tmpfile) in ovl_tmpfile()
1419 err = ovl_copy_up(dentry->d_parent); in ovl_tmpfile()
1423 err = ovl_want_write(dentry); in ovl_tmpfile()
1428 inode = ovl_new_inode(dentry->d_sb, mode, 0); in ovl_tmpfile()
1433 err = ovl_create_tmpfile(file, dentry, inode, inode->i_mode); in ovl_tmpfile()
1443 if (WARN_ON(inode != d_inode(dentry))) in ovl_tmpfile()
1448 err = finish_open(file, dentry, ovl_dummy_open); in ovl_tmpfile()
1456 ovl_drop_write(dentry); in ovl_tmpfile()