Changeset ea50e671 in mainline for uspace/lib/ext4/src/superblock.c


Ignore:
Timestamp:
2025-01-29T13:51:25Z (3 weeks ago)
Author:
Jiří Zárevúcky <zarevucky.jiri@…>
Children:
4a3a5a0
Parents:
cb747b3
Message:

A few adjustments

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ext4/src/superblock.c

    rcb747b3 rea50e671  
    12061206errno_t ext4_superblock_write_direct(service_id_t service_id, ext4_superblock_t *sb)
    12071207{
    1208         void *tmp_sb = sb;
    1209 
    12101208        /* Load physical block size from block device */
    12111209        size_t phys_block_size;
     
    12171215        uint64_t first_block = EXT4_SUPERBLOCK_OFFSET / phys_block_size;
    12181216
    1219         /* Compute number of block to write */
    1220         size_t block_count;
    12211217        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);
    12391221        }
    12401222
    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) {
    12451234                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);
    12461245        return rc;
    12471246}
Note: See TracChangeset for help on using the changeset viewer.