Lines Matching +full:no +full:- +full:temp +full:- +full:support
1 // SPDX-License-Identifier: GPL-2.0-only
58 if (err == -ENODATA || err == -EOPNOTSUPP) in ovl_copy_acl()
66 return -ENOMEM; in ovl_copy_acl()
77 struct dentry *old = oldpath->dentry; in ovl_copy_xattr()
83 if (!old->d_inode->i_op->listxattr || !new->d_inode->i_op->listxattr) in ovl_copy_xattr()
88 if (list_size == -EOPNOTSUPP) in ovl_copy_xattr()
95 return -ENOMEM; in ovl_copy_xattr()
108 error = -EIO; in ovl_copy_xattr()
111 list_size -= slen; in ovl_copy_xattr()
117 if (error == -ECANCELED) { in ovl_copy_xattr()
121 if (error < 0 && error != -EOPNOTSUPP) in ovl_copy_xattr()
134 if (size == -ERANGE) in ovl_copy_xattr()
147 error = -ENOMEM; in ovl_copy_xattr()
158 if (error != -EOPNOTSUPP || ovl_must_copy_xattr(name)) in ovl_copy_xattr()
180 /* Ntfs-3g returns -EINVAL for "no fileattr support" */ in ovl_copy_fileattr()
181 if (err == -ENOTTY || err == -EINVAL) in ovl_copy_fileattr()
184 old->dentry, err); in ovl_copy_fileattr()
189 * We cannot set immutable and append-only flags on upper inode, in ovl_copy_fileattr()
195 err = ovl_set_protattr(inode, new->dentry, &oldfa); in ovl_copy_fileattr()
196 if (err == -EPERM) in ovl_copy_fileattr()
197 pr_warn_once("copying fileattr: no xattr on upper\n"); in ovl_copy_fileattr()
209 * Returning an error if upper doesn't support fileattr will in ovl_copy_fileattr()
212 if (err == -ENOTTY || err == -EINVAL) { in ovl_copy_fileattr()
213 pr_warn_once("copying fileattr: no support on upper\n"); in ovl_copy_fileattr()
217 new->dentry, err); in ovl_copy_fileattr()
237 return -EIO; in ovl_verify_area()
239 return -EIO; in ovl_verify_area()
241 return -EIO; in ovl_verify_area()
269 loff_t data_pos = -1; in ovl_copy_up_file()
277 return -EIO; in ovl_copy_up_file()
296 if (old_file->f_mode & FMODE_LSEEK) in ovl_copy_up_file()
307 error = -EINTR; in ovl_copy_up_file()
313 * and meanwhile slow down the copy-up speed, so we do in ovl_copy_up_file()
314 * an optimization for hole during copy-up, it relies in ovl_copy_up_file()
316 * fs does not support it, copy-up will behave as before. in ovl_copy_up_file()
328 * - upper sb_writers in ovl_copy_up_file()
329 * -- lower ovl_inode_lock (ovl_llseek) in ovl_copy_up_file()
334 hole_len = data_pos - old_pos; in ovl_copy_up_file()
335 len -= hole_len; in ovl_copy_up_file()
338 } else if (data_pos == -ENXIO) { in ovl_copy_up_file()
358 len -= bytes; in ovl_copy_up_file()
373 .ia_size = stat->size, in ovl_set_size()
385 .ia_atime = stat->atime, in ovl_set_timestamps()
386 .ia_mtime = stat->mtime, in ovl_set_timestamps()
397 if (!S_ISLNK(stat->mode)) { in ovl_set_attr()
400 .ia_mode = stat->mode, in ovl_set_attr()
407 .ia_vfsuid = VFSUIDT_INIT(stat->uid), in ovl_set_attr()
408 .ia_vfsgid = VFSGIDT_INIT(stat->gid), in ovl_set_attr()
424 uuid_t *uuid = &realinode->i_sb->s_uuid; in ovl_encode_real_fh()
433 return ERR_PTR(-ENOMEM); in ovl_encode_real_fh()
436 * We encode a non-connectable file handle for non-dir, because we in ovl_encode_real_fh()
441 fh_type = exportfs_encode_inode_fh(realinode, (void *)fh->fb.fid, in ovl_encode_real_fh()
445 err = -EIO; in ovl_encode_real_fh()
450 fh->fb.version = OVL_FH_VERSION; in ovl_encode_real_fh()
451 fh->fb.magic = OVL_FH_MAGIC; in ovl_encode_real_fh()
452 fh->fb.type = fh_type; in ovl_encode_real_fh()
453 fh->fb.flags = OVL_FH_FLAG_CPU_ENDIAN; in ovl_encode_real_fh()
461 fh->fb.flags |= OVL_FH_FLAG_PATH_UPPER; in ovl_encode_real_fh()
462 fh->fb.len = sizeof(fh->fb) + buflen; in ovl_encode_real_fh()
464 fh->fb.uuid = *uuid; in ovl_encode_real_fh()
476 * When lower layer doesn't support export operations store a 'null' fh, in ovl_get_origin_fh()
480 if (!ovl_can_decode_fh(origin->d_sb)) in ovl_get_origin_fh()
492 * Do not fail when upper doesn't support xattrs. in ovl_set_origin_fh()
494 err = ovl_check_setxattr(ofs, upper, OVL_XATTR_ORIGIN, fh->buf, in ovl_set_origin_fh()
495 fh ? fh->fb.len : 0, 0); in ovl_set_origin_fh()
497 /* Ignore -EPERM from setting "user.*" on symlink/special */ in ovl_set_origin_fh()
498 return err == -EPERM ? 0 : err; in ovl_set_origin_fh()
512 err = ovl_setxattr(ofs, index, OVL_XATTR_UPPER, fh->buf, fh->fb.len); in ovl_set_upper_fh()
526 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_create_index()
527 struct dentry *indexdir = ovl_indexdir(dentry->d_sb); in ovl_create_index()
530 struct dentry *temp = NULL; in ovl_create_index() local
536 * because non-dir are copied up directly to index and then hardlinked in ovl_create_index()
539 * TODO: implement create index for non-dir, so we can call it when in ovl_create_index()
540 * encoding file handle for non-dir in case index does not exist. in ovl_create_index()
543 return -EIO; in ovl_create_index()
547 return -EIO; in ovl_create_index()
553 temp = ovl_create_temp(ofs, indexdir, OVL_CATTR(S_IFDIR | 0)); in ovl_create_index()
554 err = PTR_ERR(temp); in ovl_create_index()
555 if (IS_ERR(temp)) in ovl_create_index()
558 err = ovl_set_upper_fh(ofs, upper, temp); in ovl_create_index()
566 err = ovl_do_rename(ofs, dir, temp, dir, index, 0); in ovl_create_index()
571 ovl_cleanup(ofs, dir, temp); in ovl_create_index()
572 dput(temp); in ovl_create_index()
600 struct dentry *upperdir = ovl_dentry_upper(c->parent); in ovl_link_up()
601 struct ovl_fs *ofs = OVL_FS(c->dentry->d_sb); in ovl_link_up()
604 ovl_start_write(c->dentry); in ovl_link_up()
606 /* Mark parent "impure" because it may now contain non-pure upper */ in ovl_link_up()
607 err = ovl_set_impure(c->parent, upperdir); in ovl_link_up()
611 err = ovl_set_nlink_lower(c->dentry); in ovl_link_up()
616 upper = ovl_lookup_upper(ofs, c->dentry->d_name.name, upperdir, in ovl_link_up()
617 c->dentry->d_name.len); in ovl_link_up()
620 err = ovl_do_link(ofs, ovl_dentry_upper(c->dentry), udir, upper); in ovl_link_up()
624 ovl_set_timestamps(ofs, upperdir, &c->pstat); in ovl_link_up()
625 ovl_dentry_set_upper_alias(c->dentry); in ovl_link_up()
626 ovl_dentry_update_reval(c->dentry, upper); in ovl_link_up()
634 err = ovl_set_nlink_upper(c->dentry); in ovl_link_up()
637 ovl_end_write(c->dentry); in ovl_link_up()
641 static int ovl_copy_up_data(struct ovl_copy_up_ctx *c, const struct path *temp) in ovl_copy_up_data() argument
643 struct ovl_fs *ofs = OVL_FS(c->dentry->d_sb); in ovl_copy_up_data()
647 if (!S_ISREG(c->stat.mode) || c->metacopy || !c->stat.size) in ovl_copy_up_data()
650 new_file = ovl_path_open(temp, O_LARGEFILE | O_WRONLY); in ovl_copy_up_data()
654 err = ovl_copy_up_file(ofs, c->dentry, new_file, c->stat.size, in ovl_copy_up_data()
655 !c->metadata_fsync); in ovl_copy_up_data()
661 static int ovl_copy_up_metadata(struct ovl_copy_up_ctx *c, struct dentry *temp) in ovl_copy_up_metadata() argument
663 struct ovl_fs *ofs = OVL_FS(c->dentry->d_sb); in ovl_copy_up_metadata()
664 struct inode *inode = d_inode(c->dentry); in ovl_copy_up_metadata()
665 struct path upperpath = { .mnt = ovl_upper_mnt(ofs), .dentry = temp }; in ovl_copy_up_metadata()
668 err = ovl_copy_xattr(c->dentry->d_sb, &c->lowerpath, temp); in ovl_copy_up_metadata()
672 if (inode->i_flags & OVL_COPY_I_FLAGS_MASK && in ovl_copy_up_metadata()
673 (S_ISREG(c->stat.mode) || S_ISDIR(c->stat.mode))) { in ovl_copy_up_metadata()
678 err = ovl_copy_fileattr(inode, &c->lowerpath, &upperpath); in ovl_copy_up_metadata()
690 if (c->origin) { in ovl_copy_up_metadata()
691 err = ovl_set_origin_fh(ofs, c->origin_fh, temp); in ovl_copy_up_metadata()
696 if (c->metacopy) { in ovl_copy_up_metadata()
700 ovl_path_lowerdata(c->dentry, &lowerdatapath); in ovl_copy_up_metadata()
702 return -EIO; in ovl_copy_up_metadata()
708 c->metacopy_digest = true; in ovl_copy_up_metadata()
710 err = ovl_set_metacopy_xattr(ofs, temp, &metacopy_data); in ovl_copy_up_metadata()
715 inode_lock(temp->d_inode); in ovl_copy_up_metadata()
716 if (S_ISREG(c->stat.mode)) in ovl_copy_up_metadata()
717 err = ovl_set_size(ofs, temp, &c->stat); in ovl_copy_up_metadata()
719 err = ovl_set_attr(ofs, temp, &c->stat); in ovl_copy_up_metadata()
720 inode_unlock(temp->d_inode); in ovl_copy_up_metadata()
723 if (!err && ovl_should_sync(ofs) && c->metadata_fsync) in ovl_copy_up_metadata()
738 cc->old = cc->new = NULL; in ovl_prep_cu_creds()
739 err = security_inode_copy_up(dentry, &cc->new); in ovl_prep_cu_creds()
743 if (cc->new) in ovl_prep_cu_creds()
744 cc->old = override_creds(cc->new); in ovl_prep_cu_creds()
751 if (cc->new) { in ovl_revert_cu_creds()
752 revert_creds(cc->old); in ovl_revert_cu_creds()
753 put_cred(cc->new); in ovl_revert_cu_creds()
758 * Copyup using workdir to prepare temp file. Used when copying up directories,
759 * special files or when upper fs doesn't support O_TMPFILE.
763 struct ovl_fs *ofs = OVL_FS(c->dentry->d_sb); in ovl_copy_up_workdir()
765 struct inode *udir = d_inode(c->destdir), *wdir = d_inode(c->workdir); in ovl_copy_up_workdir()
767 struct dentry *temp, *upper, *trap; in ovl_copy_up_workdir() local
772 .mode = c->stat.mode & S_IFMT, in ovl_copy_up_workdir()
773 .rdev = c->stat.rdev, in ovl_copy_up_workdir()
774 .link = c->link in ovl_copy_up_workdir()
777 err = ovl_prep_cu_creds(c->dentry, &cc); in ovl_copy_up_workdir()
781 ovl_start_write(c->dentry); in ovl_copy_up_workdir()
783 temp = ovl_create_temp(ofs, c->workdir, &cattr); in ovl_copy_up_workdir()
785 ovl_end_write(c->dentry); in ovl_copy_up_workdir()
788 if (IS_ERR(temp)) in ovl_copy_up_workdir()
789 return PTR_ERR(temp); in ovl_copy_up_workdir()
795 path.dentry = temp; in ovl_copy_up_workdir()
801 * temp wasn't moved before copy up completion or cleanup. in ovl_copy_up_workdir()
803 ovl_start_write(c->dentry); in ovl_copy_up_workdir()
804 trap = lock_rename(c->workdir, c->destdir); in ovl_copy_up_workdir()
805 if (trap || temp->d_parent != c->workdir) { in ovl_copy_up_workdir()
806 /* temp or workdir moved underneath us? abort without cleanup */ in ovl_copy_up_workdir()
807 dput(temp); in ovl_copy_up_workdir()
808 err = -EIO; in ovl_copy_up_workdir()
816 err = ovl_copy_up_metadata(c, temp); in ovl_copy_up_workdir()
820 if (S_ISDIR(c->stat.mode) && c->indexed) { in ovl_copy_up_workdir()
821 err = ovl_create_index(c->dentry, c->origin_fh, temp); in ovl_copy_up_workdir()
826 upper = ovl_lookup_upper(ofs, c->destname.name, c->destdir, in ovl_copy_up_workdir()
827 c->destname.len); in ovl_copy_up_workdir()
832 err = ovl_do_rename(ofs, wdir, temp, udir, upper, 0); in ovl_copy_up_workdir()
837 inode = d_inode(c->dentry); in ovl_copy_up_workdir()
838 if (c->metacopy_digest) in ovl_copy_up_workdir()
844 if (!c->metacopy) in ovl_copy_up_workdir()
846 ovl_inode_update(inode, temp); in ovl_copy_up_workdir()
847 if (S_ISDIR(inode->i_mode)) in ovl_copy_up_workdir()
850 unlock_rename(c->workdir, c->destdir); in ovl_copy_up_workdir()
852 ovl_end_write(c->dentry); in ovl_copy_up_workdir()
857 ovl_cleanup(ofs, wdir, temp); in ovl_copy_up_workdir()
858 dput(temp); in ovl_copy_up_workdir()
865 struct ovl_fs *ofs = OVL_FS(c->dentry->d_sb); in ovl_copy_up_tmpfile()
866 struct inode *udir = d_inode(c->destdir); in ovl_copy_up_tmpfile()
867 struct dentry *temp, *upper; in ovl_copy_up_tmpfile() local
872 err = ovl_prep_cu_creds(c->dentry, &cc); in ovl_copy_up_tmpfile()
876 ovl_start_write(c->dentry); in ovl_copy_up_tmpfile()
877 tmpfile = ovl_do_tmpfile(ofs, c->workdir, c->stat.mode); in ovl_copy_up_tmpfile()
878 ovl_end_write(c->dentry); in ovl_copy_up_tmpfile()
883 temp = tmpfile->f_path.dentry; in ovl_copy_up_tmpfile()
884 if (!c->metacopy && c->stat.size) { in ovl_copy_up_tmpfile()
885 err = ovl_copy_up_file(ofs, c->dentry, tmpfile, c->stat.size, in ovl_copy_up_tmpfile()
886 !c->metadata_fsync); in ovl_copy_up_tmpfile()
891 ovl_start_write(c->dentry); in ovl_copy_up_tmpfile()
893 err = ovl_copy_up_metadata(c, temp); in ovl_copy_up_tmpfile()
899 upper = ovl_lookup_upper(ofs, c->destname.name, c->destdir, in ovl_copy_up_tmpfile()
900 c->destname.len); in ovl_copy_up_tmpfile()
903 err = ovl_do_link(ofs, temp, udir, upper); in ovl_copy_up_tmpfile()
911 if (c->metacopy_digest) in ovl_copy_up_tmpfile()
912 ovl_set_flag(OVL_HAS_DIGEST, d_inode(c->dentry)); in ovl_copy_up_tmpfile()
914 ovl_clear_flag(OVL_HAS_DIGEST, d_inode(c->dentry)); in ovl_copy_up_tmpfile()
915 ovl_clear_flag(OVL_VERIFIED_DIGEST, d_inode(c->dentry)); in ovl_copy_up_tmpfile()
917 if (!c->metacopy) in ovl_copy_up_tmpfile()
918 ovl_set_upperdata(d_inode(c->dentry)); in ovl_copy_up_tmpfile()
919 ovl_inode_update(d_inode(c->dentry), dget(temp)); in ovl_copy_up_tmpfile()
922 ovl_end_write(c->dentry); in ovl_copy_up_tmpfile()
940 struct ovl_fs *ofs = OVL_FS(c->dentry->d_sb); in ovl_do_copy_up()
941 struct dentry *origin = c->lowerpath.dentry; in ovl_do_copy_up()
946 * Indexed non-dir is copied up directly to the index entry and then in ovl_do_copy_up()
951 if (ovl_need_index(c->dentry)) { in ovl_do_copy_up()
952 c->indexed = true; in ovl_do_copy_up()
953 if (S_ISDIR(c->stat.mode)) in ovl_do_copy_up()
954 c->workdir = ovl_indexdir(c->dentry->d_sb); in ovl_do_copy_up()
959 if (S_ISDIR(c->stat.mode) || c->stat.nlink == 1 || to_index) { in ovl_do_copy_up()
965 c->origin_fh = fh; in ovl_do_copy_up()
966 c->origin = true; in ovl_do_copy_up()
970 c->destdir = ovl_indexdir(c->dentry->d_sb); in ovl_do_copy_up()
971 err = ovl_get_index_name(ofs, origin, &c->destname); in ovl_do_copy_up()
974 } else if (WARN_ON(!c->parent)) { in ovl_do_copy_up()
976 err = -EIO; in ovl_do_copy_up()
980 * c->dentry->d_name is stabilzed by ovl_copy_up_start(), in ovl_do_copy_up()
981 * because if we got here, it means that c->dentry has no upper in ovl_do_copy_up()
982 * alias and changing ->d_name means going through ovl_rename() in ovl_do_copy_up()
985 c->destname = c->dentry->d_name; in ovl_do_copy_up()
987 * Mark parent "impure" because it may now contain non-pure in ovl_do_copy_up()
990 ovl_start_write(c->dentry); in ovl_do_copy_up()
991 err = ovl_set_impure(c->parent, c->destdir); in ovl_do_copy_up()
992 ovl_end_write(c->dentry); in ovl_do_copy_up()
998 if (S_ISREG(c->stat.mode) && ofs->tmpfile) in ovl_do_copy_up()
1005 if (c->indexed) in ovl_do_copy_up()
1006 ovl_set_flag(OVL_INDEX, d_inode(c->dentry)); in ovl_do_copy_up()
1008 ovl_start_write(c->dentry); in ovl_do_copy_up()
1011 err = ovl_set_nlink_upper(c->dentry); in ovl_do_copy_up()
1013 struct inode *udir = d_inode(c->destdir); in ovl_do_copy_up()
1017 ovl_set_timestamps(ofs, c->destdir, &c->pstat); in ovl_do_copy_up()
1020 ovl_dentry_set_upper_alias(c->dentry); in ovl_do_copy_up()
1021 ovl_dentry_update_reval(c->dentry, ovl_dentry_upper(c->dentry)); in ovl_do_copy_up()
1023 ovl_end_write(c->dentry); in ovl_do_copy_up()
1027 kfree(c->destname.name); in ovl_do_copy_up()
1036 struct ovl_fs *ofs = OVL_FS(dentry->d_sb); in ovl_need_meta_copy_up()
1038 if (!ofs->config.metacopy) in ovl_need_meta_copy_up()
1047 /* Fall back to full copy if no fsverity on source data and we require verity */ in ovl_need_meta_copy_up()
1048 if (ofs->config.verity_mode == OVL_VERITY_REQUIRE) { in ovl_need_meta_copy_up()
1069 if (res == -ENODATA || res == -EOPNOTSUPP) in ovl_getxattr_value()
1075 return -ENOMEM; in ovl_getxattr_value()
1089 struct ovl_fs *ofs = OVL_FS(c->dentry->d_sb); in ovl_copy_up_meta_inode_data()
1095 ovl_path_upper(c->dentry, &upperpath); in ovl_copy_up_meta_inode_data()
1097 return -EIO; in ovl_copy_up_meta_inode_data()
1099 if (c->stat.size) { in ovl_copy_up_meta_inode_data()
1112 * don't want that to happen for normal copy-up operation. in ovl_copy_up_meta_inode_data()
1114 ovl_start_write(c->dentry); in ovl_copy_up_meta_inode_data()
1123 ovl_end_write(c->dentry); in ovl_copy_up_meta_inode_data()
1127 ovl_clear_flag(OVL_HAS_DIGEST, d_inode(c->dentry)); in ovl_copy_up_meta_inode_data()
1128 ovl_clear_flag(OVL_VERIFIED_DIGEST, d_inode(c->dentry)); in ovl_copy_up_meta_inode_data()
1129 ovl_set_upperdata(d_inode(c->dentry)); in ovl_copy_up_meta_inode_data()
1149 return -EROFS; in ovl_copy_up_one()
1159 return -EOVERFLOW; in ovl_copy_up_one()
1167 * that will hurt performance of workloads such as chown -R, so we in ovl_copy_up_one()
1170 ctx.metadata_fsync = !OVL_FS(dentry->d_sb)->config.metacopy && in ovl_copy_up_one()
1185 /* maybe truncate regular file. this has no effect on dirs */ in ovl_copy_up_one()
1196 /* err < 0: interrupted, err > 0: raced with another copy-up */ in ovl_copy_up_one()
1218 bool disconnected = (dentry->d_flags & DCACHE_DISCONNECTED); in ovl_copy_up_flags()
1221 * With NFS export, copy up can get called for a disconnected non-dir. in ovl_copy_up_flags()
1226 return -EIO; in ovl_copy_up_flags()
1237 old_cred = ovl_override_creds(dentry->d_sb); in ovl_copy_up_flags()
1273 if (special_file(d_inode(dentry)->i_mode)) in ovl_open_need_copy_up()