--- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -246,12 +246,6 @@ struct iattr { */ #include -/* - * Maximum number of layers of fs stack. Needs to be limited to - * prevent kernel stack overflow - */ -#define FILESYSTEM_MAX_STACK_DEPTH 2 - /** * enum positive_aop_returns - aop return codes with specific semantics * --- a/init/Kconfig +++ b/init/Kconfig @@ -44,6 +44,12 @@ config INIT_ENV_ARG_LIMIT Maximum of each of the number of arguments and environment variables passed to init from the kernel command line. +config FILESYSTEM_MAX_STACK_DEPTH + int "Maximum number of layers of fs stack" + default 2 + help + Maximum number of layers of fs stack. Needs to be limited to + prevent kernel stack overflow. Set to 0 for no limit. config CROSS_COMPILE string "Cross-compiler tool prefix" --- a/fs/ecryptfs/main.c +++ b/fs/ecryptfs/main.c @@ -568,8 +568,9 @@ static struct dentry *ecryptfs_mount(str s->s_magic = ECRYPTFS_SUPER_MAGIC; s->s_stack_depth = path.dentry->d_sb->s_stack_depth + 1; - rc = -EINVAL; - if (s->s_stack_depth > FILESYSTEM_MAX_STACK_DEPTH) { + if (CONFIG_FILESYSTEM_MAX_STACK_DEPTH > 0 && + s->s_stack_depth > CONFIG_FILESYSTEM_MAX_STACK_DEPTH) { + rc = -EINVAL; pr_err("eCryptfs: maximum fs stacking depth exceeded\n"); goto out_free; } --- a/fs/overlayfs/super.c +++ b/fs/overlayfs/super.c @@ -818,7 +818,8 @@ static int ovl_fill_super(struct super_b } err = -EINVAL; - if (sb->s_stack_depth > FILESYSTEM_MAX_STACK_DEPTH) { + if (CONFIG_FILESYSTEM_MAX_STACK_DEPTH > 0 && + sb->s_stack_depth > CONFIG_FILESYSTEM_MAX_STACK_DEPTH) { pr_err("overlayfs: maximum fs stacking depth exceeded\n"); goto out_put_lowerpath; }