Changeset e47a032 in mainline
- Timestamp:
- 2024-10-28T20:02:39Z (7 months ago)
- Children:
- 9fc1d36d
- Parents:
- 066fed9
- Location:
- uspace
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/hrctl/hrctl.c
r066fed9 re47a032 104 104 for (i = 0; i < cfg->dev_no; i++) { 105 105 rc = loc_service_get_id(argv[optind], &cfg->devs[i], 0); 106 if (rc != EOK) { 107 printf("hrctl: error resolving device \"%s\"\n", argv[optind]); 106 if (rc == ENOENT) { 107 printf("hrctl: no device \"%s\", marking as missing\n", 108 argv[optind]); 109 cfg->devs[i] = 0; 110 } else if (rc != EOK) { 111 printf("hrctl: error resolving device \"%s\", aborting\n", 112 argv[optind]); 108 113 return EINVAL; 109 114 } … … 190 195 191 196 rc = loc_service_get_id(extent_devname, &cfg->devs[i], 0); 192 if (rc != EOK) { 193 printf("hrctl: error resolving device \"%s\"\n", 197 if (rc == ENOENT) { 198 printf("hrctl: no device \"%s\", marking as missing\n", 199 extent_devname); 200 cfg->devs[i] = 0; 201 rc = EOK; 202 } else if (rc != EOK) { 203 printf("hrctl: error resolving device \"%s\", aborting\n", 194 204 extent_devname); 195 205 return EINVAL; -
uspace/lib/device/include/hr.h
r066fed9 re47a032 54 54 } hr_level_t; 55 55 56 typedef enum hr_vol_status { 57 HR_VOL_ONLINE, /* OK, OPTIMAL */ 58 HR_VOL_FAULTY 59 } hr_vol_status_t; 60 61 typedef enum hr_ext_status { 62 HR_EXT_ONLINE, /* OK */ 63 HR_EXT_MISSING, 64 HR_EXT_FAILED 65 } hr_ext_status_t; 66 56 67 typedef struct hr { 57 68 async_sess_t *sess; … … 67 78 typedef struct hr_extent { 68 79 service_id_t svc_id; 69 int status;80 hr_ext_status_t status; 70 81 } hr_extent_t; 71 82 … … 78 89 uint32_t strip_size; 79 90 size_t bsize; 91 hr_vol_status_t status; 80 92 } hr_vol_info_t; 81 93 … … 87 99 extern errno_t hr_print_status(void); 88 100 101 extern const char *hr_get_vol_status_msg(hr_vol_status_t); 102 extern const char *hr_get_ext_status_msg(hr_ext_status_t); 103 89 104 #endif 90 105 -
uspace/lib/device/src/hr.c
r066fed9 re47a032 130 130 printf("devname: %s\n", devname); 131 131 132 printf("status: %s\n", hr_get_vol_status_msg(vol_info->status)); 133 132 134 printf("level: %d\n", vol_info->level); 133 135 if (vol_info->level == HR_LVL_0 || vol_info->level == HR_LVL_4) { … … 150 152 for (i = 0; i < vol_info->extent_no; i++) { 151 153 ext = &vol_info->extents[i]; 152 rc = loc_service_get_name(ext->svc_id, &devname); 153 if (rc != EOK) 154 return rc; 154 if (ext->status == HR_EXT_MISSING) { 155 devname = (char *) "MISSING-devname"; 156 } else { 157 rc = loc_service_get_name(ext->svc_id, &devname); 158 if (rc != EOK) 159 return rc; 160 } 155 161 if (i == 0 && vol_info->level == HR_LVL_4) 156 printf(" P % d %zu %s\n", ext->status, i, devname);162 printf(" P %s %zu %s\n", hr_get_ext_status_msg(ext->status), i, devname); 157 163 else if (vol_info->level == HR_LVL_4) 158 printf(" % d %zu %s\n", ext->status, i, devname);164 printf(" %s %zu %s\n", hr_get_ext_status_msg(ext->status), i, devname); 159 165 else 160 printf(" % d %zu %s\n", ext->status, i, devname);166 printf(" %s %zu %s\n", hr_get_ext_status_msg(ext->status), i, devname); 161 167 } 162 168 return EOK; … … 262 268 } 263 269 270 const char *hr_get_vol_status_msg(hr_vol_status_t status) 271 { 272 switch (status) { 273 case HR_VOL_ONLINE: 274 return "ONLINE"; 275 case HR_VOL_FAULTY: 276 return "FAULTY"; 277 default: 278 return "UNKNOWN"; 279 } 280 } 281 282 const char *hr_get_ext_status_msg(hr_ext_status_t status) 283 { 284 switch (status) { 285 case HR_EXT_ONLINE: 286 return "ONLINE"; 287 case HR_EXT_MISSING: 288 return "MISSING"; 289 case HR_EXT_FAILED: 290 return "FAILED"; 291 default: 292 return "UNKNOWN"; 293 } 294 } 295 264 296 /** @} 265 297 */ -
uspace/srv/bd/hr/hr.c
r066fed9 re47a032 134 134 } 135 135 136 /* 137 * If there was a missing device provided 138 * for creation of a new array, abort 139 */ 140 if (!assemble) { 141 for (i = 0; i < cfg->dev_no; i++) { 142 if (cfg->devs[i] == 0) { 143 free(cfg); 144 async_answer_0(icall, EINVAL); 145 return; 146 } 147 } 148 } 149 136 150 new_volume = calloc(1, sizeof(hr_volume_t)); 137 151 if (new_volume == NULL) { … … 302 316 info.strip_size = volume->strip_size; 303 317 info.bsize = volume->bsize; 318 info.status = volume->status; 304 319 305 320 if (!async_data_read_receive(&call, &size)) { -
uspace/srv/bd/hr/superblock.c
r066fed9 re47a032 121 121 } 122 122 123 124 123 errno_t hr_fill_vol_from_meta(hr_volume_t *vol) 125 124 { … … 134 133 135 134 service_id_t cfg_svc_id_order[HR_MAXDEVS] = { 0 }; 136 for (size_t i = 0; i < vol->dev_no; i++) 135 for (size_t i = 0; i < vol->dev_no; i++) { 137 136 cfg_svc_id_order[i] = vol->extents[i].svc_id; 138 139 140 uint32_t md_order[HR_MAXDEVS] = { 0 }; 137 vol->extents[i].svc_id = 0; 138 vol->extents[i].status = HR_EXT_MISSING; 139 } 140 141 int32_t md_order[HR_MAXDEVS] = { 0 }; 141 142 for (size_t i = 0; i < vol->dev_no; i++) { 143 if (cfg_svc_id_order[i] == 0) { 144 md_order[i] = -1; 145 continue; 146 } 142 147 rc = read_metadata(cfg_svc_id_order[i], metadata); 143 148 if (rc != EOK) … … 149 154 } 150 155 151 for (size_t i = 0; i < vol->dev_no; i++) 152 for (size_t j = 0; j < vol->dev_no; j++) 153 if (i == md_order[j])156 for (size_t i = 0; i < vol->dev_no; i++) { 157 for (size_t j = 0; j < vol->dev_no; j++) { 158 if (i == (uint32_t) md_order[j]) { 154 159 vol->extents[i].svc_id = cfg_svc_id_order[j]; 160 vol->extents[i].status = HR_EXT_ONLINE; 161 } 162 } 163 } 155 164 156 165 /* -
uspace/srv/bd/hr/util.c
r066fed9 re47a032 56 56 57 57 for (i = 0; i < vol->dev_no; i++) { 58 if (vol->extents[i].svc_id == 0) { 59 vol->extents[i].status = HR_EXT_MISSING; 60 continue; 61 } 58 62 rc = block_init(vol->extents[i].svc_id); 63 vol->extents[i].status = HR_EXT_ONLINE; 59 64 log_msg(LOG_DEFAULT, LVL_DEBUG, 60 "hr_init_devs(): initing (%" PRIun ")", vol->extents[i].svc_id); 65 "hr_init_devs(): initing (%" PRIun ")", 66 vol->extents[i].svc_id); 61 67 if (rc != EOK) { 62 68 log_msg(LOG_DEFAULT, LVL_ERROR, … … 77 83 78 84 for (i = 0; i < vol->dev_no; i++) 79 block_fini(vol->extents[i].svc_id); 85 if (vol->extents[i].status != HR_EXT_MISSING) 86 block_fini(vol->extents[i].svc_id); 80 87 } 81 88 … … 127 134 128 135 errno_t rc; 129 size_t i, bsize, last_bsize; 130 uint64_t nblocks, last_nblocks; 136 size_t i, bsize; 137 uint64_t nblocks; 138 size_t last_bsize = 0; 139 uint64_t last_nblocks = 0; 131 140 uint64_t total_blocks = 0; 132 141 133 142 for (i = 0; i < vol->dev_no; i++) { 143 if (vol->extents[i].status == HR_EXT_MISSING) 144 continue; 134 145 rc = block_get_nblocks(vol->extents[i].svc_id, &nblocks); 135 146 if (rc != EOK) 136 147 goto error; 137 if ( i!= 0 && nblocks != last_nblocks) {148 if (last_nblocks != 0 && nblocks != last_nblocks) { 138 149 log_msg(LOG_DEFAULT, LVL_ERROR, 139 150 "number of blocks differs"); … … 146 157 147 158 for (i = 0; i < vol->dev_no; i++) { 159 if (vol->extents[i].status == HR_EXT_MISSING) 160 continue; 148 161 rc = block_get_bsize(vol->extents[i].svc_id, &bsize); 149 162 if (rc != EOK) 150 163 goto error; 151 if ( i!= 0 && bsize != last_bsize) {164 if (last_bsize != 0 && bsize != last_bsize) { 152 165 log_msg(LOG_DEFAULT, LVL_ERROR, "block sizes differ"); 153 166 rc = EINVAL; … … 177 190 } 178 191 192 void hr_update_ext_status(hr_volume_t *vol, uint64_t extent, hr_ext_status_t s) 193 { 194 log_msg(LOG_DEFAULT, LVL_WARN, 195 "vol %s, changing extent: %lu, to status: %s", 196 vol->devname, extent, hr_get_ext_status_msg(s)); 197 vol->extents[extent].status = s; 198 } 199 179 200 /** @} 180 201 */ -
uspace/srv/bd/hr/util.h
r066fed9 re47a032 44 44 extern void hr_fini_devs(hr_volume_t *); 45 45 extern errno_t hr_register_volume(hr_volume_t *); 46 errno_t hr_check_devs(hr_volume_t *, uint64_t *, size_t *); 47 errno_t hr_check_ba_range(hr_volume_t *, size_t, uint64_t); 48 void hr_add_ba_offset(hr_volume_t *, uint64_t *); 46 extern errno_t hr_check_devs(hr_volume_t *, uint64_t *, size_t *); 47 extern errno_t hr_check_ba_range(hr_volume_t *, size_t, uint64_t); 48 extern void hr_add_ba_offset(hr_volume_t *, uint64_t *); 49 extern void hr_update_ext_status(hr_volume_t *, uint64_t, hr_ext_status_t); 49 50 50 51 #endif -
uspace/srv/bd/hr/var.h
r066fed9 re47a032 67 67 size_t dev_no; 68 68 hr_level_t level; 69 hr_vol_status_t status; 69 70 } hr_volume_t; 70 71
Note:
See TracChangeset
for help on using the changeset viewer.