Changeset 8b51009 in mainline for uspace/srv/bd/hr/superblock.c
- Timestamp:
- 2025-03-28T23:37:16Z (3 months ago)
- 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)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/bd/hr/superblock.c
r7bfe468 r8b51009 52 52 static errno_t read_metadata(service_id_t, hr_metadata_t *); 53 53 static errno_t hr_fill_meta_from_vol(hr_volume_t *, hr_metadata_t *); 54 static errno_t validate_meta(hr_metadata_t *);55 54 56 55 errno_t hr_write_meta_to_vol(hr_volume_t *vol) … … 71 70 goto error; 72 71 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 73 82 for (i = 0; i < vol->extent_no; i++) { 74 83 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);80 84 81 85 rc = block_write_direct(vol->extents[i].svc_id, HR_META_OFF, … … 84 88 goto error; 85 89 86 /* rndgen */87 fibril_usleep(1000);88 90 } 89 91 error: … … 100 102 uuid_t uuid; 101 103 104 /* XXX: use scratchpad */ 102 105 metadata = calloc(1, HR_META_SIZE * vol->bsize); 103 106 if (metadata == NULL) … … 152 155 } 153 156 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 */ 156 165 metadata->extent_no = host2uint32_t_le(vol->extent_no); 157 166 /* index filled separately for each extent */ … … 159 168 metadata->layout = host2uint32_t_le(vol->layout); 160 169 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); 166 171 str_cpy(metadata->devname, HR_DEVNAME_LEN, vol->devname); 167 172 … … 169 174 } 170 175 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; 176 bool 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; 178 182 } 179 183 … … 203 207 if (rc != EOK) 204 208 goto end; 205 rc = validate_meta(metadata); 206 if (rc != EOK) 209 if (!hr_valid_md_magic(metadata)) 207 210 goto end; 208 211 md_order_indices[i] = uint32_t_le2host(metadata->index); … … 244 247 vol->data_blkno = uint64_t_le2host(metadata->data_blkno); 245 248 vol->data_offset = uint64_t_le2host(metadata->data_offset); 249 vol->bsize = uint32_t_le2host(metadata->bsize); 246 250 vol->counter = uint64_t_le2host(0x00); /* unused */ 247 251 … … 274 278 } 275 279 280 errno_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 321 void 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 348 void 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 276 372 /** @} 277 373 */
Note:
See TracChangeset
for help on using the changeset viewer.