Changeset ea50e671 in mainline for uspace/lib/ext4/src/superblock.c
- Timestamp:
- 2025-01-29T13:51:25Z (3 weeks ago)
- Children:
- 4a3a5a0
- Parents:
- cb747b3
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ext4/src/superblock.c
rcb747b3 rea50e671 1206 1206 errno_t ext4_superblock_write_direct(service_id_t service_id, ext4_superblock_t *sb) 1207 1207 { 1208 void *tmp_sb = sb;1209 1210 1208 /* Load physical block size from block device */ 1211 1209 size_t phys_block_size; … … 1217 1215 uint64_t first_block = EXT4_SUPERBLOCK_OFFSET / phys_block_size; 1218 1216 1219 /* Compute number of block to write */1220 size_t block_count;1221 1217 if (phys_block_size <= EXT4_SUPERBLOCK_SIZE) { 1222 block_count = EXT4_SUPERBLOCK_SIZE / phys_block_size; 1223 /* Check alignment */ 1224 if (EXT4_SUPERBLOCK_SIZE % phys_block_size) 1225 block_count++; 1226 } else { 1227 block_count = 1; 1228 tmp_sb = malloc(phys_block_size); 1229 if (tmp_sb == NULL) 1230 return ENOMEM; 1231 /* Preserve block data */ 1232 rc = block_read_direct(service_id, first_block, 1, tmp_sb); 1233 if (rc != EOK) { 1234 free(tmp_sb); 1235 return rc; 1236 } 1237 void *sb_pos = (uint8_t *)tmp_sb + EXT4_SUPERBLOCK_OFFSET; 1238 memcpy(sb_pos, sb, EXT4_SUPERBLOCK_SIZE); 1218 /* Superblock is a multiple of physical block sizes */ 1219 size_t block_count = EXT4_SUPERBLOCK_SIZE / phys_block_size; 1220 return block_write_direct(service_id, first_block, block_count, sb); 1239 1221 } 1240 1222 1241 /* Write data */ 1242 rc = block_write_direct(service_id, first_block, block_count, tmp_sb); 1243 1244 if (phys_block_size > EXT4_SUPERBLOCK_SIZE) 1223 /* 1224 * Superblock fills only a part of the physical block, 1225 * but we can only overwrite an entire physical block. 1226 */ 1227 void *tmp_sb = malloc(phys_block_size); 1228 if (tmp_sb == NULL) 1229 return ENOMEM; 1230 1231 /* Preserve physical block data */ 1232 rc = block_read_direct(service_id, first_block, 1, tmp_sb); 1233 if (rc != EOK) { 1245 1234 free(tmp_sb); 1235 return rc; 1236 } 1237 1238 /* Write the superblock */ 1239 void *sb_pos = tmp_sb + EXT4_SUPERBLOCK_OFFSET % phys_block_size; 1240 memcpy(sb_pos, sb, EXT4_SUPERBLOCK_SIZE); 1241 1242 /* Write physical block to device */ 1243 rc = block_write_direct(service_id, first_block, 1, tmp_sb); 1244 free(tmp_sb); 1246 1245 return rc; 1247 1246 }
Note:
See TracChangeset
for help on using the changeset viewer.