Changeset d082801 in mainline for uspace/srv/bd/hr/hr.c
- Timestamp:
- 2025-03-29T14:04:37Z (4 months ago)
- Children:
- 746e636
- Parents:
- 1a28518
- File:
-
- 1 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:
Note:
See TracChangeset
for help on using the changeset viewer.