Changeset 68e357e in mainline
- Timestamp:
- 2024-09-05T20:54:51Z (8 months ago)
- Children:
- 44ea48e
- Parents:
- 680e8c8
- Location:
- uspace
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/hrctl/hrctl.c
r680e8c8 r68e357e 82 82 } 83 83 84 static errno_t get_dev_svc_ids(int argc, char **argv, int optind, int dev_no,85 service_id_t **rdevs)84 static errno_t fill_config_devs(int argc, char **argv, int optind, 85 hr_config_t *cfg) 86 86 { 87 87 errno_t rc; 88 int i; 89 size_t k; 90 service_id_t *devs; 91 92 devs = calloc(dev_no, sizeof(service_id_t)); 93 if (devs == NULL) 94 return ENOMEM; 95 96 for (i = optind, k = 0; i < argc; i++, k++) { 97 rc = loc_service_get_id(argv[i], &devs[k], 0); 88 size_t i; 89 90 for (i = 0; i < cfg->dev_no; i++) { 91 rc = loc_service_get_id(argv[optind++], &cfg->devs[i], 0); 98 92 if (rc != EOK) { 99 93 printf("hrctl: error resolving device \"%s\"\n", argv[i]); 100 free(devs);101 94 return EINVAL; 102 95 } 103 96 } 104 105 *rdevs = devs;106 97 107 98 return EOK; … … 111 102 { 112 103 errno_t rc; 113 int retval, c , dev_no;104 int retval, c; 114 105 bool create, assemble; 115 char *name = NULL;116 service_id_t *devs = NULL;117 106 hr_t *hr; 118 hr_config_t hr_config; 119 hr_level_t level; 107 hr_config_t *cfg; 108 109 cfg = calloc(1, sizeof(hr_config_t)); 110 if (cfg == NULL) 111 return 1; 120 112 121 113 retval = 0; 122 level = hr_l_empty;123 dev_no = 0;114 cfg->level = hr_l_empty; 115 cfg->dev_no = 0; 124 116 create = assemble = false; 125 117 … … 143 135 return 0; 144 136 case 'a': 145 name = optarg; 137 if (str_size(optarg) > 31) { 138 printf("hrctl: device name longer than 31 bytes\n"); 139 return 1; 140 } 141 str_cpy(cfg->devname, 32, optarg); 146 142 assemble = true; 147 143 break; 148 144 case 'c': 149 name = optarg; 145 if (str_size(optarg) > 31) { 146 printf("hrctl: device name longer than 31 bytes\n"); 147 return 1; 148 } 149 str_cpy(cfg->devname, 32, optarg); 150 150 create = true; 151 151 break; 152 152 case 'l': 153 if ( level != hr_l_empty)153 if (cfg->level != hr_l_empty) 154 154 goto bad; 155 155 if (str_cmp(optarg, "linear") == 0) 156 level = hr_l_linear;156 cfg->level = hr_l_linear; 157 157 else 158 level = strtol(optarg, NULL, 10);158 cfg->level = strtol(optarg, NULL, 10); 159 159 break; 160 160 case '0': 161 if ( level != hr_l_empty)162 goto bad; 163 level = hr_l_0;161 if (cfg->level != hr_l_empty) 162 goto bad; 163 cfg->level = hr_l_0; 164 164 break; 165 165 case '1': 166 if ( level != hr_l_empty)167 goto bad; 168 level = hr_l_1;166 if (cfg->level != hr_l_empty) 167 goto bad; 168 cfg->level = hr_l_1; 169 169 break; 170 170 case '5': 171 if ( level != hr_l_empty)172 goto bad; 173 level = hr_l_5;171 if (cfg->level != hr_l_empty) 172 goto bad; 173 cfg->level = hr_l_5; 174 174 break; 175 175 case 'L': 176 if ( level != hr_l_empty)177 goto bad; 178 level = hr_l_linear;176 if (cfg->level != hr_l_empty) 177 goto bad; 178 cfg->level = hr_l_linear; 179 179 break; 180 180 case 'n': 181 dev_no = strtol(optarg, NULL, 10); 182 if (dev_no + optind != argc) 183 goto bad; 184 rc = get_dev_svc_ids(argc, argv, optind, dev_no, &devs); 181 cfg->dev_no = strtol(optarg, NULL, 10); 182 if ((int) cfg->dev_no + optind != argc) 183 goto bad; 184 if (cfg->dev_no > HR_MAXDEVS) { 185 printf("hrctl: too many devices\n"); 186 return 1; 187 } 188 rc = fill_config_devs(argc, argv, optind, cfg); 185 189 if (rc != EOK) 186 190 return 1; … … 191 195 if ((create && assemble) || 192 196 (!create && !assemble) || 193 (create && level == hr_l_empty) || 194 (assemble && level != hr_l_empty) || 195 (dev_no == 0)) { 196 free(devs); 197 (create && cfg->level == hr_l_empty) || 198 (assemble && cfg->level != hr_l_empty) || 199 (cfg->dev_no == 0)) { 197 200 goto bad; 198 201 } 199 200 hr_config.level = level;201 hr_config.dev_no = dev_no;202 hr_config.name = name;203 hr_config.devs = devs;204 202 205 203 rc = hr_sess_init(&hr); … … 211 209 212 210 if (create) { 213 rc = hr_create(hr, &hr_config);211 rc = hr_create(hr, cfg); 214 212 printf("hrctl: hr_create() rc: %s\n", str_error(rc)); 215 213 } else if (assemble) { … … 218 216 219 217 end: 220 free( devs);218 free(cfg); 221 219 hr_sess_destroy(hr); 222 220 return retval; 223 221 bad: 222 free(cfg); 224 223 printf("hrctl: bad usage, try hrctl --help\n"); 225 224 return 1; -
uspace/lib/device/include/hr.h
r680e8c8 r68e357e 41 41 #include <loc.h> 42 42 43 /* for now */ 44 #define HR_MAXDEVS 4 45 43 46 typedef struct hr { 44 47 async_sess_t *sess; … … 54 57 55 58 typedef struct hr_config { 56 char *name;57 service_id_t *devs;59 char devname[32]; 60 service_id_t devs[HR_MAXDEVS]; 58 61 size_t dev_no; 59 62 hr_level_t level; -
uspace/lib/device/src/hr.c
r680e8c8 r68e357e 94 94 95 95 exch = async_exchange_begin(hr->sess); 96 if (exch == NULL) {96 if (exch == NULL) 97 97 return EINVAL; 98 }99 98 100 req = async_send_ 1(exch, HR_CREATE, hr_config->level, NULL);99 req = async_send_0(exch, HR_CREATE, NULL); 101 100 102 rc = async_data_write_start(exch, hr_config->name, 103 str_size(hr_config->name)); 104 if (rc != EOK) { 105 async_exchange_end(exch); 106 async_forget(req); 107 return rc; 108 } 109 110 rc = async_data_write_start(exch, hr_config->devs, 111 sizeof(service_id_t) * hr_config->dev_no); 101 rc = async_data_write_start(exch, hr_config, sizeof(hr_config_t)); 112 102 if (rc != EOK) { 113 103 async_exchange_end(exch); -
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.