Changeset e80c2ff in mainline for uspace/srv/fs/minixfs/mfs_dentry.c


Ignore:
Timestamp:
2011-07-06T19:56:57Z (13 years ago)
Author:
Maurizio Lombardi <m.lombardi85@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
b89281b
Parents:
70ac0af
Message:

The read_directory_entry() function has been rewritten to avoid dynamic memory allocation
of the d_info structure.

File:
1 edited

Legend:

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

    r70ac0af re80c2ff  
    3636int
    3737read_directory_entry(struct mfs_node *mnode,
    38                      struct mfs_dentry_info **d_info, unsigned index)
     38                     struct mfs_dentry_info *d_info, unsigned index)
    3939{
    4040        const struct mfs_instance *inst = mnode->instance;
     
    4444        block_t *b;
    4545
    46         *d_info = malloc(sizeof(**d_info));
    47         if (!*d_info)
    48                 return ENOMEM;
    49 
    5046        int r = read_map(&block, mnode, index * sbi->dirsize);
    51         if (r != EOK)
    52                 goto out_err;
     47        on_error(r, goto out_err);
    5348
    5449        if (block == 0) {
     
    5954
    6055        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);
    6357
    6458        unsigned dentries_per_zone = sbi->block_size / sbi->dirsize;
     
    7064                d3 = b->data + (dentry_off * MFS3_DIRSIZE);
    7165
    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);
    7468        } else {
    7569                const int namelen = longnames ? MFS_L_MAX_NAME_LEN :
     
    8074                d = b->data + dentry_off * (longnames ? MFSL_DIRSIZE :
    8175                                            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);
    8478        }
    8579
    8680        block_put(b);
    8781
    88         (*d_info)->index = index;
    89         (*d_info)->node = mnode;
     82        d_info->index = index;
     83        d_info->node = mnode;
     84
     85out_err:
    9086        return EOK;
    91 
    92 out_err:
    93         free(*d_info);
    94         *d_info = NULL;
    95         return r;
    9687}
    9788
     
    10899
    109100        r = read_map(&block, mnode, d_off_bytes);
    110         if (r != EOK)
    111                 goto out;
     101        on_error(r, goto out);
    112102
    113103        r = block_get(&b, mnode->instance->handle, block, BLOCK_FLAGS_NONE);
    114         if (r != EOK)
    115                 goto out;
     104        on_error(r, goto out);
    116105
    117106        const size_t name_len = sbi->max_name_len;
     
    144133{
    145134        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;
    148137
    149138        const size_t name_len = str_size(d_name);
     
    153142
    154143        /*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) {
    156146                r = read_directory_entry(mnode, &d_info, i);
    157147                on_error(r, return r);
    158148
    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);
    168152                        return r;
    169153                }
    170                 free(d_info);
    171154        }
    172155
     
    177160insert_dentry(struct mfs_node *mnode, const char *d_name, fs_index_t d_inum)
    178161{
    179         int i, r;
     162        int r;
    180163        struct mfs_sb_info *sbi = mnode->instance->sbi;
    181         struct mfs_dentry_info *d_info;
     164        struct mfs_dentry_info d_info;
    182165        bool empty_dentry_found = false;
    183166
     
    188171
    189172        /*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) {
    192175                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) {
    202179                        /*This entry is not used*/
    203180                        empty_dentry_found = true;
    204181                        break;
    205182                }
    206                 free(d_info);
    207183        }
    208184
     
    213189                r = read_directory_entry(mnode, &d_info, i);
    214190                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);
    225198out:
    226199        return r;
Note: See TracChangeset for help on using the changeset viewer.