From: Gao Xiang <hsiangkao@linux.alibaba.com>
To: Yifan Zhao <zhaoyifan@sjtu.edu.cn>, grub-devel@gnu.org
Cc: jefflexu@linux.alibaba.com
Subject: Re: [PATCH v3 1/2] fs/erofs: Add support for EROFS
Date: Fri, 21 Jul 2023 11:51:26 +0800 [thread overview]
Message-ID: <03018833-5420-720e-ee51-d68c5dc116e4@linux.alibaba.com> (raw)
In-Reply-To: <20230721032902.9996-1-zhaoyifan@sjtu.edu.cn>
Hi Yifan,
On 2023/7/21 11:29, Yifan Zhao wrote:
> EROFS is a lightweight read-only filesystem designed for performance which
> has already been widely used in several scenarios, such as Android system
> partitions, container images, and rootfs for embedded devices.
>
> This patch brings EROFS uncompressed support. Now, it's possible to boot
> directly through GRUB with an EROFS rootfs.
>
> EROFS compressed support will be developed later since it has more work
> to polish.
>
It'd be better to collect all previous RVB tags here for others to refer.
> Signed-off-by: Yifan Zhao <zhaoyifan@sjtu.edu.cn>
> ---
...
> diff --git a/INSTALL b/INSTALL
> index b93fe9c61..1939e4745 100644
> --- a/INSTALL
> +++ b/INSTALL
> @@ -77,15 +77,15 @@ Prerequisites for make-check:
>
> * If running a Linux kernel the following modules must be loaded:
> - fuse, loop
> - - btrfs, ext4, f2fs, fat, hfs, hfsplus, jfs, mac-roman, minix, nilfs2,
> + - btrfs, erofs, ext4, f2fs, fat, hfs, hfsplus, jfs, mac-roman, minix, nilfs2,
> reiserfs, udf, xfs
> - On newer kernels, the exfat kernel modules may be used instead of the
> exfat FUSE filesystem
> * The following are Debian named packages required mostly for the full
> suite of filesystem testing (but some are needed by other tests as well):
> - - btrfs-progs, dosfstools, e2fsprogs, exfat-utils, f2fs-tools, genromfs,
> - hfsprogs, jfsutils, nilfs-tools, ntfs-3g, reiserfsprogs, squashfs-tools,
> - reiserfsprogs, udftools, xfsprogs, zfs-fuse
> + - btrfs-progs, dosfstools, erofs_utils, e2fsprogs, exfat-utils, f2fs-tools,
There is no erofs_utils, please use erofs-utils here.
> + genromfs, hfsprogs, jfsutils, nilfs-tools, ntfs-3g, reiserfsprogs,
> + squashfs-tools, reiserfsprogs, udftools, xfsprogs, zfs-fuse
> - exfat-fuse, if not using the exfat kernel module
> - gzip, lzop, xz-utils
> - attr, cpio, g++, gawk, parted, recode, tar, util-linux
> diff --git a/Makefile.util.def b/Makefile.util.def
> index 1e9a13d3e..ca2a32a7f 100644
> --- a/Makefile.util.def
> +++ b/Makefile.util.def
> @@ -98,6 +98,7 @@ library = {
> common = grub-core/fs/cpio_be.c;
> common = grub-core/fs/odc.c;
> common = grub-core/fs/newc.c;
> + common = grub-core/fs/erofs.c;
> common = grub-core/fs/ext2.c;
> common = grub-core/fs/fat.c;
> common = grub-core/fs/exfat.c;
> diff --git a/docs/grub.texi b/docs/grub.texi
> index b81267980..60c98e931 100644
> --- a/docs/grub.texi
> +++ b/docs/grub.texi
> @@ -361,6 +361,7 @@ blocklist notation. The currently supported filesystem types are @dfn{Amiga
> Fast FileSystem (AFFS)}, @dfn{AtheOS fs}, @dfn{BeFS},
> @dfn{BtrFS} (including raid0, raid1, raid10, gzip and lzo),
> @dfn{cpio} (little- and big-endian bin, odc and newc variants),
> +@dfn{EROFS} (only uncompressed support for now),
> @dfn{Linux ext2/ext3/ext4}, @dfn{DOS FAT12/FAT16/FAT32},
> @dfn{exFAT}, @dfn{F2FS}, @dfn{HFS}, @dfn{HFS+},
> @dfn{ISO9660} (including Joliet, Rock-ridge and multi-chunk files),
> @@ -6212,7 +6213,7 @@ assumed to be encoded in UTF-8.
> NTFS, JFS, UDF, HFS+, exFAT, long filenames in FAT, Joliet part of
> ISO9660 are treated as UTF-16 as per specification. AFS and BFS are read
> as UTF-8, again according to specification. BtrFS, cpio, tar, squash4, minix,
> -minix2, minix3, ROMFS, ReiserFS, XFS, ext2, ext3, ext4, FAT (short names),
> +minix2, minix3, ROMFS, ReiserFS, XFS, EROFS, ext2, ext3, ext4, FAT (short names),
> F2FS, RockRidge part of ISO9660, nilfs2, UFS1, UFS2 and ZFS are assumed
> to be UTF-8. This might be false on systems configured with legacy charset
> but as long as the charset used is superset of ASCII you should be able to
> diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
> index d2cf29584..eccf9b6cf 100644
> --- a/grub-core/Makefile.core.def
> +++ b/grub-core/Makefile.core.def
> @@ -1438,6 +1438,11 @@ module = {
> common = fs/odc.c;
> };
>
> +module = {
> + name = erofs;
> + common = fs/erofs.c;
> +};
> +
> module = {
> name = ext2;
> common = fs/ext2.c;
> diff --git a/grub-core/fs/erofs.c b/grub-core/fs/erofs.c
> new file mode 100644
> index 000000000..1d44862b8
> --- /dev/null
> +++ b/grub-core/fs/erofs.c
> @@ -0,0 +1,974 @@
> +/* erofs.c - Enhanced Read-Only File System */
> +/*
> + * GRUB -- GRand Unified Bootloader
> + * Copyright (C) 2023 Free Software Foundation, Inc.
> + *
> + * GRUB is free software: you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation, either version 3 of the License, or
> + * (at your option) any later version.
> + *
> + * GRUB is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include <grub/disk.h>
> +#include <grub/dl.h>
> +#include <grub/err.h>
> +#include <grub/file.h>
> +#include <grub/fs.h>
> +#include <grub/fshelp.h>
> +#include <grub/misc.h>
> +#include <grub/mm.h>
> +#include <grub/safemath.h>
> +#include <grub/types.h>
> +
> +GRUB_MOD_LICENSE ("GPLv3+");
> +
> +#define EROFS_SUPER_OFFSET (1024)
> +#define EROFS_MAGIC 0xE0F5E1E2
> +#define EROFS_ISLOTBITS (5)
> +
> +#define EROFS_FEATURE_INCOMPAT_CHUNKED_FILE 0x00000004
> +#define EROFS_ALL_FEATURE_INCOMPAT (EROFS_FEATURE_INCOMPAT_CHUNKED_FILE)
> +
> +struct grub_erofs_super
> +{
> + grub_uint32_t magic;
> + grub_uint32_t checksum;
> + grub_uint32_t feature_compat;
> + grub_uint8_t log2_blksz;
> + grub_uint8_t sb_extslots;
> +
> + grub_uint16_t root_nid;
> + grub_uint64_t inos;
> +
> + grub_uint64_t build_time;
> + grub_uint32_t build_time_nsec;
> + grub_uint32_t blocks;
> + grub_uint32_t meta_blkaddr;
> + grub_uint32_t xattr_blkaddr;
> + grub_uint8_t uuid[16];
> + grub_uint8_t volume_name[16];
> + grub_uint32_t feature_incompat;
> +
> + union
> + {
> + grub_uint16_t available_compr_algs;
> + grub_uint16_t lz4_max_distance;
> + } GRUB_PACKED u1;
> +
> + grub_uint16_t extra_devices;
> + grub_uint16_t devt_slotoff;
> + grub_uint8_t log2_dirblksz;
> + grub_uint8_t xattr_prefix_count;
> + grub_uint32_t xattr_prefix_start;
> + grub_uint64_t packed_nid;
> + grub_uint8_t reserved2[24];
> +} GRUB_PACKED;
> +
> +#define EROFS_INODE_LAYOUT_COMPACT 0
> +#define EROFS_INODE_LAYOUT_EXTENDED 1
> +
> +enum
> +{
> + EROFS_INODE_FLAT_PLAIN = 0,
> + EROFS_INODE_COMPRESSED_FULL = 1,
> + EROFS_INODE_FLAT_INLINE = 2,
> + EROFS_INODE_COMPRESSED_COMPACT = 3,
> + EROFS_INODE_CHUNK_BASED = 4,
> + EROFS_INODE_DATALAYOUT_MAX
> +};
> +
> +#define EROFS_I_VERSION_MASKS 0x01
> +#define EROFS_I_DATALAYOUT_MASKS 0x07
> +
> +#define EROFS_I_VERSION_BIT 0
> +#define EROFS_I_DATALAYOUT_BIT 1
> +
> +struct grub_erofs_inode_chunk_info
> +{
> + grub_uint16_t format;
> + grub_uint16_t reserved;
> +} GRUB_PACKED;
> +
> +#define EROFS_CHUNK_FORMAT_BLKBITS_MASK 0x001F
> +#define EROFS_CHUNK_FORMAT_INDEXES 0x0020
> +
> +#define EROFS_BLOCK_MAP_ENTRY_SIZE 4
> +
> +#define EROFS_NULL_ADDR -1
> +
> +struct grub_erofs_inode_chunk_index
> +{
> + grub_uint16_t advise;
> + grub_uint16_t device_id;
> + grub_uint32_t blkaddr;
> +};
> +
> +union grub_erofs_inode_i_u
> +{
> + grub_uint32_t compressed_blocks;
> + grub_uint32_t raw_blkaddr;
> +
> + grub_uint32_t rdev;
> +
> + struct grub_erofs_inode_chunk_info c;
> +};
> +
> +struct grub_erofs_inode_compact
> +{
> + grub_uint16_t i_format;
> +
> + grub_uint16_t i_xattr_icount;
> + grub_uint16_t i_mode;
> + grub_uint16_t i_nlink;
> + grub_uint32_t i_size;
> + grub_uint32_t i_reserved;
> +
> + union grub_erofs_inode_i_u i_u;
> +
> + grub_uint32_t i_ino;
> + grub_uint16_t i_uid;
> + grub_uint16_t i_gid;
> + grub_uint32_t i_reserved2;
> +} GRUB_PACKED;
> +
> +struct grub_erofs_inode_extended
> +{
> + grub_uint16_t i_format;
> +
> + grub_uint16_t i_xattr_icount;
> + grub_uint16_t i_mode;
> + grub_uint16_t i_reserved;
> + grub_uint64_t i_size;
> +
> + union grub_erofs_inode_i_u i_u;
> +
> + grub_uint32_t i_ino;
> +
> + grub_uint32_t i_uid;
> + grub_uint32_t i_gid;
> + grub_uint64_t i_mtime;
> + grub_uint32_t i_mtime_nsec;
> + grub_uint32_t i_nlink;
> + grub_uint8_t i_reserved2[16];
> +} GRUB_PACKED;
> +
> +enum
> +{
> + EROFS_FT_UNKNOWN,
> + EROFS_FT_REG_FILE,
> + EROFS_FT_DIR,
> + EROFS_FT_CHRDEV,
> + EROFS_FT_BLKDEV,
> + EROFS_FT_FIFO,
> + EROFS_FT_SOCK,
> + EROFS_FT_SYMLINK,
> + EROFS_FT_MAX
> +};
> +
> +#define EROFS_NAME_LEN 255
> +
> +struct grub_erofs_dirent
> +{
> + grub_uint64_t nid;
> + grub_uint16_t nameoff;
> + grub_uint8_t file_type;
> + grub_uint8_t reserved;
> +} GRUB_PACKED;
> +
> +enum
> +{
> + BH_Meta,
> + BH_Mapped,
> +};
Why need those (BH_xxx) for a bootloader? you could always use
#define EROFS_MAP_META 0x01
#define EROFS_MAP_MAPPED 0x02
Otherwise it looks good to me too, please fix the nits above:
Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Thanks,
Gao Xiang
next prev parent reply other threads:[~2023-07-21 3:51 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-20 13:36 [PATCH v2 0/2] fs/erofs: Add support for EROFS Yifan Zhao
2023-07-20 13:37 ` [PATCH v2 1/2] " Yifan Zhao
2023-07-20 17:19 ` Glenn Washburn
2023-07-21 3:29 ` [PATCH v3 " Yifan Zhao
2023-07-21 3:51 ` Gao Xiang [this message]
2023-07-20 13:38 ` [PATCH v2 2/2] fs/erofs: Add tests for EROFS in grub-fs-tester Yifan Zhao
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=03018833-5420-720e-ee51-d68c5dc116e4@linux.alibaba.com \
--to=hsiangkao@linux.alibaba.com \
--cc=grub-devel@gnu.org \
--cc=jefflexu@linux.alibaba.com \
--cc=zhaoyifan@sjtu.edu.cn \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).