Commit d10771d5 authored by Christian Brauner's avatar Christian Brauner

Merge patch series "ovl: simplify ovl_parse_param_lowerdir()"

Simplify and fix overlayfs layer parsing so the maximum of 500 layers
can be used.

* patches from https://lore.kernel.org/r/20240705011510.794025-1-chengzhihao1@huawei.com:
  ovl: ovl_parse_param_lowerdir: Add missed '\n' for pr_err
  ovl: fix wrong lowerdir number check for parameter Opt_lowerdir
  ovl: pass string to ovl_parse_layer()

Link: https://lore.kernel.org/r/20240705011510.794025-1-chengzhihao1@huawei.comSigned-off-by: default avatarChristian Brauner <brauner@kernel.org>
parents 996b37da 441e36ef
...@@ -353,6 +353,8 @@ static void ovl_add_layer(struct fs_context *fc, enum ovl_opt layer, ...@@ -353,6 +353,8 @@ static void ovl_add_layer(struct fs_context *fc, enum ovl_opt layer,
case Opt_datadir_add: case Opt_datadir_add:
ctx->nr_data++; ctx->nr_data++;
fallthrough; fallthrough;
case Opt_lowerdir:
fallthrough;
case Opt_lowerdir_add: case Opt_lowerdir_add:
WARN_ON(ctx->nr >= ctx->capacity); WARN_ON(ctx->nr >= ctx->capacity);
l = &ctx->lower[ctx->nr++]; l = &ctx->lower[ctx->nr++];
...@@ -365,10 +367,9 @@ static void ovl_add_layer(struct fs_context *fc, enum ovl_opt layer, ...@@ -365,10 +367,9 @@ static void ovl_add_layer(struct fs_context *fc, enum ovl_opt layer,
} }
} }
static int ovl_parse_layer(struct fs_context *fc, struct fs_parameter *param, static int ovl_parse_layer(struct fs_context *fc, const char *layer_name, enum ovl_opt layer)
enum ovl_opt layer)
{ {
char *name = kstrdup(param->string, GFP_KERNEL); char *name = kstrdup(layer_name, GFP_KERNEL);
bool upper = (layer == Opt_upperdir || layer == Opt_workdir); bool upper = (layer == Opt_upperdir || layer == Opt_workdir);
struct path path; struct path path;
int err; int err;
...@@ -376,7 +377,7 @@ static int ovl_parse_layer(struct fs_context *fc, struct fs_parameter *param, ...@@ -376,7 +377,7 @@ static int ovl_parse_layer(struct fs_context *fc, struct fs_parameter *param,
if (!name) if (!name)
return -ENOMEM; return -ENOMEM;
if (upper) if (upper || layer == Opt_lowerdir)
err = ovl_mount_dir(name, &path); err = ovl_mount_dir(name, &path);
else else
err = ovl_mount_dir_noesc(name, &path); err = ovl_mount_dir_noesc(name, &path);
...@@ -432,7 +433,6 @@ static int ovl_parse_param_lowerdir(const char *name, struct fs_context *fc) ...@@ -432,7 +433,6 @@ static int ovl_parse_param_lowerdir(const char *name, struct fs_context *fc)
{ {
int err; int err;
struct ovl_fs_context *ctx = fc->fs_private; struct ovl_fs_context *ctx = fc->fs_private;
struct ovl_fs_context_layer *l;
char *dup = NULL, *iter; char *dup = NULL, *iter;
ssize_t nr_lower, nr; ssize_t nr_lower, nr;
bool data_layer = false; bool data_layer = false;
...@@ -449,7 +449,7 @@ static int ovl_parse_param_lowerdir(const char *name, struct fs_context *fc) ...@@ -449,7 +449,7 @@ static int ovl_parse_param_lowerdir(const char *name, struct fs_context *fc)
return 0; return 0;
if (*name == ':') { if (*name == ':') {
pr_err("cannot append lower layer"); pr_err("cannot append lower layer\n");
return -EINVAL; return -EINVAL;
} }
...@@ -472,35 +472,11 @@ static int ovl_parse_param_lowerdir(const char *name, struct fs_context *fc) ...@@ -472,35 +472,11 @@ static int ovl_parse_param_lowerdir(const char *name, struct fs_context *fc)
goto out_err; goto out_err;
} }
if (nr_lower > ctx->capacity) {
err = -ENOMEM;
l = krealloc_array(ctx->lower, nr_lower, sizeof(*ctx->lower),
GFP_KERNEL_ACCOUNT);
if (!l)
goto out_err;
ctx->lower = l;
ctx->capacity = nr_lower;
}
iter = dup; iter = dup;
l = ctx->lower; for (nr = 0; nr < nr_lower; nr++) {
for (nr = 0; nr < nr_lower; nr++, l++) { err = ovl_parse_layer(fc, iter, Opt_lowerdir);
ctx->nr++;
memset(l, 0, sizeof(*l));
err = ovl_mount_dir(iter, &l->path);
if (err) if (err)
goto out_put; goto out_err;
err = ovl_mount_dir_check(fc, &l->path, Opt_lowerdir, iter, false);
if (err)
goto out_put;
err = -ENOMEM;
l->name = kstrdup(iter, GFP_KERNEL_ACCOUNT);
if (!l->name)
goto out_put;
if (data_layer) if (data_layer)
ctx->nr_data++; ctx->nr_data++;
...@@ -517,8 +493,8 @@ static int ovl_parse_param_lowerdir(const char *name, struct fs_context *fc) ...@@ -517,8 +493,8 @@ static int ovl_parse_param_lowerdir(const char *name, struct fs_context *fc)
* there are no data layers. * there are no data layers.
*/ */
if (ctx->nr_data > 0) { if (ctx->nr_data > 0) {
pr_err("regular lower layers cannot follow data lower layers"); pr_err("regular lower layers cannot follow data lower layers\n");
goto out_put; goto out_err;
} }
data_layer = false; data_layer = false;
...@@ -532,9 +508,6 @@ static int ovl_parse_param_lowerdir(const char *name, struct fs_context *fc) ...@@ -532,9 +508,6 @@ static int ovl_parse_param_lowerdir(const char *name, struct fs_context *fc)
kfree(dup); kfree(dup);
return 0; return 0;
out_put:
ovl_reset_lowerdirs(ctx);
out_err: out_err:
kfree(dup); kfree(dup);
...@@ -582,7 +555,7 @@ static int ovl_parse_param(struct fs_context *fc, struct fs_parameter *param) ...@@ -582,7 +555,7 @@ static int ovl_parse_param(struct fs_context *fc, struct fs_parameter *param)
case Opt_datadir_add: case Opt_datadir_add:
case Opt_upperdir: case Opt_upperdir:
case Opt_workdir: case Opt_workdir:
err = ovl_parse_layer(fc, param, opt); err = ovl_parse_layer(fc, param->string, opt);
break; break;
case Opt_default_permissions: case Opt_default_permissions:
config->default_permissions = true; config->default_permissions = true;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment