Lines Matching refs:dentry
27 static int ovl_set_redirect(struct dentry *dentry, bool samedir);
29 int ovl_cleanup(struct inode *wdir, struct dentry *wdentry) in ovl_cleanup()
48 static struct dentry *ovl_lookup_temp(struct dentry *workdir) in ovl_lookup_temp()
50 struct dentry *temp; in ovl_lookup_temp()
68 static struct dentry *ovl_whiteout(struct dentry *workdir) in ovl_whiteout()
71 struct dentry *whiteout; in ovl_whiteout()
88 int ovl_cleanup_and_whiteout(struct dentry *workdir, struct inode *dir, in ovl_cleanup_and_whiteout()
89 struct dentry *dentry) in ovl_cleanup_and_whiteout() argument
92 struct dentry *whiteout; in ovl_cleanup_and_whiteout()
101 if (d_is_dir(dentry)) in ovl_cleanup_and_whiteout()
104 err = ovl_do_rename(wdir, whiteout, dir, dentry, flags); in ovl_cleanup_and_whiteout()
108 ovl_cleanup(wdir, dentry); in ovl_cleanup_and_whiteout()
119 static int ovl_mkdir_real(struct inode *dir, struct dentry **newdentry, in ovl_mkdir_real()
123 struct dentry *d, *dentry = *newdentry; in ovl_mkdir_real() local
125 err = ovl_do_mkdir(dir, dentry, mode); in ovl_mkdir_real()
129 if (likely(!d_unhashed(dentry))) in ovl_mkdir_real()
137 d = lookup_one_len(dentry->d_name.name, dentry->d_parent, in ovl_mkdir_real()
138 dentry->d_name.len); in ovl_mkdir_real()
141 dentry, err); in ovl_mkdir_real()
144 dput(dentry); in ovl_mkdir_real()
150 struct dentry *ovl_create_real(struct inode *dir, struct dentry *newdentry, in ovl_create_real()
206 struct dentry *ovl_create_temp(struct dentry *workdir, struct ovl_cattr *attr) in ovl_create_temp()
212 static int ovl_set_opaque_xerr(struct dentry *dentry, struct dentry *upper, in ovl_set_opaque_xerr() argument
217 err = ovl_check_setxattr(dentry, upper, OVL_XATTR_OPAQUE, "y", 1, xerr); in ovl_set_opaque_xerr()
219 ovl_dentry_set_opaque(dentry); in ovl_set_opaque_xerr()
224 static int ovl_set_opaque(struct dentry *dentry, struct dentry *upperdentry) in ovl_set_opaque() argument
231 return ovl_set_opaque_xerr(dentry, upperdentry, -EIO); in ovl_set_opaque()
239 static int ovl_instantiate(struct dentry *dentry, struct inode *inode, in ovl_instantiate() argument
240 struct dentry *newdentry, bool hardlink) in ovl_instantiate()
247 ovl_dir_modified(dentry->d_parent, false); in ovl_instantiate()
248 ovl_dentry_set_upper_alias(dentry); in ovl_instantiate()
262 inode = ovl_get_inode(dentry->d_sb, &oip); in ovl_instantiate()
271 d_instantiate(dentry, inode); in ovl_instantiate()
274 dentry); in ovl_instantiate()
279 d_drop(dentry); in ovl_instantiate()
284 static bool ovl_type_merge(struct dentry *dentry) in ovl_type_merge() argument
286 return OVL_TYPE_MERGE(ovl_path_type(dentry)); in ovl_type_merge()
289 static bool ovl_type_origin(struct dentry *dentry) in ovl_type_origin() argument
291 return OVL_TYPE_ORIGIN(ovl_path_type(dentry)); in ovl_type_origin()
294 static int ovl_create_upper(struct dentry *dentry, struct inode *inode, in ovl_create_upper() argument
297 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent); in ovl_create_upper()
299 struct dentry *newdentry; in ovl_create_upper()
307 lookup_one_len(dentry->d_name.name, in ovl_create_upper()
309 dentry->d_name.len), in ovl_create_upper()
315 if (ovl_type_merge(dentry->d_parent) && d_is_dir(newdentry)) { in ovl_create_upper()
317 ovl_set_opaque(dentry, newdentry); in ovl_create_upper()
320 err = ovl_instantiate(dentry, inode, newdentry, !!attr->hardlink); in ovl_create_upper()
333 static struct dentry *ovl_clear_empty(struct dentry *dentry, in ovl_clear_empty() argument
336 struct dentry *workdir = ovl_workdir(dentry); in ovl_clear_empty()
338 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent); in ovl_clear_empty()
341 struct dentry *upper; in ovl_clear_empty()
342 struct dentry *opaquedir; in ovl_clear_empty()
353 ovl_path_upper(dentry, &upperpath); in ovl_clear_empty()
362 upper = upperpath.dentry; in ovl_clear_empty()
375 err = ovl_set_opaque(dentry, opaquedir); in ovl_clear_empty()
394 d_drop(dentry); in ovl_clear_empty()
407 static int ovl_set_upper_acl(struct dentry *upperdentry, const char *name, in ovl_set_upper_acl()
433 static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode, in ovl_create_over_whiteout() argument
436 struct dentry *workdir = ovl_workdir(dentry); in ovl_create_over_whiteout()
438 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent); in ovl_create_over_whiteout()
440 struct dentry *upper; in ovl_create_over_whiteout()
441 struct dentry *newdentry; in ovl_create_over_whiteout()
450 err = posix_acl_create(dentry->d_parent->d_inode, in ovl_create_over_whiteout()
460 upper = lookup_one_len(dentry->d_name.name, upperdir, in ovl_create_over_whiteout()
461 dentry->d_name.len); in ovl_create_over_whiteout()
500 err = ovl_set_opaque(dentry, newdentry); in ovl_create_over_whiteout()
515 err = ovl_instantiate(dentry, inode, newdentry, hardlink); in ovl_create_over_whiteout()
535 static int ovl_create_or_link(struct dentry *dentry, struct inode *inode, in ovl_create_or_link() argument
541 struct dentry *parent = dentry->d_parent; in ovl_create_or_link()
547 old_cred = ovl_override_creds(dentry->d_sb); in ovl_create_or_link()
565 err = security_dentry_create_files_as(dentry, in ovl_create_or_link()
566 attr->mode, &dentry->d_name, old_cred, in ovl_create_or_link()
576 if (!ovl_dentry_is_whiteout(dentry)) in ovl_create_or_link()
577 err = ovl_create_upper(dentry, inode, attr); in ovl_create_or_link()
579 err = ovl_create_over_whiteout(dentry, inode, attr); in ovl_create_or_link()
586 static int ovl_create_object(struct dentry *dentry, int mode, dev_t rdev, in ovl_create_object() argument
596 err = ovl_want_write(dentry); in ovl_create_object()
602 inode = ovl_new_inode(dentry->d_sb, mode, rdev); in ovl_create_object()
610 inode_init_owner(inode, dentry->d_parent->d_inode, mode); in ovl_create_object()
613 err = ovl_create_or_link(dentry, inode, &attr, false); in ovl_create_object()
615 if (inode != d_inode(dentry)) in ovl_create_object()
619 ovl_drop_write(dentry); in ovl_create_object()
624 static int ovl_create(struct inode *dir, struct dentry *dentry, umode_t mode, in ovl_create() argument
627 return ovl_create_object(dentry, (mode & 07777) | S_IFREG, 0, NULL); in ovl_create()
630 static int ovl_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) in ovl_mkdir() argument
632 return ovl_create_object(dentry, (mode & 07777) | S_IFDIR, 0, NULL); in ovl_mkdir()
635 static int ovl_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, in ovl_mknod() argument
642 return ovl_create_object(dentry, mode, rdev, NULL); in ovl_mknod()
645 static int ovl_symlink(struct inode *dir, struct dentry *dentry, in ovl_symlink() argument
648 return ovl_create_object(dentry, S_IFLNK, 0, link); in ovl_symlink()
651 static int ovl_link(struct dentry *old, struct inode *newdir, in ovl_link()
652 struct dentry *new) in ovl_link()
692 static bool ovl_matches_upper(struct dentry *dentry, struct dentry *upper) in ovl_matches_upper() argument
694 return d_inode(ovl_dentry_upper(dentry)) == d_inode(upper); in ovl_matches_upper()
697 static int ovl_remove_and_whiteout(struct dentry *dentry, in ovl_remove_and_whiteout() argument
700 struct dentry *workdir = ovl_workdir(dentry); in ovl_remove_and_whiteout()
701 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent); in ovl_remove_and_whiteout()
702 struct dentry *upper; in ovl_remove_and_whiteout()
703 struct dentry *opaquedir = NULL; in ovl_remove_and_whiteout()
710 opaquedir = ovl_clear_empty(dentry, list); in ovl_remove_and_whiteout()
720 upper = lookup_one_len(dentry->d_name.name, upperdir, in ovl_remove_and_whiteout()
721 dentry->d_name.len); in ovl_remove_and_whiteout()
728 (!opaquedir && ovl_dentry_upper(dentry) && in ovl_remove_and_whiteout()
729 !ovl_matches_upper(dentry, upper))) { in ovl_remove_and_whiteout()
737 ovl_dir_modified(dentry->d_parent, true); in ovl_remove_and_whiteout()
739 d_drop(dentry); in ovl_remove_and_whiteout()
750 static int ovl_remove_upper(struct dentry *dentry, bool is_dir, in ovl_remove_upper() argument
753 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent); in ovl_remove_upper()
755 struct dentry *upper; in ovl_remove_upper()
756 struct dentry *opaquedir = NULL; in ovl_remove_upper()
760 opaquedir = ovl_clear_empty(dentry, list); in ovl_remove_upper()
767 upper = lookup_one_len(dentry->d_name.name, upperdir, in ovl_remove_upper()
768 dentry->d_name.len); in ovl_remove_upper()
775 (!opaquedir && !ovl_matches_upper(dentry, upper))) in ovl_remove_upper()
782 ovl_dir_modified(dentry->d_parent, ovl_type_origin(dentry)); in ovl_remove_upper()
791 d_drop(dentry); in ovl_remove_upper()
801 static bool ovl_pure_upper(struct dentry *dentry) in ovl_pure_upper() argument
803 return !ovl_dentry_lower(dentry) && in ovl_pure_upper()
804 !ovl_test_flag(OVL_WHITEOUTS, d_inode(dentry)); in ovl_pure_upper()
807 static int ovl_do_remove(struct dentry *dentry, bool is_dir) in ovl_do_remove() argument
812 struct dentry *upperdentry; in ovl_do_remove()
813 bool lower_positive = ovl_lower_positive(dentry); in ovl_do_remove()
817 if (is_dir && (lower_positive || !ovl_pure_upper(dentry))) { in ovl_do_remove()
818 err = ovl_check_empty_dir(dentry, &list); in ovl_do_remove()
823 err = ovl_want_write(dentry); in ovl_do_remove()
827 err = ovl_copy_up(dentry->d_parent); in ovl_do_remove()
831 err = ovl_nlink_start(dentry, &locked); in ovl_do_remove()
835 old_cred = ovl_override_creds(dentry->d_sb); in ovl_do_remove()
837 err = ovl_remove_upper(dentry, is_dir, &list); in ovl_do_remove()
839 err = ovl_remove_and_whiteout(dentry, &list); in ovl_do_remove()
843 clear_nlink(dentry->d_inode); in ovl_do_remove()
845 drop_nlink(dentry->d_inode); in ovl_do_remove()
847 ovl_nlink_end(dentry, locked); in ovl_do_remove()
855 upperdentry = ovl_dentry_upper(dentry); in ovl_do_remove()
857 ovl_copyattr(d_inode(upperdentry), d_inode(dentry)); in ovl_do_remove()
860 ovl_drop_write(dentry); in ovl_do_remove()
866 static int ovl_unlink(struct inode *dir, struct dentry *dentry) in ovl_unlink() argument
868 return ovl_do_remove(dentry, false); in ovl_unlink()
871 static int ovl_rmdir(struct inode *dir, struct dentry *dentry) in ovl_rmdir() argument
873 return ovl_do_remove(dentry, true); in ovl_rmdir()
876 static bool ovl_type_merge_or_lower(struct dentry *dentry) in ovl_type_merge_or_lower() argument
878 enum ovl_path_type type = ovl_path_type(dentry); in ovl_type_merge_or_lower()
883 static bool ovl_can_move(struct dentry *dentry) in ovl_can_move() argument
885 return ovl_redirect_dir(dentry->d_sb) || in ovl_can_move()
886 !d_is_dir(dentry) || !ovl_type_merge_or_lower(dentry); in ovl_can_move()
889 static char *ovl_get_redirect(struct dentry *dentry, bool abs_redirect) in ovl_get_redirect() argument
892 struct dentry *d, *tmp; in ovl_get_redirect()
896 ret = kstrndup(dentry->d_name.name, dentry->d_name.len, in ovl_get_redirect()
907 for (d = dget(dentry); !IS_ROOT(d);) { in ovl_get_redirect()
949 static bool ovl_need_absolute_redirect(struct dentry *dentry, bool samedir) in ovl_need_absolute_redirect() argument
951 struct dentry *lowerdentry; in ovl_need_absolute_redirect()
956 if (d_is_dir(dentry)) in ovl_need_absolute_redirect()
972 lowerdentry = ovl_dentry_lower(dentry); in ovl_need_absolute_redirect()
976 static int ovl_set_redirect(struct dentry *dentry, bool samedir) in ovl_set_redirect() argument
979 const char *redirect = ovl_dentry_get_redirect(dentry); in ovl_set_redirect()
980 bool absolute_redirect = ovl_need_absolute_redirect(dentry, samedir); in ovl_set_redirect()
985 redirect = ovl_get_redirect(dentry, absolute_redirect); in ovl_set_redirect()
989 err = ovl_check_setxattr(dentry, ovl_dentry_upper(dentry), in ovl_set_redirect()
993 spin_lock(&dentry->d_lock); in ovl_set_redirect()
994 ovl_dentry_set_redirect(dentry, redirect); in ovl_set_redirect()
995 spin_unlock(&dentry->d_lock); in ovl_set_redirect()
1006 static int ovl_rename(struct inode *olddir, struct dentry *old, in ovl_rename()
1007 struct inode *newdir, struct dentry *new, in ovl_rename()
1012 struct dentry *old_upperdir; in ovl_rename()
1013 struct dentry *new_upperdir; in ovl_rename()
1014 struct dentry *olddentry; in ovl_rename()
1015 struct dentry *newdentry; in ovl_rename()
1016 struct dentry *trap; in ovl_rename()
1024 struct dentry *opaquedir = NULL; in ovl_rename()