Changeset 038b289 in mainline for uspace/srv/fs/mfs/mfs_rw.c


Ignore:
Timestamp:
2011-09-06T23:34:35Z (13 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
888207c9, c05642d, c0e53ff
Parents:
7e9fce6 (diff), fb7e5a9a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge MFS improvements from lp:mfs.

File:
1 moved

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/mfs/mfs_rw.c

    r7e9fce6 r038b289  
    8383        const struct mfs_sb_info *sbi = mnode->instance->sbi;
    8484
     85        if (pos >= sbi->max_file_size) {
     86                /*Can't write beyond the maximum file size*/
     87                return EINVAL;
     88        }
     89
    8590        /*Compute the relative block number in file*/
    8691        int rblock = pos / sbi->block_size;
     
    97102        uint32_t *ind_zone, *ind2_zone;
    98103
    99         assert(mnode);
    100104        struct mfs_ino_info *ino_i = mnode->ino_i;
    101 
    102         assert(ino_i);
    103         assert(mnode->instance);
    104 
    105105        struct mfs_instance *inst = mnode->instance;
    106106        struct mfs_sb_info *sbi = inst->sbi;
    107         assert(sbi);
    108107
    109108        const mfs_version_t fs_version = sbi->fs_version;
     109        const bool deleting = write_mode && (w_block == 0);
    110110
    111111        if (fs_version == MFS_VERSION_V1) {
     
    132132                /*The wanted block is in the single indirect zone chain*/
    133133                if (ino_i->i_izone[0] == 0) {
    134                         if (write_mode) {
     134                        if (write_mode && !deleting) {
    135135                                uint32_t zone;
    136136                                r = alloc_zone_and_clear(inst, &zone);
     
    166166        /*read the first indirect zone of the chain*/
    167167        if (ino_i->i_izone[1] == 0) {
    168                 if (write_mode) {
     168                if (write_mode && !deleting) {
    169169                        uint32_t zone;
    170170                        r = alloc_zone_and_clear(inst, &zone);
     
    193193        /*read the second indirect zone of the chain*/
    194194        if (ind_zone[ind2_off] == 0) {
    195                 if (write_mode) {
     195                if (write_mode && !deleting) {
    196196                        uint32_t zone;
    197197                        r = alloc_zone_and_clear(inst, &zone);
     
    213213                goto out_free_ind1;
    214214
    215         *b = ind2_zone[ind2_off % ptrs_per_block];
     215        *b = ind2_zone[rblock - (ind2_off * ptrs_per_block)];
    216216        if (write_mode) {
    217                 ind2_zone[ind2_off % ptrs_per_block] = w_block;
     217                ind2_zone[rblock - (ind2_off * ptrs_per_block)] = w_block;
    218218                write_ind_zone(inst, ind_zone[ind2_off], ind2_zone);
    219219        }
     
    371371        block_t *b;
    372372
    373         r = block_get(&b, inst->service_id, zone, BLOCK_FLAGS_NONE);
     373        r = block_get(&b, inst->service_id, zone, BLOCK_FLAGS_NOREAD);
    374374        if (r != EOK)
    375375                return r;
Note: See TracChangeset for help on using the changeset viewer.