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


Ignore:
Timestamp:
2011-04-07T19:48:48Z (13 years ago)
Author:
Maurizio Lombardi <m.lombardi85@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
7a57269f
Parents:
04be5a0
Message:

Add insert_dentry() function to add a new directory entry to the parent dir.

File:
1 edited

Legend:

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

    r04be5a0 r07dcec5  
    107107                goto out;
    108108
    109         const size_t name_len = str_size(d_info->d_name);
     109        const size_t name_len = sbi->max_name_len;
    110110        uint8_t *ptr = b->data;
    111111        ptr += (d_info->index % dirs_per_block) * sbi->dirsize;
     
    132132}
    133133
     134int
     135insert_dentry(struct mfs_node *mnode, char *d_name, fs_index_t d_inum)
     136{
     137        int i, r;
     138        struct mfs_sb_info *sbi = mnode->instance->sbi;
     139        struct mfs_dentry_info *d_info;
     140        bool empty_dentry_found = false;
     141
     142        const size_t name_len = str_size(d_name);
     143
     144        assert(name_len <= sbi->max_name_len);
     145
     146        /*Search for an empty dentry*/
     147
     148        for (i = 2; ; ++i) {
     149                d_info = read_directory_entry(mnode, i);
     150
     151                if (!d_info) {
     152                        /*Reached the end of the dentries list*/
     153                        break;
     154                }
     155
     156                if (d_info->d_inum == 0) {
     157                        /*This entry is not used*/
     158                        empty_dentry_found = true;
     159                        break;
     160                }
     161                free(d_info);
     162        }
     163
     164        if (!empty_dentry_found) {
     165                r = inode_grow(mnode, sbi->dirsize);
     166                if (r != EOK)
     167                        return r;
     168
     169                d_info = read_directory_entry(mnode, i);
     170                if (!d_info)
     171                        return EIO;
     172        }
     173
     174        d_info->d_inum = d_inum;
     175        memcpy(d_info->d_name, d_name, name_len);
     176        d_info->d_name[name_len] = 0;
     177
     178        return  write_dentry(d_info);
     179}
     180
     181
    134182/**
    135183 * @}
Note: See TracChangeset for help on using the changeset viewer.