static int rtems_rfs_shell_data (rtems_rfs_file_system* fs, int argc, char *argv[]) { size_t blocks; size_t inodes; int bpcent; int ipcent; printf ("RFS Filesystem Data\n"); printf (" flags: %08" PRIx32 "\n", fs->flags); #if 0 printf (" device: %08lx\n", rtems_rfs_fs_device (fs)); #endif printf (" blocks: %zu\n", rtems_rfs_fs_blocks (fs)); printf (" block size: %zu\n", rtems_rfs_fs_block_size (fs)); printf (" size: %" PRIu64 "\n", rtems_rfs_fs_size (fs)); printf (" media block size: %" PRIu32 "\n", rtems_rfs_fs_media_block_size (fs)); printf (" media size: %" PRIu64 "\n", rtems_rfs_fs_media_size (fs)); printf (" inodes: %" PRIu32 "\n", rtems_rfs_fs_inodes (fs)); printf (" bad blocks: %" PRIu32 "\n", fs->bad_blocks); printf (" max. name length: %" PRIu32 "\n", rtems_rfs_fs_max_name (fs)); printf (" groups: %d\n", fs->group_count); printf (" group blocks: %zd\n", fs->group_blocks); printf (" group inodes: %zd\n", fs->group_inodes); printf (" inodes per block: %zd\n", fs->inodes_per_block); printf (" blocks per block: %zd\n", fs->blocks_per_block); printf (" singly blocks: %zd\n", fs->block_map_singly_blocks); printf (" doublly blocks: %zd\n", fs->block_map_doubly_blocks); printf (" max. held buffers: %" PRId32 "\n", fs->max_held_buffers); rtems_rfs_shell_lock_rfs (fs); rtems_rfs_group_usage (fs, &blocks, &inodes); rtems_rfs_shell_unlock_rfs (fs); bpcent = (blocks * 1000) / rtems_rfs_fs_blocks (fs); ipcent = (inodes * 1000) / rtems_rfs_fs_inodes (fs); printf (" blocks used: %zd (%d.%d%%)\n", blocks, bpcent / 10, bpcent % 10); printf (" inodes used: %zd (%d.%d%%)\n", inodes, ipcent / 10, ipcent % 10); return 0; }
static int rtems_rfs_fs_read_superblock (rtems_rfs_file_system* fs) { rtems_rfs_buffer_handle handle; uint8_t* sb; int group; int rc; rc = rtems_rfs_buffer_handle_open (fs, &handle); if (rc > 0) { if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN)) printf ("rtems-rfs: read-superblock: handle open failed: %d: %s\n", rc, strerror (rc)); return rc; } rc = rtems_rfs_buffer_handle_request (fs, &handle, 0, true); if (rc > 0) { if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN)) printf ("rtems-rfs: read-superblock: request failed%d: %s\n", rc, strerror (rc)); return rc; } sb = rtems_rfs_buffer_data (&handle); #define read_sb(_o) rtems_rfs_read_u32 (sb + (_o)) if (read_sb (RTEMS_RFS_SB_OFFSET_MAGIC) != RTEMS_RFS_SB_MAGIC) { if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN)) printf ("rtems-rfs: read-superblock: invalid superblock, bad magic\n"); rtems_rfs_buffer_handle_close (fs, &handle); return EIO; } fs->blocks = read_sb (RTEMS_RFS_SB_OFFSET_BLOCKS); fs->block_size = read_sb (RTEMS_RFS_SB_OFFSET_BLOCK_SIZE); if (rtems_rfs_fs_size(fs) > rtems_rfs_fs_media_size (fs)) { if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN)) printf ("rtems-rfs: read-superblock: invalid superblock block/size count\n"); rtems_rfs_buffer_handle_close (fs, &handle); return EIO; } if ((read_sb (RTEMS_RFS_SB_OFFSET_VERSION) & RTEMS_RFS_VERSION_MASK) != (RTEMS_RFS_VERSION * RTEMS_RFS_VERSION_MASK)) { if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN)) printf ("rtems-rfs: read-superblock: incompatible version: %08" PRIx32 " (%08" PRIx32 ")\n", read_sb (RTEMS_RFS_SB_OFFSET_VERSION), RTEMS_RFS_VERSION_MASK); rtems_rfs_buffer_handle_close (fs, &handle); return EIO; } if (read_sb (RTEMS_RFS_SB_OFFSET_INODE_SIZE) != RTEMS_RFS_INODE_SIZE) { if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN)) printf ("rtems-rfs: read-superblock: inode size mismatch: fs:%" PRId32 " target:%" PRId32 "\n", read_sb (RTEMS_RFS_SB_OFFSET_VERSION), RTEMS_RFS_VERSION_MASK); rtems_rfs_buffer_handle_close (fs, &handle); return EIO; } fs->bad_blocks = read_sb (RTEMS_RFS_SB_OFFSET_BAD_BLOCKS); fs->max_name_length = read_sb (RTEMS_RFS_SB_OFFSET_MAX_NAME_LENGTH); fs->group_count = read_sb (RTEMS_RFS_SB_OFFSET_GROUPS); fs->group_blocks = read_sb (RTEMS_RFS_SB_OFFSET_GROUP_BLOCKS); fs->group_inodes = read_sb (RTEMS_RFS_SB_OFFSET_GROUP_INODES); fs->blocks_per_block = rtems_rfs_fs_block_size (fs) / sizeof (rtems_rfs_inode_block); fs->block_map_singly_blocks = fs->blocks_per_block * RTEMS_RFS_INODE_BLOCKS; fs->block_map_doubly_blocks = fs->blocks_per_block * fs->blocks_per_block * RTEMS_RFS_INODE_BLOCKS; fs->inodes = fs->group_count * fs->group_inodes; fs->inodes_per_block = fs->block_size / RTEMS_RFS_INODE_SIZE; if (fs->group_blocks > rtems_rfs_bitmap_numof_bits (rtems_rfs_fs_block_size (fs))) { rtems_rfs_buffer_handle_close (fs, &handle); if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN)) printf ("rtems-rfs: read-superblock: groups blocks larger than block bits\n"); return EIO; } rtems_rfs_buffer_handle_close (fs, &handle); /* * Change the block size to the value in the superblock. */ rc = rtems_rfs_buffer_setblksize (fs, rtems_rfs_fs_block_size (fs)); if (rc > 0) { rtems_rfs_buffer_handle_close (fs, &handle); if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN)) printf ("rtems-rfs: read-superblock: invalid superblock block size%d: %s\n", rc, strerror (rc)); return rc; } fs->groups = calloc (fs->group_count, sizeof (rtems_rfs_group)); if (!fs->groups) { rtems_rfs_buffer_handle_close (fs, &handle); if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN)) printf ("rtems-rfs: read-superblock: no memory for group table\n"); return ENOMEM; } /* * Perform each phase of group initialisation at the same time. This way we * know how far the initialisation has gone if an error occurs and we need to * close everything. */ for (group = 0; group < fs->group_count; group++) { rc = rtems_rfs_group_open (fs, rtems_rfs_fs_block (fs, group, 0), fs->group_blocks, fs->group_inodes, &fs->groups[group]); if (rc > 0) { int g; for (g = 0; g < group; g++) rtems_rfs_group_close (fs, &fs->groups[g]); rtems_rfs_buffer_handle_close (fs, &handle); if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN)) printf ("rtems-rfs: read-superblock: no memory for group table%d: %s\n", rc, strerror (rc)); return rc; } } return 0; }
int rtems_rfs_format (const char* name, const rtems_rfs_format_config* config) { rtems_rfs_file_system fs; int group; int rc; if (config->verbose) printf ("rtems-rfs: format: %s\n", name); memset (&fs, 0, sizeof (rtems_rfs_file_system)); rtems_chain_initialize_empty (&fs.buffers); rtems_chain_initialize_empty (&fs.release); rtems_chain_initialize_empty (&fs.release_modified); rtems_chain_initialize_empty (&fs.file_shares); fs.max_held_buffers = RTEMS_RFS_FS_MAX_HELD_BUFFERS; fs.release_count = 0; fs.release_modified_count = 0; fs.flags = RTEMS_RFS_FS_NO_LOCAL_CACHE; /* * Open the buffer interface. */ rc = rtems_rfs_buffer_open (name, &fs); if (rc > 0) { printf ("rtems-rfs: format: buffer open failed: %d: %s\n", rc, strerror (rc)); return -1; } /* * Check the media. */ if (rtems_rfs_fs_media_block_size (&fs) == 0) { printf ("rtems-rfs: media block is invalid: %" PRIu32 "\n", rtems_rfs_fs_media_block_size (&fs)); return -1; } /* * Check the configuration data. */ if (!rtems_rfs_check_config (&fs, config)) return -1; if (config->verbose) { printf ("rtems-rfs: format: media size = %" PRIu64 "\n", rtems_rfs_fs_media_size (&fs)); printf ("rtems-rfs: format: media blocks = %" PRIu32 "\n", rtems_rfs_fs_media_blocks (&fs)); printf ("rtems-rfs: format: media block size = %" PRIu32 "\n", rtems_rfs_fs_media_block_size (&fs)); printf ("rtems-rfs: format: size = %" PRIu64 "\n", rtems_rfs_fs_size (&fs)); printf ("rtems-rfs: format: blocks = %zu\n", rtems_rfs_fs_blocks (&fs)); printf ("rtems-rfs: format: block size = %zu\n", rtems_rfs_fs_block_size (&fs)); printf ("rtems-rfs: format: bits per block = %u\n", rtems_rfs_bits_per_block (&fs)); printf ("rtems-rfs: format: inode size = %zu\n", RTEMS_RFS_INODE_SIZE); printf ("rtems-rfs: format: inodes = %zu (%d.%d%%)\n", fs.group_inodes * fs.group_count, rtems_rfs_inode_overhead (&fs) / 10, rtems_rfs_inode_overhead (&fs) % 10); printf ("rtems-rfs: format: groups = %u\n", fs.group_count); printf ("rtems-rfs: format: group blocks = %zu\n", fs.group_blocks); printf ("rtems-rfs: format: group inodes = %zu\n", fs.group_inodes); } rc = rtems_rfs_buffer_setblksize (&fs, rtems_rfs_fs_block_size (&fs)); if (rc > 0) { printf ("rtems-rfs: format: setting block size failed: %d: %s\n", rc, strerror (rc)); return -1; } if (!rtems_rfs_write_superblock (&fs)) { printf ("rtems-rfs: format: superblock write failed\n"); return -1; } for (group = 0; group < fs.group_count; group++) if (!rtems_rfs_write_group (&fs, group, config->initialise_inodes, config->verbose)) return -1; if (config->verbose) printf ("\n"); rc = rtems_rfs_buffer_close (&fs); if (rc > 0) { printf ("rtems-rfs: format: buffer close failed: %d: %s\n", rc, strerror (rc)); return -1; } rc = rtems_rfs_write_root_dir (name); if (rc > 0) { printf ("rtems-rfs: format: writing root dir failed: %d: %s\n", rc, strerror (rc)); return -1; } return 0; }