Changeset 32f623d9 in mainline for uspace/srv/fs/fat/fat_ops.c


Ignore:
Timestamp:
2011-09-24T20:49:11Z (14 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
40cdbec
Parents:
5bf76c1
Message:

Make FAT use instance data.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/fat/fat_ops.c

    r5bf76c1 r32f623d9  
    873873        enum cache_mode cmode;
    874874        fat_bs_t *bs;
    875         int rc;
     875        fat_instance_t *instance;
     876        int rc;
     877
     878        instance = malloc(sizeof(fat_instance_t));
     879        if (!instance)
     880                return ENOMEM;
     881
     882        instance->lfn_enabled = true;
    876883
    877884        /* Check for option enabling write through. */
     
    883890        /* initialize libblock */
    884891        rc = block_init(EXCHANGE_SERIALIZE, service_id, BS_SIZE);
    885         if (rc != EOK)
    886                 return rc;
     892        if (rc != EOK) {
     893                free(instance);
     894                return rc;
     895        }
    887896
    888897        /* prepare the boot block */
    889898        rc = block_bb_read(service_id, BS_BLOCK);
    890899        if (rc != EOK) {
     900                free(instance);
    891901                block_fini(service_id);
    892902                return rc;
     
    897907       
    898908        if (BPS(bs) != BS_SIZE) {
     909                free(instance);
    899910                block_fini(service_id);
    900911                return ENOTSUP;
     
    904915        rc = block_cache_init(service_id, BPS(bs), 0 /* XXX */, cmode);
    905916        if (rc != EOK) {
     917                free(instance);
    906918                block_fini(service_id);
    907919                return rc;
     
    911923        rc = fat_sanity_check(bs, service_id);
    912924        if (rc != EOK) {
     925                free(instance);
    913926                (void) block_cache_fini(service_id);
    914927                block_fini(service_id);
     
    918931        rc = fat_idx_init_by_service_id(service_id);
    919932        if (rc != EOK) {
     933                free(instance);
    920934                (void) block_cache_fini(service_id);
    921935                block_fini(service_id);
     
    926940        fs_node_t *rfn = (fs_node_t *)malloc(sizeof(fs_node_t));
    927941        if (!rfn) {
     942                free(instance);
    928943                (void) block_cache_fini(service_id);
    929944                block_fini(service_id);
     
    935950        fat_node_t *rootp = (fat_node_t *)malloc(sizeof(fat_node_t));
    936951        if (!rootp) {
     952                free(instance);
    937953                free(rfn);
    938954                (void) block_cache_fini(service_id);
     
    945961        fat_idx_t *ridxp = fat_idx_get_by_pos(service_id, FAT_CLST_ROOTPAR, 0);
    946962        if (!ridxp) {
     963                free(instance);
    947964                free(rfn);
    948965                free(rootp);
     
    964981                rc = fat_clusters_get(&clusters, bs, service_id, rootp->firstc);
    965982                if (rc != EOK) {
     983                        fibril_mutex_unlock(&ridxp->lock);
     984                        free(instance);
    966985                        free(rfn);
    967986                        free(rootp);
     
    974993        } else
    975994                rootp->size = RDE(bs) * sizeof(fat_dentry_t);
     995
     996        rc = fs_instance_create(service_id, instance);
     997        if (rc != EOK) {
     998                fibril_mutex_unlock(&ridxp->lock);
     999                free(instance);
     1000                free(rfn);
     1001                free(rootp);
     1002                (void) block_cache_fini(service_id);
     1003                block_fini(service_id);
     1004                fat_idx_fini_by_service_id(service_id);
     1005                return rc;
     1006        }
    9761007
    9771008        rootp->idx = ridxp;
     
    10241055        (void) block_cache_fini(service_id);
    10251056        block_fini(service_id);
     1057
     1058        void *data;
     1059        if (fs_instance_get(service_id, &data) == EOK) {
     1060                fs_instance_destroy(service_id);
     1061                free(data);
     1062        }
    10261063
    10271064        return EOK;
Note: See TracChangeset for help on using the changeset viewer.