Changeset c00e729 in mainline


Ignore:
Timestamp:
2011-02-13T23:19:12Z (13 years ago)
Author:
Martin Sucha <sucha14@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f6fa2c2
Parents:
8bd5dad
Message:

Support for some more superblock fields and displaying in ext2info

Location:
uspace
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/ext2info/ext2info.c

    r8bd5dad rc00e729  
    5353
    5454static void syntax_print(void);
     55static void print_superblock(ext2_superblock_t *sb);
    5556
    5657int main(int argc, char **argv)
     
    6162        devmap_handle_t handle;
    6263        ext2_filesystem_t filesystem;
    63        
    64         uint16_t magic;
    6564       
    6665        if (argc < 2) {
     
    9291        }
    9392       
    94         printf("Superblock:\n");
    95         magic = ext2_superblock_get_magic(filesystem.superblock);
    96         if (magic == EXT2_SUPERBLOCK_MAGIC) {
    97                 printf("  Magic value: %X (correct)\n", magic);
    98         }
    99         else {
    100                 printf("  Magic value: %X (incorrect)\n", magic);
    101         }
     93        print_superblock(filesystem.superblock);
    10294
    10395        ext2_filesystem_fini(&filesystem);
     
    109101static void syntax_print(void)
    110102{
    111         printf("syntax: blkdump [--offset <num_blocks>] [--count <num_blocks>] <device_name>\n");
     103        printf("syntax: ext2info <device_name>\n");
     104}
     105
     106static void print_superblock(ext2_superblock_t *superblock)
     107{
     108        uint16_t magic;
     109        uint32_t first_block;
     110        uint32_t block_size;
     111        uint32_t fragment_size;
     112        uint32_t blocks_per_group;
     113        uint32_t fragments_per_group;
     114        uint32_t rev_major;
     115        uint16_t rev_minor;
     116        uint16_t state;
     117        uint32_t first_inode;
     118        uint16_t inode_size;
     119       
     120        int pos;
     121        unsigned char c;
     122       
     123        magic = ext2_superblock_get_magic(superblock);
     124        first_block = ext2_superblock_get_first_block(superblock);
     125        block_size = ext2_superblock_get_block_size(superblock);
     126        fragment_size = ext2_superblock_get_fragment_size(superblock);
     127        blocks_per_group = ext2_superblock_get_blocks_per_group(superblock);
     128        fragments_per_group = ext2_superblock_get_fragments_per_group(superblock);
     129        rev_major = ext2_superblock_get_rev_major(superblock);
     130        rev_minor = ext2_superblock_get_rev_minor(superblock);
     131        state = ext2_superblock_get_state(superblock);
     132        first_inode = ext2_superblock_get_first_inode(superblock);
     133        inode_size = ext2_superblock_get_inode_size(superblock);
     134       
     135        printf("Superblock:\n");
     136       
     137        if (magic == EXT2_SUPERBLOCK_MAGIC) {
     138                printf("  Magic value: %X (correct)\n", magic);
     139        }
     140        else {
     141                printf("  Magic value: %X (incorrect)\n", magic);
     142        }
     143       
     144        printf("  Revision: %u.%hu\n", rev_major, rev_minor);
     145        printf("  State: %hu\n", state);
     146        printf("  First block: %u\n", first_block);
     147        printf("  Block size: %u bytes (%u KiB)\n", block_size, block_size/1024);
     148        printf("  Blocks per group: %u\n", blocks_per_group);
     149        printf("  Fragment size: %u bytes (%u KiB)\n", fragment_size,
     150            fragment_size/1024);
     151        printf("  Fragments per group: %u\n", fragments_per_group);
     152        printf("  First inode: %u\n", first_inode);
     153        printf("  Inode size: %hu bytes\n", inode_size);
     154       
     155        printf("  UUID: ");
     156        for (pos = 0; pos < 16; pos++) {
     157                printf("%02x", superblock->uuid[pos]);
     158        }
     159        printf("\n");
     160       
     161        printf("  Volume label: ");
     162        for (pos = 0; pos < 16; pos++) {
     163                c = superblock->volume_name[pos];
     164                if (c >= 32 && c < 128) {
     165                        putchar(c);
     166                }
     167                else {
     168                        putchar(' ');
     169                }
     170        }
     171        printf("\n");
     172       
    112173}
    113174
  • uspace/lib/ext2/libext2.h

    r8bd5dad rc00e729  
    5050        uint8_t         unused2[12];
    5151        uint16_t        magic; // Magic value
     52        uint16_t        state; // State (mounted/unmounted)
     53        uint16_t        rev_minor; // Minor revision level
     54        uint8_t         unused3[12];
     55        uint32_t        creator_os;
     56        uint32_t        rev_major; // Major revision level
     57        uint8_t         unused4[8];
     58       
     59        // Following is for ext2 revision 1 only
     60        uint32_t        first_inode;
     61        uint16_t        inode_size;
     62        uint8_t         unused5[14];
     63        uint8_t         uuid[16]; // UUID TODO: Create a library for UUIDs
     64        uint8_t         volume_name[16];
    5265
    5366// TODO: add __attribute__((aligned(...)) for better performance?
     
    6982// allow maximum this block size
    7083#define EXT2_MAX_BLOCK_SIZE                     8096
     84#define EXT2_REV0_FIRST_INODE           11
     85#define EXT2_REV0_INODE_SIZE            128
    7186
    7287inline uint16_t ext2_superblock_get_magic(ext2_superblock_t *);
     
    7893inline uint32_t ext2_superblock_get_blocks_per_group(ext2_superblock_t *);
    7994inline uint32_t ext2_superblock_get_fragments_per_group(ext2_superblock_t *);
     95inline uint16_t ext2_superblock_get_state(ext2_superblock_t *);
     96inline uint16_t ext2_superblock_get_rev_minor(ext2_superblock_t *);
     97inline uint32_t ext2_superblock_get_rev_major(ext2_superblock_t *);
     98inline uint32_t ext2_superblock_get_creator_os(ext2_superblock_t *);
     99inline uint32_t ext2_superblock_get_first_inode(ext2_superblock_t *);
     100inline uint16_t ext2_superblock_get_inode_size(ext2_superblock_t *);
    80101
    81102extern int ext2_superblock_read_direct(devmap_handle_t, ext2_superblock_t **);
  • uspace/lib/ext2/libext2_superblock.c

    r8bd5dad rc00e729  
    130130}
    131131
     132/**
     133 * Get filesystem state
     134 *
     135 * @param sb pointer to superblock
     136 */
     137inline uint16_t ext2_superblock_get_state(ext2_superblock_t *sb)
     138{
     139        return uint16_t_le2host(sb->state);
     140}
     141
     142/**
     143 * Get minor revision number
     144 *
     145 * @param sb pointer to superblock
     146 */
     147inline uint16_t ext2_superblock_get_rev_minor(ext2_superblock_t *sb)
     148{
     149        return uint16_t_le2host(sb->rev_minor);
     150}
     151
     152/**
     153 * Get major revision number
     154 *
     155 * @param sb pointer to superblock
     156 */
     157inline uint32_t ext2_superblock_get_rev_major(ext2_superblock_t *sb)
     158{
     159        return uint32_t_le2host(sb->rev_major);
     160}
     161
     162/**
     163 * Get index of first regular inode
     164 *
     165 * @param sb pointer to superblock
     166 */
     167inline uint32_t ext2_superblock_get_first_inode(ext2_superblock_t *sb)
     168{
     169        if (ext2_superblock_get_rev_major(sb) == 0) {
     170                return EXT2_REV0_FIRST_INODE;
     171        }
     172        return uint32_t_le2host(sb->first_inode);
     173}
     174
     175/**
     176 * Get size of inode
     177 *
     178 * @param sb pointer to superblock
     179 */
     180inline uint16_t ext2_superblock_get_inode_size(ext2_superblock_t *sb)
     181{
     182        if (ext2_superblock_get_rev_major(sb) == 0) {
     183                return EXT2_REV0_INODE_SIZE;
     184        }
     185        return uint32_t_le2host(sb->inode_size);
     186}
     187
    132188
    133189/** Read a superblock directly from device (i.e. no libblock cache)
Note: See TracChangeset for help on using the changeset viewer.