Lines Matching refs:dentry
46 int ovl_copy_xattr(struct super_block *sb, struct dentry *old, in ovl_copy_xattr()
47 struct dentry *new) in ovl_copy_xattr()
232 static int ovl_set_size(struct dentry *upperdentry, struct kstat *stat) in ovl_set_size()
242 static int ovl_set_timestamps(struct dentry *upperdentry, struct kstat *stat) in ovl_set_timestamps()
254 int ovl_set_attr(struct dentry *upperdentry, struct kstat *stat) in ovl_set_attr()
279 struct ovl_fh *ovl_encode_real_fh(struct dentry *real, bool is_upper) in ovl_encode_real_fh()
332 int ovl_set_origin(struct dentry *dentry, struct dentry *lower, in ovl_set_origin() argument
333 struct dentry *upper) in ovl_set_origin()
352 err = ovl_check_setxattr(dentry, upper, OVL_XATTR_ORIGIN, fh->buf, in ovl_set_origin()
360 static int ovl_set_upper_fh(struct ovl_fs *ofs, struct dentry *upper, in ovl_set_upper_fh()
361 struct dentry *index) in ovl_set_upper_fh()
381 static int ovl_create_index(struct dentry *dentry, struct dentry *origin, in ovl_create_index() argument
382 struct dentry *upper) in ovl_create_index()
384 struct dentry *indexdir = ovl_indexdir(dentry->d_sb); in ovl_create_index()
386 struct dentry *index = NULL; in ovl_create_index()
387 struct dentry *temp = NULL; in ovl_create_index()
399 if (WARN_ON(!d_is_dir(dentry))) in ovl_create_index()
403 if (WARN_ON(ovl_test_flag(OVL_INDEX, d_inode(dentry)))) in ovl_create_index()
415 err = ovl_set_upper_fh(OVL_FS(dentry->d_sb), upper, temp); in ovl_create_index()
436 struct dentry *parent;
437 struct dentry *dentry; member
442 struct dentry *destdir;
444 struct dentry *workdir;
453 struct dentry *upper; in ovl_link_up()
454 struct dentry *upperdir = ovl_dentry_upper(c->parent); in ovl_link_up()
462 err = ovl_set_nlink_lower(c->dentry); in ovl_link_up()
467 upper = lookup_one_len(c->dentry->d_name.name, upperdir, in ovl_link_up()
468 c->dentry->d_name.len); in ovl_link_up()
471 err = ovl_do_link(ovl_dentry_upper(c->dentry), udir, upper); in ovl_link_up()
477 ovl_dentry_set_upper_alias(c->dentry); in ovl_link_up()
484 err = ovl_set_nlink_upper(c->dentry); in ovl_link_up()
489 static int ovl_copy_up_inode(struct ovl_copy_up_ctx *c, struct dentry *temp) in ovl_copy_up_inode()
491 struct ovl_fs *ofs = OVL_FS(c->dentry->d_sb); in ovl_copy_up_inode()
501 ovl_path_upper(c->dentry, &upperpath); in ovl_copy_up_inode()
502 if (WARN_ON(upperpath.dentry != NULL)) in ovl_copy_up_inode()
504 upperpath.dentry = temp; in ovl_copy_up_inode()
506 ovl_path_lowerdata(c->dentry, &datapath); in ovl_copy_up_inode()
513 err = ovl_copy_xattr(c->dentry->d_sb, c->lowerpath.dentry, temp); in ovl_copy_up_inode()
525 err = ovl_set_origin(c->dentry, c->lowerpath.dentry, temp); in ovl_copy_up_inode()
531 err = ovl_check_setxattr(c->dentry, temp, OVL_XATTR_METACOPY, in ovl_copy_up_inode()
552 static int ovl_prep_cu_creds(struct dentry *dentry, struct ovl_cu_creds *cc) in ovl_prep_cu_creds() argument
557 err = security_inode_copy_up(dentry, &cc->new); in ovl_prep_cu_creds()
583 struct dentry *temp, *upper; in ovl_copy_up_workdir()
598 err = ovl_prep_cu_creds(c->dentry, &cc); in ovl_copy_up_workdir()
614 err = ovl_create_index(c->dentry, c->lowerpath.dentry, temp); in ovl_copy_up_workdir()
630 ovl_set_upperdata(d_inode(c->dentry)); in ovl_copy_up_workdir()
631 inode = d_inode(c->dentry); in ovl_copy_up_workdir()
650 struct dentry *temp, *upper; in ovl_copy_up_tmpfile()
654 err = ovl_prep_cu_creds(c->dentry, &cc); in ovl_copy_up_tmpfile()
682 ovl_set_upperdata(d_inode(c->dentry)); in ovl_copy_up_tmpfile()
683 ovl_inode_update(d_inode(c->dentry), temp); in ovl_copy_up_tmpfile()
704 struct ovl_fs *ofs = c->dentry->d_sb->s_fs_info; in ovl_do_copy_up()
713 if (ovl_need_index(c->dentry)) { in ovl_do_copy_up()
716 c->workdir = ovl_indexdir(c->dentry->d_sb); in ovl_do_copy_up()
725 c->destdir = ovl_indexdir(c->dentry->d_sb); in ovl_do_copy_up()
726 err = ovl_get_index_name(c->lowerpath.dentry, &c->destname); in ovl_do_copy_up()
751 ovl_set_flag(OVL_INDEX, d_inode(c->dentry)); in ovl_do_copy_up()
755 err = ovl_set_nlink_upper(c->dentry); in ovl_do_copy_up()
764 ovl_dentry_set_upper_alias(c->dentry); in ovl_do_copy_up()
773 static bool ovl_need_meta_copy_up(struct dentry *dentry, umode_t mode, in ovl_need_meta_copy_up() argument
776 struct ovl_fs *ofs = dentry->d_sb->s_fs_info; in ovl_need_meta_copy_up()
790 static ssize_t ovl_getxattr(struct dentry *dentry, char *name, char **value) in ovl_getxattr() argument
795 res = vfs_getxattr(dentry, name, NULL, 0); in ovl_getxattr()
804 res = vfs_getxattr(dentry, name, buf, res); in ovl_getxattr()
816 struct ovl_fs *ofs = OVL_FS(c->dentry->d_sb); in ovl_copy_up_meta_inode_data()
822 ovl_path_upper(c->dentry, &upperpath); in ovl_copy_up_meta_inode_data()
823 if (WARN_ON(upperpath.dentry == NULL)) in ovl_copy_up_meta_inode_data()
826 ovl_path_lowerdata(c->dentry, &datapath); in ovl_copy_up_meta_inode_data()
827 if (WARN_ON(datapath.dentry == NULL)) in ovl_copy_up_meta_inode_data()
831 err = cap_size = ovl_getxattr(upperpath.dentry, XATTR_NAME_CAPS, in ovl_copy_up_meta_inode_data()
846 err = vfs_setxattr(upperpath.dentry, XATTR_NAME_CAPS, in ovl_copy_up_meta_inode_data()
853 err = ovl_do_removexattr(ofs, upperpath.dentry, OVL_XATTR_METACOPY); in ovl_copy_up_meta_inode_data()
857 ovl_set_upperdata(d_inode(c->dentry)); in ovl_copy_up_meta_inode_data()
864 static int ovl_copy_up_one(struct dentry *parent, struct dentry *dentry, in ovl_copy_up_one() argument
872 .dentry = dentry, in ovl_copy_up_one()
873 .workdir = ovl_workdir(dentry), in ovl_copy_up_one()
879 ovl_path_lower(dentry, &ctx.lowerpath); in ovl_copy_up_one()
885 ctx.metacopy = ovl_need_meta_copy_up(dentry, ctx.stat.mode, flags); in ovl_copy_up_one()
889 ctx.destdir = parentpath.dentry; in ovl_copy_up_one()
890 ctx.destname = dentry->d_name; in ovl_copy_up_one()
904 ctx.link = vfs_get_link(ctx.lowerpath.dentry, &done); in ovl_copy_up_one()
909 err = ovl_copy_up_start(dentry, flags); in ovl_copy_up_one()
915 if (!ovl_dentry_upper(dentry)) in ovl_copy_up_one()
917 if (!err && parent && !ovl_dentry_has_upper_alias(dentry)) in ovl_copy_up_one()
919 if (!err && ovl_dentry_needs_data_copy_up_locked(dentry, flags)) in ovl_copy_up_one()
921 ovl_copy_up_end(dentry); in ovl_copy_up_one()
928 static int ovl_copy_up_flags(struct dentry *dentry, int flags) in ovl_copy_up_flags() argument
932 bool disconnected = (dentry->d_flags & DCACHE_DISCONNECTED); in ovl_copy_up_flags()
939 if (WARN_ON(disconnected && d_is_dir(dentry))) in ovl_copy_up_flags()
942 old_cred = ovl_override_creds(dentry->d_sb); in ovl_copy_up_flags()
944 struct dentry *next; in ovl_copy_up_flags()
945 struct dentry *parent = NULL; in ovl_copy_up_flags()
947 if (ovl_already_copied_up(dentry, flags)) in ovl_copy_up_flags()
950 next = dget(dentry); in ovl_copy_up_flags()
967 ovl_revert_creds(dentry->d_sb, old_cred); in ovl_copy_up_flags()
972 static bool ovl_open_need_copy_up(struct dentry *dentry, int flags) in ovl_open_need_copy_up() argument
975 if (ovl_already_copied_up(dentry, flags)) in ovl_open_need_copy_up()
978 if (special_file(d_inode(dentry)->i_mode)) in ovl_open_need_copy_up()
987 int ovl_maybe_copy_up(struct dentry *dentry, int flags) in ovl_maybe_copy_up() argument
991 if (ovl_open_need_copy_up(dentry, flags)) { in ovl_maybe_copy_up()
992 err = ovl_want_write(dentry); in ovl_maybe_copy_up()
994 err = ovl_copy_up_flags(dentry, flags); in ovl_maybe_copy_up()
995 ovl_drop_write(dentry); in ovl_maybe_copy_up()
1002 int ovl_copy_up_with_data(struct dentry *dentry) in ovl_copy_up_with_data() argument
1004 return ovl_copy_up_flags(dentry, O_WRONLY); in ovl_copy_up_with_data()
1007 int ovl_copy_up(struct dentry *dentry) in ovl_copy_up() argument
1009 return ovl_copy_up_flags(dentry, 0); in ovl_copy_up()