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
next prev parent 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).