Changeset 28ed0d95 in mainline for uspace/lib
- Timestamp:
- 2015-06-27T19:50:12Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 78d50bd
- Parents:
- 22fb7ab
- Location:
- uspace/lib
- Files:
-
- 2 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/vbd.c
r22fb7ab r28ed0d95 37 37 #include <ipc/vbd.h> 38 38 #include <loc.h> 39 #include <mem.h> 39 40 #include <stdlib.h> 40 41 #include <types/label.h> … … 153 154 } 154 155 156 /** Get list of IDs into a buffer of fixed size. 157 * 158 * @param vbd Virtual Block Device 159 * @param method IPC method 160 * @param arg1 First argument 161 * @param id_buf Buffer to store IDs 162 * @param buf_size Buffer size 163 * @param act_size Place to store actual size of complete data. 164 * 165 * @return EOK on success or negative error code. 166 */ 167 static int vbd_get_ids_once(vbd_t *vbd, sysarg_t method, sysarg_t arg1, 168 sysarg_t *id_buf, size_t buf_size, size_t *act_size) 169 { 170 async_exch_t *exch = async_exchange_begin(vbd->sess); 171 172 ipc_call_t answer; 173 aid_t req = async_send_1(exch, method, arg1, &answer); 174 int rc = async_data_read_start(exch, id_buf, buf_size); 175 176 async_exchange_end(exch); 177 178 if (rc != EOK) { 179 async_forget(req); 180 return rc; 181 } 182 183 sysarg_t retval; 184 async_wait_for(req, &retval); 185 186 if (retval != EOK) { 187 return retval; 188 } 189 190 *act_size = IPC_GET_ARG1(answer); 191 return EOK; 192 } 193 194 /** Get list of IDs. 195 * 196 * Returns an allocated array of service IDs. 197 * 198 * @param vbd Virtual Block Device 199 * @param method IPC method 200 * @param arg1 IPC argument 1 201 * @param data Place to store pointer to array of IDs 202 * @param count Place to store number of IDs 203 * @return EOK on success or negative error code 204 */ 205 static int vbd_get_ids_internal(vbd_t *vbd, sysarg_t method, sysarg_t arg1, 206 sysarg_t **data, size_t *count) 207 { 208 *data = NULL; 209 *count = 0; 210 211 size_t act_size = 0; 212 int rc = vbd_get_ids_once(vbd, method, arg1, NULL, 0, &act_size); 213 if (rc != EOK) 214 return rc; 215 216 size_t alloc_size = act_size; 217 service_id_t *ids = malloc(alloc_size); 218 if (ids == NULL) 219 return ENOMEM; 220 221 while (true) { 222 rc = vbd_get_ids_once(vbd, method, arg1, ids, alloc_size, 223 &act_size); 224 if (rc != EOK) 225 return rc; 226 227 if (act_size <= alloc_size) 228 break; 229 230 alloc_size = act_size; 231 ids = realloc(ids, alloc_size); 232 if (ids == NULL) 233 return ENOMEM; 234 } 235 236 *count = act_size / sizeof(service_id_t); 237 *data = ids; 238 return EOK; 239 } 240 241 /** Get list of disks as array of service IDs. 242 * 243 * @param vbd Virtual Block Device 244 * @param data Place to store pointer to array 245 * @param count Place to store length of array (number of entries) 246 * 247 * @return EOK on success or negative error code 248 */ 249 int vbd_label_get_parts(vbd_t *vbd, service_id_t disk, 250 service_id_t **data, size_t *count) 251 { 252 return vbd_get_ids_internal(vbd, VBD_LABEL_GET_PARTS, disk, 253 data, count); 254 } 255 256 int vbd_part_get_info(vbd_t *vbd, vbd_part_id_t part, vbd_part_info_t *pinfo) 257 { 258 async_exch_t *exch; 259 int retval; 260 261 exch = async_exchange_begin(vbd->sess); 262 retval = async_req_1_0(exch, VBD_PART_GET_INFO, part); 263 async_exchange_end(exch); 264 265 if (retval != EOK) 266 return EIO; 267 268 return EOK; 269 } 270 271 int vbd_part_create(vbd_t *vbd, service_id_t disk, vbd_part_spec_t *pspec, 272 vbd_part_id_t *rpart) 273 { 274 async_exch_t *exch; 275 sysarg_t part; 276 int retval; 277 278 exch = async_exchange_begin(vbd->sess); 279 retval = async_req_1_1(exch, VBD_PART_CREATE, disk, &part); 280 async_exchange_end(exch); 281 282 if (retval != EOK) 283 return EIO; 284 285 *rpart = (vbd_part_id_t)part; 286 return EOK; 287 } 288 289 int vbd_part_delete(vbd_t *vbd, vbd_part_id_t part) 290 { 291 async_exch_t *exch; 292 int retval; 293 294 exch = async_exchange_begin(vbd->sess); 295 retval = async_req_1_0(exch, VBD_PART_DELETE, part); 296 async_exchange_end(exch); 297 298 if (retval != EOK) 299 return EIO; 300 301 return EOK; 302 } 303 304 void vbd_pspec_init(vbd_part_spec_t *pspec) 305 { 306 memset(pspec, 0, sizeof(vbd_part_spec_t)); 307 } 308 155 309 /** @} 156 310 */ -
uspace/lib/c/include/ipc/vbd.h
r22fb7ab r28ed0d95 41 41 VBD_DISK_INFO, 42 42 VBD_LABEL_CREATE, 43 VBD_LABEL_DELETE 43 VBD_LABEL_DELETE, 44 VBD_LABEL_GET_PARTS, 45 VBD_PART_GET_INFO, 46 VBD_PART_CREATE, 47 VBD_PART_DELETE, 44 48 } vbd_request_t; 45 49 -
uspace/lib/c/include/vbd.h
r22fb7ab r28ed0d95 52 52 } vbd_disk_info_t; 53 53 54 typedef struct { 55 } vbd_part_spec_t; 56 57 typedef struct { 58 } vbd_part_info_t; 59 60 typedef sysarg_t vbd_part_id_t; 61 54 62 extern int vbd_create(vbd_t **); 55 63 extern void vbd_destroy(vbd_t *); … … 59 67 extern int vbd_label_create(vbd_t *, service_id_t, label_type_t); 60 68 extern int vbd_label_delete(vbd_t *, service_id_t); 69 extern int vbd_label_get_parts(vbd_t *, service_id_t, service_id_t **, 70 size_t *); 71 extern int vbd_part_get_info(vbd_t *, vbd_part_id_t, vbd_part_info_t *); 72 extern int vbd_part_create(vbd_t *, service_id_t, vbd_part_spec_t *, 73 vbd_part_id_t *); 74 extern int vbd_part_delete(vbd_t *, vbd_part_id_t); 75 extern void vbd_pspec_init(vbd_part_spec_t *); 61 76 62 77 #endif -
uspace/lib/fdisk/include/types/fdisk.h
r22fb7ab r28ed0d95 41 41 #include <stdint.h> 42 42 #include <types/label.h> 43 #include <vbd.h> 43 44 #include <vol.h> 44 45 … … 126 127 /** File system type */ 127 128 fdisk_fstype_t fstype; 129 /** Partition ID */ 130 vbd_part_id_t part_id; 128 131 } fdisk_part_t; 129 132 … … 147 150 /** Volume service */ 148 151 vol_t *vol; 152 /** Virtual Block Device */ 153 vbd_t *vbd; 149 154 } fdisk_t; 150 155 -
uspace/lib/fdisk/src/fdisk.c
r22fb7ab r28ed0d95 43 43 #include <stdlib.h> 44 44 #include <str.h> 45 #include <vbd.h> 45 46 #include <vol.h> 46 47 … … 71 72 int fdisk_create(fdisk_t **rfdisk) 72 73 { 73 fdisk_t *fdisk ;74 fdisk_t *fdisk = NULL; 74 75 int rc; 75 76 76 77 fdisk = calloc(1, sizeof(fdisk_t)); 77 if (fdisk == NULL) 78 return ENOMEM; 78 if (fdisk == NULL) { 79 rc = ENOMEM; 80 goto error; 81 } 79 82 80 83 rc = vol_create(&fdisk->vol); 81 84 if (rc != EOK) { 82 free(fdisk); 83 return EIO; 85 rc = EIO; 86 goto error; 87 } 88 89 rc = vbd_create(&fdisk->vbd); 90 if (rc != EOK) { 91 rc = EIO; 92 goto error; 84 93 } 85 94 86 95 *rfdisk = fdisk; 87 96 return EOK; 97 error: 98 fdisk_destroy(fdisk); 99 100 return rc; 88 101 } 89 102 90 103 void fdisk_destroy(fdisk_t *fdisk) 91 104 { 105 if (fdisk == NULL) 106 return; 107 92 108 vol_destroy(fdisk->vol); 109 vbd_destroy(fdisk->vbd); 93 110 free(fdisk); 94 111 } … … 368 385 { 369 386 fdisk_part_t *part; 387 vbd_part_spec_t vpspec; 388 vbd_part_id_t partid; 389 int rc; 370 390 371 391 part = calloc(1, sizeof(fdisk_part_t)); 372 392 if (part == NULL) 373 393 return ENOMEM; 394 395 rc = vbd_part_create(dev->fdisk->vbd, dev->sid, &vpspec, &partid); 396 if (rc != EOK) { 397 free(part); 398 return EIO; 399 } 374 400 375 401 part->dev = dev; … … 377 403 part->capacity = pspec->capacity; 378 404 part->fstype = pspec->fstype; 405 part->part_id = partid; 379 406 380 407 if (rpart != NULL) … … 385 412 int fdisk_part_destroy(fdisk_part_t *part) 386 413 { 414 int rc; 415 416 rc = vbd_part_delete(part->dev->fdisk->vbd, part->part_id); 417 if (rc != EOK) 418 return EIO; 419 387 420 list_remove(&part->ldev); 388 421 free(part); -
uspace/lib/label/src/label.c
r22fb7ab r28ed0d95 34 34 */ 35 35 36 #include <errno.h> 37 #include <label.h> 38 #include <mem.h> 39 #include <stdlib.h> 40 41 int label_open(service_id_t sid, label_t **rlabel) 42 { 43 label_t *label; 44 45 label = calloc(1, sizeof(label_t)); 46 if (label == NULL) 47 return ENOMEM; 48 49 *rlabel = label; 50 return EOK; 51 } 52 53 int label_create(service_id_t sid, label_type_t ltype, label_t **rlabel) 54 { 55 label_t *label; 56 57 label = calloc(1, sizeof(label_t)); 58 if (label == NULL) 59 return ENOMEM; 60 61 *rlabel = label; 62 return EOK; 63 } 64 65 void label_close(label_t *label) 66 { 67 free(label); 68 } 69 70 int label_destroy(label_t *label) 71 { 72 free(label); 73 return EOK; 74 } 75 76 int label_get_info(label_t *label, label_info_t *linfo) 77 { 78 memset(linfo, 0, sizeof(label_info_t)); 79 linfo->dcnt = dc_empty; 80 return EOK; 81 } 82 83 label_part_t *label_part_first(label_t *label) 84 { 85 return NULL; 86 } 87 88 label_part_t *label_part_next(label_part_t *oart) 89 { 90 return NULL; 91 } 92 93 94 int label_part_create(label_t *label, label_part_spec_t *pspec, 95 label_part_t **rpart) 96 { 97 return ENOTSUP; 98 } 99 100 int label_part_destroy(label_part_t *part) 101 { 102 return EOK; 103 } 104 105 void label_pspec_init(label_part_spec_t *pspec) 106 { 107 memset(pspec, 0, sizeof(label_part_spec_t)); 108 } 109 36 110 /** @} 37 111 */
Note:
See TracChangeset
for help on using the changeset viewer.