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 <dro...@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 via email to