linux-f2fs-devel.lists.sourceforge.net archive mirror
 help / color / mirror / Atom feed
From: Jaegeuk Kim <jaegeuk@kernel.org>
To: Daniel Rosenberg <drosen@google.com>
Cc: kernel-team@android.com, linux-f2fs-devel@lists.sourceforge.net
Subject: Re: [f2fs-dev] [PATCH v2 7/7] f2fs-tools: Support different block sizes
Date: Mon, 28 Aug 2023 13:27:28 -0700	[thread overview]
Message-ID: <ZO0DMFmiiULzfFQB@google.com> (raw)
In-Reply-To: <20230825224400.2206278-8-drosen@google.com>

This patch somehow reveals struct size assertions.
You can get it when running fsck from the used f2fs partition.

On 08/25, Daniel Rosenberg wrote:
> This adds support for 4K and 16K block size using the same binary.
> mkfs can choose block size via the -b option, with other tools getting
> the blocksize from the superblock.
> 
> On mount time, we can't rely on block size for the location for the
> superblock, since that information is in the superblock. If the first
> superblock is corrupt, we will attempt to find the second superblock at
> a 4K block offset, and then a 16K block offset if that fails.
> 
> Signed-off-by: Daniel Rosenberg <drosen@google.com>
> ---
>  fsck/fsck.h             |  3 ---
>  fsck/mount.c            | 25 ++++++++++++++++++++-----
>  include/f2fs_fs.h       | 10 +++++++---
>  lib/libf2fs.c           |  2 ++
>  mkfs/f2fs_format_main.c | 12 +++++++++++-
>  5 files changed, 40 insertions(+), 12 deletions(-)
> 
> diff --git a/fsck/fsck.h b/fsck/fsck.h
> index 89d0b22..091b5d8 100644
> --- a/fsck/fsck.h
> +++ b/fsck/fsck.h
> @@ -127,9 +127,6 @@ struct f2fs_fsck {
>  };
>  
>  #define BLOCK_SZ		F2FS_BLKSIZE
> -struct block {
> -	unsigned char buf[BLOCK_SZ];
> -};
>  
>  enum NODE_TYPE {
>  	TYPE_INODE = 37,
> diff --git a/fsck/mount.c b/fsck/mount.c
> index 6220d91..0ba087e 100644
> --- a/fsck/mount.c
> +++ b/fsck/mount.c
> @@ -994,11 +994,15 @@ int sanity_check_raw_super(struct f2fs_super_block *sb, enum SB_ADDR sb_addr)
>  		return -1;
>  
>  	blocksize = 1 << get_sb(log_blocksize);
> -	if (F2FS_BLKSIZE != blocksize) {
> -		MSG(0, "Invalid blocksize (%u), supports only (%u)\n",
> -			blocksize, F2FS_BLKSIZE);
> +	if (blocksize < F2FS_MIN_BLKSIZE || blocksize > F2FS_MAX_BLKSIZE) {
> +		MSG(0, "Invalid blocksize (%u), must be between 4KB and 16KB\n",
> +			blocksize);
>  		return -1;
>  	}
> +	c.blksize_bits = get_sb(log_blocksize);
> +	c.blksize = blocksize;
> +	c.sectors_per_blk = F2FS_BLKSIZE / c.sector_size;
> +	check_block_struct_sizes();
>  
>  	/* check log blocks per segment */
>  	if (get_sb(log_blocks_per_seg) != 9) {
> @@ -3854,9 +3858,20 @@ int f2fs_do_mount(struct f2fs_sb_info *sbi)
>  	sbi->active_logs = NR_CURSEG_TYPE;
>  	ret = validate_super_block(sbi, SB0_ADDR);
>  	if (ret) {
> +		/* Assuming 4K Block Size */
> +		c.blksize_bits = 12;
> +		c.blksize = 1 << c.blksize_bits;
> +		MSG(0, "Looking for secondary superblock assuming 4K Block Size\n");
>  		ret = validate_super_block(sbi, SB1_ADDR);
> -		if (ret)
> -			return -1;
> +		if (ret) {
> +			/* Trying 16K Block Size */
> +			c.blksize_bits = 14;
> +			c.blksize = 1 << c.blksize_bits;
> +			MSG(0, "Looking for secondary superblock assuming 16K Block Size\n");
> +			ret = validate_super_block(sbi, SB1_ADDR);
> +			if (ret)
> +				return -1;
> +		}
>  	}
>  	sb = F2FS_RAW_SUPER(sbi);
>  
> diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
> index adbd381..a5587d3 100644
> --- a/include/f2fs_fs.h
> +++ b/include/f2fs_fs.h
> @@ -392,7 +392,7 @@ static inline uint64_t bswap_64(uint64_t val)
>  #define MAX_DEVICES		8
>  
>  #define F2FS_BYTES_TO_BLK(bytes)    ((bytes) >> F2FS_BLKSIZE_BITS)
> -#define F2FS_BLKSIZE_BITS 12	/* 4KB block */
> +#define F2FS_BLKSIZE_BITS c.blksize_bits
>  
>  /* for mkfs */
>  #define	F2FS_NUMBER_OF_CHECKPOINT_PACK	2
> @@ -400,6 +400,7 @@ static inline uint64_t bswap_64(uint64_t val)
>  #define	DEFAULT_SECTORS_PER_BLOCK	(1 << (F2FS_BLKSIZE_BITS - SECTOR_SHIFT))
>  #define	DEFAULT_BLOCKS_PER_SEGMENT	512
>  #define DEFAULT_SEGMENTS_PER_SECTION	1
> +#define DEFAULT_BLKSIZE_BITS		12	/* 4096	*/
>  
>  #define VERSION_LEN		256
>  #define VERSION_TIMESTAMP_LEN	4
> @@ -628,9 +629,10 @@ enum {
>   */
>  #define F2FS_SUPER_OFFSET		1024	/* byte-size offset */
>  #define F2FS_MIN_LOG_SECTOR_SIZE	9	/* 9 bits for 512 bytes */
> -#define F2FS_MAX_LOG_SECTOR_SIZE	F2FS_BLKSIZE_BITS	/* 12 bits for 4096 bytes */
> -#define F2FS_BLKSIZE			(1 << F2FS_BLKSIZE_BITS)/* support only 4KB block */
> +#define F2FS_MAX_LOG_SECTOR_SIZE	F2FS_BLKSIZE_BITS	/* max sector size is block size */
> +#define F2FS_MIN_BLKSIZE		4096
>  #define F2FS_MAX_BLKSIZE		16384
> +#define F2FS_BLKSIZE			c.blksize	/* support configurable block size */
>  #define F2FS_MAX_EXTENSION		64	/* # of extension entries */
>  #define F2FS_EXTENSION_LEN		8	/* max size of extension */
>  #define F2FS_BLK_ALIGN(x)	(((x) + F2FS_BLKSIZE - 1) / F2FS_BLKSIZE)
> @@ -1510,6 +1512,8 @@ struct f2fs_configuration {
>  	uint32_t lpf_ino;
>  	uint32_t root_uid;
>  	uint32_t root_gid;
> +	uint32_t blksize;
> +	uint32_t blksize_bits;
>  
>  	/* defragmentation parameters */
>  	int defrag_shrink;
> diff --git a/lib/libf2fs.c b/lib/libf2fs.c
> index 8f2cc3b..995e42d 100644
> --- a/lib/libf2fs.c
> +++ b/lib/libf2fs.c
> @@ -686,6 +686,8 @@ void f2fs_init_configuration(void)
>  
>  	memset(&c, 0, sizeof(struct f2fs_configuration));
>  	c.ndevs = 1;
> +	c.blksize = 1 << DEFAULT_BLKSIZE_BITS;
> +	c.blksize_bits = DEFAULT_BLKSIZE_BITS;
>  	c.sectors_per_blk = DEFAULT_SECTORS_PER_BLOCK;
>  	c.blks_per_seg = DEFAULT_BLOCKS_PER_SEGMENT;
>  	c.wanted_total_sectors = -1;
> diff --git a/mkfs/f2fs_format_main.c b/mkfs/f2fs_format_main.c
> index b2b84dd..349ee75 100644
> --- a/mkfs/f2fs_format_main.c
> +++ b/mkfs/f2fs_format_main.c
> @@ -50,6 +50,7 @@ static void mkfs_usage()
>  	MSG(0, "\nUsage: mkfs.f2fs [options] device [sectors]\n");
>  	MSG(0, "[options]:\n");
>  	MSG(0, "  -a heap-based allocation [default:0]\n");
> +	MSG(0, "  -b filesystem block size [default:4096]\n");
>  	MSG(0, "  -c device1[,device2,...] up to 7 additional devices, except meta device\n");
>  	MSG(0, "  -d debug level [default:0]\n");
>  	MSG(0, "  -e [cold file ext list] e.g. \"mp3,gif,mov\"\n");
> @@ -175,7 +176,7 @@ static void add_default_options(void)
>  
>  static void f2fs_parse_options(int argc, char *argv[])
>  {
> -	static const char *option_string = "qa:c:C:d:e:E:g:hil:mo:O:rR:s:S:z:t:T:U:Vfw:Z:";
> +	static const char *option_string = "qa:b:c:C:d:e:E:g:hil:mo:O:rR:s:S:z:t:T:U:Vfw:Z:";
>  	static const struct option long_opts[] = {
>  		{ .name = "help", .has_arg = 0, .flag = NULL, .val = 'h' },
>  		{ .name = NULL, .has_arg = 0, .flag = NULL, .val = 0 }
> @@ -192,6 +193,15 @@ static void f2fs_parse_options(int argc, char *argv[])
>  		case 'a':
>  			c.heap = atoi(optarg);
>  			break;
> +		case 'b':
> +			c.blksize = atoi(optarg);
> +			c.blksize_bits = log_base_2(c.blksize);
> +			c.sectors_per_blk = DEFAULT_SECTORS_PER_BLOCK;
> +			if ((1 << c.blksize_bits) != c.blksize) {
> +				MSG(0, "Error: Block size must be power of 2");
> +				mkfs_usage();
> +			}
> +			break;
>  		case 'c':
>  			if (c.ndevs >= MAX_DEVICES) {
>  				MSG(0, "Error: Too many devices\n");
> -- 
> 2.42.0.rc2.253.gd59a3bf2b4-goog


_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

  reply	other threads:[~2023-08-28 20:27 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-25 22:43 [f2fs-dev] [PATCH v2 0/7] Add 16K Support for f2fs-tools Daniel Rosenberg via Linux-f2fs-devel
2023-08-25 22:43 ` [f2fs-dev] [PATCH v2 1/7] f2fs-tools: Define constants in terms of BLKSIZE Daniel Rosenberg via Linux-f2fs-devel
2023-08-25 22:43 ` [f2fs-dev] [PATCH v2 2/7] f2fs-tools: Refactor Orphan Block struct Daniel Rosenberg via Linux-f2fs-devel
2023-08-25 22:43 ` [f2fs-dev] [PATCH v2 3/7] f2fs-tools: Refactor f2fs_node struct and friends Daniel Rosenberg via Linux-f2fs-devel
2023-08-25 22:43 ` [f2fs-dev] [PATCH v2 4/7] f2fs-tools: Refactor SIT/NAT block structs Daniel Rosenberg via Linux-f2fs-devel
2023-08-28 20:22   ` Jaegeuk Kim
2023-08-25 22:43 ` [f2fs-dev] [PATCH v2 5/7] f2fs-tools: Refactor Summary block struct and friends Daniel Rosenberg via Linux-f2fs-devel
2023-08-28 18:07   ` Jaegeuk Kim
2023-08-28 23:14     ` Daniel Rosenberg via Linux-f2fs-devel
2023-08-25 22:43 ` [f2fs-dev] [PATCH v2 6/7] f2fs-tools: Refactor f2fs_dentry_block struct Daniel Rosenberg via Linux-f2fs-devel
2023-08-25 22:44 ` [f2fs-dev] [PATCH v2 7/7] f2fs-tools: Support different block sizes Daniel Rosenberg via Linux-f2fs-devel
2023-08-28 20:27   ` Jaegeuk Kim [this message]
2023-08-28 23:18     ` Daniel Rosenberg via Linux-f2fs-devel

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=ZO0DMFmiiULzfFQB@google.com \
    --to=jaegeuk@kernel.org \
    --cc=drosen@google.com \
    --cc=kernel-team@android.com \
    --cc=linux-f2fs-devel@lists.sourceforge.net \
    /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).