Changeset 68ed0fb in mainline


Ignore:
Timestamp:
2011-03-06T14:49:59Z (13 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

Location:
uspace
Files:
3 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
  • uspace/lib/minix/minix.h

    r86d0b4b3 r68ed0fb  
    3636#include <sys/types.h>
    3737
    38 #define MFS_MAX_BLOCK_SIZE      4096
    39 #define MFS_MIN_BLOCK_SIZE      1024
     38#define MFS_BLOCKSIZE           1024
     39
     40/*The following block sizes are valid only on V3 filesystem*/
     41#define MFS_MIN_BLOCKSIZE       1024
     42#define MFS_MAX_BLOCKSIZE       4096
    4043
    4144#define MFS_ROOT_INO            1
    42 #define MFS_SUPER_BLOCK         0
    43 #define MFS_SUPER_BLOCK_SIZE    1024
     45#define MFS_SUPERBLOCK          1
     46#define MFS_SUPERBLOCK_SIZE     1024
    4447
    4548#define V2_NR_DIRECT_ZONES      7
     
    4851#define V1_NR_DIRECT_ZONES      7
    4952#define V1_NR_INDIRECT_ZONES    2
     53
     54#define V1_INODES_PER_BLOCK     (MFS_BLOCKSIZE / sizeof(struct mfs_inode))
     55#define V2_INODES_PER_BLOCK     (MFS_BLOCKSIZE / sizeof(struct mfs2_inode))
     56#define V3_INODES_PER_BLOCK(bs) ((bs) / sizeof(struct mfs2_inode))
    5057
    5158#define MFS_MAX_NAME_LEN        14
     
    126133
    127134/*MinixFS V1 inode structure as it is on disk*/
    128 struct mfs_v1_inode {
     135struct mfs_inode {
    129136        uint16_t        i_mode;
    130137        int16_t         i_uid;
     
    139146} __attribute__ ((packed));
    140147
    141 /*MinixFS V2 inode structure as it is on disk.*/
    142 struct mfs_v2_inode {
     148/*MinixFS V2 inode structure as it is on disk (also valid for V3).*/
     149struct mfs2_inode {
    143150        uint16_t        i_mode;
    144151        uint16_t        i_nlinks;
  • uspace/srv/fs/minixfs/mfs_super.c

    r86d0b4b3 r68ed0fb  
    6868
    6969        /* initialize libblock */
    70         rc = block_init(devmap_handle, MFS_SUPER_BLOCK_SIZE);
     70        rc = block_init(devmap_handle, MFS_SUPERBLOCK_SIZE);
    7171        if (rc != EOK) {
    7272                async_answer_0(rid, rc);
     
    7575
    7676        /* prepare the superblock */
    77         rc = block_bb_read(devmap_handle, MFS_SUPER_BLOCK);
     77        rc = block_bb_read(devmap_handle, MFS_SUPERBLOCK);
    7878        if (rc != EOK) {
    7979                block_fini(devmap_handle);
Note: See TracChangeset for help on using the changeset viewer.