Changeset 68ed0fb in mainline for uspace/app/mkminix/mkminix.c


Ignore:
Timestamp:
2011-03-06T14:49:59Z (14 years ago)
Author:
Maurizio Lombardi <m.lombardi85@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
bc24c5e
Parents:
86d0b4b3
Message:

prepare V1/V2 superblock and write it to disk

File:
1 edited

Legend:

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

    r86d0b4b3 r68ed0fb  
    9797
    9898        /*Default block size is 4Kb*/
    99         opt.block_size = 4096;
     99        opt.block_size = MFS_MAX_BLOCKSIZE;
    100100        opt.n_inodes = 0;
    101101        opt.fs_longnames = false;
     
    115115                case '1':
    116116                        opt.fs_magic = MFS_MAGIC_V1;
    117                         opt.block_size = MFS_MIN_BLOCK_SIZE;
     117                        opt.block_size = MFS_BLOCKSIZE;
    118118                        break;
    119119                case '2':
    120120                        opt.fs_magic = MFS_MAGIC_V2;
    121                         opt.block_size = MFS_MIN_BLOCK_SIZE;
     121                        opt.block_size = MFS_BLOCKSIZE;
    122122                        break;
    123123                case '3':
     
    136136        }
    137137
    138         if (opt.block_size < MFS_MIN_BLOCK_SIZE ||
    139                                 opt.block_size > MFS_MAX_BLOCK_SIZE) {
     138        if (opt.block_size < MFS_MIN_BLOCKSIZE ||
     139                                opt.block_size > MFS_MAX_BLOCKSIZE) {
    140140                printf(NAME ":Error! Invalid block size.\n");
    141141                exit(0);
     
    144144                printf(NAME ":Error! Invalid block size.\n");
    145145                exit(0);
    146         } else if (opt.block_size > MFS_MIN_BLOCK_SIZE &&
     146        } else if (opt.block_size > MFS_BLOCKSIZE &&
    147147                        opt.fs_magic != MFS_MAGIC_V3) {
    148148                printf(NAME ":Error! Block size > 1024 is supported by V3 filesystem only.\n");
     
    168168        }
    169169
    170         rc = block_init(handle, MFS_MIN_BLOCK_SIZE);
     170        rc = block_init(handle, MFS_MIN_BLOCKSIZE);
    171171        if (rc != EOK)  {
    172172                printf(NAME ": Error initializing libblock.\n");
     
    193193        }
    194194
    195         printf("Creating Minix file system on device\n");
     195        /*Minimum block size is 1 Kb*/
     196        opt.dev_nblocks /= 2;
     197
     198        printf(NAME ": Creating Minix file system on device\n");
    196199
    197200        /*Prepare superblock*/
     
    211214                }
    212215                prepare_superblock(sb, &opt);
     216                block_write_direct(handle, MFS_SUPERBLOCK, 1, sb);
    213217        }
    214218
     
    218222static void prepare_superblock(struct mfs_superblock *sb, mfs_params_t *opt)
    219223{
    220         if (opt->fs_longnames) {
    221                 if (opt->fs_magic == MFS_MAGIC_V1)
     224        int ino_per_block = 0;
     225        int fs_version;
     226        aoff64_t tmp;
     227
     228        if (opt->fs_magic == MFS_MAGIC_V1) {
     229                fs_version = 1;
     230                ino_per_block = V1_INODES_PER_BLOCK;
     231                if (opt->fs_longnames)
    222232                        opt->fs_magic = MFS_MAGIC_V1L;
    223                 else
     233        } else {
     234                fs_version = 2;
     235                ino_per_block = V1_INODES_PER_BLOCK;
     236                if (opt->fs_longnames)
    224237                        opt->fs_magic = MFS_MAGIC_V2L;
    225238        }
     
    235248                        UINT32_MAX : opt->dev_nblocks;
    236249
    237         if (opt->n_inodes == 0) {
    238                 aoff64_t tmp = opt->dev_nblocks / 3;           
    239                 sb->s_ninodes = tmp > UINT16_MAX ? UINT16_MAX : tmp;
    240         } else {
    241                 sb->s_ninodes = opt->n_inodes;
    242         }
    243 
     250        if (opt->n_inodes == 0)
     251                tmp = opt->dev_nblocks / 3;             
     252        else
     253                tmp = opt->n_inodes;
     254
     255        /*Round up the number of inodes to fill block size*/
     256        if (tmp % ino_per_block)
     257                tmp = ((tmp / ino_per_block) + 1) * ino_per_block;
     258        sb->s_ninodes = tmp > UINT16_MAX ? UINT16_MAX : tmp;
     259
     260        /*Compute inode bitmap size in blocks*/
     261        sb->s_ibmap_blocks = sb->s_ninodes / (MFS_BLOCKSIZE * 8);
     262        if (sb->s_ibmap_blocks == 0)
     263                sb->s_ibmap_blocks = 1;
     264
     265        /*Compute zone bitmap size in blocks*/
     266        if (fs_version == 1)
     267                sb->s_zbmap_blocks = sb->s_nzones / (MFS_BLOCKSIZE * 8);
     268        else
     269                sb->s_zbmap_blocks = sb->s_nzones2 / (MFS_BLOCKSIZE * 8);
     270        if (sb->s_zbmap_blocks == 0)
     271                sb->s_zbmap_blocks = 1;
     272
     273        /*Compute first data zone position*/
     274        sb->s_first_data_zone = 2 + sb->s_zbmap_blocks + sb->s_ibmap_blocks;
     275        unsigned long ninodes_blocks = 1 + (sb->s_ninodes / (fs_version == 1 ?
     276                                                        V1_INODES_PER_BLOCK :
     277                                                        V2_INODES_PER_BLOCK));
     278        sb->s_first_data_zone += ninodes_blocks;
    244279        sb->s_log2_zone_size = 0;
    245 
     280        /*Superblock is now ready to be written on disk*/
     281        printf(NAME ": %d inodes\n", sb->s_ninodes);
     282        printf(NAME ": %d zones\n", sb->s_nzones2);
     283        printf(NAME ": %d first data zone\n", sb->s_first_data_zone);
    246284}
    247285
Note: See TracChangeset for help on using the changeset viewer.