Changeset 6b8e89b0 in mainline for uspace/srv/bd/hr/superblock.c


Ignore:
Timestamp:
2024-10-05T13:11:11Z (8 months ago)
Author:
Miroslav Cimerman <mc@…>
Children:
dceb6e7
Parents:
dbd91da
git-author:
Miroslav Cimerman <mc@…> (2024-10-05 12:39:13)
git-committer:
Miroslav Cimerman <mc@…> (2024-10-05 13:11:11)
Message:

hr: init fuction for each RAID level

Compute total blocks, data blocks and set block size, data offset, strip
size there.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/bd/hr/superblock.c

    rdbd91da r6b8e89b0  
    5757
    5858        errno_t rc;
    59         size_t i, data_offset;
    60         uint64_t data_blkno;
     59        size_t i;
     60        size_t meta_blkno; /* blocks needed to write metadata */
    6161        hr_metadata_t *metadata;
    6262        uuid_t uuid;
     
    6666                return ENOMEM;
    6767
    68         if (vol->nblocks <= HR_META_OFF + HR_META_SIZE) {
     68        meta_blkno = (HR_META_OFF + HR_META_SIZE);
     69        if (vol->level != hr_l_1)
     70                meta_blkno *= vol->dev_no;
     71
     72        if (vol->nblocks < meta_blkno) {
    6973                log_msg(LOG_DEFAULT, LVL_ERROR,
    70                     "not enough blocks");
     74                    "not enough blocks to write metadata");
    7175                rc = EINVAL;
    7276                goto error;
    73         }
    74 
    75         data_offset = HR_META_OFF + HR_META_SIZE;
    76         if (vol->level == hr_l_1) {
    77                 data_blkno = vol->nblocks - data_offset;
    78         } else if (vol->level == hr_l_0) {
    79                 data_blkno = vol->nblocks - (data_offset * vol->dev_no);
    80         } else if (vol->level == hr_l_4) {
    81                 data_blkno = vol->nblocks - (data_offset * vol->dev_no) - (vol->nblocks / vol->dev_no);
    82         } else {
     77        } else if (vol->nblocks == meta_blkno) {
    8378                log_msg(LOG_DEFAULT, LVL_ERROR,
    84                     "level %d not implemented yet", vol->level);
    85                 return EINVAL;
     79                    "there would be zero data blocks after writing metadata, aborting");
     80                rc = EINVAL;
     81                goto error;
    8682        }
    8783
     
    9086        metadata->level = host2uint32_t_le(vol->level);
    9187        metadata->nblocks = host2uint64_t_le(vol->nblocks);
    92         metadata->data_blkno = host2uint64_t_le(data_blkno);
    93         metadata->data_offset = host2uint32_t_le(data_offset);
     88        metadata->data_blkno = host2uint64_t_le(vol->data_blkno);
     89        metadata->data_offset = host2uint32_t_le(vol->data_offset);
    9490        metadata->strip_size = host2uint32_t_le(vol->strip_size);
    9591        for (i = 0; i < vol->dev_no; i++) {
     
    10399                str_cpy(metadata->devname, 32, vol->devname);
    104100
    105                 rc = block_write_direct(vol->extents[i].svc_id, HR_META_OFF, HR_META_SIZE,
    106                     metadata);
     101                rc = block_write_direct(vol->extents[i].svc_id, HR_META_OFF,
     102                    HR_META_SIZE, metadata);
    107103                if (rc != EOK)
    108104                        goto error;
    109105        }
    110 
    111         /* fill in new members */
    112         vol->data_offset = data_offset;
    113         vol->data_blkno = data_blkno;
    114 
    115106error:
    116107        free(metadata);
Note: See TracChangeset for help on using the changeset viewer.