Changeset 8a49fed in mainline
- Timestamp:
- 2011-04-30T11:45:33Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 44c6091f
- Parents:
- 2874547
- Location:
- uspace/srv/fs/minixfs
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/minixfs/mfs.c
r2874547 r8a49fed 122 122 mfs_write(callid, &call); 123 123 break; 124 case VFS_OUT_TRUNCATE: 125 mfs_truncate(callid, &call); 126 break; 124 127 default: 125 128 async_answer_0(callid, ENOTSUP); -
uspace/srv/fs/minixfs/mfs.h
r2874547 r8a49fed 29 29 /** @addtogroup fs 30 30 * @{ 31 */ 31 */ 32 32 33 33 #ifndef _MFS_H_ … … 111 111 /*Generic MinixFS inode*/ 112 112 struct mfs_ino_info { 113 uint16_ti_mode;114 uint16_ti_nlinks;115 int16_ti_uid;116 uint16_ti_gid;117 118 int32_ti_atime;119 int32_ti_mtime;120 int32_ti_ctime;121 122 uint32_ti_dzone[V2_NR_DIRECT_ZONES];123 124 uint32_ti_izone[V2_NR_INDIRECT_ZONES];113 uint16_t i_mode; 114 uint16_t i_nlinks; 115 int16_t i_uid; 116 uint16_t i_gid; 117 size_t i_size; 118 int32_t i_atime; 119 int32_t i_mtime; 120 int32_t i_ctime; 121 /*Block numbers for direct zones*/ 122 uint32_t i_dzone[V2_NR_DIRECT_ZONES]; 123 /*Block numbers for indirect zones*/ 124 uint32_t i_izone[V2_NR_INDIRECT_ZONES]; 125 125 126 126 /*The following fields do not exist on disk but only in memory*/ … … 159 159 extern void mfs_lookup(ipc_callid_t rid, ipc_call_t *request); 160 160 extern int mfs_instance_get(devmap_handle_t handle, 161 161 struct mfs_instance **instance); 162 162 163 163 extern void mfs_stat(ipc_callid_t rid, ipc_call_t *request); … … 171 171 mfs_write(ipc_callid_t rid, ipc_call_t *request); 172 172 173 extern void 174 mfs_truncate(ipc_callid_t rid, ipc_call_t *request); 175 173 176 /*mfs_inode.c*/ 174 int177 extern int 175 178 get_inode(struct mfs_instance *inst, struct mfs_ino_info **ino_i, 176 179 fs_index_t index); 177 180 178 181 extern int 179 182 put_inode(struct mfs_node *mnode); 180 183 181 int184 extern int 182 185 inode_grow(struct mfs_node *mnode, size_t size_grow); 183 186 187 extern int 188 inode_shrink(struct mfs_node *mnode, size_t size_shrink); 189 184 190 /*mfs_rw.c*/ 185 191 extern int … … 188 194 extern int 189 195 write_map(struct mfs_node *mnode, uint32_t pos, uint32_t new_zone, 190 196 uint32_t *old_zone); 191 197 192 198 extern int … … 196 202 extern int 197 203 read_directory_entry(struct mfs_node *mnode, 198 204 struct mfs_dentry_info **d_info, unsigned index); 199 205 200 206 extern int 201 207 write_dentry(struct mfs_dentry_info *d_info); 202 208 203 int209 extern int 204 210 insert_dentry(struct mfs_node *mnode, const char *d_name, fs_index_t d_inum); 205 211 … … 215 221 /** 216 222 * @} 217 */ 218 223 */ 224 -
uspace/srv/fs/minixfs/mfs_balloc.c
r2874547 r8a49fed 72 72 73 73 r = block_get(&b, inst->handle, block, BLOCK_FLAGS_NONE); 74 if (r != EOK) 75 goto out_err; 74 on_error(r, goto out_err); 76 75 77 76 /*Compute the bit index in the block*/ … … 85 84 ptr[idx / chunk_bits] = conv32(sbi->native, chunk); 86 85 b->dirty = true; 87 r = EOK; 88 block_put(b); 86 r = block_put(b); 89 87 90 88 out_err: … … 128 126 BLOCK_FLAGS_NONE); 129 127 130 if (r != EOK) 131 goto out; 128 on_error(r, goto out); 132 129 133 130 freebit = find_free_bit_and_set(b->data, sbi->block_size, … … 145 142 if (*idx > limit) { 146 143 /*Index is beyond the limit, it is invalid*/ 147 block_put(b); 144 r = block_put(b); 145 on_error(r, goto out); 148 146 break; 149 147 } … … 151 149 *search = *idx; 152 150 b->dirty = true; 153 block_put(b);154 goto found;151 r = block_put(b); 152 goto out; 155 153 } 156 154 … … 163 161 /*Free bit not found, return error*/ 164 162 return ENOSPC; 165 166 found:167 r = EOK;168 163 169 164 out: -
uspace/srv/fs/minixfs/mfs_inode.c
r2874547 r8a49fed 302 302 303 303 int 304 inode_shrink(struct mfs_node *mnode, size_t size_shrink) 305 { 306 struct mfs_sb_info *sbi = mnode->instance->sbi; 307 struct mfs_ino_info *ino_i = mnode->ino_i; 308 const size_t bs = sbi->block_size; 309 int r; 310 311 assert(size_shrink > 0); 312 313 const size_t old_size = ino_i->i_size; 314 const size_t new_size = ino_i->i_size - size_shrink; 315 316 assert(size_shrink <= old_size); 317 318 ino_i->dirty = true; 319 320 /*Compute the number of zones to free*/ 321 unsigned zones_to_free = 0; 322 if (new_size == 0) 323 ++zones_to_free; 324 325 zones_to_free += (old_size / bs) - (new_size / bs); 326 327 mfsdebug("zones to free = %u\n", zones_to_free); 328 329 uint32_t pos = old_size - 1; 330 unsigned i; 331 for (i = 0; i < zones_to_free; ++i, pos -= bs) { 332 uint32_t old_zone; 333 334 r = write_map(mnode, pos, 0, &old_zone); 335 on_error(r, goto exit_error); 336 337 ino_i->i_size -= bs; 338 339 if (old_zone == 0) 340 continue; /*Sparse block*/ 341 342 r = mfs_free_bit(mnode->instance, old_zone, BMAP_ZONE); 343 on_error(r, goto exit_error); 344 } 345 346 ino_i->i_size = new_size; 347 return EOK; 348 349 exit_error: 350 return r; 351 } 352 353 int 304 354 inode_grow(struct mfs_node *mnode, size_t size_grow) 305 355 { -
uspace/srv/fs/minixfs/mfs_ops.c
r2874547 r8a49fed 791 791 } 792 792 793 void 794 mfs_truncate(ipc_callid_t rid, ipc_call_t *request) 795 { 796 devmap_handle_t handle = (devmap_handle_t) IPC_GET_ARG1(*request); 797 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 798 aoff64_t size = (aoff64_t) MERGE_LOUP32(IPC_GET_ARG3(*request), 799 IPC_GET_ARG4(*request)); 800 fs_node_t *fn; 801 int r; 802 803 mfsdebug("mfs_truncate()\n"); 804 805 r = mfs_node_get(&fn, handle, index); 806 if (r != EOK) { 807 async_answer_0(rid, r); 808 return; 809 } 810 811 if (!fn) { 812 async_answer_0(rid, r); 813 return; 814 } 815 816 struct mfs_node *mnode = fn->data; 817 struct mfs_ino_info *ino_i = mnode->ino_i; 818 819 if (ino_i->i_size == size) 820 r = EOK; 821 else 822 r = inode_shrink(mnode, ino_i->i_size - size); 823 824 async_answer_0(rid, r); 825 mfs_node_put(fn); 826 } 827 793 828 int mfs_instance_get(devmap_handle_t handle, struct mfs_instance **instance) 794 829 { -
uspace/srv/fs/minixfs/mfs_rw.c
r2874547 r8a49fed 83 83 { 84 84 const struct mfs_sb_info *sbi = mnode->instance->sbi; 85 const int block_size = sbi->block_size;86 85 87 86 /*Compute the relative block number in file*/ 88 int rblock = pos / block_size;87 int rblock = pos / sbi->block_size; 89 88 90 89 return rw_map_ondisk(old_zone, mnode, rblock, true, new_zone);
Note:
See TracChangeset
for help on using the changeset viewer.