Changeset 68e357e in mainline for uspace/srv/bd
- Timestamp:
- 2024-09-05T20:54:51Z (18 months ago)
- Children:
- 44ea48e
- Parents:
- 680e8c8
- Location:
- uspace/srv/bd/hr
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/bd/hr/hr.c
r680e8c8 r68e357e 46 46 #include <stdio.h> 47 47 #include <stdlib.h> 48 #include <str.h> 48 49 #include <str_error.h> 49 50 … … 64 65 errno_t rc; 65 66 size_t size; 66 hr_config_t *hr_config; 67 68 hr_config = calloc(1, sizeof(hr_config_t)); 69 if (hr_config == NULL) { 67 hr_config_t *cfg; 68 hr_volume_t *new_volume; 69 ipc_call_t call; 70 71 if (!async_data_write_receive(&call, &size)) { 72 async_answer_0(&call, EREFUSED); 73 async_answer_0(icall, EREFUSED); 74 return; 75 } 76 77 if (size != sizeof(hr_config_t)) { 78 async_answer_0(&call, EINVAL); 79 async_answer_0(icall, EINVAL); 80 return; 81 } 82 83 cfg = calloc(1, sizeof(hr_config_t)); 84 if (cfg == NULL) { 85 async_answer_0(&call, ENOMEM); 70 86 async_answer_0(icall, ENOMEM); 71 87 return; 72 88 } 73 89 74 hr_config->level = ipc_get_arg1(icall); 75 76 rc = async_data_write_accept((void **) &hr_config->name, true, 0, 0, 0, 77 NULL); 78 if (rc != EOK) { 79 async_answer_0(icall, EREFUSED); 80 return; 81 } 82 83 rc = async_data_write_accept((void **) &hr_config->devs, false, 84 sizeof(service_id_t), 0, 0, &size); 85 if (rc != EOK) { 86 async_answer_0(icall, EREFUSED); 87 return; 88 } 89 90 hr_config->dev_no = size / sizeof(service_id_t); 91 92 hr_volume_t *new_volume = calloc(1, sizeof(hr_volume_t)); 90 rc = async_data_write_finalize(&call, cfg, size); 91 if (rc != EOK) { 92 async_answer_0(&call, rc); 93 async_answer_0(icall, rc); 94 } 95 96 new_volume = calloc(1, sizeof(hr_volume_t)); 93 97 if (new_volume == NULL) { 94 98 rc = ENOMEM; 95 99 goto end; 96 100 } 97 new_volume->devname = hr_config->name; 98 new_volume->level = hr_config->level; 99 new_volume->dev_no = hr_config->dev_no; 100 new_volume->devs = hr_config->devs; 101 102 switch (hr_config->level) { 101 102 str_cpy(new_volume->devname, 32, cfg->devname); 103 memcpy(new_volume->devs, cfg->devs, sizeof(service_id_t) * HR_MAXDEVS); 104 new_volume->level = cfg->level; 105 new_volume->dev_no = cfg->dev_no; 106 107 switch (new_volume->level) { 103 108 case hr_l_1: 104 109 new_volume->hr_ops.create = hr_raid1_create; … … 115 120 116 121 rc = new_volume->hr_ops.create(new_volume); 117 if (rc != EOK) 122 if (rc != EOK) { 118 123 goto end; 124 } 119 125 120 126 fibril_mutex_lock(&hr_volumes_lock); … … 126 132 127 133 end: 128 free( hr_config);134 free(cfg); 129 135 async_answer_0(icall, rc); 130 136 } -
uspace/srv/bd/hr/var.h
r680e8c8 r68e357e 53 53 bd_srvs_t hr_bds; 54 54 link_t lvolumes; 55 char *devname;56 service_id_t *devs;55 char devname[32]; 56 service_id_t devs[HR_MAXDEVS]; 57 57 uint64_t nblocks; 58 58 size_t bsize;
Note:
See TracChangeset
for help on using the changeset viewer.
