Changes in uspace/lib/ext4/libext4_filesystem.c [eb94d84:532f53d] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ext4/libext4_filesystem.c
reb94d84 r532f53d 53 53 enum cache_mode cmode) 54 54 { 55 ext4_superblock_t *temp_superblock = NULL;56 57 55 fs->device = service_id; 58 56 59 57 /* Initialize block library (4096 is size of communication channel) */ 60 58 int rc = block_init(EXCHANGE_SERIALIZE, fs->device, 4096); 61 59 if (rc != EOK) 62 goto err;63 60 return rc; 61 64 62 /* Read superblock from device to memory */ 63 ext4_superblock_t *temp_superblock; 65 64 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 69 70 /* Read block size from superblock and check */ 70 71 uint32_t block_size = ext4_superblock_get_block_size(temp_superblock); 71 72 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 76 77 /* Initialize block caching by libblock */ 77 78 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 81 84 /* Compute limits for indirect block levels */ 82 85 uint32_t block_ids_per_block = block_size / sizeof(uint32_t); … … 89 92 fs->inode_blocks_per_level[i]; 90 93 } 91 94 92 95 /* Return loaded superblock */ 93 96 fs->superblock = temp_superblock; 94 97 95 98 uint16_t state = ext4_superblock_get_state(fs->superblock); 96 99 97 100 if (((state & EXT4_SUPERBLOCK_STATE_VALID_FS) != 98 101 EXT4_SUPERBLOCK_STATE_VALID_FS) || 99 102 ((state & EXT4_SUPERBLOCK_STATE_ERROR_FS) == 100 103 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 105 109 /* Mark system as mounted */ 106 110 ext4_superblock_set_state(fs->superblock, EXT4_SUPERBLOCK_STATE_ERROR_FS); 107 111 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 111 118 uint16_t mnt_count = ext4_superblock_get_mount_count(fs->superblock); 112 119 ext4_superblock_set_mount_count(fs->superblock, mnt_count + 1); 113 120 114 121 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;124 122 } 125 123 … … 847 845 848 846 rc = block_put(subblock); 849 if (rc != EOK) { 850 block_put(block); 847 if (rc != EOK) 851 848 return rc; 852 }853 849 } 854 850
Note:
See TracChangeset
for help on using the changeset viewer.