Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/mfs/mfs_ops.c

    r5b56dc7 r1eaa3cf  
    6464static int mfs_check_sanity(struct mfs_sb_info *sbi);
    6565static bool is_power_of_two(uint32_t n);
     66static int mfs_size_block(service_id_t service_id, uint32_t *size);
     67static int mfs_total_block_count(service_id_t service_id, uint64_t *count);
     68static int mfs_free_block_count(service_id_t service_id, uint64_t *count);
    6669
    6770static hash_table_t open_nodes;
     
    8487        .destroy = mfs_destroy_node,
    8588        .has_children = mfs_has_children,
    86         .lnkcnt_get = mfs_lnkcnt_get
     89        .lnkcnt_get = mfs_lnkcnt_get,
     90        .size_block = mfs_size_block,
     91        .total_block_count = mfs_total_block_count,
     92        .free_block_count = mfs_free_block_count
    8793};
    8894
    8995/* Hash table interface for open nodes hash table */
    90 
    9196typedef struct {
    9297        service_id_t service_id;
     
    190195                /* This is a V1 or V2 Minix filesystem */
    191196                magic = sb->s_magic;
    192         } else if (check_magic_number(sb3->s_magic, &native, &version, &longnames)) {
     197        } else if (check_magic_number(sb3->s_magic, &native,
     198            &version, &longnames)) {
    193199                /* This is a V3 Minix filesystem */
    194200                magic = sb3->s_magic;
     
    210216        sbi->isearch = 0;
    211217        sbi->zsearch = 0;
     218        sbi->nfree_zones_valid = false;
     219        sbi->nfree_zones = 0;
    212220
    213221        if (version == MFS_VERSION_V3) {
     
    345353        uint32_t inum;
    346354
    347         mfsdebug("%s()\n", __FUNCTION__);
    348 
    349355        r = mfs_instance_get(service_id, &inst);
    350356        if (r != EOK)
     
    379385                ino_i->i_mode = S_IFDIR;
    380386                ino_i->i_nlinks = 1; /* This accounts for the '.' dentry */
    381         } else
     387        } else {
    382388                ino_i->i_mode = S_IFREG;
     389                ino_i->i_nlinks = 0;
     390        }
    383391
    384392        ino_i->i_uid = 0;
     
    419427        free(ino_i);
    420428out_err:
     429        mfs_free_inode(inst, inum);
    421430        return r;
    422431}
     
    429438        struct mfs_dentry_info d_info;
    430439        int r;
    431 
    432         mfsdebug("%s()\n", __FUNCTION__);
    433440
    434441        if (!S_ISDIR(ino_i->i_mode))
     
    452459
    453460                if (comp_size == dentry_name_size &&
    454                     !bcmp(component, d_info.d_name, dentry_name_size)) {
     461                    memcmp(component, d_info.d_name, dentry_name_size) == 0) {
    455462                        /* Hit! */
    456463                        mfs_node_core_get(rfn, mnode->instance,
     
    478485        struct mfs_instance *instance;
    479486
    480         mfsdebug("%s()\n", __FUNCTION__);
    481 
    482487        rc = mfs_instance_get(service_id, &instance);
    483488        if (rc != EOK)
     
    492497        int rc = EOK;
    493498        struct mfs_node *mnode = fsnode->data;
    494 
    495         mfsdebug("%s()\n", __FUNCTION__);
    496499
    497500        fibril_mutex_lock(&open_nodes_lock);
     
    554557        int rc;
    555558
    556         mfsdebug("%s()\n", __FUNCTION__);
    557 
    558559        fibril_mutex_lock(&open_nodes_lock);
    559560
     
    568569        if (already_open) {
    569570                mnode = hash_table_get_inst(already_open, struct mfs_node, link);
     571
    570572                *rfn = mnode->fsnode;
    571573                mnode->refcnt++;
     
    648650        struct mfs_sb_info *sbi = parent->instance->sbi;
    649651        bool destroy_dentry = false;
    650 
    651         mfsdebug("%s()\n", __FUNCTION__);
    652652
    653653        if (str_size(name) > sbi->max_name_len)
     
    673673                r = mfs_insert_dentry(child, "..", parent->ino_i->index);
    674674                if (r != EOK) {
     675                        mfs_remove_dentry(child, ".");
    675676                        destroy_dentry = true;
    676677                        goto exit;
     
    700701        bool has_children;
    701702        int r;
    702 
    703         mfsdebug("%s()\n", __FUNCTION__);
    704703
    705704        if (!parent)
     
    924923               
    925924                r = mfs_write_map(mnode, pos, block, &dummy);
    926                 if (r != EOK)
     925                if (r != EOK) {
     926                        mfs_free_zone(mnode->instance, block);
    927927                        goto out_err;
     928                }
    928929
    929930                flags = BLOCK_FLAGS_NOREAD;
     
    965966mfs_destroy(service_id_t service_id, fs_index_t index)
    966967{
    967         fs_node_t *fn;
     968        fs_node_t *fn = NULL;
    968969        int r;
    969970
     
    11361137}
    11371138
     1139static int
     1140mfs_size_block(service_id_t service_id, uint32_t *size)
     1141{
     1142        struct mfs_instance *inst;
     1143        int rc;
     1144
     1145        rc = mfs_instance_get(service_id, &inst);
     1146        if (rc != EOK)
     1147                return rc;
     1148
     1149        if (NULL == inst)
     1150                return ENOENT;
     1151       
     1152        *size = inst->sbi->block_size;
     1153
     1154        return EOK;
     1155}
     1156
     1157static int
     1158mfs_total_block_count(service_id_t service_id, uint64_t *count)
     1159{
     1160        struct mfs_instance *inst;
     1161        int rc;
     1162       
     1163        rc = mfs_instance_get(service_id, &inst);
     1164        if (rc != EOK)
     1165                return rc;
     1166
     1167        if (NULL == inst)
     1168                return ENOENT;
     1169       
     1170        *count = (uint64_t) MFS_BMAP_SIZE_BITS(inst->sbi, BMAP_ZONE);
     1171
     1172        return EOK;
     1173}
     1174
     1175static int
     1176mfs_free_block_count(service_id_t service_id, uint64_t *count)
     1177{
     1178        uint32_t block_free;
     1179       
     1180        struct mfs_instance *inst;
     1181        int rc = mfs_instance_get(service_id, &inst);
     1182        if (rc != EOK)
     1183                return rc;
     1184
     1185        struct mfs_sb_info *sbi = inst->sbi;
     1186
     1187        if (!sbi->nfree_zones_valid) {
     1188                /* The cached number of free zones is not valid,
     1189                 * we need to scan the bitmap to retrieve the
     1190                 * current value.
     1191                 */
     1192
     1193                rc = mfs_count_free_zones(inst, &block_free);
     1194                if (rc != EOK)
     1195                        return rc;
     1196
     1197                sbi->nfree_zones = block_free;
     1198                sbi->nfree_zones_valid = true;
     1199        }
     1200
     1201        *count = sbi->nfree_zones;
     1202
     1203        return EOK;
     1204}
     1205
    11381206vfs_out_ops_t mfs_ops = {
    11391207        .mounted = mfs_mounted,
Note: See TracChangeset for help on using the changeset viewer.