Changeset e80c2ff in mainline for uspace/srv/fs/minixfs/mfs_dentry.c
- Timestamp:
- 2011-07-06T19:56:57Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b89281b
- Parents:
- 70ac0af
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/minixfs/mfs_dentry.c
r70ac0af re80c2ff 36 36 int 37 37 read_directory_entry(struct mfs_node *mnode, 38 struct mfs_dentry_info * *d_info, unsigned index)38 struct mfs_dentry_info *d_info, unsigned index) 39 39 { 40 40 const struct mfs_instance *inst = mnode->instance; … … 44 44 block_t *b; 45 45 46 *d_info = malloc(sizeof(**d_info));47 if (!*d_info)48 return ENOMEM;49 50 46 int r = read_map(&block, mnode, index * sbi->dirsize); 51 if (r != EOK) 52 goto out_err; 47 on_error(r, goto out_err); 53 48 54 49 if (block == 0) { … … 59 54 60 55 r = block_get(&b, inst->handle, block, BLOCK_FLAGS_NONE); 61 if (r != EOK) 62 goto out_err; 56 on_error(r, goto out_err); 63 57 64 58 unsigned dentries_per_zone = sbi->block_size / sbi->dirsize; … … 70 64 d3 = b->data + (dentry_off * MFS3_DIRSIZE); 71 65 72 (*d_info)->d_inum = conv32(sbi->native, d3->d_inum);73 memcpy( (*d_info)->d_name, d3->d_name, MFS3_MAX_NAME_LEN);66 d_info->d_inum = conv32(sbi->native, d3->d_inum); 67 memcpy(d_info->d_name, d3->d_name, MFS3_MAX_NAME_LEN); 74 68 } else { 75 69 const int namelen = longnames ? MFS_L_MAX_NAME_LEN : … … 80 74 d = b->data + dentry_off * (longnames ? MFSL_DIRSIZE : 81 75 MFS_DIRSIZE); 82 (*d_info)->d_inum = conv16(sbi->native, d->d_inum);83 memcpy( (*d_info)->d_name, d->d_name, namelen);76 d_info->d_inum = conv16(sbi->native, d->d_inum); 77 memcpy(d_info->d_name, d->d_name, namelen); 84 78 } 85 79 86 80 block_put(b); 87 81 88 (*d_info)->index = index; 89 (*d_info)->node = mnode; 82 d_info->index = index; 83 d_info->node = mnode; 84 85 out_err: 90 86 return EOK; 91 92 out_err:93 free(*d_info);94 *d_info = NULL;95 return r;96 87 } 97 88 … … 108 99 109 100 r = read_map(&block, mnode, d_off_bytes); 110 if (r != EOK) 111 goto out; 101 on_error(r, goto out); 112 102 113 103 r = block_get(&b, mnode->instance->handle, block, BLOCK_FLAGS_NONE); 114 if (r != EOK) 115 goto out; 104 on_error(r, goto out); 116 105 117 106 const size_t name_len = sbi->max_name_len; … … 144 133 { 145 134 struct mfs_sb_info *sbi = mnode->instance->sbi; 146 struct mfs_dentry_info *d_info;147 int i,r;135 struct mfs_dentry_info d_info; 136 int r; 148 137 149 138 const size_t name_len = str_size(d_name); … … 153 142 154 143 /*Search the directory entry to be removed*/ 155 for (i = 0; ; ++i) { 144 unsigned i; 145 for (i = 0; i < mnode->ino_i->i_size / sbi->dirsize ; ++i) { 156 146 r = read_directory_entry(mnode, &d_info, i); 157 147 on_error(r, return r); 158 148 159 if (!d_info) { 160 /*Reached the end of the dentries list*/ 161 break; 162 } 163 164 if (!bcmp(d_info->d_name, d_name, name_len)) { 165 d_info->d_inum = 0; 166 r = write_dentry(d_info); 167 free(d_info); 149 if (!bcmp(d_info.d_name, d_name, name_len)) { 150 d_info.d_inum = 0; 151 r = write_dentry(&d_info); 168 152 return r; 169 153 } 170 free(d_info);171 154 } 172 155 … … 177 160 insert_dentry(struct mfs_node *mnode, const char *d_name, fs_index_t d_inum) 178 161 { 179 int i,r;162 int r; 180 163 struct mfs_sb_info *sbi = mnode->instance->sbi; 181 struct mfs_dentry_info *d_info;164 struct mfs_dentry_info d_info; 182 165 bool empty_dentry_found = false; 183 166 … … 188 171 189 172 /*Search for an empty dentry*/ 190 191 for (i = 0; ; ++i) {173 unsigned i; 174 for (i = 0; i < mnode->ino_i->i_size / sbi->dirsize; ++i) { 192 175 r = read_directory_entry(mnode, &d_info, i); 193 if (r != EOK) 194 return r; 195 196 if (!d_info) { 197 /*Reached the end of the dentries list*/ 198 break; 199 } 200 201 if (d_info->d_inum == 0) { 176 on_error(r, return r); 177 178 if (d_info.d_inum == 0) { 202 179 /*This entry is not used*/ 203 180 empty_dentry_found = true; 204 181 break; 205 182 } 206 free(d_info);207 183 } 208 184 … … 213 189 r = read_directory_entry(mnode, &d_info, i); 214 190 on_error(r, goto out); 215 216 assert(d_info != NULL); 217 } 218 219 d_info->d_inum = d_inum; 220 memcpy(d_info->d_name, d_name, name_len); 221 d_info->d_name[name_len] = 0; 222 223 r = write_dentry(d_info); 224 free(d_info); 191 } 192 193 d_info.d_inum = d_inum; 194 memcpy(d_info.d_name, d_name, name_len); 195 d_info.d_name[name_len] = 0; 196 197 r = write_dentry(&d_info); 225 198 out: 226 199 return r;
Note:
See TracChangeset
for help on using the changeset viewer.