Ignore:
File:
1 edited

Legend:

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

    r5bf76c1 r7a46bfe  
    5555static int mfs_has_children(bool *has_children, fs_node_t *fsnode);
    5656static int mfs_root_get(fs_node_t **rfn, service_id_t service_id);
    57 static service_id_t mfs_service_get(fs_node_t *fsnode);
     57static service_id_t mfs_device_get(fs_node_t *fsnode);
    5858static aoff64_t mfs_size_get(fs_node_t *node);
    5959static int mfs_match(fs_node_t **rfn, fs_node_t *pfn, const char *component);
     
    7373
    7474
     75static LIST_INITIALIZE(inst_list);
     76static FIBRIL_MUTEX_INITIALIZE(inst_list_mutex);
    7577static hash_table_t open_nodes;
    7678static FIBRIL_MUTEX_INITIALIZE(open_nodes_lock);
     
    7981        .size_get = mfs_size_get,
    8082        .root_get = mfs_root_get,
    81         .service_get = mfs_service_get,
     83        .device_get = mfs_device_get,
    8284        .is_directory = mfs_is_directory,
    8385        .is_file = mfs_is_file,
     
    177179                return ENOMEM;
    178180        }
     181
     182        instance->open_nodes_cnt = 0;
    179183
    180184        sb = malloc(MFS_SUPERBLOCK_SIZE);
     
    264268                free(instance);
    265269                free(sbi);
     270                free(sb);
    266271                block_cache_fini(service_id);
    267272                block_fini(service_id);
     
    270275        }
    271276
    272         /*Initialize the instance structure and remember it*/
     277        /*Initialize the instance structure and add it to the list*/
     278        link_initialize(&instance->link);
    273279        instance->service_id = service_id;
    274280        instance->sbi = sbi;
    275         instance->open_nodes_cnt = 0;
    276         rc = fs_instance_create(service_id, instance);
    277         if (rc != EOK) {
    278                 free(instance);
    279                 free(sbi);
    280                 block_cache_fini(service_id);
    281                 block_fini(service_id);
    282                 mfsdebug("fs instance creation failed\n");
    283                 return rc;
    284         }
     281
     282        fibril_mutex_lock(&inst_list_mutex);
     283        list_append(&instance->link, &inst_list);
     284        fibril_mutex_unlock(&inst_list_mutex);
    285285
    286286        mfsdebug("mount successful\n");
     
    315315        block_fini(service_id);
    316316
    317         /* Remove and destroy the instance */
    318         (void) fs_instance_destroy(service_id);
     317        /* Remove the instance from the list */
     318        fibril_mutex_lock(&inst_list_mutex);
     319        list_remove(&inst->link);
     320        fibril_mutex_unlock(&inst_list_mutex);
     321
    319322        free(inst->sbi);
    320323        free(inst);
     
    322325}
    323326
    324 service_id_t mfs_service_get(fs_node_t *fsnode)
     327service_id_t mfs_device_get(fs_node_t *fsnode)
    325328{
    326329        struct mfs_node *node = fsnode->data;
     
    465468static aoff64_t mfs_size_get(fs_node_t *node)
    466469{
     470        assert(node);
     471
    467472        const struct mfs_node *mnode = node->data;
     473        assert(mnode);
     474        assert(mnode->ino_i);
     475
    468476        return mnode->ino_i->i_size;
    469477}
     
    505513                assert(mnode->instance->open_nodes_cnt > 0);
    506514                mnode->instance->open_nodes_cnt--;
    507                 rc = mfs_put_inode(mnode);
     515                rc = mfs_put_inode_core(mnode);
    508516                free(mnode->ino_i);
    509517                free(mnode);
     
    527535{
    528536        struct mfs_node *mnode = fsnode->data;
     537
     538        assert(mnode->ino_i);
    529539        return mnode->ino_i->index;
    530540}
     
    10091019mfs_instance_get(service_id_t service_id, struct mfs_instance **instance)
    10101020{
    1011         void *data;
    1012         int rc;
    1013 
    1014         rc = fs_instance_get(service_id, &data);
    1015         if (rc == EOK) {
    1016                 *instance = (struct mfs_instance *) data;
    1017         } else {
    1018                 mfsdebug("instance not found\n");
    1019         }
    1020 
    1021         return rc;
     1021        struct mfs_instance *instance_ptr;
     1022
     1023        fibril_mutex_lock(&inst_list_mutex);
     1024
     1025        if (list_empty(&inst_list)) {
     1026                fibril_mutex_unlock(&inst_list_mutex);
     1027                return EINVAL;
     1028        }
     1029
     1030        list_foreach(inst_list, link) {
     1031                instance_ptr = list_get_instance(link, struct mfs_instance,
     1032                                                 link);
     1033
     1034                if (instance_ptr->service_id == service_id) {
     1035                        *instance = instance_ptr;
     1036                        fibril_mutex_unlock(&inst_list_mutex);
     1037                        return EOK;
     1038                }
     1039        }
     1040
     1041        mfsdebug("Instance not found\n");
     1042
     1043        fibril_mutex_unlock(&inst_list_mutex);
     1044        return EINVAL;
    10221045}
    10231046
Note: See TracChangeset for help on using the changeset viewer.