Lines Matching +full:lower +full:- +full:case
1 // SPDX-License-Identifier: GPL-2.0-only
61 for (i = 0; i < oe->numlower; i++) in ovl_entry_stack_free()
62 dput(oe->lowerstack[i].dentry); in ovl_entry_stack_free()
72 struct ovl_entry *oe = dentry->d_fsdata; in ovl_dentry_release()
83 struct dentry *real = NULL, *lower; in ovl_d_real() local
102 lower = ovl_dentry_lowerdata(dentry); in ovl_d_real()
103 if (!lower) in ovl_d_real()
105 real = lower; in ovl_d_real()
114 __func__, dentry, inode ? inode->i_sb->s_id : "NULL", in ovl_d_real()
115 inode ? inode->i_ino : 0, real, in ovl_d_real()
116 real && d_inode(real) ? d_inode(real)->i_ino : 0); in ovl_d_real()
125 if (d->d_flags & DCACHE_OP_WEAK_REVALIDATE) in ovl_revalidate_real()
126 ret = d->d_op->d_weak_revalidate(d, flags); in ovl_revalidate_real()
127 } else if (d->d_flags & DCACHE_OP_REVALIDATE) { in ovl_revalidate_real()
128 ret = d->d_op->d_revalidate(d, flags); in ovl_revalidate_real()
132 ret = -ESTALE; in ovl_revalidate_real()
141 struct ovl_entry *oe = dentry->d_fsdata; in ovl_dentry_revalidate_common()
150 for (i = 0; ret > 0 && i < oe->numlower; i++) { in ovl_dentry_revalidate_common()
151 ret = ovl_revalidate_real(oe->lowerstack[i].dentry, flags, in ovl_dentry_revalidate_common()
183 oi->cache = NULL; in ovl_alloc_inode()
184 oi->redirect = NULL; in ovl_alloc_inode()
185 oi->version = 0; in ovl_alloc_inode()
186 oi->flags = 0; in ovl_alloc_inode()
187 oi->__upperdentry = NULL; in ovl_alloc_inode()
188 oi->lowerpath.dentry = NULL; in ovl_alloc_inode()
189 oi->lowerpath.layer = NULL; in ovl_alloc_inode()
190 oi->lowerdata = NULL; in ovl_alloc_inode()
191 mutex_init(&oi->lock); in ovl_alloc_inode()
193 return &oi->vfs_inode; in ovl_alloc_inode()
200 kfree(oi->redirect); in ovl_free_inode()
201 mutex_destroy(&oi->lock); in ovl_free_inode()
209 dput(oi->__upperdentry); in ovl_destroy_inode()
210 dput(oi->lowerpath.dentry); in ovl_destroy_inode()
211 if (S_ISDIR(inode->i_mode)) in ovl_destroy_inode()
214 iput(oi->lowerdata); in ovl_destroy_inode()
222 iput(ofs->workbasedir_trap); in ovl_free_fs()
223 iput(ofs->indexdir_trap); in ovl_free_fs()
224 iput(ofs->workdir_trap); in ovl_free_fs()
225 dput(ofs->whiteout); in ovl_free_fs()
226 dput(ofs->indexdir); in ovl_free_fs()
227 dput(ofs->workdir); in ovl_free_fs()
228 if (ofs->workdir_locked) in ovl_free_fs()
229 ovl_inuse_unlock(ofs->workbasedir); in ovl_free_fs()
230 dput(ofs->workbasedir); in ovl_free_fs()
231 if (ofs->upperdir_locked) in ovl_free_fs()
232 ovl_inuse_unlock(ovl_upper_mnt(ofs)->mnt_root); in ovl_free_fs()
234 /* Hack! Reuse ofs->layers as a vfsmount array before freeing it */ in ovl_free_fs()
235 mounts = (struct vfsmount **) ofs->layers; in ovl_free_fs()
236 for (i = 0; i < ofs->numlayer; i++) { in ovl_free_fs()
237 iput(ofs->layers[i].trap); in ovl_free_fs()
238 mounts[i] = ofs->layers[i].mnt; in ovl_free_fs()
240 kern_unmount_array(mounts, ofs->numlayer); in ovl_free_fs()
241 kfree(ofs->layers); in ovl_free_fs()
242 for (i = 0; i < ofs->numfs; i++) in ovl_free_fs()
243 free_anon_bdev(ofs->fs[i].pseudo_dev); in ovl_free_fs()
244 kfree(ofs->fs); in ovl_free_fs()
246 kfree(ofs->config.lowerdir); in ovl_free_fs()
247 kfree(ofs->config.upperdir); in ovl_free_fs()
248 kfree(ofs->config.workdir); in ovl_free_fs()
249 kfree(ofs->config.redirect_mode); in ovl_free_fs()
250 if (ofs->creator_cred) in ovl_free_fs()
251 put_cred(ofs->creator_cred); in ovl_free_fs()
257 struct ovl_fs *ofs = sb->s_fs_info; in ovl_put_super()
265 struct ovl_fs *ofs = sb->s_fs_info; in ovl_sync_fs()
276 errseq_set(&sb->s_wb_err, -EIO); in ovl_sync_fs()
277 return -EIO; in ovl_sync_fs()
294 upper_sb = ovl_upper_mnt(ofs)->mnt_sb; in ovl_sync_fs()
296 down_read(&upper_sb->s_umount); in ovl_sync_fs()
298 up_read(&upper_sb->s_umount); in ovl_sync_fs()
313 struct ovl_fs *ofs = dentry->d_sb->s_fs_info; in ovl_statfs()
314 struct dentry *root_dentry = dentry->d_sb->s_root; in ovl_statfs()
322 buf->f_namelen = ofs->namelen; in ovl_statfs()
323 buf->f_type = OVERLAYFS_SUPER_MAGIC; in ovl_statfs()
332 return (!ovl_upper_mnt(ofs) || !ofs->workdir); in ovl_force_readonly()
361 struct super_block *sb = dentry->d_sb; in ovl_show_options()
362 struct ovl_fs *ofs = sb->s_fs_info; in ovl_show_options()
364 seq_show_option(m, "lowerdir", ofs->config.lowerdir); in ovl_show_options()
365 if (ofs->config.upperdir) { in ovl_show_options()
366 seq_show_option(m, "upperdir", ofs->config.upperdir); in ovl_show_options()
367 seq_show_option(m, "workdir", ofs->config.workdir); in ovl_show_options()
369 if (ofs->config.default_permissions) in ovl_show_options()
371 if (strcmp(ofs->config.redirect_mode, ovl_redirect_mode_def()) != 0) in ovl_show_options()
372 seq_printf(m, ",redirect_dir=%s", ofs->config.redirect_mode); in ovl_show_options()
373 if (ofs->config.index != ovl_index_def) in ovl_show_options()
374 seq_printf(m, ",index=%s", ofs->config.index ? "on" : "off"); in ovl_show_options()
375 if (!ofs->config.uuid) in ovl_show_options()
377 if (ofs->config.nfs_export != ovl_nfs_export_def) in ovl_show_options()
378 seq_printf(m, ",nfs_export=%s", ofs->config.nfs_export ? in ovl_show_options()
380 if (ofs->config.xino != ovl_xino_def() && !ovl_same_fs(sb)) in ovl_show_options()
381 seq_printf(m, ",xino=%s", ovl_xino_str[ofs->config.xino]); in ovl_show_options()
382 if (ofs->config.metacopy != ovl_metacopy_def) in ovl_show_options()
384 ofs->config.metacopy ? "on" : "off"); in ovl_show_options()
385 if (ofs->config.ovl_volatile) in ovl_show_options()
387 if (ofs->config.userxattr) in ovl_show_options()
394 struct ovl_fs *ofs = sb->s_fs_info; in ovl_remount()
399 return -EROFS; in ovl_remount()
402 upper_sb = ovl_upper_mnt(ofs)->mnt_sb; in ovl_remount()
404 down_read(&upper_sb->s_umount); in ovl_remount()
406 up_read(&upper_sb->s_umount); in ovl_remount()
495 config->redirect_dir = true; in ovl_parse_redirect_mode()
500 config->redirect_follow = true; in ovl_parse_redirect_mode()
502 config->redirect_follow = true; in ovl_parse_redirect_mode()
505 config->redirect_follow = true; in ovl_parse_redirect_mode()
509 return -EINVAL; in ovl_parse_redirect_mode()
522 config->redirect_mode = kstrdup(ovl_redirect_mode_def(), GFP_KERNEL); in ovl_parse_opt()
523 if (!config->redirect_mode) in ovl_parse_opt()
524 return -ENOMEM; in ovl_parse_opt()
535 case OPT_UPPERDIR: in ovl_parse_opt()
536 kfree(config->upperdir); in ovl_parse_opt()
537 config->upperdir = match_strdup(&args[0]); in ovl_parse_opt()
538 if (!config->upperdir) in ovl_parse_opt()
539 return -ENOMEM; in ovl_parse_opt()
542 case OPT_LOWERDIR: in ovl_parse_opt()
543 kfree(config->lowerdir); in ovl_parse_opt()
544 config->lowerdir = match_strdup(&args[0]); in ovl_parse_opt()
545 if (!config->lowerdir) in ovl_parse_opt()
546 return -ENOMEM; in ovl_parse_opt()
549 case OPT_WORKDIR: in ovl_parse_opt()
550 kfree(config->workdir); in ovl_parse_opt()
551 config->workdir = match_strdup(&args[0]); in ovl_parse_opt()
552 if (!config->workdir) in ovl_parse_opt()
553 return -ENOMEM; in ovl_parse_opt()
556 case OPT_DEFAULT_PERMISSIONS: in ovl_parse_opt()
557 config->default_permissions = true; in ovl_parse_opt()
560 case OPT_REDIRECT_DIR: in ovl_parse_opt()
561 kfree(config->redirect_mode); in ovl_parse_opt()
562 config->redirect_mode = match_strdup(&args[0]); in ovl_parse_opt()
563 if (!config->redirect_mode) in ovl_parse_opt()
564 return -ENOMEM; in ovl_parse_opt()
568 case OPT_INDEX_ON: in ovl_parse_opt()
569 config->index = true; in ovl_parse_opt()
573 case OPT_INDEX_OFF: in ovl_parse_opt()
574 config->index = false; in ovl_parse_opt()
578 case OPT_UUID_ON: in ovl_parse_opt()
579 config->uuid = true; in ovl_parse_opt()
582 case OPT_UUID_OFF: in ovl_parse_opt()
583 config->uuid = false; in ovl_parse_opt()
586 case OPT_NFS_EXPORT_ON: in ovl_parse_opt()
587 config->nfs_export = true; in ovl_parse_opt()
591 case OPT_NFS_EXPORT_OFF: in ovl_parse_opt()
592 config->nfs_export = false; in ovl_parse_opt()
596 case OPT_XINO_ON: in ovl_parse_opt()
597 config->xino = OVL_XINO_ON; in ovl_parse_opt()
600 case OPT_XINO_OFF: in ovl_parse_opt()
601 config->xino = OVL_XINO_OFF; in ovl_parse_opt()
604 case OPT_XINO_AUTO: in ovl_parse_opt()
605 config->xino = OVL_XINO_AUTO; in ovl_parse_opt()
608 case OPT_METACOPY_ON: in ovl_parse_opt()
609 config->metacopy = true; in ovl_parse_opt()
613 case OPT_METACOPY_OFF: in ovl_parse_opt()
614 config->metacopy = false; in ovl_parse_opt()
618 case OPT_VOLATILE: in ovl_parse_opt()
619 config->ovl_volatile = true; in ovl_parse_opt()
622 case OPT_USERXATTR: in ovl_parse_opt()
623 config->userxattr = true; in ovl_parse_opt()
629 return -EINVAL; in ovl_parse_opt()
633 /* Workdir/index are useless in non-upper mount */ in ovl_parse_opt()
634 if (!config->upperdir) { in ovl_parse_opt()
635 if (config->workdir) { in ovl_parse_opt()
636 pr_info("option \"workdir=%s\" is useless in a non-upper mount, ignore\n", in ovl_parse_opt()
637 config->workdir); in ovl_parse_opt()
638 kfree(config->workdir); in ovl_parse_opt()
639 config->workdir = NULL; in ovl_parse_opt()
641 if (config->index && index_opt) { in ovl_parse_opt()
642 pr_info("option \"index=on\" is useless in a non-upper mount, ignore\n"); in ovl_parse_opt()
645 config->index = false; in ovl_parse_opt()
648 if (!config->upperdir && config->ovl_volatile) { in ovl_parse_opt()
649 pr_info("option \"volatile\" is meaningless in a non-upper mount, ignoring it.\n"); in ovl_parse_opt()
650 config->ovl_volatile = false; in ovl_parse_opt()
653 err = ovl_parse_redirect_mode(config, config->redirect_mode); in ovl_parse_opt()
659 * difference, since config->redirect_dir is only used for upper. in ovl_parse_opt()
661 if (!config->upperdir && config->redirect_follow) in ovl_parse_opt()
662 config->redirect_dir = true; in ovl_parse_opt()
664 /* Resolve metacopy -> redirect_dir dependency */ in ovl_parse_opt()
665 if (config->metacopy && !config->redirect_dir) { in ovl_parse_opt()
668 config->redirect_mode); in ovl_parse_opt()
669 return -EINVAL; in ovl_parse_opt()
677 config->redirect_mode); in ovl_parse_opt()
678 config->metacopy = false; in ovl_parse_opt()
681 config->redirect_follow = config->redirect_dir = true; in ovl_parse_opt()
685 /* Resolve nfs_export -> index dependency */ in ovl_parse_opt()
686 if (config->nfs_export && !config->index) { in ovl_parse_opt()
687 if (!config->upperdir && config->redirect_follow) { in ovl_parse_opt()
688 …pr_info("NFS export requires \"redirect_dir=nofollow\" on non-upper mount, falling back to nfs_exp… in ovl_parse_opt()
689 config->nfs_export = false; in ovl_parse_opt()
692 return -EINVAL; in ovl_parse_opt()
699 config->nfs_export = false; in ovl_parse_opt()
702 config->index = true; in ovl_parse_opt()
706 /* Resolve nfs_export -> !metacopy dependency */ in ovl_parse_opt()
707 if (config->nfs_export && config->metacopy) { in ovl_parse_opt()
710 return -EINVAL; in ovl_parse_opt()
718 config->nfs_export = false; in ovl_parse_opt()
725 config->metacopy = false; in ovl_parse_opt()
730 /* Resolve userxattr -> !redirect && !metacopy dependency */ in ovl_parse_opt()
731 if (config->userxattr) { in ovl_parse_opt()
732 if (config->redirect_follow && redirect_opt) { in ovl_parse_opt()
734 config->redirect_mode); in ovl_parse_opt()
735 return -EINVAL; in ovl_parse_opt()
737 if (config->metacopy && metacopy_opt) { in ovl_parse_opt()
739 return -EINVAL; in ovl_parse_opt()
747 config->redirect_dir = config->redirect_follow = false; in ovl_parse_opt()
748 config->metacopy = false; in ovl_parse_opt()
760 struct inode *dir = ofs->workbasedir->d_inode; in ovl_workdir_create()
768 work = ovl_lookup_upper(ofs, name, ofs->workbasedir, strlen(name)); in ovl_workdir_create()
776 if (work->d_inode) { in ovl_workdir_create()
777 err = -EEXIST; in ovl_workdir_create()
787 if (err == -EINVAL) { in ovl_workdir_create()
799 err = -EINVAL; in ovl_workdir_create()
807 * b) -ENODATA (there was no POSIX ACL xattr) in ovl_workdir_create()
808 * c) -EOPNOTSUPP (POSIX ACL xattrs are not supported) in ovl_workdir_create()
811 * mean that the xattr doesn't exist (e.g. -ERANGE is returned in ovl_workdir_create()
818 if (err && err != -ENODATA && err != -EOPNOTSUPP) in ovl_workdir_create()
823 if (err && err != -ENODATA && err != -EOPNOTSUPP) in ovl_workdir_create()
827 inode_lock(work->d_inode); in ovl_workdir_create()
829 inode_unlock(work->d_inode); in ovl_workdir_create()
843 pr_warn("failed to create directory %s/%s (errno: %i); mounting read-only\n", in ovl_workdir_create()
844 ofs->config.workdir, name, -err); in ovl_workdir_create()
864 int err = -EINVAL; in ovl_mount_dir_noesc()
875 err = -EINVAL; in ovl_mount_dir_noesc()
876 if (ovl_dentry_weird(path->dentry)) { in ovl_mount_dir_noesc()
880 if (!d_is_dir(path->dentry)) { in ovl_mount_dir_noesc()
894 int err = -ENOMEM; in ovl_mount_dir()
901 if (!err && path->dentry->d_flags & DCACHE_OP_REAL) { in ovl_mount_dir()
905 err = -EINVAL; in ovl_mount_dir()
921 ofs->namelen = max(ofs->namelen, statfs.f_namelen); in ovl_check_namelen()
940 *stack_depth = max(*stack_depth, path->mnt->mnt_sb->s_stack_depth); in ovl_lower_dir()
946 fh_type = ovl_can_decode_fh(path->dentry->d_sb); in ovl_lower_dir()
947 if ((ofs->config.nfs_export || in ovl_lower_dir()
948 (ofs->config.index && ofs->config.upperdir)) && !fh_type) { in ovl_lower_dir()
949 ofs->config.index = false; in ovl_lower_dir()
950 ofs->config.nfs_export = false; in ovl_lower_dir()
958 if (ofs->config.xino == OVL_XINO_AUTO && in ovl_lower_dir()
959 ofs->config.upperdir && !fh_type) { in ovl_lower_dir()
960 ofs->config.xino = OVL_XINO_OFF; in ovl_lower_dir()
965 /* Check if lower fs has 32bit inode numbers */ in ovl_lower_dir()
967 ofs->xino_mode = -1; in ovl_lower_dir()
1009 return ovl_xattr_get(dentry, inode, handler->name, buffer, size); in ovl_posix_acl_xattr_get()
1024 /* Check that everything is OK before copy-up */ in ovl_posix_acl_xattr_set()
1037 * enough to start the copy-up. in ovl_posix_acl_xattr_set()
1043 err = -EOPNOTSUPP; in ovl_posix_acl_xattr_set()
1046 if (!realinode->i_op->set_acl) in ovl_posix_acl_xattr_set()
1048 if (handler->flags == ACL_TYPE_DEFAULT && !S_ISDIR(inode->i_mode)) { in ovl_posix_acl_xattr_set()
1049 err = acl ? -EACCES : 0; in ovl_posix_acl_xattr_set()
1052 err = -EPERM; in ovl_posix_acl_xattr_set()
1062 if (unlikely(inode->i_mode & S_ISGID) && in ovl_posix_acl_xattr_set()
1063 handler->flags == ACL_TYPE_ACCESS && in ovl_posix_acl_xattr_set()
1064 !in_group_p(inode->i_gid) && in ovl_posix_acl_xattr_set()
1073 err = ovl_xattr_set(dentry, inode, handler->name, value, size, flags); in ovl_posix_acl_xattr_set()
1085 return -EOPNOTSUPP; in ovl_own_xattr_get()
1094 return -EOPNOTSUPP; in ovl_own_xattr_set()
1176 if (err == -ELOOP) in ovl_setup_trap()
1189 * attempted to be used as a lower layer in a new overlay mount.
1193 if (ofs->config.index) { in ovl_report_in_use()
1194 …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()
1196 return -EBUSY; in ovl_report_in_use()
1198 …pr_warn("%s is in-use as upperdir/workdir of another mount, accessing files from both mounts will … in ovl_report_in_use()
1210 err = ovl_mount_dir(ofs->config.upperdir, upperpath); in ovl_get_upper()
1215 if (__mnt_is_readonly(upperpath->mnt)) { in ovl_get_upper()
1216 pr_err("upper fs is r/o, try multi-lower layers mount\n"); in ovl_get_upper()
1217 err = -EINVAL; in ovl_get_upper()
1221 err = ovl_check_namelen(upperpath, ofs, ofs->config.upperdir); in ovl_get_upper()
1225 err = ovl_setup_trap(sb, upperpath->dentry, &upper_layer->trap, in ovl_get_upper()
1238 upper_mnt->mnt_flags &= ~(MNT_NOATIME | MNT_NODIRATIME | MNT_RELATIME); in ovl_get_upper()
1239 upper_layer->mnt = upper_mnt; in ovl_get_upper()
1240 upper_layer->idx = 0; in ovl_get_upper()
1241 upper_layer->fsid = 0; in ovl_get_upper()
1248 * okay because we don't yet have guarantees in that case, but it will in ovl_get_upper()
1252 if (upper_mnt->mnt_sb->s_flags & SB_NOSEC) in ovl_get_upper()
1253 sb->s_flags |= SB_NOSEC; in ovl_get_upper()
1255 if (ovl_inuse_trylock(ovl_upper_mnt(ofs)->mnt_root)) { in ovl_get_upper()
1256 ofs->upperdir_locked = true; in ovl_get_upper()
1274 struct dentry *workdir = ofs->workdir; in ovl_check_rename_whiteout()
1296 /* Name is inline and stable - using snapshot as a copy helper */ in ovl_check_rename_whiteout()
1300 if (err == -EINVAL) in ovl_check_rename_whiteout()
1336 inode_lock_nested(parent->d_inode, I_MUTEX_PARENT); in ovl_lookup_or_create()
1338 if (!IS_ERR(child) && !child->d_inode) in ovl_lookup_or_create()
1339 child = ovl_create_real(ofs, parent->d_inode, child, in ovl_lookup_or_create()
1341 inode_unlock(parent->d_inode); in ovl_lookup_or_create()
1354 struct dentry *d = dget(ofs->workbasedir); in ovl_create_volatile_dirty()
1360 for (ctr = ARRAY_SIZE(volatile_path); ctr; ctr--, name++) { in ovl_create_volatile_dirty()
1389 ofs->workdir = workdir; in ovl_make_workdir()
1391 err = ovl_setup_trap(sb, ofs->workdir, &ofs->workdir_trap, "workdir"); in ovl_make_workdir()
1410 tmpfile = ovl_do_tmpfile(ofs, ofs->workdir, S_IFREG | 0); in ovl_make_workdir()
1411 ofs->tmpfile = !IS_ERR(tmpfile); in ovl_make_workdir()
1412 if (ofs->tmpfile) in ovl_make_workdir()
1430 err = ovl_setxattr(ofs, ofs->workdir, OVL_XATTR_OPAQUE, "0", 1); in ovl_make_workdir()
1433 ofs->noxattr = true; in ovl_make_workdir()
1434 if (ofs->config.index || ofs->config.metacopy) { in ovl_make_workdir()
1435 ofs->config.index = false; in ovl_make_workdir()
1436 ofs->config.metacopy = false; in ovl_make_workdir()
1443 if (ofs->config.xino == OVL_XINO_AUTO) { in ovl_make_workdir()
1444 ofs->config.xino = OVL_XINO_OFF; in ovl_make_workdir()
1447 if (err == -EPERM && !ofs->config.userxattr) in ovl_make_workdir()
1451 ovl_removexattr(ofs, ofs->workdir, OVL_XATTR_OPAQUE); in ovl_make_workdir()
1455 * We allowed sub-optimal upper fs configuration and don't want to break in ovl_make_workdir()
1459 if (ovl_dentry_remote(ofs->workdir) && in ovl_make_workdir()
1460 (!d_type || !rename_whiteout || ofs->noxattr)) { in ovl_make_workdir()
1462 err = -EINVAL; in ovl_make_workdir()
1470 if (ofs->config.ovl_volatile) { in ovl_make_workdir()
1479 fh_type = ovl_can_decode_fh(ofs->workdir->d_sb); in ovl_make_workdir()
1480 if (ofs->config.index && !fh_type) { in ovl_make_workdir()
1481 ofs->config.index = false; in ovl_make_workdir()
1487 ofs->xino_mode = -1; in ovl_make_workdir()
1490 if (ofs->config.nfs_export && !ofs->config.index) { in ovl_make_workdir()
1492 ofs->config.nfs_export = false; in ovl_make_workdir()
1505 err = ovl_mount_dir(ofs->config.workdir, &workpath); in ovl_get_workdir()
1509 err = -EINVAL; in ovl_get_workdir()
1510 if (upperpath->mnt != workpath.mnt) { in ovl_get_workdir()
1514 if (!ovl_workdir_ok(workpath.dentry, upperpath->dentry)) { in ovl_get_workdir()
1519 ofs->workbasedir = dget(workpath.dentry); in ovl_get_workdir()
1521 if (ovl_inuse_trylock(ofs->workbasedir)) { in ovl_get_workdir()
1522 ofs->workdir_locked = true; in ovl_get_workdir()
1529 err = ovl_setup_trap(sb, ofs->workbasedir, &ofs->workbasedir_trap, in ovl_get_workdir()
1553 /* Verify lower root is upper root origin */ in ovl_get_indexdir()
1554 err = ovl_verify_origin(ofs, upperpath->dentry, in ovl_get_indexdir()
1555 oe->lowerstack[0].dentry, true); in ovl_get_indexdir()
1562 iput(ofs->workdir_trap); in ovl_get_indexdir()
1563 ofs->workdir_trap = NULL; in ovl_get_indexdir()
1564 dput(ofs->workdir); in ovl_get_indexdir()
1565 ofs->workdir = NULL; in ovl_get_indexdir()
1570 ofs->indexdir = indexdir; in ovl_get_indexdir()
1571 ofs->workdir = dget(indexdir); in ovl_get_indexdir()
1573 err = ovl_setup_trap(sb, ofs->indexdir, &ofs->indexdir_trap, in ovl_get_indexdir()
1582 * upper dir file handle. In any case, verify or set xattr in ovl_get_indexdir()
1586 if (ovl_check_origin_xattr(ofs, ofs->indexdir)) { in ovl_get_indexdir()
1587 err = ovl_verify_set_fh(ofs, ofs->indexdir, in ovl_get_indexdir()
1589 upperpath->dentry, true, false); in ovl_get_indexdir()
1593 err = ovl_verify_upper(ofs, ofs->indexdir, upperpath->dentry, in ovl_get_indexdir()
1602 if (err || !ofs->indexdir) in ovl_get_indexdir()
1603 pr_warn("try deleting index dir or mounting with '-o index=off' to disable inodes index.\n"); in ovl_get_indexdir()
1614 if (!ofs->config.nfs_export && !ovl_upper_mnt(ofs)) in ovl_lower_uuid_ok()
1618 * We allow using single lower with null uuid for index and nfs_export in ovl_lower_uuid_ok()
1619 * for example to support those features with single lower squashfs. in ovl_lower_uuid_ok()
1620 * To avoid regressions in setups of overlay with re-formatted lower in ovl_lower_uuid_ok()
1621 * squashfs, do not allow decoding origin with lower null uuid unless in ovl_lower_uuid_ok()
1622 * user opted-in to one of the new features that require following the in ovl_lower_uuid_ok()
1623 * lower inode of non-dir upper. in ovl_lower_uuid_ok()
1628 for (i = 0; i < ofs->numfs; i++) { in ovl_lower_uuid_ok()
1630 * We use uuid to associate an overlay lower file handle with a in ovl_lower_uuid_ok()
1631 * lower layer, so we can accept lower fs with null uuid as long in ovl_lower_uuid_ok()
1632 * as all lower layers with null uuid are on the same fs. in ovl_lower_uuid_ok()
1633 * if we detect multiple lower fs with the same uuid, we in ovl_lower_uuid_ok()
1634 * disable lower file handle decoding on all of them. in ovl_lower_uuid_ok()
1636 if (ofs->fs[i].is_lower && in ovl_lower_uuid_ok()
1637 uuid_equal(&ofs->fs[i].sb->s_uuid, uuid)) { in ovl_lower_uuid_ok()
1638 ofs->fs[i].bad_uuid = true; in ovl_lower_uuid_ok()
1648 struct super_block *sb = path->mnt->mnt_sb; in ovl_get_fsid()
1655 for (i = 0; i < ofs->numfs; i++) { in ovl_get_fsid()
1656 if (ofs->fs[i].sb == sb) in ovl_get_fsid()
1660 if (!ovl_lower_uuid_ok(ofs, &sb->s_uuid)) { in ovl_get_fsid()
1662 if (ofs->config.xino == OVL_XINO_AUTO) { in ovl_get_fsid()
1663 ofs->config.xino = OVL_XINO_OFF; in ovl_get_fsid()
1666 if (ofs->config.index || ofs->config.nfs_export) { in ovl_get_fsid()
1667 ofs->config.index = false; in ovl_get_fsid()
1668 ofs->config.nfs_export = false; in ovl_get_fsid()
1672 …pr_warn("%s uuid detected in lower fs '%pd2', falling back to xino=%s,index=off,nfs_export=off.\n", in ovl_get_fsid()
1673 uuid_is_null(&sb->s_uuid) ? "null" : in ovl_get_fsid()
1675 path->dentry, ovl_xino_str[ofs->config.xino]); in ovl_get_fsid()
1685 ofs->fs[ofs->numfs].sb = sb; in ovl_get_fsid()
1686 ofs->fs[ofs->numfs].pseudo_dev = dev; in ovl_get_fsid()
1687 ofs->fs[ofs->numfs].bad_uuid = bad_uuid; in ovl_get_fsid()
1689 return ofs->numfs++; in ovl_get_fsid()
1699 err = -ENOMEM; in ovl_get_layers()
1700 ofs->fs = kcalloc(numlower + 1, sizeof(struct ovl_sb), GFP_KERNEL); in ovl_get_layers()
1701 if (ofs->fs == NULL) in ovl_get_layers()
1704 /* idx/fsid 0 are reserved for upper fs even with lower only overlay */ in ovl_get_layers()
1705 ofs->numfs++; in ovl_get_layers()
1708 * All lower layers that share the same fs as upper layer, use the same in ovl_get_layers()
1709 * pseudo_dev as upper layer. Allocate fs[0].pseudo_dev even for lower in ovl_get_layers()
1711 * is_lower will be set if upper fs is shared with a lower layer. in ovl_get_layers()
1713 err = get_anon_bdev(&ofs->fs[0].pseudo_dev); in ovl_get_layers()
1720 ofs->fs[0].sb = ovl_upper_mnt(ofs)->mnt_sb; in ovl_get_layers()
1721 ofs->fs[0].is_lower = false; in ovl_get_layers()
1734 * Check if lower root conflicts with this overlay layers before in ovl_get_layers()
1735 * checking if it is in-use as upperdir/workdir of "another" in ovl_get_layers()
1737 * the upperdir/workdir is in fact in-use by our in ovl_get_layers()
1761 * Make lower layers R/O. That way fchmod/fchown on lower file in ovl_get_layers()
1762 * will fail instead of modifying lower fs. in ovl_get_layers()
1764 mnt->mnt_flags |= MNT_READONLY | MNT_NOATIME; in ovl_get_layers()
1766 layers[ofs->numlayer].trap = trap; in ovl_get_layers()
1767 layers[ofs->numlayer].mnt = mnt; in ovl_get_layers()
1768 layers[ofs->numlayer].idx = ofs->numlayer; in ovl_get_layers()
1769 layers[ofs->numlayer].fsid = fsid; in ovl_get_layers()
1770 layers[ofs->numlayer].fs = &ofs->fs[fsid]; in ovl_get_layers()
1771 ofs->numlayer++; in ovl_get_layers()
1772 ofs->fs[fsid].is_lower = true; in ovl_get_layers()
1784 if (ofs->numfs - !ovl_upper_mnt(ofs) == 1) { in ovl_get_layers()
1785 if (ofs->config.xino == OVL_XINO_ON) in ovl_get_layers()
1787 ofs->xino_mode = 0; in ovl_get_layers()
1788 } else if (ofs->config.xino == OVL_XINO_OFF) { in ovl_get_layers()
1789 ofs->xino_mode = -1; in ovl_get_layers()
1790 } else if (ofs->xino_mode < 0) { in ovl_get_layers()
1794 * lower only overlay) +1 extra bit is reserved for the non in ovl_get_layers()
1796 * xino lower bits overflow. in ovl_get_layers()
1799 ofs->xino_mode = ilog2(ofs->numfs - 1) + 2; in ovl_get_layers()
1802 if (ofs->xino_mode > 0) { in ovl_get_layers()
1804 ofs->xino_mode); in ovl_get_layers()
1813 const char *lower, unsigned int numlower, in ovl_get_lowerstack() argument
1821 if (!ofs->config.upperdir && numlower == 1) { in ovl_get_lowerstack()
1823 return ERR_PTR(-EINVAL); in ovl_get_lowerstack()
1828 return ERR_PTR(-ENOMEM); in ovl_get_lowerstack()
1830 err = -EINVAL; in ovl_get_lowerstack()
1832 err = ovl_lower_dir(lower, &stack[i], ofs, &sb->s_stack_depth); in ovl_get_lowerstack()
1836 lower = strchr(lower, '\0') + 1; in ovl_get_lowerstack()
1839 err = -EINVAL; in ovl_get_lowerstack()
1840 sb->s_stack_depth++; in ovl_get_lowerstack()
1841 if (sb->s_stack_depth > FILESYSTEM_MAX_STACK_DEPTH) { in ovl_get_lowerstack()
1850 err = -ENOMEM; in ovl_get_lowerstack()
1856 oe->lowerstack[i].dentry = dget(stack[i].dentry); in ovl_get_lowerstack()
1857 oe->lowerstack[i].layer = &ofs->layers[i+1]; in ovl_get_lowerstack()
1874 * - another layer of this overlayfs instance
1875 * - upper/work dir of any overlayfs instance
1892 err = -ELOOP; in ovl_check_layer()
1916 err = ovl_check_layer(sb, ofs, ovl_upper_mnt(ofs)->mnt_root, in ovl_check_overlapping_layers()
1925 * workbasedir. In that case, we already have their traps in in ovl_check_overlapping_layers()
1926 * inode cache and we will catch that case on lookup. in ovl_check_overlapping_layers()
1928 err = ovl_check_layer(sb, ofs, ofs->workbasedir, "workdir", in ovl_check_overlapping_layers()
1934 for (i = 1; i < ofs->numlayer; i++) { in ovl_check_overlapping_layers()
1936 ofs->layers[i].mnt->mnt_root, in ovl_check_overlapping_layers()
1950 struct ovl_path *lowerpath = &oe->lowerstack[0]; in ovl_get_root()
1951 unsigned long ino = d_inode(lowerpath->dentry)->i_ino; in ovl_get_root()
1952 int fsid = lowerpath->layer->fsid; in ovl_get_root()
1962 root->d_fsdata = oe; in ovl_get_root()
1966 ino = d_inode(upperdentry)->i_ino; in ovl_get_root()
1973 /* Root is always merge -> can have whiteouts */ in ovl_get_root()
1995 err = -EIO; in ovl_fill_super()
1996 if (WARN_ON(sb->s_user_ns != current_user_ns())) in ovl_fill_super()
1999 sb->s_d_op = &ovl_dentry_operations; in ovl_fill_super()
2001 err = -ENOMEM; in ovl_fill_super()
2006 err = -ENOMEM; in ovl_fill_super()
2007 ofs->creator_cred = cred = prepare_creds(); in ovl_fill_super()
2012 ofs->share_whiteout = true; in ovl_fill_super()
2014 ofs->config.index = ovl_index_def; in ovl_fill_super()
2015 ofs->config.uuid = true; in ovl_fill_super()
2016 ofs->config.nfs_export = ovl_nfs_export_def; in ovl_fill_super()
2017 ofs->config.xino = ovl_xino_def(); in ovl_fill_super()
2018 ofs->config.metacopy = ovl_metacopy_def; in ovl_fill_super()
2019 err = ovl_parse_opt((char *) data, &ofs->config); in ovl_fill_super()
2023 err = -EINVAL; in ovl_fill_super()
2024 if (!ofs->config.lowerdir) { in ovl_fill_super()
2030 err = -ENOMEM; in ovl_fill_super()
2031 splitlower = kstrdup(ofs->config.lowerdir, GFP_KERNEL); in ovl_fill_super()
2035 err = -EINVAL; in ovl_fill_super()
2038 pr_err("too many lower directories, limit is %d\n", in ovl_fill_super()
2043 err = -ENOMEM; in ovl_fill_super()
2048 ofs->layers = layers; in ovl_fill_super()
2050 ofs->numlayer = 1; in ovl_fill_super()
2052 sb->s_stack_depth = 0; in ovl_fill_super()
2053 sb->s_maxbytes = MAX_LFS_FILESIZE; in ovl_fill_super()
2054 atomic_long_set(&ofs->last_ino, 1); in ovl_fill_super()
2056 if (ofs->config.xino != OVL_XINO_OFF) { in ovl_fill_super()
2057 ofs->xino_mode = BITS_PER_LONG - 32; in ovl_fill_super()
2058 if (!ofs->xino_mode) { in ovl_fill_super()
2060 ofs->config.xino = OVL_XINO_OFF; in ovl_fill_super()
2065 sb->s_op = &ovl_super_operations; in ovl_fill_super()
2067 if (ofs->config.upperdir) { in ovl_fill_super()
2070 err = -EINVAL; in ovl_fill_super()
2071 if (!ofs->config.workdir) { in ovl_fill_super()
2080 upper_sb = ovl_upper_mnt(ofs)->mnt_sb; in ovl_fill_super()
2082 ofs->errseq = errseq_sample(&upper_sb->s_wb_err); in ovl_fill_super()
2083 if (errseq_check(&upper_sb->s_wb_err, ofs->errseq)) { in ovl_fill_super()
2084 err = -EIO; in ovl_fill_super()
2094 if (!ofs->workdir) in ovl_fill_super()
2095 sb->s_flags |= SB_RDONLY; in ovl_fill_super()
2097 sb->s_stack_depth = upper_sb->s_stack_depth; in ovl_fill_super()
2098 sb->s_time_gran = upper_sb->s_time_gran; in ovl_fill_super()
2107 sb->s_flags |= SB_RDONLY; in ovl_fill_super()
2109 if (!ofs->config.uuid && ofs->numfs > 1) { in ovl_fill_super()
2110 pr_warn("The uuid=off requires a single fs for lower and upper, falling back to uuid=on.\n"); in ovl_fill_super()
2111 ofs->config.uuid = true; in ovl_fill_super()
2114 if (!ovl_force_readonly(ofs) && ofs->config.index) { in ovl_fill_super()
2120 if (!ofs->indexdir) in ovl_fill_super()
2121 sb->s_flags |= SB_RDONLY; in ovl_fill_super()
2129 if (!ofs->indexdir) { in ovl_fill_super()
2130 ofs->config.index = false; in ovl_fill_super()
2131 if (ovl_upper_mnt(ofs) && ofs->config.nfs_export) { in ovl_fill_super()
2133 ofs->config.nfs_export = false; in ovl_fill_super()
2137 if (ofs->config.metacopy && ofs->config.nfs_export) { in ovl_fill_super()
2139 ofs->config.nfs_export = false; in ovl_fill_super()
2142 if (ofs->config.nfs_export) in ovl_fill_super()
2143 sb->s_export_op = &ovl_export_operations; in ovl_fill_super()
2146 cap_lower(cred->cap_effective, CAP_SYS_RESOURCE); in ovl_fill_super()
2148 sb->s_magic = OVERLAYFS_SUPER_MAGIC; in ovl_fill_super()
2149 sb->s_xattr = ofs->config.userxattr ? ovl_user_xattr_handlers : in ovl_fill_super()
2151 sb->s_fs_info = ofs; in ovl_fill_super()
2152 sb->s_flags |= SB_POSIXACL; in ovl_fill_super()
2153 sb->s_iflags |= SB_I_SKIP_SYNC; in ovl_fill_super()
2155 err = -ENOMEM; in ovl_fill_super()
2163 sb->s_root = root_dentry; in ovl_fill_super()
2197 inode_init_once(&oi->vfs_inode); in ovl_inode_init_once()
2210 return -ENOMEM; in ovl_init()