Changeset 07dcec5 in mainline


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.

Location:
uspace/srv/fs/minixfs
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/minixfs/mfs.h

    r04be5a0 r07dcec5  
    9090        mfs_version_t fs_version;
    9191        int ino_per_block;
    92         int dirsize;
     92        size_t dirsize;
    9393        int itable_off;
    9494        unsigned max_name_len;
     
    122122struct mfs_dentry_info {
    123123        uint32_t d_inum;
    124         char d_name[MFS3_MAX_NAME_LEN];
     124        char d_name[MFS3_MAX_NAME_LEN + 1];
    125125
    126126        /*The following fields do not exist on disk but only in memory*/
     
    182182write_dentry(struct mfs_dentry_info *d_info);
    183183
     184int
     185insert_dentry(struct mfs_node *mnode, char *d_name, fs_index_t d_inum);
     186
    184187/*mfs_balloc.c*/
    185188extern int
  • 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.