All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sean Anderson <seanga2@gmail.com>
To: Richard Weinberger <richard@nod.at>, u-boot@lists.denx.de
Cc: Jixiong.Hu@mediatek.com, sjg@chromium.org,
	patrick.delaunay@foss.st.com, ilias.apalodimas@linaro.org,
	xypron.glpk@gmx.de, trini@konsulko.com,
	upstream+uboot@sigma-star.at
Subject: Re: [PATCH] ext4: Improve feature checking
Date: Sun, 30 Jun 2024 20:23:00 -0400	[thread overview]
Message-ID: <279949a8-26da-e480-e498-e9a85cdbf479@gmail.com> (raw)
In-Reply-To: <20240630212556.5627-1-richard@nod.at>

On 6/30/24 17:25, Richard Weinberger wrote:
> Evaluate the filesystem incompat and ro_compat bit fields to judge
> whether the filesystem can be read or written.
> For the read side only a scary warning is shown so far.
> I'd love to about mounting too, but I fear this will break some setups

I think you are missing a verb in the first half of your sentence

> where the driver works by chance.
> 
> Signed-off-by: Richard Weinberger <richard@nod.at>
> ---
> After facing ext4 write corruptions and read errors I checked
> the ext4 implementation briefly.
> Hopefully this patch helps other users to detect earlier that
> they're using ext4 features which are not supported by u-boot.
> 
> To make feature checking possible I had to figure what this
> implementation actually supports.
> I hope I got them right, feedback is welcome!
> 
> Thanks,
> //richard
> ---
>   fs/ext4/ext4_common.c |  8 +++++++
>   fs/ext4/ext4_write.c  | 12 ++++++++--
>   include/ext4fs.h      | 55 ++++++++++++++++++++++++++++++++++++++++++-
>   3 files changed, 72 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c
> index 2ff0dca249..7148d35ee0 100644
> --- a/fs/ext4/ext4_common.c
> +++ b/fs/ext4/ext4_common.c
> @@ -2386,6 +2386,14 @@ int ext4fs_mount(void)
>   		fs->inodesz = 128;
>   		fs->gdsize = 32;
>   	} else {
> +		int missing = __le32_to_cpu(data->sblock.feature_incompat) & \
> +			      ~(EXT4_FEATURE_INCOMPAT_SUPP | \
> +				EXT4_FEATURE_INCOMPAT_SUPP_LAZY_RO);
> +
> +		if (missing)
> +			log_err("fs uses incompatible features: %08x, failures *are* expected!\n",
> +				missing);
> +

I think it is a bit unclear to the user what their action should be. Maybe something like

printf("EXT4 incompatible features: %08x, ignoring...\n")
  
and then maybe add a comment like what you have in the commit message.

>   		debug("EXT4 features COMPAT: %08x INCOMPAT: %08x RO_COMPAT: %08x\n",
>   		      __le32_to_cpu(data->sblock.feature_compatibility),
>   		      __le32_to_cpu(data->sblock.feature_incompat),
> diff --git a/fs/ext4/ext4_write.c b/fs/ext4/ext4_write.c
> index d057f6b5a7..4aae3c5f7f 100644
> --- a/fs/ext4/ext4_write.c
> +++ b/fs/ext4/ext4_write.c
> @@ -869,6 +869,7 @@ int ext4fs_write(const char *fname, const char *buffer,
>   	ALLOC_CACHE_ALIGN_BUFFER(char, filename, 256);
>   	bool store_link_in_inode = false;
>   	memset(filename, 0x00, 256);
> +	int missing_feat;
>   
>   	if (type != FILETYPE_REG && type != FILETYPE_SYMLINK)
>   		return -1;
> @@ -882,8 +883,15 @@ int ext4fs_write(const char *fname, const char *buffer,
>   		return -1;
>   	}
>   
> -	if (le32_to_cpu(fs->sb->feature_ro_compat) & EXT4_FEATURE_RO_COMPAT_METADATA_CSUM) {
> -		printf("Unsupported feature metadata_csum found, not writing.\n");
> +	missing_feat = le32_to_cpu(fs->sb->feature_incompat) & ~EXT4_FEATURE_INCOMPAT_SUPP;
> +	if (missing_feat) {
> +		log_err("Unsupported features found %08x, not writing.\n", missing_feat);
> +		return -1;
> +	}
> +
> +	missing_feat = le32_to_cpu(fs->sb->feature_ro_compat) & ~EXT4_FEATURE_RO_COMPAT_SUPP;
> +	if (missing_feat) {
> +		log_err("Unsupported RO compat features found %08x, not writing.\n", missing_feat);
>   		return -1;
>   	}
>   
> diff --git a/include/ext4fs.h b/include/ext4fs.h
> index d96edfd057..01b66f469f 100644
> --- a/include/ext4fs.h
> +++ b/include/ext4fs.h
> @@ -34,12 +34,65 @@ struct disk_partition;
>   #define EXT4_TOPDIR_FL		0x00020000 /* Top of directory hierarchies*/
>   #define EXT4_EXTENTS_FL		0x00080000 /* Inode uses extents */
>   #define EXT4_EXT_MAGIC			0xf30a
> -#define EXT4_FEATURE_RO_COMPAT_GDT_CSUM	0x0010
> +
> +#define EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER  0x0001
> +#define EXT4_FEATURE_RO_COMPAT_LARGE_FILE    0x0002
> +#define EXT4_FEATURE_RO_COMPAT_BTREE_DIR     0x0004
> +#define EXT4_FEATURE_RO_COMPAT_HUGE_FILE     0x0008
> +#define EXT4_FEATURE_RO_COMPAT_GDT_CSUM      0x0010
> +#define EXT4_FEATURE_RO_COMPAT_DIR_NLINK     0x0020
> +#define EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE   0x0040
> +#define EXT4_FEATURE_RO_COMPAT_QUOTA         0x0100
> +#define EXT4_FEATURE_RO_COMPAT_BIGALLOC      0x0200
>   #define EXT4_FEATURE_RO_COMPAT_METADATA_CSUM 0x0400
> +
> +#define EXT4_FEATURE_INCOMPAT_FILETYPE  0x0002
> +#define EXTE_FEATURE_INCOMPAT_RECOVER   0x0004
>   #define EXT4_FEATURE_INCOMPAT_EXTENTS	0x0040
>   #define EXT4_FEATURE_INCOMPAT_64BIT	0x0080
> +#define EXT4_FEATURE_INCOMPAT_MMP       0x0100
> +#define EXT4_FEATURE_INCOMPAT_FLEX_BG   0x0200
> +#define EXT4_FEATURE_INCOMPAT_CSUM_SEED 0x2000
> +#define EXT4_FEATURE_INCOMPAT_ENCRYPT   0x10000
> +
>   #define EXT4_INDIRECT_BLOCKS		12
>   
> +/*
> + * Incompat features supported by this implementation.
> + */
> +#define EXT4_FEATURE_INCOMPAT_SUPP ( EXT4_FEATURE_INCOMPAT_FILETYPE \
> +				   | EXTE_FEATURE_INCOMPAT_RECOVER \

EXT4

> +				   | EXT4_FEATURE_INCOMPAT_EXTENTS \
> +				   | EXT4_FEATURE_INCOMPAT_64BIT \
> +				   | EXT4_FEATURE_INCOMPAT_FLEX_BG \
> +				   )

Operators should go at the end of the line. So like

#define EXT4_FEATURE_INCOMPAT_SUPP (EXT4_FEATURE_INCOMPAT_FILETYPE | \
				    EXT4_FEATURE_INCOMPAT_RECOVER | \
				    EXT4_FEATURE_INCOMPAT_EXTENTS | \
				    EXT4_FEATURE_INCOMPAT_64BIT | \
				    EXT4_FEATURE_INCOMPAT_FLEX_BG)

> +/*
> + * Incompat features supported by this implementation only in a lazy
> + * way, good enough for reading files.
> + *
> + * - Multi mount protection (mmp) is not supported, but for read-only
> + *   we get away with it.
> + * - Same fore metadata_csum_seed and metadata_csum.

nit: for

> + * - The implementation has also no clue about fscrypt, but it can read
> + *   unencrypted files. Reading encrypted files will read garbage.
> + */
> +#define EXT4_FEATURE_INCOMPAT_SUPP_LAZY_RO ( EXT4_FEATURE_INCOMPAT_MMP \
> +					   | EXT4_FEATURE_INCOMPAT_CSUM_SEED \
> +					   | EXT4_FEATURE_INCOMPAT_ENCRYPT \
> +					   )

ditto

> +/*
> + * Read-only compat features we support.
> + * If unknown ro compat features are detected, writing to the fs is denied.
> + */
> +#define EXT4_FEATURE_RO_COMPAT_SUPP ( EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER \
> +				    | EXT4_FEATURE_RO_COMPAT_LARGE_FILE \
> +				    | EXT4_FEATURE_RO_COMPAT_HUGE_FILE \
> +				    | EXT4_FEATURE_RO_COMPAT_DIR_NLINK \
> +				    | EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE \
> +				    )

ditto

>   #define EXT4_BG_INODE_UNINIT		0x0001
>   #define EXT4_BG_BLOCK_UNINIT		0x0002
>   #define EXT4_BG_INODE_ZEROED		0x0004

Anyway, the substance of this patch is good. Just needs a little cosmetic cleanup.

--Sean

  reply	other threads:[~2024-07-01  0:23 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-06-30 21:25 [PATCH] ext4: Improve feature checking Richard Weinberger
2024-07-01  0:23 ` Sean Anderson [this message]
2024-07-01  0:32   ` Sean Anderson

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=279949a8-26da-e480-e498-e9a85cdbf479@gmail.com \
    --to=seanga2@gmail.com \
    --cc=Jixiong.Hu@mediatek.com \
    --cc=ilias.apalodimas@linaro.org \
    --cc=patrick.delaunay@foss.st.com \
    --cc=richard@nod.at \
    --cc=sjg@chromium.org \
    --cc=trini@konsulko.com \
    --cc=u-boot@lists.denx.de \
    --cc=upstream+uboot@sigma-star.at \
    --cc=xypron.glpk@gmx.de \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.