Changeset 152610a8 in mainline for uspace/srv/fs/minixfs/mfs_read.c


Ignore:
Timestamp:
2011-03-29T18:03:51Z (13 years ago)
Author:
Maurizio Lombardi <m.lombardi85@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
ba5beaf
Parents:
1f1cc9d
Message:

Improves read_map() to avoid the need to call the read_ind_block() function.

File:
1 edited

Legend:

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

    r1f1cc9d r152610a8  
    7474        int r, nr_direct;
    7575        int ptrs_per_block;
    76         uint32_t *bi1 = NULL;
    77         uint32_t *bi2 = NULL;
     76        block_t *bi1;
     77        block_t *bi2;
    7878
    7979        assert(mnode);
     
    8383        assert(mnode->instance);
    8484
    85         const struct mfs_sb_info *sbi = mnode->instance->sbi;
     85        const struct mfs_instance *inst = mnode->instance;
     86        const struct mfs_sb_info *sbi = inst->sbi;
    8687        assert(sbi);
    8788
     
    111112                }
    112113
    113                 bi1 = (uint32_t *) malloc(sbi->block_size);
    114                 r = read_ind_block(bi1, mnode->instance, ino_i->i_izone[0],
    115                                         fs_version);
     114                r = block_get(&bi1, inst->handle, ino_i->i_izone[0],
     115                                BLOCK_FLAGS_NONE);
     116                if (r != EOK)
     117                        goto out;
    116118
    117                 if (fs_version == MFS_VERSION_V1)
    118                         *b = ((uint16_t *) bi1)[rblock];
    119                 else
    120                         *b = bi1[rblock];
     119                if (fs_version == MFS_VERSION_V1) {
     120                        uint16_t tmp = ((uint16_t *) bi1->data)[rblock];
     121                        *b = conv16(sbi->native, tmp);
     122                } else {
     123                        uint32_t tmp = ((uint32_t *) bi1->data)[rblock];
     124                        *b = conv32(sbi->native, tmp);
     125                }
    121126
    122                 goto out;
     127                goto out_put_1;
    123128        }
    124129
     
    133138        }
    134139
    135         bi1 = (uint32_t *) malloc(sbi->block_size);
    136         bi2 = (uint32_t *) malloc(sbi->block_size);
    137 
    138         r = read_ind_block(bi1, mnode->instance, ino_i->i_izone[1],
    139                                 fs_version);
     140        r = block_get(&bi1, inst->handle, ino_i->i_izone[1],
     141                        BLOCK_FLAGS_NONE);
    140142
    141143        if (r != EOK)
     
    150152        /*read the second indirect zone of the chain*/
    151153        if (fs_version == MFS_VERSION_V1) {
    152                 r = read_ind_block(bi2, mnode->instance,
    153                         ((uint16_t *) bi1)[di_block], fs_version);
     154                uint16_t *pt16 = bi1->data;
     155                uint16_t blk = conv16(sbi->native, pt16[di_block]);
     156                r = block_get(&bi2, inst->handle, blk, BLOCK_FLAGS_NONE);
    154157
    155158                if (r != EOK)
    156                         goto out;
     159                        goto out_put_1;
    157160
    158                 *b = ((uint16_t *) bi2)[rblock % ptrs_per_block];
     161                pt16 = bi2->data;
     162                blk = conv16(sbi->native, pt16[di_block % ptrs_per_block]);
     163                *b = blk;
    159164        } else {
    160                 r = read_ind_block(bi2, mnode->instance,
    161                         ((uint32_t *) bi1)[di_block], fs_version);
     165                uint32_t *pt32 = bi1->data;
     166                uint32_t blk = conv32(sbi->native, pt32[di_block]);
     167                r = block_get(&bi2, inst->handle, blk, BLOCK_FLAGS_NONE);
    162168
    163169                if (r != EOK)
    164                         goto out;
     170                        goto out_put_1;
    165171
    166                 *b = bi2[rblock % ptrs_per_block];
     172                pt32 = bi2->data;
     173                blk = conv32(sbi->native, pt32[di_block % ptrs_per_block]);
     174                *b = blk;
    167175        }
    168176        r = EOK;
    169177
     178        block_put(bi2);
     179out_put_1:
     180        block_put(bi1);
    170181out:
    171         if (bi1)
    172                 free(bi1);
    173         if (bi2)
    174                 free(bi2);
    175182        return r;
    176183}
Note: See TracChangeset for help on using the changeset viewer.