Skip to content

Commit

Permalink
fs: ext2: Use the UUID library
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
sorru94 committed Oct 3, 2024
1 parent a04219d commit 318f323
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 78 deletions.
4 changes: 3 additions & 1 deletion include/zephyr/fs/ext2.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@

#include <stdint.h>

#include <zephyr/sys/uuid.h>

/** @brief Configuration used to format ext2 file system.
*
* If a field is set to 0 then default value is used.
Expand All @@ -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;
};
Expand Down
144 changes: 69 additions & 75 deletions subsys/fs/ext2/ext2_format.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

Expand Down Expand Up @@ -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));
}

Expand All @@ -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;

Expand Down Expand Up @@ -187,68 +181,68 @@ 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);
struct ext2_block *bbitmap_block = ext2_get_block(fs, bbitmap_block_num);
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;
}

struct ext2_disk_superblock *sb =
(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) {
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down
4 changes: 2 additions & 2 deletions subsys/fs/ext2/ext2_struct.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,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;
Expand Down

0 comments on commit 318f323

Please sign in to comment.