Lines Matching refs:dentry

24 static int ovl_set_redirect(struct dentry *dentry, bool samedir);
26 int ovl_cleanup(struct ovl_fs *ofs, struct inode *wdir, struct dentry *wdentry)
45 struct dentry *ovl_lookup_temp(struct ovl_fs *ofs, struct dentry *workdir)
47 struct dentry *temp;
65 static struct dentry *ovl_whiteout(struct ovl_fs *ofs)
68 struct dentry *whiteout;
69 struct dentry *workdir = ofs->workdir;
110 struct dentry *dentry)
113 struct dentry *whiteout;
122 if (d_is_dir(dentry))
125 err = ovl_do_rename(ofs, wdir, whiteout, dir, dentry, flags);
129 ovl_cleanup(ofs, wdir, dentry);
141 struct dentry **newdentry, umode_t mode)
144 struct dentry *d, *dentry = *newdentry;
146 err = ovl_do_mkdir(ofs, dir, dentry, mode);
150 if (likely(!d_unhashed(dentry)))
154 * vfs_mkdir() may succeed and leave the dentry passed
156 * lookup a new hashed and positive dentry.
158 d = ovl_lookup_upper(ofs, dentry->d_name.name, dentry->d_parent,
159 dentry->d_name.len);
162 dentry, err);
165 dput(dentry);
171 struct dentry *ovl_create_real(struct ovl_fs *ofs, struct inode *dir,
172 struct dentry *newdentry, struct ovl_cattr *attr)
214 * Not quite sure if non-instantiated dentry is legal or not.
227 struct dentry *ovl_create_temp(struct ovl_fs *ofs, struct dentry *workdir,
234 static int ovl_set_opaque_xerr(struct dentry *dentry, struct dentry *upper,
237 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
242 ovl_dentry_set_opaque(dentry);
247 static int ovl_set_opaque(struct dentry *dentry, struct dentry *upperdentry)
254 return ovl_set_opaque_xerr(dentry, upperdentry, -EIO);
260 * may not use to instantiate the new dentry.
262 static int ovl_instantiate(struct dentry *dentry, struct inode *inode,
263 struct dentry *newdentry, bool hardlink)
270 ovl_dir_modified(dentry->d_parent, false);
271 ovl_dentry_set_upper_alias(dentry);
272 ovl_dentry_init_reval(dentry, newdentry, NULL);
280 * to instantiate the new dentry.
287 inode = ovl_get_inode(dentry->d_sb, &oip);
298 d_instantiate(dentry, inode);
301 dentry);
306 d_drop(dentry);
311 static bool ovl_type_merge(struct dentry *dentry)
313 return OVL_TYPE_MERGE(ovl_path_type(dentry));
316 static bool ovl_type_origin(struct dentry *dentry)
318 return OVL_TYPE_ORIGIN(ovl_path_type(dentry));
321 static int ovl_create_upper(struct dentry *dentry, struct inode *inode,
324 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
325 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
327 struct dentry *newdentry;
335 ovl_lookup_upper(ofs, dentry->d_name.name,
336 upperdir, dentry->d_name.len),
342 if (ovl_type_merge(dentry->d_parent) && d_is_dir(newdentry) &&
345 ovl_set_opaque(dentry, newdentry);
348 err = ovl_instantiate(dentry, inode, newdentry, !!attr->hardlink);
361 static struct dentry *ovl_clear_empty(struct dentry *dentry,
364 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
365 struct dentry *workdir = ovl_workdir(dentry);
367 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
370 struct dentry *upper;
371 struct dentry *opaquedir;
382 ovl_path_upper(dentry, &upperpath);
391 upper = upperpath.dentry;
400 err = ovl_copy_xattr(dentry->d_sb, &upperpath, opaquedir);
404 err = ovl_set_opaque(dentry, opaquedir);
422 /* dentry's upper doesn't match now, get rid of it */
423 d_drop(dentry);
436 static int ovl_set_upper_acl(struct ovl_fs *ofs, struct dentry *upperdentry,
445 static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode,
448 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
449 struct dentry *workdir = ovl_workdir(dentry);
451 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
453 struct dentry *upper;
454 struct dentry *newdentry;
463 err = posix_acl_create(dentry->d_parent->d_inode,
473 upper = ovl_lookup_upper(ofs, dentry->d_name.name, upperdir,
474 dentry->d_name.len);
517 err = ovl_set_opaque(dentry, newdentry);
532 err = ovl_instantiate(dentry, inode, newdentry, hardlink);
554 static int ovl_create_or_link(struct dentry *dentry, struct inode *inode,
560 struct dentry *parent = dentry->d_parent;
566 old_cred = ovl_override_creds(dentry->d_sb);
598 err = security_dentry_create_files_as(dentry,
599 attr->mode, &dentry->d_name, old_cred,
609 if (!ovl_dentry_is_whiteout(dentry))
610 err = ovl_create_upper(dentry, inode, attr);
612 err = ovl_create_over_whiteout(dentry, inode, attr);
619 static int ovl_create_object(struct dentry *dentry, int mode, dev_t rdev,
629 err = ovl_want_write(dentry);
635 inode = ovl_new_inode(dentry->d_sb, mode, rdev);
643 inode_init_owner(&nop_mnt_idmap, inode, dentry->d_parent->d_inode, mode);
646 err = ovl_create_or_link(dentry, inode, &attr, false);
648 if (inode != d_inode(dentry))
652 ovl_drop_write(dentry);
658 struct dentry *dentry, umode_t mode, bool excl)
660 return ovl_create_object(dentry, (mode & 07777) | S_IFREG, 0, NULL);
664 struct dentry *dentry, umode_t mode)
666 return ovl_create_object(dentry, (mode & 07777) | S_IFDIR, 0, NULL);
670 struct dentry *dentry, umode_t mode, dev_t rdev)
676 return ovl_create_object(dentry, mode, rdev, NULL);
680 struct dentry *dentry, const char *link)
682 return ovl_create_object(dentry, S_IFLNK, 0, link);
685 static int ovl_set_link_redirect(struct dentry *dentry)
690 old_cred = ovl_override_creds(dentry->d_sb);
691 err = ovl_set_redirect(dentry, false);
697 static int ovl_link(struct dentry *old, struct inode *newdir,
698 struct dentry *new)
741 static bool ovl_matches_upper(struct dentry *dentry, struct dentry *upper)
743 return d_inode(ovl_dentry_upper(dentry)) == d_inode(upper);
746 static int ovl_remove_and_whiteout(struct dentry *dentry,
749 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
750 struct dentry *workdir = ovl_workdir(dentry);
751 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
752 struct dentry *upper;
753 struct dentry *opaquedir = NULL;
760 opaquedir = ovl_clear_empty(dentry, list);
770 upper = ovl_lookup_upper(ofs, dentry->d_name.name, upperdir,
771 dentry->d_name.len);
778 (!opaquedir && ovl_dentry_upper(dentry) &&
779 !ovl_matches_upper(dentry, upper))) {
787 ovl_dir_modified(dentry->d_parent, true);
789 d_drop(dentry);
800 static int ovl_remove_upper(struct dentry *dentry, bool is_dir,
803 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
804 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
806 struct dentry *upper;
807 struct dentry *opaquedir = NULL;
811 opaquedir = ovl_clear_empty(dentry, list);
818 upper = ovl_lookup_upper(ofs, dentry->d_name.name, upperdir,
819 dentry->d_name.len);
826 (!opaquedir && !ovl_matches_upper(dentry, upper)))
833 ovl_dir_modified(dentry->d_parent, ovl_type_origin(dentry));
836 * Keeping this dentry hashed would mean having to release
838 * sole user of this dentry. Too tricky... Just unhash for
842 d_drop(dentry);
852 static bool ovl_pure_upper(struct dentry *dentry)
854 return !ovl_dentry_lower(dentry) &&
855 !ovl_test_flag(OVL_WHITEOUTS, d_inode(dentry));
858 static void ovl_drop_nlink(struct dentry *dentry)
860 struct inode *inode = d_inode(dentry);
861 struct dentry *alias;
866 if (alias != dentry && !d_unhashed(alias))
880 static int ovl_do_remove(struct dentry *dentry, bool is_dir)
884 bool lower_positive = ovl_lower_positive(dentry);
888 if (is_dir && (lower_positive || !ovl_pure_upper(dentry))) {
889 err = ovl_check_empty_dir(dentry, &list);
894 err = ovl_want_write(dentry);
898 err = ovl_copy_up(dentry->d_parent);
902 err = ovl_nlink_start(dentry);
906 old_cred = ovl_override_creds(dentry->d_sb);
908 err = ovl_remove_upper(dentry, is_dir, &list);
910 err = ovl_remove_and_whiteout(dentry, &list);
914 clear_nlink(dentry->d_inode);
916 ovl_drop_nlink(dentry);
918 ovl_nlink_end(dentry);
926 if (ovl_dentry_upper(dentry))
927 ovl_copyattr(d_inode(dentry));
930 ovl_drop_write(dentry);
936 static int ovl_unlink(struct inode *dir, struct dentry *dentry)
938 return ovl_do_remove(dentry, false);
941 static int ovl_rmdir(struct inode *dir, struct dentry *dentry)
943 return ovl_do_remove(dentry, true);
946 static bool ovl_type_merge_or_lower(struct dentry *dentry)
948 enum ovl_path_type type = ovl_path_type(dentry);
953 static bool ovl_can_move(struct dentry *dentry)
955 return ovl_redirect_dir(OVL_FS(dentry->d_sb)) ||
956 !d_is_dir(dentry) || !ovl_type_merge_or_lower(dentry);
959 static char *ovl_get_redirect(struct dentry *dentry, bool abs_redirect)
962 struct dentry *d, *tmp;
966 ret = kstrndup(dentry->d_name.name, dentry->d_name.len,
977 for (d = dget(dentry); !IS_ROOT(d);) {
1019 static bool ovl_need_absolute_redirect(struct dentry *dentry, bool samedir)
1021 struct dentry *lowerdentry;
1026 if (d_is_dir(dentry))
1042 lowerdentry = ovl_dentry_lower(dentry);
1046 static int ovl_set_redirect(struct dentry *dentry, bool samedir)
1049 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
1050 const char *redirect = ovl_dentry_get_redirect(dentry);
1051 bool absolute_redirect = ovl_need_absolute_redirect(dentry, samedir);
1056 redirect = ovl_get_redirect(dentry, absolute_redirect);
1060 err = ovl_check_setxattr(ofs, ovl_dentry_upper(dentry),
1064 spin_lock(&dentry->d_lock);
1065 ovl_dentry_set_redirect(dentry, redirect);
1066 spin_unlock(&dentry->d_lock);
1078 struct dentry *old, struct inode *newdir,
1079 struct dentry *new, unsigned int flags)
1082 struct dentry *old_upperdir;
1083 struct dentry *new_upperdir;
1084 struct dentry *olddentry;
1085 struct dentry *newdentry;
1086 struct dentry *trap;
1095 struct dentry *opaquedir = NULL;