[PATCH] erofs-utils: lib: fix compressed packed inodes

Danny Lin danny at orbstack.dev
Sun Sep 22 15:08:30 AEST 2024


Gentle bump — let me know if anything needs to be changed!

Thanks,
Danny

On Mon, Sep 16, 2024 at 12:39 AM Danny Lin <danny at orbstack.dev> wrote:
>
> Commit b9b6493 fixed uncompressed packed inodes by not always writing
> compressed data, but it broke compressed packed inodes because now
> uncompressed file data is always written after the compressed data.
>
> The new error handling always rewinds with lseek and falls through to
> write_uncompressed_file_from_fd, regardless of whether the compressed
> data was written successfully (ret = 0) or not (ret = -ENOSPC). This
> can result in corrupted files.
>
> Fix it by simplifying the error handling to better match the old code.
>
> Fixes: b9b6493 ("erofs-utils: lib: fix uncompressed packed inode")
> Signed-off-by: Danny Lin <danny at orbstack.dev>
> ---
>  lib/inode.c | 14 ++++++++------
>  1 file changed, 8 insertions(+), 6 deletions(-)
>
> diff --git a/lib/inode.c b/lib/inode.c
> index bc3cb76..797c622 100644
> --- a/lib/inode.c
> +++ b/lib/inode.c
> @@ -1927,14 +1927,16 @@ struct erofs_inode *erofs_mkfs_build_special_from_fd(struct erofs_sb_info *sbi,
>
>                 DBG_BUGON(!ictx);
>                 ret = erofs_write_compressed_file(ictx);
> -               if (ret && ret != -ENOSPC)
> -                        return ERR_PTR(ret);
> +               if (ret == -ENOSPC) {
> +                       ret = lseek(fd, 0, SEEK_SET);
> +                       if (ret < 0)
> +                               return ERR_PTR(-errno);
>
> -               ret = lseek(fd, 0, SEEK_SET);
> -               if (ret < 0)
> -                       return ERR_PTR(-errno);
> +                       ret = write_uncompressed_file_from_fd(inode, fd);
> +               }
> +       } else {
> +               ret = write_uncompressed_file_from_fd(inode, fd);
>         }
> -       ret = write_uncompressed_file_from_fd(inode, fd);
>         if (ret)
>                 return ERR_PTR(ret);
>         erofs_prepare_inode_buffer(inode);
> --
> 2.46.0
>


More information about the Linux-erofs mailing list