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