Changeset d082801 in mainline for uspace/srv
- Timestamp:
- 2025-03-29T14:04:37Z (6 months ago)
- Children:
- 746e636
- Parents:
- 1a28518
- Location:
- uspace/srv/bd/hr
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/bd/hr/hr.c
r1a28518 rd082801 79 79 80 80 if (size != sizeof(size_t)) { 81 async_answer_0(&call, EINVAL); 81 82 async_answer_0(icall, EINVAL); 82 83 return; 83 84 } 84 85 85 rc = hr_util_try_auto_assemble(&assembled_cnt); 86 if (rc != EOK) { 87 async_answer_0(&call, rc); 88 async_answer_0(icall, rc); 89 return; 90 } 86 rc = hr_util_try_assemble(NULL, &assembled_cnt); 87 if (rc != EOK) 88 goto error; 91 89 92 90 rc = async_data_read_finalize(&call, &assembled_cnt, size); 93 if (rc != EOK) { 94 async_answer_0(&call, rc); 95 async_answer_0(icall, rc); 96 return; 97 } 91 if (rc != EOK) 92 goto error; 98 93 99 94 async_answer_0(icall, EOK); 100 } 101 102 static void hr_create_srv(ipc_call_t *icall, bool assemble) 95 return; 96 error: 97 async_answer_0(&call, rc); 98 async_answer_0(icall, rc); 99 } 100 101 static void hr_assemble_srv(ipc_call_t *icall) 102 { 103 HR_DEBUG("%s()", __func__); 104 105 errno_t rc; 106 size_t size, assembled_cnt; 107 hr_config_t *cfg; 108 ipc_call_t call; 109 110 if (!async_data_write_receive(&call, &size)) { 111 async_answer_0(&call, EREFUSED); 112 async_answer_0(icall, EREFUSED); 113 return; 114 } 115 116 if (size != sizeof(hr_config_t)) { 117 async_answer_0(&call, EINVAL); 118 async_answer_0(icall, EINVAL); 119 return; 120 } 121 122 cfg = calloc(1, sizeof(hr_config_t)); 123 if (cfg == NULL) { 124 async_answer_0(&call, ENOMEM); 125 async_answer_0(icall, ENOMEM); 126 return; 127 } 128 129 rc = async_data_write_finalize(&call, cfg, size); 130 if (rc != EOK) 131 goto error; 132 133 if (!async_data_read_receive(&call, &size)) { 134 async_answer_0(icall, EREFUSED); 135 return; 136 } 137 138 if (size != sizeof(size_t)) { 139 async_answer_0(icall, EINVAL); 140 return; 141 } 142 143 rc = hr_util_try_assemble(cfg, &assembled_cnt); 144 if (rc != EOK) 145 goto error; 146 147 rc = async_data_read_finalize(&call, &assembled_cnt, size); 148 if (rc != EOK) 149 goto error; 150 151 free(cfg); 152 async_answer_0(icall, EOK); 153 return; 154 error: 155 free(cfg); 156 async_answer_0(&call, rc); 157 async_answer_0(icall, rc); 158 } 159 160 static void hr_create_srv(ipc_call_t *icall) 103 161 { 104 162 HR_DEBUG("%s()", __func__); … … 141 199 * for creation of a new array, abort 142 200 */ 143 if (!assemble) { 144 for (i = 0; i < cfg->dev_no; i++) { 145 if (cfg->devs[i] == 0) { 146 /* 147 * XXX: own error codes, no need to log this... 148 * its user error not service error 149 */ 150 HR_ERROR("missing device provided for array " 151 "creation, aborting"); 152 free(cfg); 153 async_answer_0(icall, EINVAL); 154 return; 155 } 201 for (i = 0; i < cfg->dev_no; i++) { 202 if (cfg->devs[i] == 0) { 203 /* 204 * XXX: own error codes, no need to log this... 205 * its user error not service error 206 */ 207 HR_ERROR("missing device provided for array " 208 "creation, aborting"); 209 free(cfg); 210 async_answer_0(icall, EINVAL); 211 return; 156 212 } 157 213 } … … 170 226 new_volume->extent_no = cfg->dev_no; 171 227 228 /* XXX: do proper initing ... */ 172 229 rc = hr_init_devs(new_volume); 173 230 if (rc != EOK) { … … 178 235 } 179 236 180 if (assemble) { 181 if (cfg->level != HR_LVL_UNKNOWN) 182 HR_DEBUG("level manually set when assembling, ingoring"); 183 new_volume->level = HR_LVL_UNKNOWN; 184 } 185 186 if (assemble) { 187 /* just bsize needed for reading metadata later */ 188 rc = hr_check_devs(new_volume, NULL, &new_volume->bsize); 189 if (rc != EOK) 190 goto error; 191 192 rc = hr_fill_vol_from_meta(new_volume); 193 if (rc != EOK) 194 goto error; 195 } 196 197 if (!assemble) { 198 new_volume->hr_ops.init(new_volume); 199 if (rc != EOK) 200 goto error; 201 202 rc = hr_write_meta_to_vol(new_volume); 203 if (rc != EOK) 204 goto error; 205 } 237 new_volume->hr_ops.init(new_volume); 238 if (rc != EOK) 239 goto error; 240 241 rc = hr_write_meta_to_vol(new_volume); 242 if (rc != EOK) 243 goto error; 206 244 207 245 rc = new_volume->hr_ops.create(new_volume); … … 217 255 fibril_rwlock_write_unlock(&hr_volumes_lock); 218 256 219 if (assemble) { 220 HR_DEBUG("assembled volume \"%s\" (%" PRIun ")\n", 221 new_volume->devname, new_volume->svc_id); 222 } else { 223 HR_DEBUG("created volume \"%s\" (%" PRIun ")\n", 224 new_volume->devname, new_volume->svc_id); 225 } 257 HR_DEBUG("created volume \"%s\" (%" PRIun ")\n", new_volume->devname, 258 new_volume->svc_id); 226 259 227 260 free(cfg); … … 390 423 switch (method) { 391 424 case HR_CREATE: 392 hr_create_srv(&call , false);425 hr_create_srv(&call); 393 426 break; 394 427 case HR_ASSEMBLE: 395 hr_ create_srv(&call, true);428 hr_assemble_srv(&call); 396 429 break; 397 430 case HR_AUTO_ASSEMBLE: -
uspace/srv/bd/hr/util.c
r1a28518 rd082801 875 875 } 876 876 877 errno_t hr_util_try_auto_assemble(size_t *rassembled_cnt) 877 static errno_t hr_fill_svcs_list_from_cfg(hr_config_t *cfg, list_t *list) 878 { 879 errno_t rc = EOK; 880 for (size_t i = 0; i < cfg->dev_no; ++i) { 881 rc = hr_add_svc_linked_to_list(list, cfg->devs[i], false, NULL); 882 if (rc != EOK) 883 goto error; 884 } 885 886 return EOK; 887 error: 888 free_svc_id_list(list); 889 return rc; 890 } 891 892 errno_t hr_util_try_assemble(hr_config_t *cfg, size_t *rassembled_cnt) 878 893 { 879 894 HR_DEBUG("%s()", __func__); … … 897 912 898 913 list_initialize(&dev_id_list); 899 rc = hr_fill_disk_part_svcs_list(&dev_id_list); 914 915 if (cfg == NULL) 916 rc = hr_fill_disk_part_svcs_list(&dev_id_list); 917 else 918 rc = hr_fill_svcs_list_from_cfg(cfg, &dev_id_list); 919 900 920 if (rc != EOK) 901 921 goto error; -
uspace/srv/bd/hr/util.h
r1a28518 rd082801 38 38 39 39 #include <errno.h> 40 #include <hr.h> 40 41 #include <io/log.h> 41 42 … … 77 78 extern hr_range_lock_t *hr_range_lock_acquire(hr_volume_t *, uint64_t, 78 79 uint64_t); 79 extern errno_t hr_util_try_a uto_assemble(size_t *);80 extern errno_t hr_util_try_assemble(hr_config_t *, size_t *); 80 81 extern errno_t hr_util_add_hotspare(hr_volume_t *, service_id_t); 81 82
Note:
See TracChangeset
for help on using the changeset viewer.