From 6e5b0fe9fd36da1fc4860fd80f852d59cc198596 Mon Sep 17 00:00:00 2001 From: Simone Orru Date: Thu, 3 Oct 2024 17:52:02 +0200 Subject: [PATCH] fs: ext2: Use the UUID library Use the sys/uuid.h library to generate and hold the ext2 UUID. This commit also includes some formatting for the ext2 library. Signed-off-by: Simone Orru --- include/zephyr/fs/ext2.h | 4 +- subsys/fs/ext2/ext2_format.c | 144 +++++++++++++-------------- subsys/fs/ext2/ext2_struct.h | 5 +- tests/subsys/fs/ext2/prj.conf | 3 + tests/subsys/fs/ext2/prj_big.conf | 3 + tests/subsys/fs/ext2/prj_flash.conf | 3 + tests/subsys/fs/ext2/prj_sdcard.conf | 3 + 7 files changed, 87 insertions(+), 78 deletions(-) diff --git a/include/zephyr/fs/ext2.h b/include/zephyr/fs/ext2.h index 087134ce7f899c..ef928182485227 100644 --- a/include/zephyr/fs/ext2.h +++ b/include/zephyr/fs/ext2.h @@ -9,6 +9,8 @@ #include +#include + /** @brief Configuration used to format ext2 file system. * * If a field is set to 0 then default value is used. @@ -27,7 +29,7 @@ struct ext2_cfg { uint32_t block_size; uint32_t fs_size; /* Number of blocks that we want to take. */ uint32_t bytes_per_inode; - uint8_t uuid[16]; + struct uuid uuid; uint8_t volume_name[17]; /* If first byte is 0 then name ext2" is given. */ bool set_uuid; }; diff --git a/subsys/fs/ext2/ext2_format.c b/subsys/fs/ext2/ext2_format.c index f316e4d3d51af1..c0a07fccd47a19 100644 --- a/subsys/fs/ext2/ext2_format.c +++ b/subsys/fs/ext2/ext2_format.c @@ -33,12 +33,7 @@ static void validate_config(struct ext2_cfg *cfg) } if (!cfg->set_uuid) { - /* Generate random UUID */ - sys_rand_get(cfg->uuid, 16); - - /* Set version of UUID (ver. 4 variant 1) */ - cfg->uuid[6] = (cfg->uuid[6] & 0x0f) | 0x40; - cfg->uuid[8] = (cfg->uuid[8] & 0x3f) | 0x80; + uuid_generate_v4(&cfg->uuid); } } @@ -72,24 +67,24 @@ static void set_bitmap_bits(uint8_t *bitmap, uint32_t to_set) } static void default_directory_inode(struct ext2_disk_inode *in, uint32_t nblocks, - struct ext2_cfg *cfg) + struct ext2_cfg *cfg) { LOG_DBG("Set directory inode: %p", in); - in->i_mode = sys_cpu_to_le16(EXT2_DEF_DIR_MODE); - in->i_uid = 0; - in->i_size = sys_cpu_to_le32(nblocks * cfg->block_size); - in->i_atime = 0; - in->i_ctime = 0; - in->i_mtime = 0; - in->i_dtime = 0; - in->i_gid = 0; - in->i_blocks = sys_cpu_to_le32(nblocks * cfg->block_size / 512); - in->i_flags = 0; - in->i_osd1 = 0; + in->i_mode = sys_cpu_to_le16(EXT2_DEF_DIR_MODE); + in->i_uid = 0; + in->i_size = sys_cpu_to_le32(nblocks * cfg->block_size); + in->i_atime = 0; + in->i_ctime = 0; + in->i_mtime = 0; + in->i_dtime = 0; + in->i_gid = 0; + in->i_blocks = sys_cpu_to_le32(nblocks * cfg->block_size / 512); + in->i_flags = 0; + in->i_osd1 = 0; in->i_generation = 0; - in->i_file_acl = 0; - in->i_dir_acl = 0; - in->i_faddr = 0; + in->i_file_acl = 0; + in->i_dir_acl = 0; + in->i_faddr = 0; memset(in->i_block, 0, EXT2_INODE_BLOCKS * sizeof(uint32_t)); } @@ -98,9 +93,8 @@ int ext2_format(struct ext2_data *fs, struct ext2_cfg *cfg) int rc, ret = 0; validate_config(cfg); - LOG_INF("[Config] blk_sz:%d fs_sz:%d ino_bytes:%d uuid:'%s' vol:'%s'", - cfg->block_size, cfg->fs_size, cfg->bytes_per_inode, cfg->uuid, - cfg->volume_name); + LOG_INF("[Config] blk_sz:%d fs_sz:%d ino_bytes:%d uuid:'%s' vol:'%s'", cfg->block_size, + cfg->fs_size, cfg->bytes_per_inode, cfg->uuid.val, cfg->volume_name); uint32_t fs_memory = cfg->fs_size ? MIN(cfg->fs_size, fs->device_size) : fs->device_size; @@ -187,10 +181,10 @@ int ext2_format(struct ext2_data *fs, struct ext2_cfg *cfg) /* Blocks that will be described in bitmaps. */ uint32_t used_blocks = occupied_blocks - first_data_block; - LOG_INF("[Blocks] total:%d per_grp:%d occupied:%d used:%d", - blocks_count, blocks_per_group, occupied_blocks, used_blocks); - LOG_INF("[Inodes] total:%d used:%d itable_blocks:%d", - inodes_count, used_inodes, itable_blocks); + LOG_INF("[Blocks] total:%d per_grp:%d occupied:%d used:%d", blocks_count, blocks_per_group, + occupied_blocks, used_blocks); + LOG_INF("[Inodes] total:%d used:%d itable_blocks:%d", inodes_count, used_inodes, + itable_blocks); struct ext2_block *sb_block = ext2_get_block(fs, first_data_block); struct ext2_block *bg_block = ext2_get_block(fs, bg_block_num); @@ -198,11 +192,11 @@ int ext2_format(struct ext2_data *fs, struct ext2_cfg *cfg) struct ext2_block *ibitmap_block = ext2_get_block(fs, ibitmap_block_num); struct ext2_block *itable_block1, *itable_block2, *root_dir_blk, *lost_found_dir_blk; - itable_block1 = itable_block2 = root_dir_blk = lost_found_dir_blk = NULL; + itable_block1 = itable_block2 = root_dir_blk = lost_found_dir_blk = NULL; - if (ibitmap_block == NULL || bbitmap_block == NULL || - bg_block == NULL || sb_block == NULL) { - ret = -ENOMEM; + if (ibitmap_block == NULL || bbitmap_block == NULL || bg_block == NULL || + sb_block == NULL) { + ret = -ENOMEM; goto out; } @@ -210,45 +204,45 @@ int ext2_format(struct ext2_data *fs, struct ext2_cfg *cfg) (struct ext2_disk_superblock *)((uint8_t *)sb_block->data + sb_offset); memset(sb, 0, 1024); - sb->s_inodes_count = sys_cpu_to_le32(inodes_count); - sb->s_blocks_count = sys_cpu_to_le32(blocks_count); - sb->s_r_blocks_count = sys_cpu_to_le32(0); - sb->s_free_blocks_count = sys_cpu_to_le32(free_blocks); - sb->s_free_inodes_count = sys_cpu_to_le32(inodes_count - used_inodes); - sb->s_first_data_block = sys_cpu_to_le32(first_data_block); - sb->s_log_block_size = sys_cpu_to_le32(block_log_size); - sb->s_log_frag_size = sys_cpu_to_le32(block_log_size); - sb->s_blocks_per_group = sys_cpu_to_le32(cfg->block_size * 8); - sb->s_frags_per_group = sys_cpu_to_le32(cfg->block_size * 8); - sb->s_inodes_per_group = sys_cpu_to_le32(inodes_count); - sb->s_mtime = sys_cpu_to_le32(0); - sb->s_wtime = sys_cpu_to_le32(0); - sb->s_mnt_count = sys_cpu_to_le32(0); - sb->s_max_mnt_count = sys_cpu_to_le32(-1); - sb->s_magic = sys_cpu_to_le32(0xEF53); - sb->s_state = sys_cpu_to_le32(EXT2_VALID_FS); - sb->s_errors = sys_cpu_to_le32(EXT2_ERRORS_RO); - sb->s_minor_rev_level = sys_cpu_to_le32(0); - sb->s_lastcheck = sys_cpu_to_le32(0); - sb->s_checkinterval = sys_cpu_to_le32(0); - sb->s_creator_os = sys_cpu_to_le32(5); /* Unknown OS */ - sb->s_rev_level = sys_cpu_to_le32(EXT2_DYNAMIC_REV); - sb->s_def_resuid = sys_cpu_to_le32(0); - sb->s_def_resgid = sys_cpu_to_le32(0); - sb->s_first_ino = sys_cpu_to_le32(11); - sb->s_inode_size = sys_cpu_to_le32(sizeof(struct ext2_disk_inode)); - sb->s_block_group_nr = sys_cpu_to_le32(0); - sb->s_feature_compat = sys_cpu_to_le32(0); - sb->s_feature_incompat = sys_cpu_to_le32(EXT2_FEATURE_INCOMPAT_FILETYPE); - sb->s_feature_ro_compat = sys_cpu_to_le32(0); - sb->s_algo_bitmap = sys_cpu_to_le32(0); - sb->s_prealloc_blocks = sys_cpu_to_le32(0); + sb->s_inodes_count = sys_cpu_to_le32(inodes_count); + sb->s_blocks_count = sys_cpu_to_le32(blocks_count); + sb->s_r_blocks_count = sys_cpu_to_le32(0); + sb->s_free_blocks_count = sys_cpu_to_le32(free_blocks); + sb->s_free_inodes_count = sys_cpu_to_le32(inodes_count - used_inodes); + sb->s_first_data_block = sys_cpu_to_le32(first_data_block); + sb->s_log_block_size = sys_cpu_to_le32(block_log_size); + sb->s_log_frag_size = sys_cpu_to_le32(block_log_size); + sb->s_blocks_per_group = sys_cpu_to_le32(cfg->block_size * 8); + sb->s_frags_per_group = sys_cpu_to_le32(cfg->block_size * 8); + sb->s_inodes_per_group = sys_cpu_to_le32(inodes_count); + sb->s_mtime = sys_cpu_to_le32(0); + sb->s_wtime = sys_cpu_to_le32(0); + sb->s_mnt_count = sys_cpu_to_le32(0); + sb->s_max_mnt_count = sys_cpu_to_le32(-1); + sb->s_magic = sys_cpu_to_le32(0xEF53); + sb->s_state = sys_cpu_to_le32(EXT2_VALID_FS); + sb->s_errors = sys_cpu_to_le32(EXT2_ERRORS_RO); + sb->s_minor_rev_level = sys_cpu_to_le32(0); + sb->s_lastcheck = sys_cpu_to_le32(0); + sb->s_checkinterval = sys_cpu_to_le32(0); + sb->s_creator_os = sys_cpu_to_le32(5); /* Unknown OS */ + sb->s_rev_level = sys_cpu_to_le32(EXT2_DYNAMIC_REV); + sb->s_def_resuid = sys_cpu_to_le32(0); + sb->s_def_resgid = sys_cpu_to_le32(0); + sb->s_first_ino = sys_cpu_to_le32(11); + sb->s_inode_size = sys_cpu_to_le32(sizeof(struct ext2_disk_inode)); + sb->s_block_group_nr = sys_cpu_to_le32(0); + sb->s_feature_compat = sys_cpu_to_le32(0); + sb->s_feature_incompat = sys_cpu_to_le32(EXT2_FEATURE_INCOMPAT_FILETYPE); + sb->s_feature_ro_compat = sys_cpu_to_le32(0); + sb->s_algo_bitmap = sys_cpu_to_le32(0); + sb->s_prealloc_blocks = sys_cpu_to_le32(0); sb->s_prealloc_dir_blocks = sys_cpu_to_le32(0); - sb->s_journal_inum = sys_cpu_to_le32(0); - sb->s_journal_dev = sys_cpu_to_le32(0); - sb->s_last_orphan = sys_cpu_to_le32(0); + sb->s_journal_inum = sys_cpu_to_le32(0); + sb->s_journal_dev = sys_cpu_to_le32(0); + sb->s_last_orphan = sys_cpu_to_le32(0); - memcpy(sb->s_uuid, cfg->uuid, 16); + uuid_to_buffer(cfg->uuid, sb->s_uuid); strcpy(sb->s_volume_name, cfg->volume_name); if (ext2_write_block(fs, sb_block) < 0) { @@ -261,12 +255,12 @@ int ext2_format(struct ext2_data *fs, struct ext2_cfg *cfg) struct ext2_disk_bgroup *bg = (struct ext2_disk_bgroup *)bg_block->data; memset(bg, 0, cfg->block_size); - bg->bg_block_bitmap = sys_cpu_to_le32(bbitmap_block_num); - bg->bg_inode_bitmap = sys_cpu_to_le32(ibitmap_block_num); - bg->bg_inode_table = sys_cpu_to_le32(itable_block_num); + bg->bg_block_bitmap = sys_cpu_to_le32(bbitmap_block_num); + bg->bg_inode_bitmap = sys_cpu_to_le32(ibitmap_block_num); + bg->bg_inode_table = sys_cpu_to_le32(itable_block_num); bg->bg_free_blocks_count = sys_cpu_to_le16(free_blocks); bg->bg_free_inodes_count = sys_cpu_to_le16(inodes_count - used_inodes); - bg->bg_used_dirs_count = sys_cpu_to_le16(2); /* '/' and 'lost+found' */ + bg->bg_used_dirs_count = sys_cpu_to_le16(2); /* '/' and 'lost+found' */ if (ext2_write_block(fs, bg_block) < 0) { ret = -EIO; @@ -318,7 +312,7 @@ int ext2_format(struct ext2_data *fs, struct ext2_cfg *cfg) default_directory_inode(&in[inode_offset], 1, cfg); in[inode_offset].i_links_count = sys_cpu_to_le16(3); /* 2 from itself, 1 from child */ - in[inode_offset].i_block[0] = sys_cpu_to_le32(root_dir_blk_num); + in[inode_offset].i_block[0] = sys_cpu_to_le32(root_dir_blk_num); if (ext2_write_block(fs, itable_block1) < 0) { ret = -EIO; goto out; @@ -339,7 +333,7 @@ int ext2_format(struct ext2_data *fs, struct ext2_cfg *cfg) default_directory_inode(&in[inode_offset], 1, cfg); in[inode_offset].i_links_count = sys_cpu_to_le16(2); /* 1 from itself, 1 from parent */ - in[inode_offset].i_block[0] = sys_cpu_to_le32(lost_found_dir_blk_num); + in[inode_offset].i_block[0] = sys_cpu_to_le32(lost_found_dir_blk_num); if (itable_block2) { if (ext2_write_block(fs, itable_block2) < 0) { ret = -EIO; diff --git a/subsys/fs/ext2/ext2_struct.h b/subsys/fs/ext2/ext2_struct.h index f2805752140b19..f543b855e52135 100644 --- a/subsys/fs/ext2/ext2_struct.h +++ b/subsys/fs/ext2/ext2_struct.h @@ -8,6 +8,7 @@ #define __EXT2_STRUCT_H__ #include +#include #include "ext2.h" /* Disk structures ---------------------------------------------------------- */ @@ -44,14 +45,14 @@ struct ext2_disk_superblock { uint32_t s_feature_compat; uint32_t s_feature_incompat; uint32_t s_feature_ro_compat; - uint8_t s_uuid[16]; + uint8_t s_uuid[UUID_SIZE]; uint8_t s_volume_name[16]; uint8_t s_last_mounted[64]; uint32_t s_algo_bitmap; uint8_t s_prealloc_blocks; uint8_t s_prealloc_dir_blocks; uint8_t s_align[2]; - uint8_t s_journal_uuid[16]; + uint8_t s_journal_uuid[UUID_SIZE]; uint32_t s_journal_inum; uint32_t s_journal_dev; uint32_t s_last_orphan; diff --git a/tests/subsys/fs/ext2/prj.conf b/tests/subsys/fs/ext2/prj.conf index 8b965329f6bed0..5d897a3defa071 100644 --- a/tests/subsys/fs/ext2/prj.conf +++ b/tests/subsys/fs/ext2/prj.conf @@ -5,6 +5,9 @@ CONFIG_FILE_SYSTEM_MKFS=y CONFIG_DISK_ACCESS=y CONFIG_DISK_DRIVER_RAM=y +CONFIG_UUID=y +CONFIG_UUID_V4=y +CONFIG_ENTROPY_GENERATOR=y CONFIG_TEST_RANDOM_GENERATOR=y CONFIG_ZTEST=y diff --git a/tests/subsys/fs/ext2/prj_big.conf b/tests/subsys/fs/ext2/prj_big.conf index 1463ebfa8cc9f1..252bcb67324d91 100644 --- a/tests/subsys/fs/ext2/prj_big.conf +++ b/tests/subsys/fs/ext2/prj_big.conf @@ -7,6 +7,9 @@ CONFIG_DISK_DRIVER_RAM=y CONFIG_EXT2_MAX_BLOCK_COUNT=20 +CONFIG_UUID=y +CONFIG_UUID_V4=y +CONFIG_ENTROPY_GENERATOR=y CONFIG_TEST_RANDOM_GENERATOR=y CONFIG_ZTEST=y diff --git a/tests/subsys/fs/ext2/prj_flash.conf b/tests/subsys/fs/ext2/prj_flash.conf index ada4707349b345..8f1a86b7170071 100644 --- a/tests/subsys/fs/ext2/prj_flash.conf +++ b/tests/subsys/fs/ext2/prj_flash.conf @@ -5,6 +5,9 @@ CONFIG_FILE_SYSTEM_MKFS=y CONFIG_DISK_ACCESS=y CONFIG_DISK_DRIVER_FLASH=y +CONFIG_UUID=y +CONFIG_UUID_V4=y +CONFIG_ENTROPY_GENERATOR=y CONFIG_TEST_RANDOM_GENERATOR=y CONFIG_ZTEST=y diff --git a/tests/subsys/fs/ext2/prj_sdcard.conf b/tests/subsys/fs/ext2/prj_sdcard.conf index dcc472b4081d99..63e0ed944e46be 100644 --- a/tests/subsys/fs/ext2/prj_sdcard.conf +++ b/tests/subsys/fs/ext2/prj_sdcard.conf @@ -9,6 +9,9 @@ CONFIG_DISK_DRIVER_SDMMC=y CONFIG_EXT2_DISK_STARTING_SECTOR=34 +CONFIG_UUID=y +CONFIG_UUID_V4=y +CONFIG_ENTROPY_GENERATOR=y CONFIG_TEST_RANDOM_GENERATOR=y CONFIG_ZTEST=y