@@ -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-
538511out_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