Changeset 8b51009 in mainline for uspace/srv/bd/hr/superblock.c


Ignore:
Timestamp:
2025-03-28T23:37:16Z (3 months ago)
Author:
Miroslav Cimerman <mc@…>
Children:
0437dd5
Parents:
7bfe468
git-author:
Miroslav Cimerman <mc@…> (2025-03-28 23:25:57)
git-committer:
Miroslav Cimerman <mc@…> (2025-03-28 23:37:16)
Message:

hr: auto assembly, refactor

Added automatic assembly (with hrctl -A). All disks or their partitions
are scanned for HelenRAID metadata and assembly is attempted.

Main volume list is now locked with RW lock. The volume list
manipulation functions are moved into util.c.

hr_{create,destroy}_vol_struct() are implemented for better reusability
and modularity.

Volume destroy/stop (hrctl -D) now returns EBUSY if someone has still
the volume open()-ed.

File:
1 edited

Legend:

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

    r7bfe468 r8b51009  
    5252static errno_t read_metadata(service_id_t, hr_metadata_t *);
    5353static errno_t hr_fill_meta_from_vol(hr_volume_t *, hr_metadata_t *);
    54 static errno_t validate_meta(hr_metadata_t *);
    5554
    5655errno_t hr_write_meta_to_vol(hr_volume_t *vol)
     
    7170                goto error;
    7271
     72        /* rndgen */
     73        fibril_usleep(1000);
     74        rc = uuid_generate(&uuid);
     75        if (rc != EOK)
     76                goto error;
     77
     78        /* XXX: for now we just copy byte by byte as "encoding" */
     79        memcpy(metadata->uuid, &uuid, sizeof(HR_UUID_LEN));
     80        /* uuid_encode(&uuid, metadata->uuid); */
     81
    7382        for (i = 0; i < vol->extent_no; i++) {
    7483                metadata->index = host2uint32_t_le(i);
    75 
    76                 rc = uuid_generate(&uuid);
    77                 if (rc != EOK)
    78                         goto error;
    79                 uuid_encode(&uuid, metadata->uuid);
    8084
    8185                rc = block_write_direct(vol->extents[i].svc_id, HR_META_OFF,
     
    8488                        goto error;
    8589
    86                 /* rndgen */
    87                 fibril_usleep(1000);
    8890        }
    8991error:
     
    100102        uuid_t uuid;
    101103
     104        /* XXX: use scratchpad */
    102105        metadata = calloc(1, HR_META_SIZE * vol->bsize);
    103106        if (metadata == NULL)
     
    152155        }
    153156
    154         metadata->magic = host2uint64_t_le(HR_MAGIC);
    155         metadata->version = host2uint32_t_le(~(0U)); /* unused */
     157        /* XXX: use scratchpad */
     158        str_cpy(metadata->magic, HR_MAGIC_SIZE, HR_MAGIC_STR);
     159        metadata->nblocks = host2uint64_t_le(vol->nblocks);
     160        metadata->data_blkno = host2uint64_t_le(vol->data_blkno);
     161        metadata->truncated_blkno = host2uint64_t_le(vol->truncated_blkno);
     162        metadata->data_offset = host2uint64_t_le(vol->data_offset);
     163        metadata->counter = host2uint64_t_le(~(0UL)); /* XXX: unused */
     164        metadata->version = host2uint32_t_le(~(0U)); /* XXX: unused */
    156165        metadata->extent_no = host2uint32_t_le(vol->extent_no);
    157166        /* index filled separately for each extent */
     
    159168        metadata->layout = host2uint32_t_le(vol->layout);
    160169        metadata->strip_size = host2uint32_t_le(vol->strip_size);
    161         metadata->nblocks = host2uint64_t_le(vol->nblocks);
    162         metadata->data_blkno = host2uint64_t_le(vol->data_blkno);
    163         metadata->data_offset = host2uint64_t_le(vol->data_offset);
    164         metadata->counter = host2uint64_t_le(~(0UL)); /* unused */
    165         /* UUID generated separately for each extent */
     170        metadata->bsize = host2uint32_t_le(vol->bsize);
    166171        str_cpy(metadata->devname, HR_DEVNAME_LEN, vol->devname);
    167172
     
    169174}
    170175
    171 static errno_t validate_meta(hr_metadata_t *md)
    172 {
    173         if (uint64_t_le2host(md->magic) != HR_MAGIC) {
    174                 HR_ERROR("invalid magic\n");
    175                 return EINVAL;
    176         }
    177         return EOK;
     176bool hr_valid_md_magic(hr_metadata_t *md)
     177{
     178        if (str_lcmp(md->magic, HR_MAGIC_STR, HR_MAGIC_SIZE) != 0)
     179                return false;
     180
     181        return true;
    178182}
    179183
     
    203207                if (rc != EOK)
    204208                        goto end;
    205                 rc = validate_meta(metadata);
    206                 if (rc != EOK)
     209                if (!hr_valid_md_magic(metadata))
    207210                        goto end;
    208211                md_order_indices[i] = uint32_t_le2host(metadata->index);
     
    244247        vol->data_blkno = uint64_t_le2host(metadata->data_blkno);
    245248        vol->data_offset = uint64_t_le2host(metadata->data_offset);
     249        vol->bsize = uint32_t_le2host(metadata->bsize);
    246250        vol->counter = uint64_t_le2host(0x00); /* unused */
    247251
     
    274278}
    275279
     280errno_t hr_get_metadata_block(service_id_t dev, void **rblock)
     281{
     282        HR_DEBUG("%s()", __func__);
     283        errno_t rc;
     284        uint64_t blkno;
     285        size_t bsize;
     286        void *block;
     287
     288        rc = block_get_bsize(dev, &bsize);
     289        if (rc != EOK)
     290                return rc;
     291
     292        if (bsize < sizeof(hr_metadata_t))
     293                return EINVAL;
     294
     295        rc = block_get_nblocks(dev, &blkno);
     296        if (rc != EOK)
     297                return rc;
     298
     299        if (blkno < HR_META_OFF + HR_META_SIZE)
     300                return EINVAL;
     301
     302        block = malloc(bsize);
     303        if (block == NULL)
     304                return ENOMEM;
     305
     306        rc = block_read_direct(dev, HR_META_OFF, HR_META_SIZE, block);
     307        if (rc != EOK) {
     308                free(block);
     309                return rc;
     310        }
     311
     312        if (rblock == NULL) {
     313                free(block);
     314                return EINVAL;
     315        }
     316
     317        *rblock = block;
     318        return EOK;
     319}
     320
     321void hr_decode_metadata_from_block(void *block, hr_metadata_t *metadata)
     322{
     323        /*
     324         * Use scratch metadata for easier decoding without the need
     325         * for manualy specifying offsets.
     326         */
     327        hr_metadata_t scratch_md;
     328        memcpy(&scratch_md, block, sizeof(hr_metadata_t));
     329
     330        memcpy(metadata->magic, scratch_md.magic, HR_MAGIC_SIZE);
     331        memcpy(metadata->uuid, scratch_md.uuid, HR_UUID_LEN);
     332        metadata->nblocks = uint64_t_le2host(scratch_md.nblocks);
     333        metadata->data_blkno = uint64_t_le2host(scratch_md.data_blkno);
     334        metadata->truncated_blkno = uint64_t_le2host(
     335            scratch_md.truncated_blkno);
     336        metadata->data_offset = uint64_t_le2host(scratch_md.data_offset);
     337        metadata->counter = uint64_t_le2host(scratch_md.counter);
     338        metadata->version = uint32_t_le2host(scratch_md.version);
     339        metadata->extent_no = uint32_t_le2host(scratch_md.extent_no);
     340        metadata->index = uint32_t_le2host(scratch_md.index);
     341        metadata->level = uint32_t_le2host(scratch_md.level);
     342        metadata->layout = uint32_t_le2host(scratch_md.layout);
     343        metadata->strip_size = uint32_t_le2host(scratch_md.strip_size);
     344        metadata->bsize = uint64_t_le2host(scratch_md.bsize);
     345        memcpy(metadata->devname, scratch_md.devname, HR_DEVNAME_LEN);
     346}
     347
     348void hr_metadata_dump(hr_metadata_t *metadata)
     349{
     350        printf("\tmagic: %s\n", metadata->magic);
     351        printf("\tUUID: ");
     352        for (size_t i = 0; i < HR_UUID_LEN; ++i) {
     353                printf("%.2X", metadata->uuid[i]);
     354                if (i + 1 < HR_UUID_LEN)
     355                        printf(" ");
     356        }
     357        printf("\n");
     358        printf("\tnblocks: %lu\n", metadata->nblocks);
     359        printf("\tdata_blkno: %lu\n", metadata->data_blkno);
     360        printf("\ttruncated_blkno: %lu\n", metadata->truncated_blkno);
     361        printf("\tdata_offset: %lu\n", metadata->data_offset);
     362        printf("\tcounter: %lu\n", metadata->counter);
     363        printf("\tversion: %u\n", metadata->version);
     364        printf("\textent_no: %u\n", metadata->extent_no);
     365        printf("\tindex: %u\n", metadata->index);
     366        printf("\tlevel: %u\n", metadata->level);
     367        printf("\tlayout: %u\n", metadata->layout);
     368        printf("\tstrip_size: %u\n", metadata->strip_size);
     369        printf("\tdevname: %s\n", metadata->devname);
     370}
     371
    276372/** @}
    277373 */
Note: See TracChangeset for help on using the changeset viewer.