Lines Matching refs:dentry

24 static int ovl_set_redirect(struct dentry *dentry, bool samedir);
26 int ovl_cleanup(struct inode *wdir, struct dentry *wdentry)
45 struct dentry *ovl_lookup_temp(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(wdir, whiteout, dir, dentry, flags);
129 ovl_cleanup(wdir, dentry);
140 int ovl_mkdir_real(struct inode *dir, struct dentry **newdentry, umode_t mode)
143 struct dentry *d, *dentry = *newdentry;
145 err = ovl_do_mkdir(dir, dentry, mode);
149 if (likely(!d_unhashed(dentry)))
153 * vfs_mkdir() may succeed and leave the dentry passed
155 * lookup a new hashed and positive dentry.
157 d = lookup_one_len(dentry->d_name.name, dentry->d_parent,
158 dentry->d_name.len);
161 dentry, err);
164 dput(dentry);
170 struct dentry *ovl_create_real(struct inode *dir, struct dentry *newdentry,
213 * Not quite sure if non-instantiated dentry is legal or not.
226 struct dentry *ovl_create_temp(struct dentry *workdir, struct ovl_cattr *attr)
232 static int ovl_set_opaque_xerr(struct dentry *dentry, struct dentry *upper,
237 err = ovl_check_setxattr(dentry, upper, OVL_XATTR_OPAQUE, "y", 1, xerr);
239 ovl_dentry_set_opaque(dentry);
244 static int ovl_set_opaque(struct dentry *dentry, struct dentry *upperdentry)
251 return ovl_set_opaque_xerr(dentry, upperdentry, -EIO);
257 * may not use to instantiate the new dentry.
259 static int ovl_instantiate(struct dentry *dentry, struct inode *inode,
260 struct dentry *newdentry, bool hardlink)
267 ovl_dir_modified(dentry->d_parent, false);
268 ovl_dentry_set_upper_alias(dentry);
269 ovl_dentry_init_reval(dentry, newdentry);
277 * to instantiate the new dentry.
284 inode = ovl_get_inode(dentry->d_sb, &oip);
295 d_instantiate(dentry, inode);
298 dentry);
303 d_drop(dentry);
308 static bool ovl_type_merge(struct dentry *dentry)
310 return OVL_TYPE_MERGE(ovl_path_type(dentry));
313 static bool ovl_type_origin(struct dentry *dentry)
315 return OVL_TYPE_ORIGIN(ovl_path_type(dentry));
318 static int ovl_create_upper(struct dentry *dentry, struct inode *inode,
321 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
323 struct dentry *newdentry;
331 lookup_one_len(dentry->d_name.name,
333 dentry->d_name.len),
339 if (ovl_type_merge(dentry->d_parent) && d_is_dir(newdentry)) {
341 ovl_set_opaque(dentry, newdentry);
344 err = ovl_instantiate(dentry, inode, newdentry, !!attr->hardlink);
357 static struct dentry *ovl_clear_empty(struct dentry *dentry,
360 struct dentry *workdir = ovl_workdir(dentry);
362 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
365 struct dentry *upper;
366 struct dentry *opaquedir;
377 ovl_path_upper(dentry, &upperpath);
386 upper = upperpath.dentry;
395 err = ovl_copy_xattr(dentry->d_sb, upper, opaquedir);
399 err = ovl_set_opaque(dentry, opaquedir);
417 /* dentry's upper doesn't match now, get rid of it */
418 d_drop(dentry);
431 static int ovl_set_upper_acl(struct dentry *upperdentry, const char *name,
456 static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode,
459 struct dentry *workdir = ovl_workdir(dentry);
461 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
463 struct dentry *upper;
464 struct dentry *newdentry;
473 err = posix_acl_create(dentry->d_parent->d_inode,
483 upper = lookup_one_len(dentry->d_name.name, upperdir,
484 dentry->d_name.len);
527 err = ovl_set_opaque(dentry, newdentry);
542 err = ovl_instantiate(dentry, inode, newdentry, hardlink);
564 static int ovl_create_or_link(struct dentry *dentry, struct inode *inode,
570 struct dentry *parent = dentry->d_parent;
576 old_cred = ovl_override_creds(dentry->d_sb);
608 err = security_dentry_create_files_as(dentry,
609 attr->mode, &dentry->d_name, old_cred,
619 if (!ovl_dentry_is_whiteout(dentry))
620 err = ovl_create_upper(dentry, inode, attr);
622 err = ovl_create_over_whiteout(dentry, inode, attr);
629 static int ovl_create_object(struct dentry *dentry, int mode, dev_t rdev,
639 err = ovl_want_write(dentry);
645 inode = ovl_new_inode(dentry->d_sb, mode, rdev);
653 inode_init_owner(inode, dentry->d_parent->d_inode, mode);
656 err = ovl_create_or_link(dentry, inode, &attr, false);
658 if (inode != d_inode(dentry))
662 ovl_drop_write(dentry);
667 static int ovl_create(struct inode *dir, struct dentry *dentry, umode_t mode,
670 return ovl_create_object(dentry, (mode & 07777) | S_IFREG, 0, NULL);
673 static int ovl_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
675 return ovl_create_object(dentry, (mode & 07777) | S_IFDIR, 0, NULL);
678 static int ovl_mknod(struct inode *dir, struct dentry *dentry, umode_t mode,
685 return ovl_create_object(dentry, mode, rdev, NULL);
688 static int ovl_symlink(struct inode *dir, struct dentry *dentry,
691 return ovl_create_object(dentry, S_IFLNK, 0, link);
694 static int ovl_set_link_redirect(struct dentry *dentry)
699 old_cred = ovl_override_creds(dentry->d_sb);
700 err = ovl_set_redirect(dentry, false);
706 static int ovl_link(struct dentry *old, struct inode *newdir,
707 struct dentry *new)
750 static bool ovl_matches_upper(struct dentry *dentry, struct dentry *upper)
752 return d_inode(ovl_dentry_upper(dentry)) == d_inode(upper);
755 static int ovl_remove_and_whiteout(struct dentry *dentry,
758 struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
759 struct dentry *workdir = ovl_workdir(dentry);
760 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
761 struct dentry *upper;
762 struct dentry *opaquedir = NULL;
769 opaquedir = ovl_clear_empty(dentry, list);
779 upper = lookup_one_len(dentry->d_name.name, upperdir,
780 dentry->d_name.len);
787 (!opaquedir && ovl_dentry_upper(dentry) &&
788 !ovl_matches_upper(dentry, upper))) {
796 ovl_dir_modified(dentry->d_parent, true);
798 d_drop(dentry);
809 static int ovl_remove_upper(struct dentry *dentry, bool is_dir,
812 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent);
814 struct dentry *upper;
815 struct dentry *opaquedir = NULL;
819 opaquedir = ovl_clear_empty(dentry, list);
826 upper = lookup_one_len(dentry->d_name.name, upperdir,
827 dentry->d_name.len);
834 (!opaquedir && !ovl_matches_upper(dentry, upper)))
841 ovl_dir_modified(dentry->d_parent, ovl_type_origin(dentry));
844 * Keeping this dentry hashed would mean having to release
846 * sole user of this dentry. Too tricky... Just unhash for
850 d_drop(dentry);
860 static bool ovl_pure_upper(struct dentry *dentry)
862 return !ovl_dentry_lower(dentry) &&
863 !ovl_test_flag(OVL_WHITEOUTS, d_inode(dentry));
866 static void ovl_drop_nlink(struct dentry *dentry)
868 struct inode *inode = d_inode(dentry);
869 struct dentry *alias;
874 if (alias != dentry && !d_unhashed(alias))
888 static int ovl_do_remove(struct dentry *dentry, bool is_dir)
892 struct dentry *upperdentry;
893 bool lower_positive = ovl_lower_positive(dentry);
897 if (is_dir && (lower_positive || !ovl_pure_upper(dentry))) {
898 err = ovl_check_empty_dir(dentry, &list);
903 err = ovl_want_write(dentry);
907 err = ovl_copy_up(dentry->d_parent);
911 err = ovl_nlink_start(dentry);
915 old_cred = ovl_override_creds(dentry->d_sb);
917 err = ovl_remove_upper(dentry, is_dir, &list);
919 err = ovl_remove_and_whiteout(dentry, &list);
923 clear_nlink(dentry->d_inode);
925 ovl_drop_nlink(dentry);
927 ovl_nlink_end(dentry);
935 upperdentry = ovl_dentry_upper(dentry);
937 ovl_copyattr(d_inode(upperdentry), d_inode(dentry));
940 ovl_drop_write(dentry);
946 static int ovl_unlink(struct inode *dir, struct dentry *dentry)
948 return ovl_do_remove(dentry, false);
951 static int ovl_rmdir(struct inode *dir, struct dentry *dentry)
953 return ovl_do_remove(dentry, true);
956 static bool ovl_type_merge_or_lower(struct dentry *dentry)
958 enum ovl_path_type type = ovl_path_type(dentry);
963 static bool ovl_can_move(struct dentry *dentry)
965 return ovl_redirect_dir(dentry->d_sb) ||
966 !d_is_dir(dentry) || !ovl_type_merge_or_lower(dentry);
969 static char *ovl_get_redirect(struct dentry *dentry, bool abs_redirect)
972 struct dentry *d, *tmp;
976 ret = kstrndup(dentry->d_name.name, dentry->d_name.len,
987 for (d = dget(dentry); !IS_ROOT(d);) {
1029 static bool ovl_need_absolute_redirect(struct dentry *dentry, bool samedir)
1031 struct dentry *lowerdentry;
1036 if (d_is_dir(dentry))
1052 lowerdentry = ovl_dentry_lower(dentry);
1056 static int ovl_set_redirect(struct dentry *dentry, bool samedir)
1059 const char *redirect = ovl_dentry_get_redirect(dentry);
1060 bool absolute_redirect = ovl_need_absolute_redirect(dentry, samedir);
1065 redirect = ovl_get_redirect(dentry, absolute_redirect);
1069 err = ovl_check_setxattr(dentry, ovl_dentry_upper(dentry),
1073 spin_lock(&dentry->d_lock);
1074 ovl_dentry_set_redirect(dentry, redirect);
1075 spin_unlock(&dentry->d_lock);
1086 static int ovl_rename(struct inode *olddir, struct dentry *old,
1087 struct inode *newdir, struct dentry *new,
1091 struct dentry *old_upperdir;
1092 struct dentry *new_upperdir;
1093 struct dentry *olddentry;
1094 struct dentry *newdentry;
1095 struct dentry *trap;
1104 struct dentry *opaquedir = NULL;