Changeset 2d7c77a in mainline for uspace/srv/fs/minixfs/mfs_read.c


Ignore:
Timestamp:
2011-04-03T17:41: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:
18346ec
Parents:
c4eeb2f
Message:

Modify read_map_ondisk() to support write mode, it has been renamed to rw_map_ondisk.

When write_mode is set at "true", a reference to a block (which number is specified in the parameter
w_block) will be saved at the given position.

File:
1 edited

Legend:

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

    rc4eeb2f r2d7c77a  
    3636#include "mfs_utils.h"
    3737
    38 static int read_map_ondisk(uint32_t *b, const struct mfs_node *mnode, int rblock);
    39 
    40 /*Given the position in the file expressed in
     38static int
     39rw_map_ondisk(uint32_t *b, const struct mfs_node *mnode, int rblock,
     40                                bool write_mode, uint32_t w_block);
     41
     42/**Given the position in the file expressed in
    4143 *bytes, this function returns the on-disk block
    4244 *relative to that position.
     
    6567        }
    6668
    67         r = read_map_ondisk(b, mnode, rblock);
     69        r = rw_map_ondisk(b, mnode, rblock, false, 0);
    6870out:
    6971        return r;
    7072}
    7173
    72 static int read_map_ondisk(uint32_t *b, const struct mfs_node *mnode, int rblock)
     74static int
     75rw_map_ondisk(uint32_t *b, const struct mfs_node *mnode, int rblock,
     76                                bool write_mode, uint32_t w_block)
    7377{
    7478        int r, nr_direct;
     
    7882
    7983        assert(mnode);
    80         const struct mfs_ino_info *ino_i = mnode->ino_i;
     84        struct mfs_ino_info *ino_i = mnode->ino_i;
    8185
    8286        assert(ino_i);
     
    100104        if (rblock < nr_direct) {
    101105                *b = ino_i->i_dzone[rblock];
     106                if (write_mode) {
     107                        ino_i->i_dzone[rblock] = w_block;
     108                        ino_i->dirty = true;
     109                }
    102110                r = EOK;
    103111                goto out;
     
    118126
    119127                if (fs_version == MFS_VERSION_V1) {
    120                         uint16_t tmp = ((uint16_t *) bi1->data)[rblock];
    121                         *b = conv16(sbi->native, tmp);
     128                        uint16_t *tmp = &(((uint16_t *) bi1->data)[rblock]);
     129                        *b = conv16(sbi->native, *tmp);
     130                        if (write_mode) {
     131                                *tmp = conv16(sbi->native, w_block);
     132                                bi1->dirty = true;
     133                        }
    122134                } else {
    123                         uint32_t tmp = ((uint32_t *) bi1->data)[rblock];
    124                         *b = conv32(sbi->native, tmp);
     135                        uint32_t *tmp = &(((uint32_t *) bi1->data)[rblock]);
     136                        *b = conv32(sbi->native, *tmp);
     137                        if (write_mode) {
     138                                *tmp = conv32(sbi->native, w_block);
     139                                bi1->dirty = true;
     140                        }
    125141                }
    126142
     
    154170                uint16_t *pt16 = bi1->data;
    155171                uint16_t blk = conv16(sbi->native, pt16[di_block]);
     172       
    156173                r = block_get(&bi2, inst->handle, blk, BLOCK_FLAGS_NONE);
    157174
     
    160177
    161178                pt16 = bi2->data;
    162                 blk = conv16(sbi->native, pt16[di_block % ptrs_per_block]);
    163                 *b = blk;
     179                pt16 += di_block % ptrs_per_block;
     180                *b = conv16(sbi->native, *pt16);
     181                if (write_mode) {
     182                        *pt16 = conv16(sbi->native, w_block);
     183                        bi2->dirty = false;
     184                }
    164185        } else {
    165186                uint32_t *pt32 = bi1->data;
    166187                uint32_t blk = conv32(sbi->native, pt32[di_block]);
     188       
    167189                r = block_get(&bi2, inst->handle, blk, BLOCK_FLAGS_NONE);
    168190
     
    171193
    172194                pt32 = bi2->data;
    173                 blk = conv32(sbi->native, pt32[di_block % ptrs_per_block]);
    174                 *b = blk;
     195                pt32 += di_block % ptrs_per_block;
     196                *b = conv32(sbi->native, *pt32);
     197                if (write_mode) {
     198                        *pt32 = conv32(sbi->native, w_block);
     199                        bi2->dirty = false;
     200                }
    175201        }
    176202        r = EOK;
Note: See TracChangeset for help on using the changeset viewer.