Lines Matching +full:lower +full:- +full:case
1 // SPDX-License-Identifier: GPL-2.0-only
80 return ovl_parameter_uuid[config->uuid].name; in ovl_uuid_mode()
97 return ovl_parameter_xino[config->xino].name; in ovl_xino_mode()
115 return ovl_parameter_redirect_dir[config->redirect_mode].name; in ovl_redirect_mode()
134 return ovl_parameter_verity[config->verity_mode].name; in ovl_verity_mode()
208 return -EINVAL; in ovl_parse_param_split_lowerdirs()
223 return -EINVAL; in ovl_parse_param_split_lowerdirs()
235 int err = -EINVAL; in ovl_mount_dir_noesc()
267 int err = -ENOMEM; in ovl_mount_dir()
281 struct ovl_fs_context *ctx = fc->fs_private; in ovl_mount_dir_check()
283 if (!d_is_dir(path->dentry)) in ovl_mount_dir_check()
287 * Root dentries of case-insensitive capable filesystems might in ovl_mount_dir_check()
289 * with overlayfs. Check explicitly to prevent post-mount in ovl_mount_dir_check()
292 if (sb_has_encoding(path->mnt->mnt_sb)) in ovl_mount_dir_check()
293 return invalfc(fc, "case-insensitive capable filesystem on %s not supported", name); in ovl_mount_dir_check()
295 if (ovl_dentry_weird(path->dentry)) in ovl_mount_dir_check()
299 * Check whether upper path is read-only here to report failures in ovl_mount_dir_check()
304 if (path->dentry->d_flags & DCACHE_OP_REAL) in ovl_mount_dir_check()
306 if (__mnt_is_readonly(path->mnt)) in ovl_mount_dir_check()
307 return invalfc(fc, "filesystem on %s is read-only", name); in ovl_mount_dir_check()
309 if (ctx->lowerdir_all && layer != Opt_lowerdir) in ovl_mount_dir_check()
311 if (ctx->nr_data && layer == Opt_lowerdir_add) in ovl_mount_dir_check()
312 return invalfc(fc, "regular lower layers cannot follow data layers"); in ovl_mount_dir_check()
313 if (ctx->nr == OVL_MAX_STACK) in ovl_mount_dir_check()
314 return invalfc(fc, "too many lower directories, limit is %d", in ovl_mount_dir_check()
322 struct ovl_fs_context *ctx = fc->fs_private; in ovl_ctx_realloc_lower()
326 if (ctx->nr < ctx->capacity) in ovl_ctx_realloc_lower()
329 nr = min_t(size_t, max(4096 / sizeof(*l), ctx->capacity * 2), in ovl_ctx_realloc_lower()
331 l = krealloc_array(ctx->lower, nr, sizeof(*l), GFP_KERNEL_ACCOUNT); in ovl_ctx_realloc_lower()
333 return -ENOMEM; in ovl_ctx_realloc_lower()
335 ctx->lower = l; in ovl_ctx_realloc_lower()
336 ctx->capacity = nr; in ovl_ctx_realloc_lower()
343 struct ovl_fs *ofs = fc->s_fs_info; in ovl_add_layer()
344 struct ovl_config *config = &ofs->config; in ovl_add_layer()
345 struct ovl_fs_context *ctx = fc->fs_private; in ovl_add_layer()
349 case Opt_workdir: in ovl_add_layer()
350 swap(config->workdir, *pname); in ovl_add_layer()
351 swap(ctx->work, *path); in ovl_add_layer()
353 case Opt_upperdir: in ovl_add_layer()
354 swap(config->upperdir, *pname); in ovl_add_layer()
355 swap(ctx->upper, *path); in ovl_add_layer()
357 case Opt_datadir_add: in ovl_add_layer()
358 ctx->nr_data++; in ovl_add_layer()
360 case Opt_lowerdir_add: in ovl_add_layer()
361 WARN_ON(ctx->nr >= ctx->capacity); in ovl_add_layer()
362 l = &ctx->lower[ctx->nr++]; in ovl_add_layer()
364 swap(l->name, *pname); in ovl_add_layer()
365 swap(l->path, *path); in ovl_add_layer()
375 char *name = kstrdup(param->string, GFP_KERNEL); in ovl_parse_layer()
381 return -ENOMEM; in ovl_parse_layer()
412 struct ovl_fs_context_layer *l = ctx->lower; in ovl_reset_lowerdirs()
415 kfree(ctx->lowerdir_all); in ovl_reset_lowerdirs()
416 ctx->lowerdir_all = NULL; in ovl_reset_lowerdirs()
418 for (size_t nr = 0; nr < ctx->nr; nr++, l++) { in ovl_reset_lowerdirs()
419 path_put(&l->path); in ovl_reset_lowerdirs()
420 kfree(l->name); in ovl_reset_lowerdirs()
421 l->name = NULL; in ovl_reset_lowerdirs()
423 ctx->nr = 0; in ovl_reset_lowerdirs()
424 ctx->nr_data = 0; in ovl_reset_lowerdirs()
431 * Set "/lower1", "/lower2", and "/lower3" as lower layers and
432 * "/data1" and "/data2" as data lower layers. Any existing lower
438 struct ovl_fs_context *ctx = fc->fs_private; in ovl_parse_param_lowerdir()
449 /* drop all existing lower layers */ in ovl_parse_param_lowerdir()
456 pr_err("cannot append lower layer"); in ovl_parse_param_lowerdir()
457 return -EINVAL; in ovl_parse_param_lowerdir()
461 ctx->lowerdir_all = kstrdup(name, GFP_KERNEL); in ovl_parse_param_lowerdir()
462 if (!ctx->lowerdir_all) in ovl_parse_param_lowerdir()
463 return -ENOMEM; in ovl_parse_param_lowerdir()
467 return -ENOMEM; in ovl_parse_param_lowerdir()
469 err = -EINVAL; in ovl_parse_param_lowerdir()
475 pr_err("too many lower directories, limit is %d\n", OVL_MAX_STACK); in ovl_parse_param_lowerdir()
479 if (nr_lower > ctx->capacity) { in ovl_parse_param_lowerdir()
480 err = -ENOMEM; in ovl_parse_param_lowerdir()
481 l = krealloc_array(ctx->lower, nr_lower, sizeof(*ctx->lower), in ovl_parse_param_lowerdir()
486 ctx->lower = l; in ovl_parse_param_lowerdir()
487 ctx->capacity = nr_lower; in ovl_parse_param_lowerdir()
491 l = ctx->lower; in ovl_parse_param_lowerdir()
495 err = ovl_mount_dir(iter, &l->path); in ovl_parse_param_lowerdir()
499 err = ovl_mount_dir_check(fc, &l->path, Opt_lowerdir, iter, false); in ovl_parse_param_lowerdir()
503 err = -ENOMEM; in ovl_parse_param_lowerdir()
504 l->name = kstrdup(iter, GFP_KERNEL_ACCOUNT); in ovl_parse_param_lowerdir()
505 if (!l->name) in ovl_parse_param_lowerdir()
515 err = -EINVAL; in ovl_parse_param_lowerdir()
522 if ((ctx->nr_data + nr_data) > 0) { in ovl_parse_param_lowerdir()
523 pr_err("regular lower layers cannot follow data lower layers"); in ovl_parse_param_lowerdir()
531 /* This is a data lower layer. */ in ovl_parse_param_lowerdir()
535 ctx->nr = nr_lower; in ovl_parse_param_lowerdir()
536 ctx->nr_data += nr_data; in ovl_parse_param_lowerdir()
554 struct ovl_fs *ofs = fc->s_fs_info; in ovl_parse_param()
555 struct ovl_config *config = &ofs->config; in ovl_parse_param()
556 struct ovl_fs_context *ctx = fc->fs_private; in ovl_parse_param()
559 if (fc->purpose == FS_CONTEXT_FOR_RECONFIGURE) { in ovl_parse_param()
565 if (fc->oldapi) in ovl_parse_param()
583 case Opt_lowerdir: in ovl_parse_param()
584 err = ovl_parse_param_lowerdir(param->string, fc); in ovl_parse_param()
586 case Opt_lowerdir_add: in ovl_parse_param()
587 case Opt_datadir_add: in ovl_parse_param()
588 case Opt_upperdir: in ovl_parse_param()
589 case Opt_workdir: in ovl_parse_param()
592 case Opt_default_permissions: in ovl_parse_param()
593 config->default_permissions = true; in ovl_parse_param()
595 case Opt_redirect_dir: in ovl_parse_param()
596 config->redirect_mode = result.uint_32; in ovl_parse_param()
597 if (config->redirect_mode == OVL_REDIRECT_OFF) { in ovl_parse_param()
598 config->redirect_mode = ovl_redirect_always_follow ? in ovl_parse_param()
602 ctx->set.redirect = true; in ovl_parse_param()
604 case Opt_index: in ovl_parse_param()
605 config->index = result.uint_32; in ovl_parse_param()
606 ctx->set.index = true; in ovl_parse_param()
608 case Opt_uuid: in ovl_parse_param()
609 config->uuid = result.uint_32; in ovl_parse_param()
611 case Opt_nfs_export: in ovl_parse_param()
612 config->nfs_export = result.uint_32; in ovl_parse_param()
613 ctx->set.nfs_export = true; in ovl_parse_param()
615 case Opt_xino: in ovl_parse_param()
616 config->xino = result.uint_32; in ovl_parse_param()
618 case Opt_metacopy: in ovl_parse_param()
619 config->metacopy = result.uint_32; in ovl_parse_param()
620 ctx->set.metacopy = true; in ovl_parse_param()
622 case Opt_verity: in ovl_parse_param()
623 config->verity_mode = result.uint_32; in ovl_parse_param()
625 case Opt_volatile: in ovl_parse_param()
626 config->ovl_volatile = true; in ovl_parse_param()
628 case Opt_userxattr: in ovl_parse_param()
629 config->userxattr = true; in ovl_parse_param()
633 param->key); in ovl_parse_param()
634 return -EINVAL; in ovl_parse_param()
648 path_put(&ctx->upper); in ovl_fs_context_free()
649 path_put(&ctx->work); in ovl_fs_context_free()
650 kfree(ctx->lower); in ovl_fs_context_free()
656 struct ovl_fs *ofs = fc->s_fs_info; in ovl_free()
657 struct ovl_fs_context *ctx = fc->fs_private; in ovl_free()
674 struct super_block *sb = fc->root->d_sb; in ovl_reconfigure()
679 if (!(fc->sb_flags & SB_RDONLY) && ovl_force_readonly(ofs)) in ovl_reconfigure()
680 return -EROFS; in ovl_reconfigure()
682 if (fc->sb_flags & SB_RDONLY && !sb_rdonly(sb)) { in ovl_reconfigure()
683 upper_sb = ovl_upper_mnt(ofs)->mnt_sb; in ovl_reconfigure()
685 down_read(&upper_sb->s_umount); in ovl_reconfigure()
687 up_read(&upper_sb->s_umount); in ovl_reconfigure()
704 * the caller in fc->user_ns since we've raised FS_USERNS_MOUNT. We'll
716 return -ENOMEM; in ovl_init_fs_context()
719 * By default we allocate for three lower layers. It's likely in ovl_init_fs_context()
722 ctx->lower = kmalloc_array(3, sizeof(*ctx->lower), GFP_KERNEL_ACCOUNT); in ovl_init_fs_context()
723 if (!ctx->lower) in ovl_init_fs_context()
725 ctx->capacity = 3; in ovl_init_fs_context()
731 ofs->config.redirect_mode = ovl_redirect_mode_def(); in ovl_init_fs_context()
732 ofs->config.index = ovl_index_def; in ovl_init_fs_context()
733 ofs->config.uuid = ovl_uuid_def(); in ovl_init_fs_context()
734 ofs->config.nfs_export = ovl_nfs_export_def; in ovl_init_fs_context()
735 ofs->config.xino = ovl_xino_def(); in ovl_init_fs_context()
736 ofs->config.metacopy = ovl_metacopy_def; in ovl_init_fs_context()
738 fc->s_fs_info = ofs; in ovl_init_fs_context()
739 fc->fs_private = ctx; in ovl_init_fs_context()
740 fc->ops = &ovl_context_ops; in ovl_init_fs_context()
745 return -ENOMEM; in ovl_init_fs_context()
754 iput(ofs->workbasedir_trap); in ovl_free_fs()
755 iput(ofs->indexdir_trap); in ovl_free_fs()
756 iput(ofs->workdir_trap); in ovl_free_fs()
757 dput(ofs->whiteout); in ovl_free_fs()
758 dput(ofs->indexdir); in ovl_free_fs()
759 dput(ofs->workdir); in ovl_free_fs()
760 if (ofs->workdir_locked) in ovl_free_fs()
761 ovl_inuse_unlock(ofs->workbasedir); in ovl_free_fs()
762 dput(ofs->workbasedir); in ovl_free_fs()
763 if (ofs->upperdir_locked) in ovl_free_fs()
764 ovl_inuse_unlock(ovl_upper_mnt(ofs)->mnt_root); in ovl_free_fs()
766 /* Reuse ofs->config.lowerdirs as a vfsmount array before freeing it */ in ovl_free_fs()
767 mounts = (struct vfsmount **) ofs->config.lowerdirs; in ovl_free_fs()
768 for (i = 0; i < ofs->numlayer; i++) { in ovl_free_fs()
769 iput(ofs->layers[i].trap); in ovl_free_fs()
770 kfree(ofs->config.lowerdirs[i]); in ovl_free_fs()
771 mounts[i] = ofs->layers[i].mnt; in ovl_free_fs()
773 kern_unmount_array(mounts, ofs->numlayer); in ovl_free_fs()
774 kfree(ofs->layers); in ovl_free_fs()
775 for (i = 0; i < ofs->numfs; i++) in ovl_free_fs()
776 free_anon_bdev(ofs->fs[i].pseudo_dev); in ovl_free_fs()
777 kfree(ofs->fs); in ovl_free_fs()
779 kfree(ofs->config.lowerdirs); in ovl_free_fs()
780 kfree(ofs->config.upperdir); in ovl_free_fs()
781 kfree(ofs->config.workdir); in ovl_free_fs()
782 if (ofs->creator_cred) in ovl_free_fs()
783 put_cred(ofs->creator_cred); in ovl_free_fs()
790 struct ovl_opt_set set = ctx->set; in ovl_fs_params_verify()
792 if (ctx->nr_data > 0 && !config->metacopy) { in ovl_fs_params_verify()
793 pr_err("lower data-only dirs require metacopy support.\n"); in ovl_fs_params_verify()
794 return -EINVAL; in ovl_fs_params_verify()
797 /* Workdir/index are useless in non-upper mount */ in ovl_fs_params_verify()
798 if (!config->upperdir) { in ovl_fs_params_verify()
799 if (config->workdir) { in ovl_fs_params_verify()
800 pr_info("option \"workdir=%s\" is useless in a non-upper mount, ignore\n", in ovl_fs_params_verify()
801 config->workdir); in ovl_fs_params_verify()
802 kfree(config->workdir); in ovl_fs_params_verify()
803 config->workdir = NULL; in ovl_fs_params_verify()
805 if (config->index && set.index) { in ovl_fs_params_verify()
806 pr_info("option \"index=on\" is useless in a non-upper mount, ignore\n"); in ovl_fs_params_verify()
809 config->index = false; in ovl_fs_params_verify()
812 if (!config->upperdir && config->ovl_volatile) { in ovl_fs_params_verify()
813 pr_info("option \"volatile\" is meaningless in a non-upper mount, ignoring it.\n"); in ovl_fs_params_verify()
814 config->ovl_volatile = false; in ovl_fs_params_verify()
817 if (!config->upperdir && config->uuid == OVL_UUID_ON) { in ovl_fs_params_verify()
819 config->uuid = OVL_UUID_NULL; in ovl_fs_params_verify()
822 /* Resolve verity -> metacopy dependency */ in ovl_fs_params_verify()
823 if (config->verity_mode && !config->metacopy) { in ovl_fs_params_verify()
828 return -EINVAL; in ovl_fs_params_verify()
831 config->metacopy = true; in ovl_fs_params_verify()
838 if (!config->upperdir && config->redirect_mode == OVL_REDIRECT_FOLLOW) in ovl_fs_params_verify()
839 config->redirect_mode = OVL_REDIRECT_ON; in ovl_fs_params_verify()
841 /* Resolve verity -> metacopy -> redirect_dir dependency */ in ovl_fs_params_verify()
842 if (config->metacopy && config->redirect_mode != OVL_REDIRECT_ON) { in ovl_fs_params_verify()
846 return -EINVAL; in ovl_fs_params_verify()
848 if (config->verity_mode && set.redirect) { in ovl_fs_params_verify()
851 return -EINVAL; in ovl_fs_params_verify()
860 config->metacopy = false; in ovl_fs_params_verify()
863 config->redirect_mode = OVL_REDIRECT_ON; in ovl_fs_params_verify()
867 /* Resolve nfs_export -> index dependency */ in ovl_fs_params_verify()
868 if (config->nfs_export && !config->index) { in ovl_fs_params_verify()
869 if (!config->upperdir && in ovl_fs_params_verify()
870 config->redirect_mode != OVL_REDIRECT_NOFOLLOW) { in ovl_fs_params_verify()
871 …pr_info("NFS export requires \"redirect_dir=nofollow\" on non-upper mount, falling back to nfs_exp… in ovl_fs_params_verify()
872 config->nfs_export = false; in ovl_fs_params_verify()
875 return -EINVAL; in ovl_fs_params_verify()
882 config->nfs_export = false; in ovl_fs_params_verify()
885 config->index = true; in ovl_fs_params_verify()
889 /* Resolve nfs_export -> !metacopy && !verity dependency */ in ovl_fs_params_verify()
890 if (config->nfs_export && config->metacopy) { in ovl_fs_params_verify()
893 return -EINVAL; in ovl_fs_params_verify()
901 config->nfs_export = false; in ovl_fs_params_verify()
902 } else if (config->verity_mode) { in ovl_fs_params_verify()
909 config->nfs_export = false; in ovl_fs_params_verify()
916 config->metacopy = false; in ovl_fs_params_verify()
921 /* Resolve userxattr -> !redirect && !metacopy && !verity dependency */ in ovl_fs_params_verify()
922 if (config->userxattr) { in ovl_fs_params_verify()
924 config->redirect_mode != OVL_REDIRECT_NOFOLLOW) { in ovl_fs_params_verify()
927 return -EINVAL; in ovl_fs_params_verify()
929 if (config->metacopy && set.metacopy) { in ovl_fs_params_verify()
931 return -EINVAL; in ovl_fs_params_verify()
933 if (config->verity_mode) { in ovl_fs_params_verify()
936 return -EINVAL; in ovl_fs_params_verify()
944 config->redirect_mode = OVL_REDIRECT_NOFOLLOW; in ovl_fs_params_verify()
945 config->metacopy = false; in ovl_fs_params_verify()
961 struct super_block *sb = dentry->d_sb; in ovl_show_options()
964 char **lowerdirs = ofs->config.lowerdirs; in ovl_show_options()
977 nr_lower = ofs->numlayer; in ovl_show_options()
978 nr_merged_lower = nr_lower - ofs->numdatalayer; in ovl_show_options()
986 if (ofs->config.upperdir) { in ovl_show_options()
987 seq_show_option(m, "upperdir", ofs->config.upperdir); in ovl_show_options()
988 seq_show_option(m, "workdir", ofs->config.workdir); in ovl_show_options()
990 if (ofs->config.default_permissions) in ovl_show_options()
992 if (ofs->config.redirect_mode != ovl_redirect_mode_def()) in ovl_show_options()
994 ovl_redirect_mode(&ofs->config)); in ovl_show_options()
995 if (ofs->config.index != ovl_index_def) in ovl_show_options()
996 seq_printf(m, ",index=%s", ofs->config.index ? "on" : "off"); in ovl_show_options()
997 if (ofs->config.uuid != ovl_uuid_def()) in ovl_show_options()
998 seq_printf(m, ",uuid=%s", ovl_uuid_mode(&ofs->config)); in ovl_show_options()
999 if (ofs->config.nfs_export != ovl_nfs_export_def) in ovl_show_options()
1000 seq_printf(m, ",nfs_export=%s", ofs->config.nfs_export ? in ovl_show_options()
1002 if (ofs->config.xino != ovl_xino_def() && !ovl_same_fs(ofs)) in ovl_show_options()
1003 seq_printf(m, ",xino=%s", ovl_xino_mode(&ofs->config)); in ovl_show_options()
1004 if (ofs->config.metacopy != ovl_metacopy_def) in ovl_show_options()
1006 ofs->config.metacopy ? "on" : "off"); in ovl_show_options()
1007 if (ofs->config.ovl_volatile) in ovl_show_options()
1009 if (ofs->config.userxattr) in ovl_show_options()
1011 if (ofs->config.verity_mode != ovl_verity_mode_def()) in ovl_show_options()
1013 ovl_verity_mode(&ofs->config)); in ovl_show_options()