Changeset 06f2762 in mainline


Ignore:
Timestamp:
2024-11-22T18:36:16Z (6 months ago)
Author:
Miroslav Cimerman <mc@…>
Children:
5b320ac
Parents:
e76e12d8
Message:

hr: add option to write metadata to one extent

Location:
uspace/srv/bd/hr
Files:
2 edited

Legend:

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

    re76e12d8 r06f2762  
    5151
    5252static errno_t read_metadata(service_id_t, hr_metadata_t *);
     53static errno_t hr_fill_meta_from_vol(hr_volume_t *, hr_metadata_t *);
    5354
    5455errno_t hr_write_meta_to_vol(hr_volume_t *vol)
     
    5859        errno_t rc;
    5960        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        rc = hr_fill_meta_from_vol(vol, metadata);
     69        if (rc != EOK)
     70                goto error;
     71
     72        for (i = 0; i < vol->dev_no; i++) {
     73                metadata->index = host2uint32_t_le(i);
     74
     75                rc = uuid_generate(&uuid);
     76                if (rc != EOK)
     77                        goto error;
     78                uuid_encode(&uuid, metadata->uuid);
     79
     80                rc = block_write_direct(vol->extents[i].svc_id, HR_META_OFF,
     81                    HR_META_SIZE, metadata);
     82                if (rc != EOK)
     83                        goto error;
     84
     85                /* rndgen */
     86                fibril_usleep(1000);
     87        }
     88error:
     89        free(metadata);
     90        return rc;
     91}
     92
     93errno_t hr_write_meta_to_ext(hr_volume_t *vol, size_t ext)
     94{
     95        HR_DEBUG("hr_write_meta_to_vol()\n");
     96
     97        errno_t rc;
     98        hr_metadata_t *metadata;
     99        uuid_t uuid;
     100
     101        metadata = calloc(1, HR_META_SIZE * vol->bsize);
     102        if (metadata == NULL)
     103                return ENOMEM;
     104
     105        rc = hr_fill_meta_from_vol(vol, metadata);
     106        if (rc != EOK)
     107                goto error;
     108
     109        metadata->index = host2uint32_t_le(ext);
     110
     111        rc = uuid_generate(&uuid);
     112        if (rc != EOK)
     113                goto error;
     114        uuid_encode(&uuid, metadata->uuid);
     115
     116        rc = block_write_direct(vol->extents[ext].svc_id, HR_META_OFF,
     117            HR_META_SIZE, metadata);
     118        if (rc != EOK)
     119                goto error;
     120
     121error:
     122        free(metadata);
     123        return rc;
     124}
     125
     126/*
     127 * Fill metadata members from
     128 * specified volume.
     129 *
     130 * Does not fill extent index and UUID.
     131 */
     132static errno_t hr_fill_meta_from_vol(hr_volume_t *vol, hr_metadata_t *metadata)
     133{
     134        HR_DEBUG("hr_fill_meta_from_vol()\n");
     135
     136        size_t meta_blkno; /* blocks needed to write metadata */
     137
    68138        meta_blkno = (HR_META_OFF + HR_META_SIZE);
    69139        if (vol->level != HR_LVL_1)
     
    71141
    72142        if (vol->nblocks < meta_blkno) {
    73                 HR_ERROR("not enough blocks to write metadat\n");
    74                 rc = EINVAL;
    75                 goto error;
     143                HR_ERROR("hr_fill_meta_from_vol(): volume \"%s\" does not "
     144                    " have enough space to store metada, aborting\n",
     145                    vol->devname);
     146                return EINVAL;
    76147        } else if (vol->nblocks == meta_blkno) {
    77                 HR_ERROR("there would be zero data blocks after writing "
    78                     "metadata, aborting");
    79                 rc = EINVAL;
    80                 goto error;
     148                HR_ERROR("hr_fill_meta_from_vol(): volume \"%s\" would have "
     149                    "zero data blocks after writing metadata, aborting\n",
     150                    vol->devname);
     151                return EINVAL;
    81152        }
    82153
     
    88159        metadata->data_offset = host2uint32_t_le(vol->data_offset);
    89160        metadata->strip_size = host2uint32_t_le(vol->strip_size);
    90         for (i = 0; i < vol->dev_no; i++) {
    91                 metadata->index = host2uint32_t_le(i);
    92 
    93                 rc = uuid_generate(&uuid);
    94                 if (rc != EOK)
    95                         goto error;
    96                 uuid_encode(&uuid, metadata->uuid);
    97 
    98                 str_cpy(metadata->devname, HR_DEVNAME_LEN, vol->devname);
    99 
    100                 rc = block_write_direct(vol->extents[i].svc_id, HR_META_OFF,
    101                     HR_META_SIZE, metadata);
    102                 if (rc != EOK)
    103                         goto error;
    104 
    105                 /* rndgen */
    106                 fibril_usleep(1000);
    107         }
    108 error:
    109         free(metadata);
    110         return rc;
     161
     162        str_cpy(metadata->devname, HR_DEVNAME_LEN, vol->devname);
     163
     164        return EOK;
    111165}
    112166
  • uspace/srv/bd/hr/superblock.h

    re76e12d8 r06f2762  
    6161
    6262extern errno_t hr_write_meta_to_vol(hr_volume_t *);
     63extern errno_t hr_write_meta_to_ext(hr_volume_t *, size_t);
    6364extern errno_t hr_fill_vol_from_meta(hr_volume_t *);
    6465
Note: See TracChangeset for help on using the changeset viewer.