Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ext4/libext4_filesystem.c

    reb94d84 r532f53d  
    5353    enum cache_mode cmode)
    5454{
    55         ext4_superblock_t *temp_superblock = NULL;
    56 
    5755        fs->device = service_id;
    58 
     56       
    5957        /* Initialize block library (4096 is size of communication channel) */
    6058        int rc = block_init(EXCHANGE_SERIALIZE, fs->device, 4096);
    6159        if (rc != EOK)
    62                 goto err;
    63 
     60                return rc;
     61       
    6462        /* Read superblock from device to memory */
     63        ext4_superblock_t *temp_superblock;
    6564        rc = ext4_superblock_read_direct(fs->device, &temp_superblock);
    66         if (rc != EOK)
    67                 goto err_1;
    68 
     65        if (rc != EOK) {
     66                block_fini(fs->device);
     67                return rc;
     68        }
     69       
    6970        /* Read block size from superblock and check */
    7071        uint32_t block_size = ext4_superblock_get_block_size(temp_superblock);
    7172        if (block_size > EXT4_MAX_BLOCK_SIZE) {
    72                 rc = ENOTSUP;
    73                 goto err_1;
    74         }
    75 
     73                block_fini(fs->device);
     74                return ENOTSUP;
     75        }
     76       
    7677        /* Initialize block caching by libblock */
    7778        rc = block_cache_init(service_id, block_size, 0, cmode);
    78         if (rc != EOK)
    79                 goto err_1;
    80 
     79        if (rc != EOK) {
     80                block_fini(fs->device);
     81                return rc;
     82        }
     83       
    8184        /* Compute limits for indirect block levels */
    8285        uint32_t block_ids_per_block = block_size / sizeof(uint32_t);
     
    8992                    fs->inode_blocks_per_level[i];
    9093        }
    91 
     94       
    9295        /* Return loaded superblock */
    9396        fs->superblock = temp_superblock;
    94 
     97       
    9598        uint16_t state = ext4_superblock_get_state(fs->superblock);
    96 
     99       
    97100        if (((state & EXT4_SUPERBLOCK_STATE_VALID_FS) !=
    98101            EXT4_SUPERBLOCK_STATE_VALID_FS) ||
    99102            ((state & EXT4_SUPERBLOCK_STATE_ERROR_FS) ==
    100103            EXT4_SUPERBLOCK_STATE_ERROR_FS)) {
    101                 rc = ENOTSUP;
    102                 goto err_2;
    103         }
    104 
     104                block_cache_fini(fs->device);
     105                block_fini(fs->device);
     106                return ENOTSUP;
     107        }
     108       
    105109        /* Mark system as mounted */
    106110        ext4_superblock_set_state(fs->superblock, EXT4_SUPERBLOCK_STATE_ERROR_FS);
    107111        rc = ext4_superblock_write_direct(fs->device, fs->superblock);
    108         if (rc != EOK)
    109                 goto err_2;
    110 
     112        if (rc != EOK) {
     113                block_cache_fini(fs->device);
     114                block_fini(fs->device);
     115                return rc;
     116        }
     117       
    111118        uint16_t mnt_count = ext4_superblock_get_mount_count(fs->superblock);
    112119        ext4_superblock_set_mount_count(fs->superblock, mnt_count + 1);
    113 
     120       
    114121        return EOK;
    115 
    116 err_2:
    117         block_cache_fini(fs->device);
    118 err_1:
    119         block_fini(fs->device);
    120 err:
    121         if (temp_superblock)
    122                 ext4_superblock_release(temp_superblock);
    123         return rc;
    124122}
    125123
     
    847845                               
    848846                                rc = block_put(subblock);
    849                                 if (rc != EOK) {
    850                                         block_put(block);
     847                                if (rc != EOK)
    851848                                        return rc;
    852                                 }
    853849                        }
    854850                       
Note: See TracChangeset for help on using the changeset viewer.