Lines Matching +full:lower +full:- +full:case

1 // SPDX-License-Identifier: GPL-2.0-only
33 struct dentry *upper, *lower; in ovl_d_real() local
37 case D_REAL_DATA: in ovl_d_real()
38 case D_REAL_METADATA: in ovl_d_real()
55 lower = ovl_dentry_lower(dentry); in ovl_d_real()
60 * Best effort lazy lookup of lowerdata for D_REAL_DATA case to return in ovl_d_real()
70 lower = ovl_dentry_lowerdata(dentry); in ovl_d_real()
71 if (!lower) in ovl_d_real()
75 /* Handle recursion into stacked lower fs */ in ovl_d_real()
76 return d_real(lower, type); in ovl_d_real()
91 if (d->d_flags & DCACHE_OP_WEAK_REVALIDATE) in ovl_revalidate_real()
92 ret = d->d_op->d_weak_revalidate(d, flags); in ovl_revalidate_real()
93 } else if (d->d_flags & DCACHE_OP_REVALIDATE) { in ovl_revalidate_real()
99 parent = READ_ONCE(d->d_parent); in ovl_revalidate_real()
102 return -ECHILD; in ovl_revalidate_real()
108 ret = d->d_op->d_revalidate(dir, &n.name, d, flags); in ovl_revalidate_real()
115 ret = -ESTALE; in ovl_revalidate_real()
133 return -ECHILD; in ovl_dentry_revalidate_common()
173 oi->cache = NULL; in ovl_alloc_inode()
174 oi->redirect = NULL; in ovl_alloc_inode()
175 oi->version = 0; in ovl_alloc_inode()
176 oi->flags = 0; in ovl_alloc_inode()
177 oi->__upperdentry = NULL; in ovl_alloc_inode()
178 oi->lowerdata_redirect = NULL; in ovl_alloc_inode()
179 oi->oe = NULL; in ovl_alloc_inode()
180 mutex_init(&oi->lock); in ovl_alloc_inode()
182 return &oi->vfs_inode; in ovl_alloc_inode()
189 kfree(oi->redirect); in ovl_free_inode()
190 kfree(oi->oe); in ovl_free_inode()
191 mutex_destroy(&oi->lock); in ovl_free_inode()
199 dput(oi->__upperdentry); in ovl_destroy_inode()
200 ovl_stack_put(ovl_lowerstack(oi->oe), ovl_numlower(oi->oe)); in ovl_destroy_inode()
201 if (S_ISDIR(inode->i_mode)) in ovl_destroy_inode()
204 kfree(oi->lowerdata_redirect); in ovl_destroy_inode()
225 return -EIO; in ovl_sync_fs()
241 upper_sb = ovl_upper_mnt(ofs)->mnt_sb; in ovl_sync_fs()
243 down_read(&upper_sb->s_umount); in ovl_sync_fs()
245 up_read(&upper_sb->s_umount); in ovl_sync_fs()
260 struct super_block *sb = dentry->d_sb; in ovl_statfs()
262 struct dentry *root_dentry = sb->s_root; in ovl_statfs()
270 buf->f_namelen = ofs->namelen; in ovl_statfs()
271 buf->f_type = OVERLAYFS_SUPER_MAGIC; in ovl_statfs()
273 buf->f_fsid = uuid_to_fsid(sb->s_uuid.b); in ovl_statfs()
296 struct inode *dir = ofs->workbasedir->d_inode; in ovl_workdir_create()
304 work = ovl_lookup_upper(ofs, name, ofs->workbasedir, strlen(name)); in ovl_workdir_create()
312 if (work->d_inode) { in ovl_workdir_create()
313 err = -EEXIST; in ovl_workdir_create()
323 if (err == -EINVAL) { in ovl_workdir_create()
335 err = -EINVAL; in ovl_workdir_create()
343 * b) -ENODATA (there was no POSIX ACL xattr) in ovl_workdir_create()
344 * c) -EOPNOTSUPP (POSIX ACL xattrs are not supported) in ovl_workdir_create()
347 * mean that the xattr doesn't exist (e.g. -ERANGE is returned in ovl_workdir_create()
353 if (err && err != -ENODATA && err != -EOPNOTSUPP) in ovl_workdir_create()
357 if (err && err != -ENODATA && err != -EOPNOTSUPP) in ovl_workdir_create()
361 inode_lock(work->d_inode); in ovl_workdir_create()
363 inode_unlock(work->d_inode); in ovl_workdir_create()
377 pr_warn("failed to create directory %s/%s (errno: %i); mounting read-only\n", in ovl_workdir_create()
378 ofs->config.workdir, name, -err); in ovl_workdir_create()
392 ofs->namelen = max(ofs->namelen, statfs.f_namelen); in ovl_check_namelen()
407 *stack_depth = max(*stack_depth, path->mnt->mnt_sb->s_stack_depth); in ovl_lower_dir()
413 fh_type = ovl_can_decode_fh(path->dentry->d_sb); in ovl_lower_dir()
414 if ((ofs->config.nfs_export || in ovl_lower_dir()
415 (ofs->config.index && ofs->config.upperdir)) && !fh_type) { in ovl_lower_dir()
416 ofs->config.index = false; in ovl_lower_dir()
417 ofs->config.nfs_export = false; in ovl_lower_dir()
421 ofs->nofh |= !fh_type; in ovl_lower_dir()
426 if (ofs->config.xino == OVL_XINO_AUTO && in ovl_lower_dir()
427 ofs->config.upperdir && !fh_type) { in ovl_lower_dir()
428 ofs->config.xino = OVL_XINO_OFF; in ovl_lower_dir()
433 /* Check if lower fs has 32bit inode numbers */ in ovl_lower_dir()
435 ofs->xino_mode = -1; in ovl_lower_dir()
463 if (err == -ELOOP) in ovl_setup_trap()
476 * attempted to be used as a lower layer in a new overlay mount.
480 if (ofs->config.index) { in ovl_report_in_use()
481 …pr_err("%s is in-use as upperdir/workdir of another mount, mount with '-o index=off' to override e… in ovl_report_in_use()
483 return -EBUSY; in ovl_report_in_use()
485 …pr_warn("%s is in-use as upperdir/workdir of another mount, accessing files from both mounts will … in ovl_report_in_use()
499 if (__mnt_is_readonly(upperpath->mnt)) { in ovl_get_upper()
500 pr_err("upper fs is r/o, try multi-lower layers mount\n"); in ovl_get_upper()
501 err = -EINVAL; in ovl_get_upper()
505 err = ovl_check_namelen(upperpath, ofs, ofs->config.upperdir); in ovl_get_upper()
509 err = ovl_setup_trap(sb, upperpath->dentry, &upper_layer->trap, in ovl_get_upper()
522 upper_mnt->mnt_flags &= ~(MNT_NOATIME | MNT_NODIRATIME | MNT_RELATIME); in ovl_get_upper()
523 upper_layer->mnt = upper_mnt; in ovl_get_upper()
524 upper_layer->idx = 0; in ovl_get_upper()
525 upper_layer->fsid = 0; in ovl_get_upper()
532 * okay because we don't yet have guarantees in that case, but it will in ovl_get_upper()
536 if (upper_mnt->mnt_sb->s_flags & SB_NOSEC) in ovl_get_upper()
537 sb->s_flags |= SB_NOSEC; in ovl_get_upper()
539 if (ovl_inuse_trylock(ovl_upper_mnt(ofs)->mnt_root)) { in ovl_get_upper()
540 ofs->upperdir_locked = true; in ovl_get_upper()
558 struct dentry *workdir = ofs->workdir; in ovl_check_rename_whiteout()
580 /* Name is inline and stable - using snapshot as a copy helper */ in ovl_check_rename_whiteout()
584 if (err == -EINVAL) in ovl_check_rename_whiteout()
620 inode_lock_nested(parent->d_inode, I_MUTEX_PARENT); in ovl_lookup_or_create()
622 if (!IS_ERR(child) && !child->d_inode) in ovl_lookup_or_create()
623 child = ovl_create_real(ofs, parent->d_inode, child, in ovl_lookup_or_create()
625 inode_unlock(parent->d_inode); in ovl_lookup_or_create()
638 struct dentry *d = dget(ofs->workbasedir); in ovl_create_volatile_dirty()
644 for (ctr = ARRAY_SIZE(volatile_path); ctr; ctr--, name++) { in ovl_create_volatile_dirty()
673 ofs->workdir = workdir; in ovl_make_workdir()
675 err = ovl_setup_trap(sb, ofs->workdir, &ofs->workdir_trap, "workdir"); in ovl_make_workdir()
694 tmpfile = ovl_do_tmpfile(ofs, ofs->workdir, S_IFREG | 0); in ovl_make_workdir()
695 ofs->tmpfile = !IS_ERR(tmpfile); in ovl_make_workdir()
696 if (ofs->tmpfile) in ovl_make_workdir()
714 err = ovl_setxattr(ofs, ofs->workdir, OVL_XATTR_OPAQUE, "0", 1); in ovl_make_workdir()
717 ofs->noxattr = true; in ovl_make_workdir()
719 ofs->config.redirect_mode = OVL_REDIRECT_NOFOLLOW; in ovl_make_workdir()
722 if (ofs->config.metacopy) { in ovl_make_workdir()
723 ofs->config.metacopy = false; in ovl_make_workdir()
726 if (ofs->config.index) { in ovl_make_workdir()
727 ofs->config.index = false; in ovl_make_workdir()
731 ofs->config.uuid = OVL_UUID_NULL; in ovl_make_workdir()
738 if (ofs->config.xino == OVL_XINO_AUTO) { in ovl_make_workdir()
739 ofs->config.xino = OVL_XINO_OFF; in ovl_make_workdir()
742 if (err == -EPERM && !ofs->config.userxattr) in ovl_make_workdir()
746 ovl_removexattr(ofs, ofs->workdir, OVL_XATTR_OPAQUE); in ovl_make_workdir()
750 * We allowed sub-optimal upper fs configuration and don't want to break in ovl_make_workdir()
754 if (ovl_dentry_remote(ofs->workdir) && in ovl_make_workdir()
755 (!d_type || !rename_whiteout || ofs->noxattr)) { in ovl_make_workdir()
757 err = -EINVAL; in ovl_make_workdir()
765 if (ofs->config.ovl_volatile) { in ovl_make_workdir()
774 fh_type = ovl_can_decode_fh(ofs->workdir->d_sb); in ovl_make_workdir()
775 if (ofs->config.index && !fh_type) { in ovl_make_workdir()
776 ofs->config.index = false; in ovl_make_workdir()
779 ofs->nofh |= !fh_type; in ovl_make_workdir()
783 ofs->xino_mode = -1; in ovl_make_workdir()
786 if (ofs->config.nfs_export && !ofs->config.index) { in ovl_make_workdir()
788 ofs->config.nfs_export = false; in ovl_make_workdir()
801 err = -EINVAL; in ovl_get_workdir()
802 if (upperpath->mnt != workpath->mnt) { in ovl_get_workdir()
806 if (!ovl_workdir_ok(workpath->dentry, upperpath->dentry)) { in ovl_get_workdir()
811 ofs->workbasedir = dget(workpath->dentry); in ovl_get_workdir()
813 if (ovl_inuse_trylock(ofs->workbasedir)) { in ovl_get_workdir()
814 ofs->workdir_locked = true; in ovl_get_workdir()
821 err = ovl_setup_trap(sb, ofs->workbasedir, &ofs->workbasedir_trap, in ovl_get_workdir()
834 struct dentry *origin = ovl_lowerstack(oe)->dentry; in ovl_get_indexdir()
846 /* Verify lower root is upper root origin */ in ovl_get_indexdir()
847 err = ovl_verify_origin_fh(ofs, upperpath->dentry, fh, true); in ovl_get_indexdir()
854 iput(ofs->workdir_trap); in ovl_get_indexdir()
855 ofs->workdir_trap = NULL; in ovl_get_indexdir()
856 dput(ofs->workdir); in ovl_get_indexdir()
857 ofs->workdir = NULL; in ovl_get_indexdir()
862 ofs->workdir = indexdir; in ovl_get_indexdir()
863 err = ovl_setup_trap(sb, indexdir, &ofs->workdir_trap, in ovl_get_indexdir()
872 * upper dir file handle. In any case, verify or set xattr in ovl_get_indexdir()
879 upperpath->dentry, true, in ovl_get_indexdir()
884 err = ovl_verify_upper(ofs, indexdir, upperpath->dentry, true); in ovl_get_indexdir()
893 pr_warn("try deleting index dir or mounting with '-o index=off' to disable inodes index.\n"); in ovl_get_indexdir()
906 if (!ofs->config.nfs_export && !ovl_upper_mnt(ofs)) in ovl_lower_uuid_ok()
910 * We allow using single lower with null uuid for index and nfs_export in ovl_lower_uuid_ok()
911 * for example to support those features with single lower squashfs. in ovl_lower_uuid_ok()
912 * To avoid regressions in setups of overlay with re-formatted lower in ovl_lower_uuid_ok()
913 * squashfs, do not allow decoding origin with lower null uuid unless in ovl_lower_uuid_ok()
914 * user opted-in to one of the new features that require following the in ovl_lower_uuid_ok()
915 * lower inode of non-dir upper. in ovl_lower_uuid_ok()
920 for (i = 0; i < ofs->numfs; i++) { in ovl_lower_uuid_ok()
922 * We use uuid to associate an overlay lower file handle with a in ovl_lower_uuid_ok()
923 * lower layer, so we can accept lower fs with null uuid as long in ovl_lower_uuid_ok()
924 * as all lower layers with null uuid are on the same fs. in ovl_lower_uuid_ok()
925 * if we detect multiple lower fs with the same uuid, we in ovl_lower_uuid_ok()
926 * disable lower file handle decoding on all of them. in ovl_lower_uuid_ok()
928 if (ofs->fs[i].is_lower && in ovl_lower_uuid_ok()
929 uuid_equal(&ofs->fs[i].sb->s_uuid, uuid)) { in ovl_lower_uuid_ok()
930 ofs->fs[i].bad_uuid = true; in ovl_lower_uuid_ok()
940 struct super_block *sb = path->mnt->mnt_sb; in ovl_get_fsid()
947 for (i = 0; i < ofs->numfs; i++) { in ovl_get_fsid()
948 if (ofs->fs[i].sb == sb) in ovl_get_fsid()
952 if (!ovl_lower_uuid_ok(ofs, &sb->s_uuid)) { in ovl_get_fsid()
954 if (ofs->config.xino == OVL_XINO_AUTO) { in ovl_get_fsid()
955 ofs->config.xino = OVL_XINO_OFF; in ovl_get_fsid()
958 if (ofs->config.index || ofs->config.nfs_export) { in ovl_get_fsid()
959 ofs->config.index = false; in ovl_get_fsid()
960 ofs->config.nfs_export = false; in ovl_get_fsid()
964 …pr_warn("%s uuid detected in lower fs '%pd2', falling back to xino=%s,index=off,nfs_export=off.\n", in ovl_get_fsid()
965 uuid_is_null(&sb->s_uuid) ? "null" : in ovl_get_fsid()
967 path->dentry, ovl_xino_mode(&ofs->config)); in ovl_get_fsid()
977 ofs->fs[ofs->numfs].sb = sb; in ovl_get_fsid()
978 ofs->fs[ofs->numfs].pseudo_dev = dev; in ovl_get_fsid()
979 ofs->fs[ofs->numfs].bad_uuid = bad_uuid; in ovl_get_fsid()
981 return ofs->numfs++; in ovl_get_fsid()
985 * The fsid after the last lower fsid is used for the data layers.
990 return ofs->numfs; in ovl_get_data_fsid()
1001 ofs->fs = kcalloc(ctx->nr + 2, sizeof(struct ovl_sb), GFP_KERNEL); in ovl_get_layers()
1002 if (ofs->fs == NULL) in ovl_get_layers()
1003 return -ENOMEM; in ovl_get_layers()
1006 * idx/fsid 0 are reserved for upper fs even with lower only overlay in ovl_get_layers()
1009 ofs->numfs++; in ovl_get_layers()
1012 * All lower layers that share the same fs as upper layer, use the same in ovl_get_layers()
1013 * pseudo_dev as upper layer. Allocate fs[0].pseudo_dev even for lower in ovl_get_layers()
1015 * is_lower will be set if upper fs is shared with a lower layer. in ovl_get_layers()
1017 err = get_anon_bdev(&ofs->fs[0].pseudo_dev); in ovl_get_layers()
1024 ofs->fs[0].sb = ovl_upper_mnt(ofs)->mnt_sb; in ovl_get_layers()
1025 ofs->fs[0].is_lower = false; in ovl_get_layers()
1028 nr_merged_lower = ctx->nr - ctx->nr_data; in ovl_get_layers()
1029 for (i = 0; i < ctx->nr; i++) { in ovl_get_layers()
1030 struct ovl_fs_context_layer *l = &ctx->lower[i]; in ovl_get_layers()
1036 fsid = ovl_get_fsid(ofs, &l->path); in ovl_get_layers()
1043 * Check if lower root conflicts with this overlay layers before in ovl_get_layers()
1044 * checking if it is in-use as upperdir/workdir of "another" in ovl_get_layers()
1046 * the upperdir/workdir is in fact in-use by our in ovl_get_layers()
1049 err = ovl_setup_trap(sb, l->path.dentry, &trap, "lowerdir"); in ovl_get_layers()
1053 if (ovl_is_inuse(l->path.dentry)) { in ovl_get_layers()
1061 mnt = clone_private_mount(&l->path); in ovl_get_layers()
1070 * Make lower layers R/O. That way fchmod/fchown on lower file in ovl_get_layers()
1071 * will fail instead of modifying lower fs. in ovl_get_layers()
1073 mnt->mnt_flags |= MNT_READONLY | MNT_NOATIME; in ovl_get_layers()
1075 layers[ofs->numlayer].trap = trap; in ovl_get_layers()
1076 layers[ofs->numlayer].mnt = mnt; in ovl_get_layers()
1077 layers[ofs->numlayer].idx = ofs->numlayer; in ovl_get_layers()
1078 layers[ofs->numlayer].fsid = fsid; in ovl_get_layers()
1079 layers[ofs->numlayer].fs = &ofs->fs[fsid]; in ovl_get_layers()
1081 ofs->config.lowerdirs[ofs->numlayer] = l->name; in ovl_get_layers()
1082 l->name = NULL; in ovl_get_layers()
1083 ofs->numlayer++; in ovl_get_layers()
1084 ofs->fs[fsid].is_lower = true; in ovl_get_layers()
1096 if (ofs->numfs - !ovl_upper_mnt(ofs) == 1) { in ovl_get_layers()
1097 if (ofs->config.xino == OVL_XINO_ON) in ovl_get_layers()
1099 ofs->xino_mode = 0; in ovl_get_layers()
1100 } else if (ofs->config.xino == OVL_XINO_OFF) { in ovl_get_layers()
1101 ofs->xino_mode = -1; in ovl_get_layers()
1102 } else if (ofs->xino_mode < 0) { in ovl_get_layers()
1106 * lower only overlay) +1 extra bit is reserved for the non in ovl_get_layers()
1108 * xino lower bits overflow. in ovl_get_layers()
1111 ofs->xino_mode = ilog2(ofs->numfs - 1) + 2; in ovl_get_layers()
1114 if (ofs->xino_mode > 0) { in ovl_get_layers()
1116 ofs->xino_mode); in ovl_get_layers()
1135 if (!ofs->config.upperdir && ctx->nr == 1) { in ovl_get_lowerstack()
1137 return ERR_PTR(-EINVAL); in ovl_get_lowerstack()
1140 err = -EINVAL; in ovl_get_lowerstack()
1141 for (i = 0; i < ctx->nr; i++) { in ovl_get_lowerstack()
1142 l = &ctx->lower[i]; in ovl_get_lowerstack()
1144 err = ovl_lower_dir(l->name, &l->path, ofs, &sb->s_stack_depth); in ovl_get_lowerstack()
1149 err = -EINVAL; in ovl_get_lowerstack()
1150 sb->s_stack_depth++; in ovl_get_lowerstack()
1151 if (sb->s_stack_depth > FILESYSTEM_MAX_STACK_DEPTH) { in ovl_get_lowerstack()
1160 err = -ENOMEM; in ovl_get_lowerstack()
1161 /* Data-only layers are not merged in root directory */ in ovl_get_lowerstack()
1162 nr_merged_lower = ctx->nr - ctx->nr_data; in ovl_get_lowerstack()
1169 l = &ctx->lower[i]; in ovl_get_lowerstack()
1170 lowerstack[i].dentry = dget(l->path.dentry); in ovl_get_lowerstack()
1171 lowerstack[i].layer = &ofs->layers[i + 1]; in ovl_get_lowerstack()
1173 ofs->numdatalayer = ctx->nr_data; in ovl_get_lowerstack()
1180 * - another layer of this overlayfs instance
1181 * - upper/work dir of any overlayfs instance
1198 err = -ELOOP; in ovl_check_layer()
1222 err = ovl_check_layer(sb, ofs, ovl_upper_mnt(ofs)->mnt_root, in ovl_check_overlapping_layers()
1231 * workbasedir. In that case, we already have their traps in in ovl_check_overlapping_layers()
1232 * inode cache and we will catch that case on lookup. in ovl_check_overlapping_layers()
1234 err = ovl_check_layer(sb, ofs, ofs->workbasedir, "workdir", in ovl_check_overlapping_layers()
1240 for (i = 1; i < ofs->numlayer; i++) { in ovl_check_overlapping_layers()
1242 ofs->layers[i].mnt->mnt_root, in ovl_check_overlapping_layers()
1258 unsigned long ino = d_inode(lowerpath->dentry)->i_ino; in ovl_get_root()
1259 int fsid = lowerpath->layer->fsid; in ovl_get_root()
1271 ino = d_inode(upperdentry)->i_ino; in ovl_get_root()
1279 for (int i = 0; i < ovl_numlower(oe) - 1; i++, lowerpath++) { in ovl_get_root()
1281 .mnt = lowerpath->layer->mnt, in ovl_get_root()
1282 .dentry = lowerpath->dentry, in ovl_get_root()
1287 ovl_layer_set_xwhiteouts(ofs, lowerpath->layer); in ovl_get_root()
1292 /* Root is always merge -> can have whiteouts */ in ovl_get_root()
1306 struct ovl_fs *ofs = sb->s_fs_info; in ovl_fill_super()
1307 struct ovl_fs_context *ctx = fc->fs_private; in ovl_fill_super()
1314 err = -EIO; in ovl_fill_super()
1315 if (WARN_ON(fc->user_ns != current_user_ns())) in ovl_fill_super()
1318 sb->s_d_op = &ovl_dentry_operations; in ovl_fill_super()
1320 err = -ENOMEM; in ovl_fill_super()
1321 ofs->creator_cred = cred = prepare_creds(); in ovl_fill_super()
1325 err = ovl_fs_params_verify(ctx, &ofs->config); in ovl_fill_super()
1329 err = -EINVAL; in ovl_fill_super()
1330 if (ctx->nr == 0) { in ovl_fill_super()
1331 if (!(fc->sb_flags & SB_SILENT)) in ovl_fill_super()
1336 err = -ENOMEM; in ovl_fill_super()
1337 layers = kcalloc(ctx->nr + 1, sizeof(struct ovl_layer), GFP_KERNEL); in ovl_fill_super()
1341 ofs->config.lowerdirs = kcalloc(ctx->nr + 1, sizeof(char *), GFP_KERNEL); in ovl_fill_super()
1342 if (!ofs->config.lowerdirs) { in ovl_fill_super()
1346 ofs->layers = layers; in ovl_fill_super()
1352 ofs->config.lowerdirs[0] = ctx->lowerdir_all; in ovl_fill_super()
1353 ctx->lowerdir_all = NULL; in ovl_fill_super()
1354 ofs->numlayer = 1; in ovl_fill_super()
1356 sb->s_stack_depth = 0; in ovl_fill_super()
1357 sb->s_maxbytes = MAX_LFS_FILESIZE; in ovl_fill_super()
1358 atomic_long_set(&ofs->last_ino, 1); in ovl_fill_super()
1360 if (ofs->config.xino != OVL_XINO_OFF) { in ovl_fill_super()
1361 ofs->xino_mode = BITS_PER_LONG - 32; in ovl_fill_super()
1362 if (!ofs->xino_mode) { in ovl_fill_super()
1364 ofs->config.xino = OVL_XINO_OFF; in ovl_fill_super()
1369 sb->s_op = &ovl_super_operations; in ovl_fill_super()
1371 if (ofs->config.upperdir) { in ovl_fill_super()
1374 err = -EINVAL; in ovl_fill_super()
1375 if (!ofs->config.workdir) { in ovl_fill_super()
1380 err = ovl_get_upper(sb, ofs, &layers[0], &ctx->upper); in ovl_fill_super()
1384 upper_sb = ovl_upper_mnt(ofs)->mnt_sb; in ovl_fill_super()
1386 ofs->errseq = errseq_sample(&upper_sb->s_wb_err); in ovl_fill_super()
1387 if (errseq_check(&upper_sb->s_wb_err, ofs->errseq)) { in ovl_fill_super()
1388 err = -EIO; in ovl_fill_super()
1394 err = ovl_get_workdir(sb, ofs, &ctx->upper, &ctx->work); in ovl_fill_super()
1398 if (!ofs->workdir) in ovl_fill_super()
1399 sb->s_flags |= SB_RDONLY; in ovl_fill_super()
1401 sb->s_stack_depth = upper_sb->s_stack_depth; in ovl_fill_super()
1402 sb->s_time_gran = upper_sb->s_time_gran; in ovl_fill_super()
1411 sb->s_flags |= SB_RDONLY; in ovl_fill_super()
1413 if (!ovl_origin_uuid(ofs) && ofs->numfs > 1) { in ovl_fill_super()
1414 pr_warn("The uuid=off requires a single fs for lower and upper, falling back to uuid=null.\n"); in ovl_fill_super()
1415 ofs->config.uuid = OVL_UUID_NULL; in ovl_fill_super()
1418 ovl_init_uuid_xattr(sb, ofs, &ctx->upper); in ovl_fill_super()
1421 if (!ovl_force_readonly(ofs) && ofs->config.index) { in ovl_fill_super()
1422 err = ovl_get_indexdir(sb, ofs, oe, &ctx->upper); in ovl_fill_super()
1427 if (!ofs->workdir) in ovl_fill_super()
1428 sb->s_flags |= SB_RDONLY; in ovl_fill_super()
1436 if (!ofs->workdir) { in ovl_fill_super()
1437 ofs->config.index = false; in ovl_fill_super()
1438 if (ovl_upper_mnt(ofs) && ofs->config.nfs_export) { in ovl_fill_super()
1440 ofs->config.nfs_export = false; in ovl_fill_super()
1444 if (ofs->config.metacopy && ofs->config.nfs_export) { in ovl_fill_super()
1446 ofs->config.nfs_export = false; in ovl_fill_super()
1451 * and encoding non-decodable file handles with nfs_export=off in ovl_fill_super()
1454 if (ofs->config.nfs_export) in ovl_fill_super()
1455 sb->s_export_op = &ovl_export_operations; in ovl_fill_super()
1456 else if (!ofs->nofh) in ovl_fill_super()
1457 sb->s_export_op = &ovl_export_fid_operations; in ovl_fill_super()
1460 cap_lower(cred->cap_effective, CAP_SYS_RESOURCE); in ovl_fill_super()
1462 sb->s_magic = OVERLAYFS_SUPER_MAGIC; in ovl_fill_super()
1463 sb->s_xattr = ovl_xattr_handlers(ofs); in ovl_fill_super()
1464 sb->s_fs_info = ofs; in ovl_fill_super()
1466 sb->s_flags |= SB_POSIXACL; in ovl_fill_super()
1468 sb->s_iflags |= SB_I_SKIP_SYNC; in ovl_fill_super()
1474 sb->s_iflags |= SB_I_NOUMASK; in ovl_fill_super()
1475 sb->s_iflags |= SB_I_EVM_HMAC_UNSUPPORTED; in ovl_fill_super()
1477 err = -ENOMEM; in ovl_fill_super()
1478 root_dentry = ovl_get_root(sb, ctx->upper.dentry, oe); in ovl_fill_super()
1482 sb->s_root = root_dentry; in ovl_fill_super()
1490 sb->s_fs_info = NULL; in ovl_fill_super()
1508 inode_init_once(&oi->vfs_inode); in ovl_inode_init_once()
1521 return -ENOMEM; in ovl_init()