Ignore:
File:
1 edited

Legend:

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

    rb69e4c0 rb33870b  
    871871    aoff64_t *size, unsigned *linkcnt)
    872872{
    873         enum cache_mode cmode = CACHE_MODE_WB;
     873        enum cache_mode cmode;
    874874        fat_bs_t *bs;
    875         fat_instance_t *instance;
    876         int rc;
    877 
    878         instance = malloc(sizeof(fat_instance_t));
    879         if (!instance)
    880                 return ENOMEM;
    881         instance->lfn_enabled = true;
    882 
    883         /* Parse mount options. */
    884         char *mntopts = (char *) opts;
    885         char *saveptr;
    886         char *opt;
    887         while ((opt = strtok_r(mntopts, " ,", &saveptr)) != NULL) {
    888                 if (str_cmp(opt, "wtcache") == 0)
    889                         cmode = CACHE_MODE_WT;
    890                 else if (str_cmp(opt, "nolfn") == 0)
    891                         instance->lfn_enabled = false;
    892                 mntopts = NULL;
    893         }
     875        int rc;
     876
     877        /* Check for option enabling write through. */
     878        if (str_cmp(opts, "wtcache") == 0)
     879                cmode = CACHE_MODE_WT;
     880        else
     881                cmode = CACHE_MODE_WB;
    894882
    895883        /* initialize libblock */
    896884        rc = block_init(EXCHANGE_SERIALIZE, service_id, BS_SIZE);
    897         if (rc != EOK) {
    898                 free(instance);
    899                 return rc;
    900         }
     885        if (rc != EOK)
     886                return rc;
    901887
    902888        /* prepare the boot block */
    903889        rc = block_bb_read(service_id, BS_BLOCK);
    904890        if (rc != EOK) {
    905                 free(instance);
    906891                block_fini(service_id);
    907892                return rc;
     
    912897       
    913898        if (BPS(bs) != BS_SIZE) {
    914                 free(instance);
    915899                block_fini(service_id);
    916900                return ENOTSUP;
     
    920904        rc = block_cache_init(service_id, BPS(bs), 0 /* XXX */, cmode);
    921905        if (rc != EOK) {
    922                 free(instance);
    923906                block_fini(service_id);
    924907                return rc;
     
    928911        rc = fat_sanity_check(bs, service_id);
    929912        if (rc != EOK) {
    930                 free(instance);
    931913                (void) block_cache_fini(service_id);
    932914                block_fini(service_id);
     
    936918        rc = fat_idx_init_by_service_id(service_id);
    937919        if (rc != EOK) {
    938                 free(instance);
    939920                (void) block_cache_fini(service_id);
    940921                block_fini(service_id);
     
    945926        fs_node_t *rfn = (fs_node_t *)malloc(sizeof(fs_node_t));
    946927        if (!rfn) {
    947                 free(instance);
    948928                (void) block_cache_fini(service_id);
    949929                block_fini(service_id);
     
    955935        fat_node_t *rootp = (fat_node_t *)malloc(sizeof(fat_node_t));
    956936        if (!rootp) {
    957                 free(instance);
    958937                free(rfn);
    959938                (void) block_cache_fini(service_id);
     
    966945        fat_idx_t *ridxp = fat_idx_get_by_pos(service_id, FAT_CLST_ROOTPAR, 0);
    967946        if (!ridxp) {
    968                 free(instance);
    969947                free(rfn);
    970948                free(rootp);
     
    986964                rc = fat_clusters_get(&clusters, bs, service_id, rootp->firstc);
    987965                if (rc != EOK) {
    988                         fibril_mutex_unlock(&ridxp->lock);
    989                         free(instance);
    990966                        free(rfn);
    991967                        free(rootp);
     
    999975                rootp->size = RDE(bs) * sizeof(fat_dentry_t);
    1000976
    1001         rc = fs_instance_create(service_id, instance);
    1002         if (rc != EOK) {
    1003                 fibril_mutex_unlock(&ridxp->lock);
    1004                 free(instance);
    1005                 free(rfn);
    1006                 free(rootp);
    1007                 (void) block_cache_fini(service_id);
    1008                 block_fini(service_id);
    1009                 fat_idx_fini_by_service_id(service_id);
    1010                 return rc;
    1011         }
    1012 
    1013977        rootp->idx = ridxp;
    1014978        ridxp->nodep = rootp;
     
    1025989}
    1026990
    1027 static int fat_update_fat32_fsinfo(service_id_t service_id)
    1028 {
    1029         fat_bs_t *bs;
    1030         fat32_fsinfo_t *info;
    1031         block_t *b;
    1032         int rc;
    1033 
    1034         bs = block_bb_get(service_id);
    1035         assert(FAT_IS_FAT32(bs));
    1036 
    1037         rc = block_get(&b, service_id, uint16_t_le2host(bs->fat32.fsinfo_sec),
    1038             BLOCK_FLAGS_NONE);
    1039         if (rc != EOK)
    1040                 return rc;
    1041 
    1042         info = (fat32_fsinfo_t *) b->data;
    1043 
    1044         if (bcmp(info->sig1, FAT32_FSINFO_SIG1, sizeof(info->sig1)) ||
    1045             bcmp(info->sig2, FAT32_FSINFO_SIG2, sizeof(info->sig2)) ||
    1046             bcmp(info->sig3, FAT32_FSINFO_SIG3, sizeof(info->sig3))) {
    1047                 (void) block_put(b);
    1048                 return EINVAL;
    1049         }
    1050 
    1051         /* For now, invalidate the counter. */
    1052         info->free_clusters = host2uint16_t_le(-1);
    1053 
    1054         b->dirty = true;
    1055         return block_put(b);
    1056 }
    1057 
    1058991static int fat_unmounted(service_id_t service_id)
    1059992{
    1060993        fs_node_t *fn;
    1061994        fat_node_t *nodep;
    1062         fat_bs_t *bs;
    1063         int rc;
    1064 
    1065         bs = block_bb_get(service_id);
     995        int rc;
    1066996
    1067997        rc = fat_root_get(&fn, service_id);
     
    10771007                (void) fat_node_put(fn);
    10781008                return EBUSY;
    1079         }
    1080 
    1081         if (FAT_IS_FAT32(bs)) {
    1082                 /*
    1083                  * Attempt to update the FAT32 FS info.
    1084                  */
    1085                 (void) fat_update_fat32_fsinfo(service_id);
    10861009        }
    10871010
     
    11011024        (void) block_cache_fini(service_id);
    11021025        block_fini(service_id);
    1103 
    1104         void *data;
    1105         if (fs_instance_get(service_id, &data) == EOK) {
    1106                 fs_instance_destroy(service_id);
    1107                 free(data);
    1108         }
    11091026
    11101027        return EOK;
Note: See TracChangeset for help on using the changeset viewer.