Changeset 953a823 in mainline


Ignore:
Timestamp:
2011-03-17T13:41:58Z (13 years ago)
Author:
Maurizio Lombardi <m.lombardi85@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
3b08178
Parents:
f66d903
Message:

mount minix filesystem and add the superblock info structure to the instances list

Location:
uspace/srv/fs/minixfs
Files:
2 edited
1 moved

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/minixfs/Makefile

    rf66d903 r953a823  
    3535SOURCES = \
    3636        mfs.c \
    37         mfs_super.c \
     37        mfs_ops.c \
    3838        mfs_utils.c
    3939
  • uspace/srv/fs/minixfs/mfs.h

    rf66d903 r953a823  
    3535
    3636#include <minix.h>
     37#include <libblock.h>
     38#include <adt/list.h>
    3739#include "../../vfs/vfs.h"
    3840
     
    4749typedef enum {
    4850        MFS_VERSION_V1 = 1,
    49         MFS_VERSION_V1L,
    5051        MFS_VERSION_V2,
    51         MFS_VERSION_V2L,
    5252        MFS_VERSION_V3
    5353} mfs_version_t;
     54
     55/*Generic MinixFS superblock*/
     56struct mfs_sb_info {
     57        uint32_t ninodes;
     58        uint32_t nzones;
     59        unsigned long ibmap_blocks;
     60        unsigned long zbmap_blocks;
     61        unsigned long firstdatazone;
     62        unsigned long itable_size;
     63        int log2_zone_size;
     64        int ino_per_block;
     65        int dirsize;
     66        int block_size;
     67        int fs_version;
     68        uint32_t max_file_size;
     69        uint16_t magic;
     70        uint16_t state;
     71        bool long_names;
     72        bool native;
     73};
     74
     75struct mfs_instance {
     76        link_t link;
     77        devmap_handle_t handle;
     78        struct mfs_sb_info *sbi;
     79};
    5480
    5581extern void mfs_mounted(ipc_callid_t rid, ipc_call_t *request);
  • uspace/srv/fs/minixfs/mfs_ops.c

    rf66d903 r953a823  
    3535#include <stdlib.h>
    3636#include <libblock.h>
     37#include <fibril_synch.h>
    3738#include <errno.h>
    38 #include <str.h>
     39#include <adt/list.h>
    3940#include "mfs.h"
    4041#include "mfs_utils.h"
     
    4344static bool check_magic_number(uint16_t magic, bool *native,
    4445                                mfs_version_t *version, bool *longfilenames);
     46
     47static LIST_INITIALIZE(inst_list);
     48static FIBRIL_MUTEX_INITIALIZE(inst_list_mutex);
    4549
    4650void mfs_mounted(ipc_callid_t rid, ipc_call_t *request)
     
    4852        devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request);
    4953        enum cache_mode cmode; 
    50         struct mfs_superblock *sp;
    51         struct mfs3_superblock *sp3;
     54        struct mfs_superblock *sb;
     55        struct mfs3_superblock *sb3;
     56        struct mfs_sb_info *sbi;
     57        struct mfs_instance *instance;
    5258        bool native, longnames;
    5359        mfs_version_t version;
     
    8086        }
    8187
    82         sp = (struct mfs_superblock *) malloc(MFS_SUPERBLOCK_SIZE);
     88        /*Allocate space for generic MFS superblock*/
     89        sbi = (struct mfs_sb_info *) malloc(sizeof(struct mfs_sb_info));
     90
     91        if (!sbi) {
     92                async_answer_0(rid, ENOMEM);
     93                return;
     94        }
     95
     96        /*Allocate space for filesystem instance*/
     97        instance = (struct mfs_instance *) malloc(sizeof(struct mfs_instance));
     98
     99        if (!instance) {
     100                async_answer_0(rid, ENOMEM);
     101                return;
     102        }
     103
     104        sb = (struct mfs_superblock *) malloc(MFS_SUPERBLOCK_SIZE);
     105
     106        if (!sb) {
     107                async_answer_0(rid, ENOMEM);
     108                return;
     109        }
    83110
    84111        /* Read the superblock */
    85         rc = block_read_direct(devmap_handle, MFS_SUPERBLOCK << 1, 1, sp);
     112        rc = block_read_direct(devmap_handle, MFS_SUPERBLOCK << 1, 1, sb);
    86113        if (rc != EOK) {
    87114                block_fini(devmap_handle);
     
    90117        }
    91118
    92         if (check_magic_number(sp->s_magic, &native, &version, &longnames)) {
    93                 magic = sp->s_magic;
     119        sb3 = (struct mfs3_superblock *) sb;
     120
     121        if (check_magic_number(sb->s_magic, &native, &version, &longnames)) {
     122                magic = sb->s_magic;
    94123                goto recognized;
    95124        }
    96125
    97         sp3 = (struct mfs3_superblock *) sp;
    98 
    99         if (!check_magic_number(sp3->s_magic, &native, &version, &longnames)) {
     126        if (!check_magic_number(sb3->s_magic, &native, &version, &longnames)) {
    100127                mfsdebug("magic number not recognized\n");
    101128                block_fini(devmap_handle);
     
    104131        }
    105132
    106         magic = sp3->s_magic;
     133        magic = sb3->s_magic;
    107134
    108135recognized:
    109136
    110137        mfsdebug("magic number recognized = %04x\n", magic);
    111         free(sp);
     138
     139        /*Fill superblock info structure*/
     140
     141        sbi->fs_version = version;
     142        sbi->long_names = longnames;
     143        sbi->native = native;
     144        sbi->magic = magic;
     145
     146        if (version == MFS_VERSION_V3) {
     147                sbi->ninodes = conv32(native, sb3->s_ninodes);
     148                sbi->ibmap_blocks = conv16(native, sb3->s_ibmap_blocks);
     149                sbi->zbmap_blocks = conv16(native, sb3->s_zbmap_blocks);
     150                sbi->firstdatazone = conv16(native, sb3->s_first_data_zone);
     151                sbi->log2_zone_size = conv16(native, sb3->s_log2_zone_size);
     152                sbi->max_file_size = conv32(native, sb3->s_max_file_size);
     153                sbi->nzones = conv32(native, sb3->s_nzones);
     154                sbi->block_size = conv16(native, sb3->s_block_size);
     155        } else {
     156                sbi->ninodes = conv16(native, sb->s_ninodes);
     157                sbi->ibmap_blocks = conv16(native, sb->s_ibmap_blocks);
     158                sbi->zbmap_blocks = conv16(native, sb->s_zbmap_blocks);
     159                sbi->firstdatazone = conv16(native, sb->s_first_data_zone);
     160                sbi->log2_zone_size = conv16(native, sb->s_log2_zone_size);
     161                sbi->max_file_size = conv32(native, sb->s_max_file_size);
     162                sbi->nzones = conv16(native, sb->s_nzones);
     163                if (version == MFS_VERSION_V2)
     164                        sbi->nzones = conv32(native, sb->s_nzones2);
     165        }
     166 
     167        free(sb);
     168
     169        /*Initialize the instance structure and add it to the list*/
     170        link_initialize(&instance->link);
     171        instance->handle = devmap_handle;
     172        instance->sbi = sbi;
     173
     174        fibril_mutex_lock(&inst_list_mutex);
     175        list_append(&instance->link, &inst_list);
     176        fibril_mutex_unlock(&inst_list_mutex);
     177
     178        mfsdebug("mount successful\n");
     179
     180        async_answer_0(rid, EOK);
    112181}
    113182
Note: See TracChangeset for help on using the changeset viewer.