Changeset 038b289 in mainline for uspace/srv/fs/mfs/mfs_rw.c
- Timestamp:
- 2011-09-06T23:34:35Z (13 years ago)
- 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. - File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/mfs/mfs_rw.c
r7e9fce6 r038b289 83 83 const struct mfs_sb_info *sbi = mnode->instance->sbi; 84 84 85 if (pos >= sbi->max_file_size) { 86 /*Can't write beyond the maximum file size*/ 87 return EINVAL; 88 } 89 85 90 /*Compute the relative block number in file*/ 86 91 int rblock = pos / sbi->block_size; … … 97 102 uint32_t *ind_zone, *ind2_zone; 98 103 99 assert(mnode);100 104 struct mfs_ino_info *ino_i = mnode->ino_i; 101 102 assert(ino_i);103 assert(mnode->instance);104 105 105 struct mfs_instance *inst = mnode->instance; 106 106 struct mfs_sb_info *sbi = inst->sbi; 107 assert(sbi);108 107 109 108 const mfs_version_t fs_version = sbi->fs_version; 109 const bool deleting = write_mode && (w_block == 0); 110 110 111 111 if (fs_version == MFS_VERSION_V1) { … … 132 132 /*The wanted block is in the single indirect zone chain*/ 133 133 if (ino_i->i_izone[0] == 0) { 134 if (write_mode ) {134 if (write_mode && !deleting) { 135 135 uint32_t zone; 136 136 r = alloc_zone_and_clear(inst, &zone); … … 166 166 /*read the first indirect zone of the chain*/ 167 167 if (ino_i->i_izone[1] == 0) { 168 if (write_mode ) {168 if (write_mode && !deleting) { 169 169 uint32_t zone; 170 170 r = alloc_zone_and_clear(inst, &zone); … … 193 193 /*read the second indirect zone of the chain*/ 194 194 if (ind_zone[ind2_off] == 0) { 195 if (write_mode ) {195 if (write_mode && !deleting) { 196 196 uint32_t zone; 197 197 r = alloc_zone_and_clear(inst, &zone); … … 213 213 goto out_free_ind1; 214 214 215 *b = ind2_zone[ ind2_off % ptrs_per_block];215 *b = ind2_zone[rblock - (ind2_off * ptrs_per_block)]; 216 216 if (write_mode) { 217 ind2_zone[ ind2_off % ptrs_per_block] = w_block;217 ind2_zone[rblock - (ind2_off * ptrs_per_block)] = w_block; 218 218 write_ind_zone(inst, ind_zone[ind2_off], ind2_zone); 219 219 } … … 371 371 block_t *b; 372 372 373 r = block_get(&b, inst->service_id, zone, BLOCK_FLAGS_NO NE);373 r = block_get(&b, inst->service_id, zone, BLOCK_FLAGS_NOREAD); 374 374 if (r != EOK) 375 375 return r;
Note:
See TracChangeset
for help on using the changeset viewer.