Lines Matching refs:dentry
18 void ovl_cleanup(struct inode *wdir, struct dentry *wdentry) in ovl_cleanup()
35 struct dentry *ovl_lookup_temp(struct dentry *workdir, struct dentry *dentry) in ovl_lookup_temp() argument
37 struct dentry *temp; in ovl_lookup_temp()
55 static struct dentry *ovl_whiteout(struct dentry *workdir, in ovl_whiteout()
56 struct dentry *dentry) in ovl_whiteout() argument
59 struct dentry *whiteout; in ovl_whiteout()
62 whiteout = ovl_lookup_temp(workdir, dentry); in ovl_whiteout()
75 int ovl_create_real(struct inode *dir, struct dentry *newdentry, in ovl_create_real()
77 struct dentry *hardlink, bool debug) in ovl_create_real()
122 static int ovl_set_opaque(struct dentry *upperdentry) in ovl_set_opaque()
127 static void ovl_remove_opaque(struct dentry *upperdentry) in ovl_remove_opaque()
138 static int ovl_dir_getattr(struct vfsmount *mnt, struct dentry *dentry, in ovl_dir_getattr() argument
145 type = ovl_path_real(dentry, &realpath); in ovl_dir_getattr()
150 stat->dev = dentry->d_sb->s_dev; in ovl_dir_getattr()
151 stat->ino = dentry->d_inode->i_ino; in ovl_dir_getattr()
164 static int ovl_create_upper(struct dentry *dentry, struct inode *inode, in ovl_create_upper() argument
166 struct dentry *hardlink) in ovl_create_upper()
168 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent); in ovl_create_upper()
170 struct dentry *newdentry; in ovl_create_upper()
174 newdentry = lookup_one_len(dentry->d_name.name, upperdir, in ovl_create_upper()
175 dentry->d_name.len); in ovl_create_upper()
183 ovl_dentry_version_inc(dentry->d_parent); in ovl_create_upper()
184 ovl_dentry_update(dentry, newdentry); in ovl_create_upper()
186 d_instantiate(dentry, inode); in ovl_create_upper()
195 static int ovl_lock_rename_workdir(struct dentry *workdir, in ovl_lock_rename_workdir()
196 struct dentry *upperdir) in ovl_lock_rename_workdir()
215 static struct dentry *ovl_clear_empty(struct dentry *dentry, in ovl_clear_empty() argument
218 struct dentry *workdir = ovl_workdir(dentry); in ovl_clear_empty()
220 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent); in ovl_clear_empty()
223 struct dentry *upper; in ovl_clear_empty()
224 struct dentry *opaquedir; in ovl_clear_empty()
235 ovl_path_upper(dentry, &upperpath); in ovl_clear_empty()
243 upper = upperpath.dentry; in ovl_clear_empty()
247 opaquedir = ovl_lookup_temp(workdir, dentry); in ovl_clear_empty()
279 d_drop(dentry); in ovl_clear_empty()
293 static struct dentry *ovl_check_empty_and_clear(struct dentry *dentry) in ovl_check_empty_and_clear() argument
296 struct dentry *ret = NULL; in ovl_check_empty_and_clear()
299 err = ovl_check_empty_dir(dentry, &list); in ovl_check_empty_and_clear()
310 if (ovl_dentry_upper(dentry)) in ovl_check_empty_and_clear()
311 ret = ovl_clear_empty(dentry, &list); in ovl_check_empty_and_clear()
319 static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode, in ovl_create_over_whiteout() argument
321 struct dentry *hardlink) in ovl_create_over_whiteout()
323 struct dentry *workdir = ovl_workdir(dentry); in ovl_create_over_whiteout()
325 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent); in ovl_create_over_whiteout()
327 struct dentry *upper; in ovl_create_over_whiteout()
328 struct dentry *newdentry; in ovl_create_over_whiteout()
338 newdentry = ovl_lookup_temp(workdir, dentry); in ovl_create_over_whiteout()
343 upper = lookup_one_len(dentry->d_name.name, upperdir, in ovl_create_over_whiteout()
344 dentry->d_name.len); in ovl_create_over_whiteout()
369 ovl_dentry_version_inc(dentry->d_parent); in ovl_create_over_whiteout()
370 ovl_dentry_update(dentry, newdentry); in ovl_create_over_whiteout()
372 d_instantiate(dentry, inode); in ovl_create_over_whiteout()
388 static int ovl_create_or_link(struct dentry *dentry, int mode, dev_t rdev, in ovl_create_or_link() argument
389 const char *link, struct dentry *hardlink) in ovl_create_or_link()
399 inode = ovl_new_inode(dentry->d_sb, mode, dentry->d_fsdata); in ovl_create_or_link()
403 err = ovl_copy_up(dentry->d_parent); in ovl_create_or_link()
407 if (!ovl_dentry_is_opaque(dentry)) { in ovl_create_or_link()
408 err = ovl_create_upper(dentry, inode, &stat, link, hardlink); in ovl_create_or_link()
413 old_cred = ovl_override_creds(dentry->d_sb); in ovl_create_or_link()
423 err = ovl_create_over_whiteout(dentry, inode, &stat, in ovl_create_or_link()
437 static int ovl_create_object(struct dentry *dentry, int mode, dev_t rdev, in ovl_create_object() argument
442 err = ovl_want_write(dentry); in ovl_create_object()
444 err = ovl_create_or_link(dentry, mode, rdev, link, NULL); in ovl_create_object()
445 ovl_drop_write(dentry); in ovl_create_object()
451 static int ovl_create(struct inode *dir, struct dentry *dentry, umode_t mode, in ovl_create() argument
454 return ovl_create_object(dentry, (mode & 07777) | S_IFREG, 0, NULL); in ovl_create()
457 static int ovl_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) in ovl_mkdir() argument
459 return ovl_create_object(dentry, (mode & 07777) | S_IFDIR, 0, NULL); in ovl_mkdir()
462 static int ovl_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, in ovl_mknod() argument
469 return ovl_create_object(dentry, mode, rdev, NULL); in ovl_mknod()
472 static int ovl_symlink(struct inode *dir, struct dentry *dentry, in ovl_symlink() argument
475 return ovl_create_object(dentry, S_IFLNK, 0, link); in ovl_symlink()
478 static int ovl_link(struct dentry *old, struct inode *newdir, in ovl_link()
479 struct dentry *new) in ovl_link()
482 struct dentry *upper; in ovl_link()
501 static int ovl_remove_and_whiteout(struct dentry *dentry, bool is_dir) in ovl_remove_and_whiteout() argument
503 struct dentry *workdir = ovl_workdir(dentry); in ovl_remove_and_whiteout()
505 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent); in ovl_remove_and_whiteout()
507 struct dentry *whiteout; in ovl_remove_and_whiteout()
508 struct dentry *upper; in ovl_remove_and_whiteout()
509 struct dentry *opaquedir = NULL; in ovl_remove_and_whiteout()
517 if (OVL_TYPE_MERGE_OR_LOWER(ovl_path_type(dentry))) { in ovl_remove_and_whiteout()
518 opaquedir = ovl_check_empty_and_clear(dentry); in ovl_remove_and_whiteout()
530 err = ovl_check_empty_dir(dentry, &list); in ovl_remove_and_whiteout()
541 upper = lookup_one_len(dentry->d_name.name, upperdir, in ovl_remove_and_whiteout()
542 dentry->d_name.len); in ovl_remove_and_whiteout()
549 (!opaquedir && ovl_dentry_upper(dentry) && in ovl_remove_and_whiteout()
550 upper != ovl_dentry_upper(dentry))) { in ovl_remove_and_whiteout()
554 whiteout = ovl_whiteout(workdir, dentry); in ovl_remove_and_whiteout()
568 ovl_dentry_version_inc(dentry->d_parent); in ovl_remove_and_whiteout()
570 d_drop(dentry); in ovl_remove_and_whiteout()
586 static int ovl_remove_upper(struct dentry *dentry, bool is_dir) in ovl_remove_upper() argument
588 struct dentry *upperdir = ovl_dentry_upper(dentry->d_parent); in ovl_remove_upper()
590 struct dentry *upper; in ovl_remove_upper()
594 upper = lookup_one_len(dentry->d_name.name, upperdir, in ovl_remove_upper()
595 dentry->d_name.len); in ovl_remove_upper()
601 if (upper == ovl_dentry_upper(dentry)) { in ovl_remove_upper()
606 ovl_dentry_version_inc(dentry->d_parent); in ovl_remove_upper()
617 d_drop(dentry); in ovl_remove_upper()
624 static inline int ovl_check_sticky(struct dentry *dentry) in ovl_check_sticky() argument
626 struct inode *dir = ovl_dentry_real(dentry->d_parent)->d_inode; in ovl_check_sticky()
627 struct inode *inode = ovl_dentry_real(dentry)->d_inode; in ovl_check_sticky()
635 static int ovl_do_remove(struct dentry *dentry, bool is_dir) in ovl_do_remove() argument
640 err = ovl_check_sticky(dentry); in ovl_do_remove()
644 err = ovl_want_write(dentry); in ovl_do_remove()
648 err = ovl_copy_up(dentry->d_parent); in ovl_do_remove()
652 type = ovl_path_type(dentry); in ovl_do_remove()
654 err = ovl_remove_upper(dentry, is_dir); in ovl_do_remove()
656 const struct cred *old_cred = ovl_override_creds(dentry->d_sb); in ovl_do_remove()
658 err = ovl_remove_and_whiteout(dentry, is_dir); in ovl_do_remove()
663 ovl_drop_write(dentry); in ovl_do_remove()
668 static int ovl_unlink(struct inode *dir, struct dentry *dentry) in ovl_unlink() argument
670 return ovl_do_remove(dentry, false); in ovl_unlink()
673 static int ovl_rmdir(struct inode *dir, struct dentry *dentry) in ovl_rmdir() argument
675 return ovl_do_remove(dentry, true); in ovl_rmdir()
678 static int ovl_rename2(struct inode *olddir, struct dentry *old, in ovl_rename2()
679 struct inode *newdir, struct dentry *new, in ovl_rename2()
685 struct dentry *old_upperdir; in ovl_rename2()
686 struct dentry *new_upperdir; in ovl_rename2()
687 struct dentry *olddentry; in ovl_rename2()
688 struct dentry *newdentry; in ovl_rename2()
689 struct dentry *trap; in ovl_rename2()
697 struct dentry *opaquedir = NULL; in ovl_rename2()