Changeset 6b8e89b0 in mainline for uspace/srv/bd/hr/superblock.c
- Timestamp:
- 2024-10-05T13:11:11Z (8 months ago)
- 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)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/bd/hr/superblock.c
rdbd91da r6b8e89b0 57 57 58 58 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 */ 61 61 hr_metadata_t *metadata; 62 62 uuid_t uuid; … … 66 66 return ENOMEM; 67 67 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) { 69 73 log_msg(LOG_DEFAULT, LVL_ERROR, 70 "not enough blocks ");74 "not enough blocks to write metadata"); 71 75 rc = EINVAL; 72 76 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) { 83 78 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; 86 82 } 87 83 … … 90 86 metadata->level = host2uint32_t_le(vol->level); 91 87 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); 94 90 metadata->strip_size = host2uint32_t_le(vol->strip_size); 95 91 for (i = 0; i < vol->dev_no; i++) { … … 103 99 str_cpy(metadata->devname, 32, vol->devname); 104 100 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); 107 103 if (rc != EOK) 108 104 goto error; 109 105 } 110 111 /* fill in new members */112 vol->data_offset = data_offset;113 vol->data_blkno = data_blkno;114 115 106 error: 116 107 free(metadata);
Note:
See TracChangeset
for help on using the changeset viewer.