Changeset 155f792 in mainline for uspace/srv/fs/minixfs/mfs_read.c


Ignore:
Timestamp:
2011-03-20T11:30:25Z (14 years ago)
Author:
Maurizio Lombardi <m.lombardi85@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
6adba0a8
Parents:
930baca
Message:

Use a generic minixfs inode in core to avoid code duplication

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/minixfs/mfs_read.c

    r930baca r155f792  
    44#include "mfs_utils.h"
    55
    6 static int read_map_v1(uint16_t *b, const struct mfs_node *mnode, int rblock);
    7 static int read_map_v2(uint32_t *b, const struct mfs_node *mnode, int rblock);
     6static int read_map_ondisk(uint32_t *b, const struct mfs_node *mnode, int rblock);
    87
    98/*Given the position in the file expressed in
     
    2221        assert(sbi);
    2322
    24         const mfs_version_t fs_version = sbi->fs_version;
    2523        const int block_size = sbi->block_size;
    2624
     
    2826        int rblock = pos / block_size;
    2927
    30         if (fs_version == MFS_VERSION_V1) {
    31                 if (mnode->ino->i_size < (int32_t) pos)
    32                         return -1;
    33 
    34                 uint16_t b16 = 0;
    35                 r = read_map_v1(&b16, mnode, rblock);
    36                 *b = b16;
    37         } else {
    38                 if (mnode->ino2->i_size < (int32_t) pos)
    39                         return -1;
    40 
    41                 r = read_map_v2(b, mnode, rblock);
    42         }
    43 
    44         return r;
    45 }
    46 
    47 static int read_map_v1(uint16_t *b, const struct mfs_node *mnode, int rblock)
    48 {
    49         const int ptrs_per_block = MFS_BLOCKSIZE / sizeof(uint16_t);
    50         block_t *bi1, *bi2;
    51         const struct mfs_inode *ino = mnode->ino;
    52         int r;
    53 
    54         assert(ino);
    55         assert(mnode->instance);
    56 
    57         if (rblock < V1_NR_DIRECT_ZONES) {
    58                 *b = ino->i_dzone[rblock];
     28        if (mnode->ino_i->i_size < (int32_t) pos) {
    5929                r = EOK;
     30                *b = 0;
    6031                goto out;
    6132        }
    6233
    63         rblock -= V1_NR_DIRECT_ZONES - 1;
    64 
    65         /*Check if the wanted block is in the single indirect zone*/
    66         if (rblock < ptrs_per_block) {
    67                 if (ino->i_izone[0] == 0) {
    68                         r = -1;
    69                         goto out;
    70                 }
    71 
    72                 r = read_ind_block(bi1, mnode->instance, ino->i_izone[0]);
    73 
    74                 if (r != EOK)
    75                         goto out;
    76 
    77                 *b = ((uint16_t *) bi1->data)[rblock];
    78                 goto out_block;
    79         }
    80 
    81         rblock -= ptrs_per_block - 1;
    82 
    83         /*The wanted block is in the double indirect zone*/
    84         uint16_t di_block = rblock / ptrs_per_block;
    85 
    86         /*read the first indirect zone*/
    87         if (ino->i_izone[1] == 0) {
    88                 r = -1;
    89                 goto out;
    90         }
    91 
    92         r = read_ind_block(bi1, mnode->instance, ino->i_izone[1]);
    93 
    94         if (r != EOK)
    95                 goto out;
    96 
    97         /*read the dobule indirect zone*/
    98         r = read_ind_block(bi2, mnode->instance,
    99                         ((uint16_t *) bi1->data)[di_block]);
    100 
    101         if (r != EOK)
    102                 goto out_block;
    103 
    104         *b = ((uint16_t *) bi2->data)[rblock % ptrs_per_block];
    105         block_put(bi2);
    106 
    107 out_block:
    108         block_put(bi1);
     34        r = read_map_ondisk(b, mnode, rblock);
    10935out:
    11036        return r;
    11137}
    11238
    113 static int read_map_v2(uint32_t *b, const struct mfs_node *mnode, int rblock)
     39static int read_map_ondisk(uint32_t *b, const struct mfs_node *mnode, int rblock)
    11440{
    11541        block_t *bi1, *bi2;
    116         int r;
     42        int r, nr_direct, nr_indirect;
     43        int ptrs_per_block;
    11744
    11845        assert(mnode);
    119         const struct mfs2_inode *ino2 = mnode->ino2;
     46        const struct mfs_ino_info *ino_i = mnode->ino_i;
    12047
    121         assert(ino2);
     48        assert(ino_i);
    12249        assert(mnode->instance);
    12350
     
    12552        assert(sbi);
    12653
    127         const int ptrs_per_block = sbi->block_size / sizeof(uint32_t);
     54        const int fs_version = sbi->fs_version;
    12855
    129         if (rblock < V2_NR_DIRECT_ZONES) {
    130                 *b = ino2->i_dzone[rblock];
     56        if (fs_version == MFS_VERSION_V1) {
     57                nr_direct = V1_NR_DIRECT_ZONES;
     58                nr_indirect = V1_NR_INDIRECT_ZONES;
     59                ptrs_per_block = MFS_BLOCKSIZE / sizeof(uint16_t);
     60        } else {
     61                nr_direct = V2_NR_DIRECT_ZONES;
     62                nr_indirect = V2_NR_INDIRECT_ZONES;
     63                ptrs_per_block = sbi->block_size / sizeof(uint32_t);
     64        }
     65
     66        if (rblock < nr_direct) {
     67                *b = ino_i->i_dzone[rblock];
    13168                r = EOK;
    13269                goto out;
    13370        }
    134         rblock -= V2_NR_DIRECT_ZONES - 1;
     71        rblock -= nr_direct - 1;
    13572
    13673        /*Check if the wanted block is in the single indirect zone*/
    13774        if (rblock < ptrs_per_block) {
    138                 if (ino2->i_izone[0] == 0) {
     75                if (ino_i->i_izone[0] == 0) {
    13976                        r = -1;
    14077                        goto out;
    14178                }
    14279
    143                 r = read_ind_block(bi2, mnode->instance, ino2->i_izone[0]);
     80                r = read_ind_block(bi2, mnode->instance, ino_i->i_izone[0]);
    14481
    14582                if (r != EOK)
    14683                        goto out;
    14784
    148                 *b = ((uint32_t *) bi1->data)[rblock];
     85                *b = fs_version == MFS_VERSION_V1 ?
     86                                ((uint16_t *) bi1->data)[rblock] :
     87                                ((uint32_t *) bi1->data)[rblock];
    14988                goto out_block;
    15089        }
     
    15695
    15796        /*read the first indirect zone*/
    158         if (ino2->i_izone[1] == 0) {
     97        if (ino_i->i_izone[1] == 0) {
    15998                r = -1;
    16099                goto out;
    161100        }
    162101
    163         r = read_ind_block(bi1, mnode->instance, ino2->i_izone[1]);
     102        r = read_ind_block(bi1, mnode->instance, ino_i->i_izone[1]);
    164103
    165104        if (r != EOK)
     
    167106
    168107        /*read the second indirect zone*/
    169         r = read_ind_block(bi2, mnode->instance,
     108        if (fs_version == MFS_VERSION_V1) {
     109                r = read_ind_block(bi2, mnode->instance,
     110                        ((uint16_t *) bi1->data)[di_block]);
     111
     112                if (r != EOK)
     113                        goto out_block;
     114
     115                *b = ((uint16_t *) bi2->data)[rblock % ptrs_per_block];
     116        } else {
     117                r = read_ind_block(bi2, mnode->instance,
    170118                        ((uint32_t *) bi1->data)[di_block]);
    171119
    172         if (r != EOK)
    173                 goto out_block;
     120                if (r != EOK)
     121                        goto out_block;
    174122
    175         *b = ((uint32_t *) bi2->data)[rblock % ptrs_per_block];
     123                *b = ((uint32_t *) bi2->data)[rblock % ptrs_per_block];
     124        }
    176125        block_put(bi2);
    177126
Note: See TracChangeset for help on using the changeset viewer.