Changeset e89a06a in mainline for uspace/srv/volsrv/part.c
- Timestamp:
- 2018-07-06T22:13:20Z (6 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- be0f5e4
- Parents:
- 6419c6e
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/volsrv/part.c
r6419c6e re89a06a 35 35 */ 36 36 37 #include < stdbool.h>37 #include <adt/list.h> 38 38 #include <errno.h> 39 #include <str_error.h>40 39 #include <fibril_synch.h> 41 40 #include <io/log.h> 42 41 #include <loc.h> 42 #include <stdbool.h> 43 43 #include <stdlib.h> 44 44 #include <str.h> 45 #include <str_error.h> 45 46 #include <vfs/vfs.h> 46 47 … … 50 51 #include "types/part.h" 51 52 52 static errno_t vol_part_add_locked( service_id_t);53 static errno_t vol_part_add_locked(vol_parts_t *, service_id_t); 53 54 static void vol_part_remove_locked(vol_part_t *); 54 static errno_t vol_part_find_by_id_ref_locked(service_id_t, vol_part_t **); 55 56 static LIST_INITIALIZE(vol_parts); /* of vol_part_t */ 57 static FIBRIL_MUTEX_INITIALIZE(vol_parts_lock); 55 static errno_t vol_part_find_by_id_ref_locked(vol_parts_t *, service_id_t, 56 vol_part_t **); 58 57 59 58 struct fsname_type { … … 87 86 88 87 /** Check for new and removed partitions */ 89 static errno_t vol_part_check_new(vo id)88 static errno_t vol_part_check_new(vol_parts_t *parts) 90 89 { 91 90 bool already_known; … … 98 97 errno_t rc; 99 98 100 fibril_mutex_lock(& vol_parts_lock);99 fibril_mutex_lock(&parts->lock); 101 100 102 101 rc = loc_category_get_id("partition", &part_cat, IPC_FLAG_BLOCKING); 103 102 if (rc != EOK) { 104 103 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed resolving category 'partition'."); 105 fibril_mutex_unlock(& vol_parts_lock);104 fibril_mutex_unlock(&parts->lock); 106 105 return ENOENT; 107 106 } … … 111 110 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed getting list of partition " 112 111 "devices."); 113 fibril_mutex_unlock(& vol_parts_lock);112 fibril_mutex_unlock(&parts->lock); 114 113 return EIO; 115 114 } … … 120 119 121 120 // XXX Make this faster 122 list_foreach( vol_parts, lparts, vol_part_t, part) {121 list_foreach(parts->parts, lparts, vol_part_t, part) { 123 122 if (part->svc_id == svcs[i]) { 124 123 already_known = true; … … 130 129 log_msg(LOG_DEFAULT, LVL_NOTE, "Found partition '%lu'", 131 130 (unsigned long) svcs[i]); 132 rc = vol_part_add_locked( svcs[i]);131 rc = vol_part_add_locked(parts, svcs[i]); 133 132 if (rc != EOK) { 134 133 log_msg(LOG_DEFAULT, LVL_ERROR, "Could not add " … … 139 138 140 139 /* Check for removed partitions */ 141 cur = list_first(& vol_parts);140 cur = list_first(&parts->parts); 142 141 while (cur != NULL) { 143 next = list_next(cur, & vol_parts);142 next = list_next(cur, &parts->parts); 144 143 part = list_get_instance(cur, vol_part_t, lparts); 145 144 … … 164 163 free(svcs); 165 164 166 fibril_mutex_unlock(& vol_parts_lock);165 fibril_mutex_unlock(&parts->lock); 167 166 return EOK; 168 167 } … … 180 179 atomic_set(&part->refcnt, 1); 181 180 link_initialize(&part->lparts); 181 part->parts = NULL; 182 182 part->pcnt = vpc_empty; 183 183 … … 206 206 log_msg(LOG_DEFAULT, LVL_NOTE, "Probe partition %s", part->svc_name); 207 207 208 assert(fibril_mutex_is_locked(& vol_parts_lock));208 assert(fibril_mutex_is_locked(&part->parts->lock)); 209 209 210 210 fst = &fstab[0]; … … 324 324 } 325 325 326 static errno_t vol_part_add_locked( service_id_t sid)326 static errno_t vol_part_add_locked(vol_parts_t *parts, service_id_t sid) 327 327 { 328 328 vol_part_t *part; 329 329 errno_t rc; 330 330 331 assert(fibril_mutex_is_locked(& vol_parts_lock));331 assert(fibril_mutex_is_locked(&parts->lock)); 332 332 log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_add_locked(%zu)", sid); 333 333 334 334 /* Check for duplicates */ 335 rc = vol_part_find_by_id_ref_locked( sid, &part);335 rc = vol_part_find_by_id_ref_locked(parts, sid, &part); 336 336 if (rc == EOK) { 337 337 vol_part_del_ref(part); … … 346 346 347 347 part->svc_id = sid; 348 part->parts = parts; 348 349 349 350 rc = loc_service_get_name(sid, &part->svc_name); … … 361 362 goto error; 362 363 363 list_append(&part->lparts, & vol_parts);364 list_append(&part->lparts, &parts->parts); 364 365 365 366 log_msg(LOG_DEFAULT, LVL_NOTE, "Added partition %zu", part->svc_id); … … 374 375 static void vol_part_remove_locked(vol_part_t *part) 375 376 { 376 assert(fibril_mutex_is_locked(&vol_parts_lock)); 377 log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_remove_locked(%zu)", part->svc_id); 377 assert(fibril_mutex_is_locked(&part->parts->lock)); 378 log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_remove_locked(%zu)", 379 part->svc_id); 378 380 379 381 list_remove(&part->lparts); … … 383 385 } 384 386 385 errno_t vol_part_add( service_id_t sid)386 { 387 errno_t rc; 388 389 fibril_mutex_lock(& vol_parts_lock);390 rc = vol_part_add_locked( sid);391 fibril_mutex_unlock(& vol_parts_lock);387 errno_t vol_part_add(vol_parts_t *parts, service_id_t sid) 388 { 389 errno_t rc; 390 391 fibril_mutex_lock(&parts->lock); 392 rc = vol_part_add_locked(parts, sid); 393 fibril_mutex_unlock(&parts->lock); 392 394 393 395 return rc; 394 396 } 395 397 396 static void vol_part_cat_change_cb(void) 397 { 398 (void) vol_part_check_new(); 399 } 400 401 errno_t vol_part_init(void) 402 { 403 return EOK; 404 } 405 406 errno_t vol_part_discovery_start(void) 407 { 408 errno_t rc; 409 410 rc = loc_register_cat_change_cb(vol_part_cat_change_cb); 398 static void vol_part_cat_change_cb(void *arg) 399 { 400 vol_parts_t *parts = (vol_parts_t *) arg; 401 402 (void) vol_part_check_new(parts); 403 } 404 405 errno_t vol_parts_create(vol_parts_t **rparts) 406 { 407 vol_parts_t *parts; 408 409 parts = calloc(1, sizeof(vol_parts_t)); 410 if (parts == NULL) 411 return ENOMEM; 412 413 fibril_mutex_initialize(&parts->lock); 414 list_initialize(&parts->parts); 415 416 *rparts = parts; 417 return EOK; 418 } 419 420 void vol_parts_destroy(vol_parts_t *parts) 421 { 422 if (parts == NULL) 423 return; 424 425 assert(list_empty(&parts->parts)); 426 free(parts); 427 } 428 429 errno_t vol_part_discovery_start(vol_parts_t *parts) 430 { 431 errno_t rc; 432 433 rc = loc_register_cat_change_cb(vol_part_cat_change_cb, parts); 411 434 if (rc != EOK) { 412 435 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering callback " … … 415 438 } 416 439 417 return vol_part_check_new( );440 return vol_part_check_new(parts); 418 441 } 419 442 420 443 /** Get list of partitions as array of service IDs. */ 421 errno_t vol_part_get_ids(service_id_t *id_buf, size_t buf_size, size_t *act_size) 444 errno_t vol_part_get_ids(vol_parts_t *parts, service_id_t *id_buf, 445 size_t buf_size, size_t *act_size) 422 446 { 423 447 size_t act_cnt; 424 448 size_t buf_cnt; 425 449 426 fibril_mutex_lock(& vol_parts_lock);450 fibril_mutex_lock(&parts->lock); 427 451 428 452 buf_cnt = buf_size / sizeof(service_id_t); 429 453 430 act_cnt = list_count(& vol_parts);454 act_cnt = list_count(&parts->parts); 431 455 *act_size = act_cnt * sizeof(service_id_t); 432 456 433 457 if (buf_size % sizeof(service_id_t) != 0) { 434 fibril_mutex_unlock(& vol_parts_lock);458 fibril_mutex_unlock(&parts->lock); 435 459 return EINVAL; 436 460 } 437 461 438 462 size_t pos = 0; 439 list_foreach( vol_parts, lparts, vol_part_t, part) {463 list_foreach(parts->parts, lparts, vol_part_t, part) { 440 464 if (pos < buf_cnt) 441 465 id_buf[pos] = part->svc_id; … … 443 467 } 444 468 445 fibril_mutex_unlock(& vol_parts_lock);446 return EOK; 447 } 448 449 static errno_t vol_part_find_by_id_ref_locked( service_id_t sid,450 vol_part_t **rpart)451 { 452 assert(fibril_mutex_is_locked(& vol_parts_lock));453 454 list_foreach( vol_parts, lparts, vol_part_t, part) {469 fibril_mutex_unlock(&parts->lock); 470 return EOK; 471 } 472 473 static errno_t vol_part_find_by_id_ref_locked(vol_parts_t *parts, 474 service_id_t sid, vol_part_t **rpart) 475 { 476 assert(fibril_mutex_is_locked(&parts->lock)); 477 478 list_foreach(parts->parts, lparts, vol_part_t, part) { 455 479 if (part->svc_id == sid) { 456 480 /* Add reference */ … … 464 488 } 465 489 466 errno_t vol_part_find_by_id_ref(service_id_t sid, vol_part_t **rpart) 467 { 468 errno_t rc; 469 470 fibril_mutex_lock(&vol_parts_lock); 471 rc = vol_part_find_by_id_ref_locked(sid, rpart); 472 fibril_mutex_unlock(&vol_parts_lock); 490 errno_t vol_part_find_by_id_ref(vol_parts_t *parts, service_id_t sid, 491 vol_part_t **rpart) 492 { 493 errno_t rc; 494 495 fibril_mutex_lock(&parts->lock); 496 rc = vol_part_find_by_id_ref_locked(parts, sid, rpart); 497 fibril_mutex_unlock(&parts->lock); 473 498 474 499 return rc; … … 539 564 log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_part_mkfs_part()"); 540 565 541 fibril_mutex_lock(& vol_parts_lock);566 fibril_mutex_lock(&part->parts->lock); 542 567 543 568 rc = volsrv_part_mkfs(part->svc_id, fstype, label); … … 545 570 log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_part_mkfs_part() - failed %s", 546 571 str_error(rc)); 547 fibril_mutex_unlock(& vol_parts_lock);572 fibril_mutex_unlock(&part->parts->lock); 548 573 return rc; 549 574 } … … 556 581 rc = vol_part_probe(part); 557 582 if (rc != EOK) { 558 fibril_mutex_unlock(& vol_parts_lock);583 fibril_mutex_unlock(&part->parts->lock); 559 584 return rc; 560 585 } … … 562 587 rc = vol_part_mount(part); 563 588 if (rc != EOK) { 564 fibril_mutex_unlock(& vol_parts_lock);589 fibril_mutex_unlock(&part->parts->lock); 565 590 return rc; 566 591 } 567 592 568 fibril_mutex_unlock(& vol_parts_lock);593 fibril_mutex_unlock(&part->parts->lock); 569 594 return EOK; 570 595 }
Note:
See TracChangeset
for help on using the changeset viewer.