Changeset 24df3834 in mainline for uspace/srv


Ignore:
Timestamp:
2011-12-08T11:09:49Z (14 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
190c943
Parents:
2f016df (diff), e895352 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge from lp:mfs.

Location:
uspace/srv/fs/mfs
Files:
6 edited

Legend:

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

    r2f016df r24df3834  
    4848#define NAME            "mfs"
    4949
    50 //#define DEBUG_MODE
     50/* #define DEBUG_MODE */
    5151
    5252#define min(a, b)       ((a) < (b) ? (a) : (b))
     
    7171} mfs_version_t;
    7272
    73 /*Generic MinixFS superblock*/
     73/* Generic MinixFS superblock */
    7474struct mfs_sb_info {
    7575        uint32_t ninodes;
     
    8484        uint16_t state;
    8585
    86         /*The following fields do not exist on disk but only in memory*/
     86        /* The following fields do not exist on disk but only in memory */
    8787        unsigned long itable_size;
    8888        mfs_version_t fs_version;
     
    9797};
    9898
    99 /*Generic MinixFS inode*/
     99/* Generic MinixFS inode */
    100100struct mfs_ino_info {
    101101        uint16_t        i_mode;
     
    107107        int32_t         i_mtime;
    108108        int32_t         i_ctime;
    109         /*Block numbers for direct zones*/
     109        /* Block numbers for direct zones */
    110110        uint32_t        i_dzone[V2_NR_DIRECT_ZONES];
    111         /*Block numbers for indirect zones*/
     111        /* Block numbers for indirect zones */
    112112        uint32_t        i_izone[V2_NR_INDIRECT_ZONES];
    113113
    114         /*The following fields do not exist on disk but only in memory*/
     114        /* The following fields do not exist on disk but only in memory */
    115115        bool dirty;
    116116        fs_index_t index;
    117117};
    118118
    119 /*Generic MFS directory entry*/
     119/* Generic MFS directory entry */
    120120struct mfs_dentry_info {
    121121        uint32_t d_inum;
    122122        char d_name[MFS3_MAX_NAME_LEN + 1];
    123123
    124         /*The following fields do not exist on disk but only in memory*/
    125 
    126         /*Index of the dentry in the list*/
     124        /* The following fields do not exist on disk but only in memory */
     125
     126        /* Index of the dentry in the list */
    127127        unsigned index;
    128         /*Pointer to the node at witch the dentry belongs*/
     128        /* Pointer to the node at witch the dentry belongs */
    129129        struct mfs_node *node;
    130130};
     
    136136};
    137137
    138 /*MinixFS node in core*/
     138/* MinixFS node in core */
    139139struct mfs_node {
    140140        struct mfs_ino_info *ino_i;
     
    145145};
    146146
    147 /*mfs_ops.c*/
     147/* mfs_ops.c */
    148148extern vfs_out_ops_t mfs_ops;
    149149extern libfs_ops_t mfs_libfs_ops;
     
    152152mfs_global_init(void);
    153153
    154 /*mfs_inode.c*/
     154/* mfs_inode.c */
    155155extern int
    156156mfs_get_inode(struct mfs_instance *inst, struct mfs_ino_info **ino_i,
    157           fs_index_t index);
     157    fs_index_t index);
    158158
    159159extern int
     
    163163mfs_inode_shrink(struct mfs_node *mnode, size_t size_shrink);
    164164
    165 /*mfs_rw.c*/
     165/* mfs_rw.c */
    166166extern int
    167167mfs_read_map(uint32_t *b, const struct mfs_node *mnode, const uint32_t pos);
     
    169169extern int
    170170mfs_write_map(struct mfs_node *mnode, uint32_t pos, uint32_t new_zone,
    171           uint32_t *old_zone);
     171    uint32_t *old_zone);
    172172
    173173extern int
    174174mfs_prune_ind_zones(struct mfs_node *mnode, size_t new_size);
    175175
    176 /*mfs_dentry.c*/
     176/* mfs_dentry.c */
    177177extern int
    178178mfs_read_dentry(struct mfs_node *mnode,
    179                      struct mfs_dentry_info *d_info, unsigned index);
     179    struct mfs_dentry_info *d_info, unsigned index);
    180180
    181181extern int
     
    188188mfs_insert_dentry(struct mfs_node *mnode, const char *d_name, fs_index_t d_inum);
    189189
    190 /*mfs_balloc.c*/
     190/* mfs_balloc.c */
    191191extern int
    192192mfs_alloc_inode(struct mfs_instance *inst, uint32_t *inum);
     
    201201mfs_free_zone(struct mfs_instance *inst, uint32_t zone);
    202202
    203 /*mfs_utils.c*/
     203/* mfs_utils.c */
    204204extern uint16_t
    205205conv16(bool native, uint16_t n);
  • uspace/srv/fs/mfs/mfs_balloc.c

    r2f016df r24df3834  
    198198                limit = sbi->nzones - sbi->firstdatazone - 1;
    199199        } else {
    200                 /*bid == BMAP_INODE*/
     200                /* bid == BMAP_INODE */
    201201                search = &sbi->isearch;
    202202                start_block = 2;
     
    212212        for (i = *search / bits_per_block; i < nblocks; ++i) {
    213213                r = block_get(&b, inst->service_id, i + start_block,
    214                               BLOCK_FLAGS_NONE);
     214                    BLOCK_FLAGS_NONE);
    215215
    216216                if (r != EOK)
  • uspace/srv/fs/mfs/mfs_dentry.c

    r2f016df r24df3834  
    168168                return ENAMETOOLONG;
    169169
    170         /*Search the directory entry to be removed*/
     170        /* Search the directory entry to be removed */
    171171        unsigned i;
    172172        for (i = 0; i < mnode->ino_i->i_size / sbi->dirsize ; ++i) {
  • uspace/srv/fs/mfs/mfs_inode.c

    r2f016df r24df3834  
    235235
    236236        r = block_get(&b, mnode->instance->service_id,
    237                       itable_off + inum / sbi->ino_per_block,
    238                       BLOCK_FLAGS_NONE);
     237            itable_off + inum / sbi->ino_per_block,
     238            BLOCK_FLAGS_NONE);
    239239
    240240        if (r != EOK)
     
    278278
    279279        r = block_get(&b, mnode->instance->service_id,
    280                       itable_off + inum / sbi->ino_per_block,
    281                       BLOCK_FLAGS_NONE);
     280            itable_off + inum / sbi->ino_per_block,
     281            BLOCK_FLAGS_NONE);
    282282
    283283        if (r != EOK)
  • uspace/srv/fs/mfs/mfs_ops.c

    r2f016df r24df3834  
    664664        struct mfs_node *child = cfn->data;
    665665        struct mfs_sb_info *sbi = parent->instance->sbi;
     666        bool destroy_dentry = false;
    666667
    667668        mfsdebug("%s()\n", __FUNCTION__);
     
    672673        int r = mfs_insert_dentry(parent, name, child->ino_i->index);
    673674        if (r != EOK)
    674                 goto exit_error;
    675 
    676         child->ino_i->i_nlinks++;
    677         child->ino_i->dirty = true;
     675                return r;
    678676
    679677        if (S_ISDIR(child->ino_i->i_mode)) {
     678                if (child->ino_i->i_nlinks != 1) {
     679                        /* It's not possible to hardlink directories in MFS */
     680                        destroy_dentry = true;
     681                        r = EMLINK;
     682                        goto exit;
     683                }
    680684                r = mfs_insert_dentry(child, ".", child->ino_i->index);
    681                 if (r != EOK)
    682                         goto exit_error;
     685                if (r != EOK) {
     686                        destroy_dentry = true;
     687                        goto exit;
     688                }
    683689
    684690                r = mfs_insert_dentry(child, "..", parent->ino_i->index);
    685                 if (r != EOK)
    686                         goto exit_error;
     691                if (r != EOK) {
     692                        destroy_dentry = true;
     693                        goto exit;
     694                }
    687695
    688696                parent->ino_i->i_nlinks++;
     
    690698        }
    691699
    692 exit_error:
     700exit:
     701        if (destroy_dentry) {
     702                int r2 = mfs_remove_dentry(parent, name);
     703                if (r2 != EOK)
     704                        r = r2;
     705        } else {
     706                child->ino_i->i_nlinks++;
     707                child->ino_i->dirty = true;
     708        }
    693709        return r;
    694710}
     
    821837found:
    822838                async_data_read_finalize(callid, d_info.d_name,
    823                                         str_size(d_info.d_name) + 1);
     839                    str_size(d_info.d_name) + 1);
    824840                bytes = ((pos - spos) + 1);
    825841        } else {
  • uspace/srv/fs/mfs/mfs_rw.c

    r2f016df r24df3834  
    147147                                ino_i->dirty = true;
    148148                        } else {
    149                                 /*Sparse block*/
     149                                /* Sparse block */
    150150                                *b = 0;
    151151                                return EOK;
     
    233233}
    234234
    235 /**Free unused indirect zones from a MINIX inode according to it's new size.
     235/**Free unused indirect zones from a MINIX inode according to its new size.
    236236 *
    237237 * @param mnode         Pointer to a generic MINIX inode in memory.
Note: See TracChangeset for help on using the changeset viewer.