Received: by 2002:ab2:6857:0:b0:1ef:ffd0:ce49 with SMTP id l23csp2624112lqp; Mon, 25 Mar 2024 04:57:34 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCVtAC3ci2KSmqliIrvo+uQAfJgwlwC4Vx+qANm49uKkPGlzRhPcl4WLUfTWiwsizDJ7i49l/lTa9bzgr23oqxMQFE3FHks1VY5eunM5PQ== X-Google-Smtp-Source: AGHT+IG7Zt6B7NUh0Rx07mO9kIfwiCXA/WR5IfAJX90tV1Ti1S64cbellWFyG6TeP510J//Nly/A X-Received: by 2002:a92:c10c:0:b0:368:976d:bd62 with SMTP id p12-20020a92c10c000000b00368976dbd62mr938789ile.27.1711367854351; Mon, 25 Mar 2024 04:57:34 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1711367854; cv=pass; d=google.com; s=arc-20160816; b=FzmKgYn81YT9d3dgdKoDFrN88rDM7RKQn2TMcodoNWSZAly5BBXj/dp5B98lqTFRsI +N3JY0K4r/7eQYoPNrqDbV1nCiQGBYL+HJvv8+0T7TrzG+i1XrF3Qa5JzEGrvpfBsQ9O yKgpDVxb6O4mM4rt7d1yXmKUosH/DfMKGf6Saxyu9qrf0loRx+3FBwj9MavF6c9cXJkO ruQiuvWoSkG5kjCfB52bP9BpHBNsLnaIh0brtlt83b1EXzOyD3+WwotdkgGhvJIXwDxX oknH+cggIsA9CEn4VmMq9k62j1FJtJ+ZxnApHcNQMOcZMTsoENv3OA4PNM4U0HNGgzKy AvLw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=MDR1oe5fmcZRWR4g+TP9SxR/QkIeT9zl3fJ0FrFctfk=; fh=zdqoZmlFwoXOCX2AUHmG4ftOBWyAWMiQMi270G6ybK8=; b=ddOOT5d+v8BpNmw+pnaKUgr6zq4+IXBu7r5R4i1Z648ogytR2kh4RCZ0PycfkRcRmD y9EbgbxWqEIzGJkUwthyhMeNLifsV5USpYDVa0IAS0mA9Q9OeC42w4trhaEWxJHU8J5h IY5OvVEiAnVXEqK2ITrDFGA4V1EIQVPbIHI9g6u7HFO9gbGrtl/GmTfP5upe/o11WpJM 23xLgsMr2mtWCos9EEgeU5uEY2zabby0wcvqCwm8zvcZqmGRQYQgfGvhhEDpGZO0elwv PD+6K+g/3vlZ27vIvyzXvcOyOxEHqLdPa568GD6hcVVfRcJ0aJHPX7WmQdhaSvOHH+0x H0GQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=qrfziV1O; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-115610-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) smtp.mailfrom="linux-kernel+bounces-115610-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [147.75.48.161]) by mx.google.com with ESMTPS id u15-20020a63234f000000b005dc41265c15si7548433pgm.658.2024.03.25.04.57.33 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 Mar 2024 04:57:34 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-115610-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) client-ip=147.75.48.161; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=qrfziV1O; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-115610-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) smtp.mailfrom="linux-kernel+bounces-115610-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id DFD6BB2EE28 for ; Mon, 25 Mar 2024 11:29:00 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id C76ED1FF7B4; Mon, 25 Mar 2024 02:48:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="qrfziV1O" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2C2B3130AF2; Sun, 24 Mar 2024 23:02:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711321367; cv=none; b=piKbJzpu9FX3FFiKOLNYZ88gHAoT4LXLjuRkB5541nGKQI7Y6sFtOs5XciQfxhdKY8rQ8j/E+7FtgRVSpLOm1AX7cc1GUcJhBQzZlZzRtjNm89U/E2+je/m8iIkQuTvGDDvsBCOP6N4eb+5x4XK3W1Lt0mt+PoCJcJMYQ7EAVSo= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711321367; c=relaxed/simple; bh=jOC1QaG75pxY/4EBQxqMHFvdTzj7nAouj7c7sRrQpQs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GUTYQnMQNu9iWys95wzjXDLI6cpSkgwE/zbZEkG7QEZsPpaY83pNF4EXQq5muk36m88kWCdKj9q29ccLvTFqlh+9CTfmNvS5xQIZKNjSdbNx8O9yMEOyKt5dGqPgyEpgEy4eSksUaXZNKvv7K8CKd9VBS/fCs9HqCjtq4l+Iop8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=qrfziV1O; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7FB24C43390; Sun, 24 Mar 2024 23:02:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1711321366; bh=jOC1QaG75pxY/4EBQxqMHFvdTzj7nAouj7c7sRrQpQs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qrfziV1O19TwDC5Q6xHmpAqYr5/QLKNPArN+QL9JCKf4SMtMr5cpxJ6CyVXM9yoLh LnNbR5SIlrcyRJ9WVOZRJGvGJNyZ9Q1V+F+nFAaV3k8sKav2VuLdm1qqeMFMZE8syD 4yBa7TRCZsGjVHuawZenFYSGL6xklDxR9iEp6T7ijBD9zjcN+ETIraOWCvu+aF+tqF 1TiVS2FEQXK0IiVKH5D3ksdql2DZ5b2wgFq84ffn0dYNrbckDEDHBJ2uAYXTa8nBc8 xKnqrmSpkaZgknna8ja+ajKmtwYvCaAZzyra7eOCv45u6PMjklVbJgrmfcWjBmXjC4 4cmyiaVHWnhmA== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Amir Goldstein , Sasha Levin Subject: [PATCH 6.6 090/638] ovl: store and show the user provided lowerdir mount option Date: Sun, 24 Mar 2024 18:52:07 -0400 Message-ID: <20240324230116.1348576-91-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240324230116.1348576-1-sashal@kernel.org> References: <20240324230116.1348576-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit From: Amir Goldstein [ Upstream commit 0cea4c097d97fdc89de488bd4202d0b087ccec58 ] We are about to add new mount options for adding lowerdir one by one, but those mount options will not support escaping. For the existing case, where lowerdir mount option is provided as a colon separated list, store the user provided (possibly escaped) string and display it as is when showing the lowerdir mount option. Signed-off-by: Amir Goldstein Stable-dep-of: 2824083db76c ("ovl: Always reject mounting over case-insensitive directories") Signed-off-by: Sasha Levin --- fs/overlayfs/params.c | 46 +++++++++++++++++++++---------------------- fs/overlayfs/params.h | 1 + fs/overlayfs/super.c | 5 ++++- 3 files changed, 28 insertions(+), 24 deletions(-) diff --git a/fs/overlayfs/params.c b/fs/overlayfs/params.c index 0059cc405159e..0bf754a69e919 100644 --- a/fs/overlayfs/params.c +++ b/fs/overlayfs/params.c @@ -332,12 +332,18 @@ static int ovl_parse_param_upperdir(const char *name, struct fs_context *fc, return 0; } -static void ovl_parse_param_drop_lowerdir(struct ovl_fs_context *ctx) +static void ovl_reset_lowerdirs(struct ovl_fs_context *ctx) { - for (size_t nr = 0; nr < ctx->nr; nr++) { - path_put(&ctx->lower[nr].path); - kfree(ctx->lower[nr].name); - ctx->lower[nr].name = NULL; + struct ovl_fs_context_layer *l = ctx->lower; + + // Reset old user provided lowerdir string + kfree(ctx->lowerdir_all); + ctx->lowerdir_all = NULL; + + for (size_t nr = 0; nr < ctx->nr; nr++, l++) { + path_put(&l->path); + kfree(l->name); + l->name = NULL; } ctx->nr = 0; ctx->nr_data = 0; @@ -366,7 +372,7 @@ static int ovl_parse_param_lowerdir(const char *name, struct fs_context *fc) */ /* drop all existing lower layers */ - ovl_parse_param_drop_lowerdir(ctx); + ovl_reset_lowerdirs(ctx); if (!*name) return 0; @@ -376,6 +382,11 @@ static int ovl_parse_param_lowerdir(const char *name, struct fs_context *fc) return -EINVAL; } + // Store user provided lowerdir string to show in mount options + ctx->lowerdir_all = kstrdup(name, GFP_KERNEL); + if (!ctx->lowerdir_all) + return -ENOMEM; + dup = kstrdup(name, GFP_KERNEL); if (!dup) return -ENOMEM; @@ -448,7 +459,7 @@ static int ovl_parse_param_lowerdir(const char *name, struct fs_context *fc) return 0; out_put: - ovl_parse_param_drop_lowerdir(ctx); + ovl_reset_lowerdirs(ctx); out_err: kfree(dup); @@ -554,7 +565,7 @@ static int ovl_get_tree(struct fs_context *fc) static inline void ovl_fs_context_free(struct ovl_fs_context *ctx) { - ovl_parse_param_drop_lowerdir(ctx); + ovl_reset_lowerdirs(ctx); path_put(&ctx->upper); path_put(&ctx->work); kfree(ctx->lower); @@ -870,24 +881,13 @@ int ovl_show_options(struct seq_file *m, struct dentry *dentry) { struct super_block *sb = dentry->d_sb; struct ovl_fs *ofs = OVL_FS(sb); - size_t nr, nr_merged_lower = ofs->numlayer - ofs->numdatalayer; + char **lowerdirs = ofs->config.lowerdirs; /* - * lowerdirs[] starts from offset 1, then - * >= 0 regular lower layers prefixed with : and - * >= 0 data-only lower layers prefixed with :: - * - * we need to escase comma and space like seq_show_option() does and - * we also need to escape the colon separator from lowerdir paths. + * lowerdirs[0] holds the colon separated list that user provided + * with lowerdir mount option. */ - seq_puts(m, ",lowerdir="); - for (nr = 1; nr < ofs->numlayer; nr++) { - if (nr > 1) - seq_putc(m, ':'); - if (nr >= nr_merged_lower) - seq_putc(m, ':'); - seq_escape(m, ofs->config.lowerdirs[nr], ":, \t\n\\"); - } + seq_show_option(m, "lowerdir", lowerdirs[0]); if (ofs->config.upperdir) { seq_show_option(m, "upperdir", ofs->config.upperdir); seq_show_option(m, "workdir", ofs->config.workdir); diff --git a/fs/overlayfs/params.h b/fs/overlayfs/params.h index 8750da68ab2a4..c96d939820211 100644 --- a/fs/overlayfs/params.h +++ b/fs/overlayfs/params.h @@ -32,6 +32,7 @@ struct ovl_fs_context { size_t nr_data; struct ovl_opt_set set; struct ovl_fs_context_layer *lower; + char *lowerdir_all; /* user provided lowerdir string */ }; int ovl_init_fs_context(struct fs_context *fc); diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c index c71d185980c08..2c056d737c27c 100644 --- a/fs/overlayfs/super.c +++ b/fs/overlayfs/super.c @@ -1374,8 +1374,11 @@ int ovl_fill_super(struct super_block *sb, struct fs_context *fc) ofs->layers = layers; /* * Layer 0 is reserved for upper even if there's no upper. - * For consistency, config.lowerdirs[0] is NULL. + * config.lowerdirs[0] is used for storing the user provided colon + * separated lowerdir string. */ + ofs->config.lowerdirs[0] = ctx->lowerdir_all; + ctx->lowerdir_all = NULL; ofs->numlayer = 1; sb->s_stack_depth = 0; -- 2.43.0