2023-07-18 08:59:40

by Yunlong Xing

[permalink] [raw]
Subject: [PATCH] ovl: fix mount fail because the upper doesn't have space

The current ovlfs mount flow:

ovl_fill_super
|_ovl_get_workdir
|_ovl_make_workdir
|_ovl_check_rename_whiteout

In ovl_check_rename_whiteout(), a new file is attempted to create.But if
the upper doesn't have space to do this, it will return error -ENOSPC,
causing the mount fail. It means that if the upper is full, the overlayfs
cannot be mounted.It is not reasonable, so this patch will omit this error
and continue mount flow.

Fixes: cad218ab3320 ("ovl: check if upper fs supports RENAME_WHITEOUT")
Signed-off-by: Yunlong Xing <[email protected]>
---
fs/overlayfs/super.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
index 5b069f1a1e44..2cf41e978cff 100644
--- a/fs/overlayfs/super.c
+++ b/fs/overlayfs/super.c
@@ -744,9 +744,12 @@ static int ovl_make_workdir(struct super_block *sb, struct ovl_fs *ofs,

/* Check if upper/work fs supports RENAME_WHITEOUT */
err = ovl_check_rename_whiteout(ofs);
- if (err < 0)
- goto out;
-
+ if (err < 0) {
+ if (err == -ENOSPC)
+ pr_warn("upper fs check RENAME_WHITEOUT fail due to no space.\n");
+ else
+ goto out;
+ }
rename_whiteout = err;
if (!rename_whiteout)
pr_warn("upper fs does not support RENAME_WHITEOUT.\n");
--
2.25.1



2023-07-18 12:04:13

by Amir Goldstein

[permalink] [raw]
Subject: Re: [PATCH] ovl: fix mount fail because the upper doesn't have space

On Tue, Jul 18, 2023 at 11:35 AM Yunlong Xing <[email protected]> wrote:
>
> The current ovlfs mount flow:
>
> ovl_fill_super
> |_ovl_get_workdir
> |_ovl_make_workdir
> |_ovl_check_rename_whiteout
>
> In ovl_check_rename_whiteout(), a new file is attempted to create.But if
> the upper doesn't have space to do this, it will return error -ENOSPC,
> causing the mount fail. It means that if the upper is full, the overlayfs
> cannot be mounted.It is not reasonable, so this patch will omit this error
> and continue mount flow.
>
> Fixes: cad218ab3320 ("ovl: check if upper fs supports RENAME_WHITEOUT")
> Signed-off-by: Yunlong Xing <[email protected]>
> ---
> fs/overlayfs/super.c | 9 ++++++---
> 1 file changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
> index 5b069f1a1e44..2cf41e978cff 100644
> --- a/fs/overlayfs/super.c
> +++ b/fs/overlayfs/super.c
> @@ -744,9 +744,12 @@ static int ovl_make_workdir(struct super_block *sb, struct ovl_fs *ofs,
>
> /* Check if upper/work fs supports RENAME_WHITEOUT */
> err = ovl_check_rename_whiteout(ofs);
> - if (err < 0)
> - goto out;
> -
> + if (err < 0) {
> + if (err == -ENOSPC)
> + pr_warn("upper fs check RENAME_WHITEOUT fail due to no space.\n");
> + else
> + goto out;
> + }
> rename_whiteout = err;
> if (!rename_whiteout)
> pr_warn("upper fs does not support RENAME_WHITEOUT.\n");
> --

This assumes that RENAME_WHITEOUT is supported.
I rather assume it is not supported if the check fails.
Like this is shorter (not tested):

--- a/fs/overlayfs/super.c
+++ b/fs/overlayfs/super.c
@@ -744,12 +744,13 @@ static int ovl_make_workdir(struct super_block
*sb, struct ovl_fs *ofs,

/* Check if upper/work fs supports RENAME_WHITEOUT */
err = ovl_check_rename_whiteout(ofs);
- if (err < 0)
+ if (err < 0 && err != -ENOSPC)
goto out;

- rename_whiteout = err;
+ rename_whiteout = err > 0;
if (!rename_whiteout)
- pr_warn("upper fs does not support RENAME_WHITEOUT.\n");
+ pr_warn("upper fs does not support RENAME_WHITEOUT (%i).\n",
+ err);

Thanks,
Amir.