Changeset 10eb754 in mainline


Ignore:
Timestamp:
2011-04-02T09:14: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:
f3e2663
Parents:
9cd199c
Message:

Add mfs_write_inode_raw() function to write V1 dirty inodes on disk.

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

Legend:

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

    r9cd199c r10eb754  
    9191        int ino_per_block;
    9292        int dirsize;
     93        int itable_off;
    9394        unsigned max_name_len;
    9495        bool long_names;
     
    155156mfs2_read_inode_raw(const struct mfs_instance *instance, uint32_t inum);
    156157
     158extern int
     159put_inode(struct mfs_node *mnode);
     160
    157161/*mfs_read.c*/
    158162int read_map(uint32_t *b, const struct mfs_node *mnode, const uint32_t pos);
  • uspace/srv/fs/minixfs/mfs_inode.c

    r9cd199c r10eb754  
    3838#include "mfs_utils.h"
    3939
    40 struct mfs_ino_info *mfs_read_inode_raw(const struct mfs_instance *instance,
    41                                         uint16_t inum)
     40static int
     41mfs_write_inode_raw(struct mfs_node *mnode);
     42
     43struct mfs_ino_info *
     44mfs_read_inode_raw(const struct mfs_instance *instance, uint16_t inum)
    4245{
    4346        struct mfs_inode *ino = NULL;
     
    4649        block_t *b;
    4750        int i;
     51
     52        sbi = instance->sbi;
     53        assert(sbi);
    4854       
    49         const int ino_off = inum % V1_INODES_PER_BLOCK;
     55        const int ino_off = inum % sbi->ino_per_block;
    5056        const size_t ino_size = sizeof(struct mfs_inode);
    5157
     
    5662                goto out_err;
    5763
    58         sbi = instance->sbi;
    59         assert(sbi);
    60 
    61         const int itable_off = 2 + sbi->ibmap_blocks + sbi->zbmap_blocks;
     64        const int itable_off = sbi->itable_off;
    6265
    6366        if (block_get(&b, instance->handle,
    64                         itable_off + inum / V1_INODES_PER_BLOCK,
     67                        itable_off + inum / sbi->ino_per_block,
    6568                        BLOCK_FLAGS_NONE) != EOK)
    6669                goto out_err;
     
    9497}
    9598
    96 struct mfs_ino_info *mfs2_read_inode_raw(const struct mfs_instance *instance,
    97                                         uint32_t inum)
     99struct mfs_ino_info *
     100mfs2_read_inode_raw(const struct mfs_instance *instance, uint32_t inum)
    98101{
    99102        struct mfs2_inode *ino = NULL;
     
    114117        assert(sbi);
    115118
    116         const int itable_off = 2 + sbi->ibmap_blocks + sbi->zbmap_blocks;
    117         const int ino_off = inum % V3_INODES_PER_BLOCK(sbi->block_size);
     119        const int itable_off = sbi->itable_off;
     120        const int ino_off = inum % sbi->ino_per_block;
    118121
    119122        if (block_get(&b, instance->handle,
    120                 itable_off + inum / V3_INODES_PER_BLOCK(sbi->block_size),
     123                itable_off + inum / sbi->ino_per_block,
    121124                        BLOCK_FLAGS_NONE) != EOK)
    122125                goto out_err;
     
    153156}
    154157
     158int
     159put_inode(struct mfs_node *mnode)
     160{
     161        int rc = EOK;
     162
     163        assert(mnode);
     164        assert(mnode->ino_i);
     165
     166        if (!mnode->ino_i->dirty)
     167                goto out;
     168
     169        struct mfs_instance *inst = mnode->instance;
     170        assert(inst);
     171        struct mfs_sb_info *sbi = inst->sbi;
     172        assert(sbi);
     173
     174        if (sbi->fs_version == MFS_VERSION_V1)
     175                rc = mfs_write_inode_raw(mnode);
     176        else {
     177                /*rc = mfs2_write_inode_raw(mnode);*/
     178        }
     179
     180out:
     181        return rc;
     182}
     183
     184static int
     185mfs_write_inode_raw(struct mfs_node *mnode)
     186{
     187        int i, r;
     188        block_t *b;
     189        struct mfs_ino_info *ino_i = mnode->ino_i;
     190        struct mfs_sb_info *sbi = mnode->instance->sbi;
     191
     192        const int itable_off = sbi->itable_off;
     193        const int ino_off = ino_i->index % sbi->ino_per_block;
     194        const bool native = sbi->native;
     195
     196        r = block_get(&b, mnode->instance->handle,
     197                                itable_off + ino_i->index / sbi->ino_per_block,
     198                                BLOCK_FLAGS_NONE);
     199
     200        if (r != EOK)
     201                goto out;
     202
     203        struct mfs_inode *ino = b->data;
     204        ino += ino_off;
     205
     206        ino->i_mode = conv16(native, ino_i->i_mode);
     207        ino->i_uid = conv16(native, ino_i->i_uid);
     208        ino->i_gid = ino_i->i_gid;
     209        ino->i_nlinks = ino_i->i_nlinks;
     210        ino->i_size = conv32(native, ino_i->i_size);
     211        ino->i_mtime = conv32(native, ino_i->i_mtime);
     212
     213        for (i = 0; i < V1_NR_DIRECT_ZONES; ++i)
     214                ino->i_dzone[i] = conv16(native, ino_i->i_dzone[i]);
     215        for (i = 0; i < V1_NR_INDIRECT_ZONES; ++i)
     216                ino->i_izone[i] = conv16(native, ino_i->i_izone[i]);
     217
     218        b->dirty = true;
     219        block_put(b);
     220
     221        ino_i->dirty = false;
     222out:
     223        return r;
     224}
     225
    155226/**
    156227 * @}
  • uspace/srv/fs/minixfs/mfs_ops.c

    r9cd199c r10eb754  
    5656static aoff64_t mfs_size_get(fs_node_t *node);
    5757static int mfs_match(fs_node_t **rfn, fs_node_t *pfn, const char *component);
     58static int mfs_create_node(fs_node_t **rfn, devmap_handle_t handle, int flags);
    5859
    5960static
     
    7677        .index_get = mfs_index_get,
    7778        .match = mfs_match,
     79        .create = mfs_create_node,
    7880        .plb_get_char = mfs_plb_get_char,
    7981        .has_children = mfs_has_children,
     
    191193                sbi->nzones = conv32(native, sb3->s_nzones);
    192194                sbi->block_size = conv16(native, sb3->s_block_size);
     195                sbi->ino_per_block = V3_INODES_PER_BLOCK(sbi->block_size);
    193196                sbi->dirsize = MFS3_DIRSIZE;
    194197                sbi->max_name_len = MFS3_MAX_NAME_LEN;
     
    202205                sbi->nzones = conv16(native, sb->s_nzones);
    203206                sbi->block_size = MFS_BLOCKSIZE;
     207                sbi->ino_per_block = V1_INODES_PER_BLOCK;
    204208                if (version == MFS_VERSION_V2)
    205209                        sbi->nzones = conv32(native, sb->s_nzones2);
     
    208212                                MFS_MAX_NAME_LEN;
    209213        }
     214        sbi->itable_off = 2 + sbi->ibmap_blocks + sbi->zbmap_blocks;
    210215 
    211216        free(sb);
     
    243248        struct mfs_node *node = fsnode->data;
    244249        return node->instance->handle;
     250}
     251
     252static int mfs_create_node(fs_node_t **rfn, devmap_handle_t handle, int flags)
     253{
     254        mfsdebug("create_node()\n");
     255        return ENOTSUP;
    245256}
    246257
Note: See TracChangeset for help on using the changeset viewer.