Skip to content

Commit d10771d

Browse files
committed
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/[email protected]: 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/[email protected] Signed-off-by: Christian Brauner <[email protected]>
2 parents 996b37d + 441e36e commit d10771d

File tree

1 file changed

+12
-39
lines changed

1 file changed

+12
-39
lines changed

fs/overlayfs/params.c

Lines changed: 12 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,8 @@ static void ovl_add_layer(struct fs_context *fc, enum ovl_opt layer,
353353
case Opt_datadir_add:
354354
ctx->nr_data++;
355355
fallthrough;
356+
case Opt_lowerdir:
357+
fallthrough;
356358
case Opt_lowerdir_add:
357359
WARN_ON(ctx->nr >= ctx->capacity);
358360
l = &ctx->lower[ctx->nr++];
@@ -365,18 +367,17 @@ static void ovl_add_layer(struct fs_context *fc, enum ovl_opt layer,
365367
}
366368
}
367369

368-
static int ovl_parse_layer(struct fs_context *fc, struct fs_parameter *param,
369-
enum ovl_opt layer)
370+
static int ovl_parse_layer(struct fs_context *fc, const char *layer_name, enum ovl_opt layer)
370371
{
371-
char *name = kstrdup(param->string, GFP_KERNEL);
372+
char *name = kstrdup(layer_name, GFP_KERNEL);
372373
bool upper = (layer == Opt_upperdir || layer == Opt_workdir);
373374
struct path path;
374375
int err;
375376

376377
if (!name)
377378
return -ENOMEM;
378379

379-
if (upper)
380+
if (upper || layer == Opt_lowerdir)
380381
err = ovl_mount_dir(name, &path);
381382
else
382383
err = ovl_mount_dir_noesc(name, &path);
@@ -432,7 +433,6 @@ static int ovl_parse_param_lowerdir(const char *name, struct fs_context *fc)
432433
{
433434
int err;
434435
struct ovl_fs_context *ctx = fc->fs_private;
435-
struct ovl_fs_context_layer *l;
436436
char *dup = NULL, *iter;
437437
ssize_t nr_lower, nr;
438438
bool data_layer = false;
@@ -449,7 +449,7 @@ static int ovl_parse_param_lowerdir(const char *name, struct fs_context *fc)
449449
return 0;
450450

451451
if (*name == ':') {
452-
pr_err("cannot append lower layer");
452+
pr_err("cannot append lower layer\n");
453453
return -EINVAL;
454454
}
455455

@@ -472,35 +472,11 @@ static int ovl_parse_param_lowerdir(const char *name, struct fs_context *fc)
472472
goto out_err;
473473
}
474474

475-
if (nr_lower > ctx->capacity) {
476-
err = -ENOMEM;
477-
l = krealloc_array(ctx->lower, nr_lower, sizeof(*ctx->lower),
478-
GFP_KERNEL_ACCOUNT);
479-
if (!l)
480-
goto out_err;
481-
482-
ctx->lower = l;
483-
ctx->capacity = nr_lower;
484-
}
485-
486475
iter = dup;
487-
l = ctx->lower;
488-
for (nr = 0; nr < nr_lower; nr++, l++) {
489-
ctx->nr++;
490-
memset(l, 0, sizeof(*l));
491-
492-
err = ovl_mount_dir(iter, &l->path);
476+
for (nr = 0; nr < nr_lower; nr++) {
477+
err = ovl_parse_layer(fc, iter, Opt_lowerdir);
493478
if (err)
494-
goto out_put;
495-
496-
err = ovl_mount_dir_check(fc, &l->path, Opt_lowerdir, iter, false);
497-
if (err)
498-
goto out_put;
499-
500-
err = -ENOMEM;
501-
l->name = kstrdup(iter, GFP_KERNEL_ACCOUNT);
502-
if (!l->name)
503-
goto out_put;
479+
goto out_err;
504480

505481
if (data_layer)
506482
ctx->nr_data++;
@@ -517,8 +493,8 @@ static int ovl_parse_param_lowerdir(const char *name, struct fs_context *fc)
517493
* there are no data layers.
518494
*/
519495
if (ctx->nr_data > 0) {
520-
pr_err("regular lower layers cannot follow data lower layers");
521-
goto out_put;
496+
pr_err("regular lower layers cannot follow data lower layers\n");
497+
goto out_err;
522498
}
523499

524500
data_layer = false;
@@ -532,9 +508,6 @@ static int ovl_parse_param_lowerdir(const char *name, struct fs_context *fc)
532508
kfree(dup);
533509
return 0;
534510

535-
out_put:
536-
ovl_reset_lowerdirs(ctx);
537-
538511
out_err:
539512
kfree(dup);
540513

@@ -582,7 +555,7 @@ static int ovl_parse_param(struct fs_context *fc, struct fs_parameter *param)
582555
case Opt_datadir_add:
583556
case Opt_upperdir:
584557
case Opt_workdir:
585-
err = ovl_parse_layer(fc, param, opt);
558+
err = ovl_parse_layer(fc, param->string, opt);
586559
break;
587560
case Opt_default_permissions:
588561
config->default_permissions = true;

0 commit comments

Comments
 (0)