Changeset fe2333d in mainline for uspace/srv
- Timestamp:
- 2010-12-09T00:08:57Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0a5a950
- Parents:
- 07b9203e (diff), c01f8e6 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- uspace/srv
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/devman/devman.c
r07b9203e rfe2333d 516 516 /** Notify driver about the devices to which it was assigned. 517 517 * 518 * The driver's mutex must be locked.519 *520 518 * @param driver The driver to which the devices are passed. 521 519 */ … … 526 524 int phone; 527 525 528 printf(NAME ": pass_devices_to_driver\n"); 529 530 phone = ipc_connect_me_to(driver->phone, DRIVER_DEVMAN, 0, 0); 531 if (phone > 0) { 532 526 printf(NAME ": pass_devices_to_driver(`%s')\n", driver->name); 527 528 fibril_mutex_lock(&driver->driver_mutex); 529 530 phone = async_connect_me_to(driver->phone, DRIVER_DEVMAN, 0, 0); 531 532 if (phone < 0) { 533 fibril_mutex_unlock(&driver->driver_mutex); 534 return; 535 } 536 537 /* 538 * Go through devices list as long as there is some device 539 * that has not been passed to the driver. 540 */ 541 link = driver->devices.next; 542 while (link != &driver->devices) { 543 dev = list_get_instance(link, node_t, driver_devices); 544 if (dev->passed_to_driver) { 545 link = link->next; 546 continue; 547 } 548 549 /* 550 * We remove the device from the list to allow safe adding 551 * of new devices (no one will touch our item this way). 552 */ 553 list_remove(link); 554 555 /* 556 * Unlock to avoid deadlock when adding device 557 * handled by itself. 558 */ 559 fibril_mutex_unlock(&driver->driver_mutex); 560 561 add_device(phone, driver, dev, tree); 562 563 /* 564 * Lock again as we will work with driver's 565 * structure. 566 */ 567 fibril_mutex_lock(&driver->driver_mutex); 568 569 /* 570 * Insert the device back. 571 * The order is not relevant here so no harm is done 572 * (actually, the order would be preserved in most cases). 573 */ 574 list_append(link, &driver->devices); 575 576 /* 577 * Restart the cycle to go through all devices again. 578 */ 533 579 link = driver->devices.next; 534 while (link != &driver->devices) { 535 dev = list_get_instance(link, node_t, driver_devices); 536 add_device(phone, driver, dev, tree); 537 link = link->next; 538 } 539 540 ipc_hangup(phone); 541 } 580 } 581 582 ipc_hangup(phone); 583 584 /* 585 * Once we passed all devices to the driver, we need to mark the 586 * driver as running. 587 * It is vital to do it here and inside critical section. 588 * 589 * If we would change the state earlier, other devices added to 590 * the driver would be added to the device list and started 591 * immediately and possibly started here as well. 592 */ 593 printf(NAME ": driver %s goes into running state.\n", driver->name); 594 driver->state = DRIVER_RUNNING; 595 596 fibril_mutex_unlock(&driver->driver_mutex); 542 597 } 543 598 … … 553 608 void initialize_running_driver(driver_t *driver, dev_tree_t *tree) 554 609 { 555 printf(NAME ": initialize_running_driver\n"); 556 fibril_mutex_lock(&driver->driver_mutex); 610 printf(NAME ": initialize_running_driver (`%s')\n", driver->name); 557 611 558 612 /* … … 561 615 */ 562 616 pass_devices_to_driver(driver, tree); 563 564 /* Change driver's state to running. */565 driver->state = DRIVER_RUNNING;566 567 fibril_mutex_unlock(&driver->driver_mutex);568 617 } 569 618 … … 637 686 } 638 687 688 static FIBRIL_MUTEX_INITIALIZE(add_device_guard); 639 689 640 690 /** Pass a device to running driver. … … 645 695 void add_device(int phone, driver_t *drv, node_t *node, dev_tree_t *tree) 646 696 { 647 printf(NAME ": add_device\n"); 697 fibril_mutex_lock(&add_device_guard); 698 699 /* 700 * We do not expect to have driver's mutex locked as we do not 701 * access any structures that would affect driver_t. 702 */ 703 printf(NAME ": add_device (driver `%s', device `%s')\n", drv->name, 704 node->name); 648 705 649 706 ipcarg_t rc; … … 657 714 parent_handle = 0; 658 715 } 716 659 717 aid_t req = async_send_2(phone, DRIVER_ADD_DEVICE, node->handle, 660 718 parent_handle, &answer); … … 666 724 /* TODO handle error */ 667 725 } 668 726 669 727 /* Wait for answer from the driver. */ 670 728 async_wait_for(req, &rc); 729 730 fibril_mutex_unlock(&add_device_guard); 731 671 732 switch(rc) { 672 733 case EOK: … … 681 742 } 682 743 744 node->passed_to_driver = true; 745 683 746 return; 684 747 } … … 706 769 attach_driver(node, drv); 707 770 771 fibril_mutex_lock(&drv->driver_mutex); 708 772 if (drv->state == DRIVER_NOT_STARTED) { 709 773 /* Start the driver. */ 710 774 start_driver(drv); 711 775 } 712 713 if (drv->state == DRIVER_RUNNING) { 776 bool is_running = drv->state == DRIVER_RUNNING; 777 fibril_mutex_unlock(&drv->driver_mutex); 778 779 if (is_running) { 714 780 /* Notify the driver about the new device. */ 715 int phone = ipc_connect_me_to(drv->phone, DRIVER_DEVMAN, 0, 0);781 int phone = async_connect_me_to(drv->phone, DRIVER_DEVMAN, 0, 0); 716 782 if (phone > 0) { 717 783 add_device(phone, drv, node, tree); … … 875 941 node->name = dev_name; 876 942 if (!set_dev_path(node, parent)) { 877 fibril_rwlock_write_unlock(&tree->rwlock);878 943 return false; 879 944 } … … 1097 1162 while (link != &class_list->classes) { 1098 1163 cl = list_get_instance(link, dev_class_t, link); 1099 if (str_cmp(cl->name, class_name) == 0) 1164 if (str_cmp(cl->name, class_name) == 0) { 1100 1165 return cl; 1166 } 1167 link = link->next; 1101 1168 } 1102 1169 -
uspace/srv/devman/devman.h
r07b9203e rfe2333d 168 168 */ 169 169 link_t devmap_link; 170 171 /** 172 * Whether this device was already passed to the driver. 173 */ 174 bool passed_to_driver; 170 175 }; 171 176 -
uspace/srv/devman/main.c
r07b9203e rfe2333d 197 197 } 198 198 199 static int assign_driver_fibril(void *arg) 200 { 201 node_t *node = (node_t *) arg; 202 assign_driver(node, &drivers_list, &device_tree); 203 return EOK; 204 } 205 199 206 /** Handle child device registration. 200 207 * … … 237 244 238 245 devman_receive_match_ids(match_count, &node->match_ids); 239 246 247 /* 248 * Try to find a suitable driver and assign it to the device. We do 249 * not want to block the current fibril that is used for processing 250 * incoming calls: we will launch a separate fibril to handle the 251 * driver assigning. That is because assign_driver can actually include 252 * task spawning which could take some time. 253 */ 254 fid_t assign_fibril = fibril_create(assign_driver_fibril, node); 255 if (assign_fibril == 0) { 256 /* 257 * Fallback in case we are out of memory. 258 * Probably not needed as we will die soon anyway ;-). 259 */ 260 (void) assign_driver_fibril(node); 261 } else { 262 fibril_add_ready(assign_fibril); 263 } 264 240 265 /* Return device handle to parent's driver. */ 241 266 ipc_answer_1(callid, EOK, node->handle); 242 243 /* Try to find suitable driver and assign it to the device. */244 assign_driver(node, &drivers_list, &device_tree);245 267 } 246 268 … … 297 319 printf(NAME ": device '%s' added to class '%s', class name '%s' was " 298 320 "asigned to it\n", dev->pathname, class_name, class_info->dev_name); 299 321 300 322 ipc_answer_0(callid, EOK); 301 323 } -
uspace/srv/devman/match.c
r07b9203e rfe2333d 46 46 if (str_cmp(driver->id, device->id) == 0) { 47 47 /* 48 * The strings match es, return their score multiplied.48 * The strings match, return the product of their scores. 49 49 */ 50 50 return driver->score * device->score; … … 66 66 67 67 /* 68 * Go through all pairs, return the highest score obtaine td.68 * Go through all pairs, return the highest score obtained. 69 69 */ 70 70 int highest_score = 0; -
uspace/srv/fs/devfs/devfs.c
r07b9203e rfe2333d 53 53 static vfs_info_t devfs_vfs_info = { 54 54 .name = NAME, 55 .concurrent_read_write = false, 56 .write_retains_size = false, 55 57 }; 56 58 -
uspace/srv/fs/fat/fat.c
r07b9203e rfe2333d 52 52 vfs_info_t fat_vfs_info = { 53 53 .name = NAME, 54 .concurrent_read_write = false, 55 .write_retains_size = false, 54 56 }; 55 57 -
uspace/srv/fs/tmpfs/tmpfs.c
r07b9203e rfe2333d 57 57 vfs_info_t tmpfs_vfs_info = { 58 58 .name = NAME, 59 .concurrent_read_write = false, 60 .write_retains_size = false, 59 61 }; 60 62 -
uspace/srv/net/il/arp/arp.c
r07b9203e rfe2333d 72 72 #define NAME "arp" 73 73 74 /** Number of microseconds to wait for an ARP reply. */ 75 #define ARP_TRANS_WAIT 1000000 76 74 77 /** ARP global data. */ 75 78 arp_globals_t arp_globals; … … 77 80 DEVICE_MAP_IMPLEMENT(arp_cache, arp_device_t); 78 81 INT_MAP_IMPLEMENT(arp_protos, arp_proto_t); 79 GENERIC_CHAR_MAP_IMPLEMENT(arp_addr, measured_string_t); 82 GENERIC_CHAR_MAP_IMPLEMENT(arp_addr, arp_trans_t); 83 84 static void arp_clear_trans(arp_trans_t *trans) 85 { 86 if (trans->hw_addr) { 87 free(trans->hw_addr); 88 trans->hw_addr = NULL; 89 } 90 fibril_condvar_broadcast(&trans->cv); 91 } 92 93 static void arp_clear_addr(arp_addr_t *addresses) 94 { 95 int count; 96 arp_trans_t *trans; 97 98 for (count = arp_addr_count(addresses) - 1; count >= 0; count--) { 99 trans = arp_addr_items_get_index(&addresses->values, count); 100 if (trans) 101 arp_clear_trans(trans); 102 } 103 } 104 80 105 81 106 /** Clears the device specific data. … … 96 121 if (proto->addr_data) 97 122 free(proto->addr_data); 123 arp_clear_addr(&proto->addresses); 98 124 arp_addr_destroy(&proto->addresses); 99 125 } … … 107 133 arp_device_t *device; 108 134 109 fibril_ rwlock_write_lock(&arp_globals.lock);135 fibril_mutex_lock(&arp_globals.lock); 110 136 for (count = arp_cache_count(&arp_globals.cache) - 1; count >= 0; 111 137 count--) { … … 120 146 } 121 147 arp_cache_clear(&arp_globals.cache); 122 fibril_ rwlock_write_unlock(&arp_globals.lock);148 fibril_mutex_unlock(&arp_globals.lock); 123 149 printf("Cache cleaned\n"); 124 150 return EOK; … … 130 156 arp_device_t *device; 131 157 arp_proto_t *proto; 132 133 fibril_rwlock_write_lock(&arp_globals.lock); 158 arp_trans_t *trans; 159 160 fibril_mutex_lock(&arp_globals.lock); 134 161 device = arp_cache_find(&arp_globals.cache, device_id); 135 162 if (!device) { 136 fibril_ rwlock_write_unlock(&arp_globals.lock);163 fibril_mutex_unlock(&arp_globals.lock); 137 164 return ENOENT; 138 165 } 139 166 proto = arp_protos_find(&device->protos, protocol); 140 167 if (!proto) { 141 fibril_ rwlock_write_unlock(&arp_globals.lock);168 fibril_mutex_unlock(&arp_globals.lock); 142 169 return ENOENT; 143 170 } 171 trans = arp_addr_find(&proto->addresses, address->value, address->length); 172 if (trans) 173 arp_clear_trans(trans); 144 174 arp_addr_exclude(&proto->addresses, address->value, address->length); 145 fibril_ rwlock_write_unlock(&arp_globals.lock);175 fibril_mutex_unlock(&arp_globals.lock); 146 176 return EOK; 147 177 } … … 152 182 arp_device_t *device; 153 183 154 fibril_ rwlock_write_lock(&arp_globals.lock);184 fibril_mutex_lock(&arp_globals.lock); 155 185 device = arp_cache_find(&arp_globals.cache, device_id); 156 186 if (!device) { 157 fibril_ rwlock_write_unlock(&arp_globals.lock);187 fibril_mutex_unlock(&arp_globals.lock); 158 188 return ENOENT; 159 189 } 160 190 arp_clear_device(device); 161 191 printf("Device %d cleared\n", device_id); 162 fibril_ rwlock_write_unlock(&arp_globals.lock);192 fibril_mutex_unlock(&arp_globals.lock); 163 193 return EOK; 164 194 } … … 221 251 int rc; 222 252 223 fibril_ rwlock_write_lock(&arp_globals.lock);253 fibril_mutex_lock(&arp_globals.lock); 224 254 225 255 /* An existing device? */ … … 229 259 if (device->service != service) { 230 260 printf("Device %d already exists\n", device->device_id); 231 fibril_ rwlock_write_unlock(&arp_globals.lock);261 fibril_mutex_unlock(&arp_globals.lock); 232 262 return EEXIST; 233 263 } … … 241 271 rc = arp_proto_create(&proto, protocol, address); 242 272 if (rc != EOK) { 243 fibril_ rwlock_write_unlock(&arp_globals.lock);273 fibril_mutex_unlock(&arp_globals.lock); 244 274 return rc; 245 275 } … … 247 277 proto); 248 278 if (index < 0) { 249 fibril_ rwlock_write_unlock(&arp_globals.lock);279 fibril_mutex_unlock(&arp_globals.lock); 250 280 free(proto); 251 281 return index; … … 262 292 device = (arp_device_t *) malloc(sizeof(arp_device_t)); 263 293 if (!device) { 264 fibril_ rwlock_write_unlock(&arp_globals.lock);294 fibril_mutex_unlock(&arp_globals.lock); 265 295 return ENOMEM; 266 296 } … … 269 299 rc = arp_protos_initialize(&device->protos); 270 300 if (rc != EOK) { 271 fibril_ rwlock_write_unlock(&arp_globals.lock);301 fibril_mutex_unlock(&arp_globals.lock); 272 302 free(device); 273 303 return rc; … … 275 305 rc = arp_proto_create(&proto, protocol, address); 276 306 if (rc != EOK) { 277 fibril_ rwlock_write_unlock(&arp_globals.lock);307 fibril_mutex_unlock(&arp_globals.lock); 278 308 free(device); 279 309 return rc; … … 281 311 index = arp_protos_add(&device->protos, proto->service, proto); 282 312 if (index < 0) { 283 fibril_ rwlock_write_unlock(&arp_globals.lock);313 fibril_mutex_unlock(&arp_globals.lock); 284 314 arp_protos_destroy(&device->protos); 285 315 free(device); … … 293 323 arp_globals.client_connection); 294 324 if (device->phone < 0) { 295 fibril_ rwlock_write_unlock(&arp_globals.lock);325 fibril_mutex_unlock(&arp_globals.lock); 296 326 arp_protos_destroy(&device->protos); 297 327 free(device); … … 303 333 &device->packet_dimension); 304 334 if (rc != EOK) { 305 fibril_ rwlock_write_unlock(&arp_globals.lock);335 fibril_mutex_unlock(&arp_globals.lock); 306 336 arp_protos_destroy(&device->protos); 307 337 free(device); … … 313 343 &device->addr_data); 314 344 if (rc != EOK) { 315 fibril_ rwlock_write_unlock(&arp_globals.lock);345 fibril_mutex_unlock(&arp_globals.lock); 316 346 arp_protos_destroy(&device->protos); 317 347 free(device); … … 323 353 &device->broadcast_addr, &device->broadcast_data); 324 354 if (rc != EOK) { 325 fibril_ rwlock_write_unlock(&arp_globals.lock);355 fibril_mutex_unlock(&arp_globals.lock); 326 356 free(device->addr); 327 357 free(device->addr_data); … … 334 364 device); 335 365 if (rc != EOK) { 336 fibril_ rwlock_write_unlock(&arp_globals.lock);366 fibril_mutex_unlock(&arp_globals.lock); 337 367 free(device->addr); 338 368 free(device->addr_data); … … 347 377 device->service, protocol); 348 378 } 349 fibril_ rwlock_write_unlock(&arp_globals.lock);379 fibril_mutex_unlock(&arp_globals.lock); 350 380 351 381 return EOK; … … 363 393 int rc; 364 394 365 fibril_ rwlock_initialize(&arp_globals.lock);366 fibril_ rwlock_write_lock(&arp_globals.lock);395 fibril_mutex_initialize(&arp_globals.lock); 396 fibril_mutex_lock(&arp_globals.lock); 367 397 arp_globals.client_connection = client_connection; 368 398 rc = arp_cache_initialize(&arp_globals.cache); 369 fibril_ rwlock_write_unlock(&arp_globals.lock);399 fibril_mutex_unlock(&arp_globals.lock); 370 400 371 401 return rc; … … 383 413 arp_device_t *device; 384 414 385 fibril_ rwlock_write_lock(&arp_globals.lock);415 fibril_mutex_lock(&arp_globals.lock); 386 416 device = arp_cache_find(&arp_globals.cache, device_id); 387 417 if (!device) { 388 fibril_ rwlock_write_unlock(&arp_globals.lock);418 fibril_mutex_unlock(&arp_globals.lock); 389 419 return ENOENT; 390 420 } 391 421 device->packet_dimension.content = mtu; 392 fibril_ rwlock_write_unlock(&arp_globals.lock);422 fibril_mutex_unlock(&arp_globals.lock); 393 423 printf("arp - device %d changed mtu to %zu\n\n", device_id, mtu); 394 424 return EOK; … … 421 451 arp_device_t *device; 422 452 arp_proto_t *proto; 423 measured_string_t *hw_source;453 arp_trans_t *trans; 424 454 uint8_t *src_hw; 425 455 uint8_t *src_proto; … … 452 482 des_hw = src_proto + header->protocol_length; 453 483 des_proto = des_hw + header->hardware_length; 454 hw_source= arp_addr_find(&proto->addresses, (char *) src_proto,484 trans = arp_addr_find(&proto->addresses, (char *) src_proto, 455 485 CONVERT_SIZE(uint8_t, char, header->protocol_length)); 456 486 /* Exists? */ 457 if ( hw_source) {458 if ( hw_source->length != CONVERT_SIZE(uint8_t, char,487 if (trans && trans->hw_addr) { 488 if (trans->hw_addr->length != CONVERT_SIZE(uint8_t, char, 459 489 header->hardware_length)) { 460 490 return EINVAL; 461 491 } 462 memcpy( hw_source->value, src_hw, hw_source->length);492 memcpy(trans->hw_addr->value, src_hw, trans->hw_addr->length); 463 493 } 464 494 /* Is my protocol address? */ … … 470 500 proto->addr->length)) { 471 501 /* Not already updated? */ 472 if (!hw_source) { 473 hw_source = measured_string_create_bulk((char *) src_hw, 474 CONVERT_SIZE(uint8_t, char, 502 if (!trans) { 503 trans = (arp_trans_t *) malloc(sizeof(arp_trans_t)); 504 if (!trans) 505 return ENOMEM; 506 trans->hw_addr = NULL; 507 fibril_condvar_initialize(&trans->cv); 508 rc = arp_addr_add(&proto->addresses, (char *) src_proto, 509 CONVERT_SIZE(uint8_t, char, header->protocol_length), 510 trans); 511 if (rc != EOK) { 512 /* The generic char map has already freed trans! */ 513 return rc; 514 } 515 } 516 if (!trans->hw_addr) { 517 trans->hw_addr = measured_string_create_bulk( 518 (char *) src_hw, CONVERT_SIZE(uint8_t, char, 475 519 header->hardware_length)); 476 if (! hw_source)520 if (!trans->hw_addr) 477 521 return ENOMEM; 478 522 479 rc = arp_addr_add(&proto->addresses, (char *) src_proto, 480 CONVERT_SIZE(uint8_t, char, 481 header->protocol_length), hw_source); 482 if (rc != EOK) 483 return rc; 523 /* Notify the fibrils that wait for the translation. */ 524 fibril_condvar_broadcast(&trans->cv); 484 525 } 485 526 if (ntohs(header->operation) == ARPOP_REQUEST) { … … 490 531 memcpy(src_hw, device->addr->value, 491 532 device->packet_dimension.addr_len); 492 memcpy(des_hw, hw_source->value,533 memcpy(des_hw, trans->hw_addr->value, 493 534 header->hardware_length); 494 535 … … 516 557 * @param[in] protocol The protocol service. 517 558 * @param[in] target The target protocol address. 518 * @return The hardware address of the target. 519 * @return NULL if the target parameter is NULL. 520 * @return NULL if the device is not found. 521 * @return NULL if the device packet is too small to send a 522 * request. 523 * @return NULL if the hardware address is not found in the cache. 524 */ 525 static measured_string_t * 559 * @param[out] translation Where the hardware address of the target is stored. 560 * @return EOK on success. 561 * @return EAGAIN if the caller should try again. 562 * @return Other error codes in case of error. 563 */ 564 static int 526 565 arp_translate_message(device_id_t device_id, services_t protocol, 527 measured_string_t *target )566 measured_string_t *target, measured_string_t **translation) 528 567 { 529 568 arp_device_t *device; 530 569 arp_proto_t *proto; 531 measured_string_t *addr;570 arp_trans_t *trans; 532 571 size_t length; 533 572 packet_t *packet; 534 573 arp_header_t *header; 535 536 if (!target) 537 return NULL; 574 bool retry = false; 575 int rc; 576 577 restart: 578 if (!target || !translation) 579 return EBADMEM; 538 580 539 581 device = arp_cache_find(&arp_globals.cache, device_id); 540 582 if (!device) 541 return NULL;583 return ENOENT; 542 584 543 585 proto = arp_protos_find(&device->protos, protocol); 544 586 if (!proto || (proto->addr->length != target->length)) 545 return NULL; 546 547 addr = arp_addr_find(&proto->addresses, target->value, target->length); 548 if (addr) 549 return addr; 587 return ENOENT; 588 589 trans = arp_addr_find(&proto->addresses, target->value, target->length); 590 if (trans) { 591 if (trans->hw_addr) { 592 *translation = trans->hw_addr; 593 return EOK; 594 } 595 if (retry) 596 return EAGAIN; 597 rc = fibril_condvar_wait_timeout(&trans->cv, &arp_globals.lock, 598 ARP_TRANS_WAIT); 599 if (rc == ETIMEOUT) 600 return ENOENT; 601 retry = true; 602 goto restart; 603 } 604 if (retry) 605 return EAGAIN; 550 606 551 607 /* ARP packet content size = header + (address + translation) * 2 */ … … 553 609 CONVERT_SIZE(char, uint8_t, device->addr->length)); 554 610 if (length > device->packet_dimension.content) 555 return NULL;611 return ELIMIT; 556 612 557 613 packet = packet_get_4_remote(arp_globals.net_phone, … … 559 615 length, device->packet_dimension.suffix); 560 616 if (!packet) 561 return NULL;617 return ENOMEM; 562 618 563 619 header = (arp_header_t *) packet_suffix(packet, length); 564 620 if (!header) { 565 621 pq_release_remote(arp_globals.net_phone, packet_get_id(packet)); 566 return NULL;622 return ENOMEM; 567 623 } 568 624 … … 583 639 memcpy(((uint8_t *) header) + length, target->value, target->length); 584 640 585 if (packet_set_addr(packet, (uint8_t *) device->addr->value,641 rc = packet_set_addr(packet, (uint8_t *) device->addr->value, 586 642 (uint8_t *) device->broadcast_addr->value, 587 CONVERT_SIZE(char, uint8_t, device->addr->length)) != EOK) { 643 CONVERT_SIZE(char, uint8_t, device->addr->length)); 644 if (rc != EOK) { 588 645 pq_release_remote(arp_globals.net_phone, packet_get_id(packet)); 589 return NULL;646 return rc; 590 647 } 591 648 592 649 nil_send_msg(device->phone, device_id, packet, SERVICE_ARP); 593 return NULL; 650 651 trans = (arp_trans_t *) malloc(sizeof(arp_trans_t)); 652 if (!trans) 653 return ENOMEM; 654 trans->hw_addr = NULL; 655 fibril_condvar_initialize(&trans->cv); 656 rc = arp_addr_add(&proto->addresses, target->value, target->length, 657 trans); 658 if (rc != EOK) { 659 /* The generic char map has already freed trans! */ 660 return rc; 661 } 662 663 rc = fibril_condvar_wait_timeout(&trans->cv, &arp_globals.lock, 664 ARP_TRANS_WAIT); 665 if (rc == ETIMEOUT) 666 return ENOENT; 667 retry = true; 668 goto restart; 594 669 } 595 670 … … 642 717 return rc; 643 718 644 fibril_ rwlock_read_lock(&arp_globals.lock);645 translation= arp_translate_message(IPC_GET_DEVICE(call),646 IPC_GET_SERVICE(call), address );719 fibril_mutex_lock(&arp_globals.lock); 720 rc = arp_translate_message(IPC_GET_DEVICE(call), 721 IPC_GET_SERVICE(call), address, &translation); 647 722 free(address); 648 723 free(data); 724 if (rc != EOK) { 725 fibril_mutex_unlock(&arp_globals.lock); 726 return rc; 727 } 649 728 if (!translation) { 650 fibril_ rwlock_read_unlock(&arp_globals.lock);729 fibril_mutex_unlock(&arp_globals.lock); 651 730 return ENOENT; 652 731 } 653 732 rc = measured_strings_reply(translation, 1); 654 fibril_ rwlock_read_unlock(&arp_globals.lock);733 fibril_mutex_unlock(&arp_globals.lock); 655 734 return rc; 656 735 … … 682 761 return rc; 683 762 684 fibril_ rwlock_read_lock(&arp_globals.lock);763 fibril_mutex_lock(&arp_globals.lock); 685 764 do { 686 765 next = pq_detach(packet); … … 692 771 packet = next; 693 772 } while (packet); 694 fibril_ rwlock_read_unlock(&arp_globals.lock);773 fibril_mutex_unlock(&arp_globals.lock); 695 774 696 775 return EOK; -
uspace/srv/net/il/arp/arp.h
r07b9203e rfe2333d 65 65 typedef struct arp_proto arp_proto_t; 66 66 67 /** Type definition of the ARP address translation record. 68 * @see arp_trans 69 */ 70 typedef struct arp_trans arp_trans_t; 71 67 72 /** ARP address map. 68 73 * … … 70 75 * @see generic_char_map.h 71 76 */ 72 GENERIC_CHAR_MAP_DECLARE(arp_addr, measured_string_t);77 GENERIC_CHAR_MAP_DECLARE(arp_addr, arp_trans_t); 73 78 74 79 /** ARP address cache. … … 89 94 struct arp_device { 90 95 /** Actual device hardware address. */ 91 measured_string_t * 96 measured_string_t *addr; 92 97 /** Actual device hardware address data. */ 93 98 char *addr_data; 94 99 /** Broadcast device hardware address. */ 95 measured_string_t * 100 measured_string_t *broadcast_addr; 96 101 /** Broadcast device hardware address data. */ 97 102 char *broadcast_data; … … 129 134 int net_phone; 130 135 /** Safety lock. */ 131 fibril_ rwlock_t lock;136 fibril_mutex_t lock; 132 137 }; 133 138 … … 144 149 }; 145 150 151 /** ARP address translation record. */ 152 struct arp_trans { 153 /** 154 * Hardware address for the translation. NULL denotes an incomplete 155 * record with possible waiters. 156 */ 157 measured_string_t *hw_addr; 158 /** Condition variable used for waiting for completion of the record. */ 159 fibril_condvar_t cv; 160 }; 161 146 162 #endif 147 163 148 164 /** @} 149 165 */ 166 -
uspace/srv/vfs/vfs.h
r07b9203e rfe2333d 172 172 173 173 extern fs_handle_t fs_name_to_handle(char *, bool); 174 extern vfs_info_t *fs_handle_to_info(fs_handle_t); 174 175 175 176 extern int vfs_lookup_internal(char *, int, vfs_lookup_res_t *, -
uspace/srv/vfs/vfs_ops.c
r07b9203e rfe2333d 781 781 static void vfs_rdwr(ipc_callid_t rid, ipc_call_t *request, bool read) 782 782 { 783 vfs_info_t *vi; 783 784 784 785 /* … … 807 808 fibril_mutex_lock(&file->lock); 808 809 810 vi = fs_handle_to_info(file->node->fs_handle); 811 assert(vi); 812 809 813 /* 810 814 * Lock the file's node so that no other client can read/write to it at 811 * the same time. 812 */ 813 if (read) 815 * the same time unless the FS supports concurrent reads/writes and its 816 * write implementation does not modify the file size. 817 */ 818 if (read || (vi->concurrent_read_write && vi->write_retains_size)) 814 819 fibril_rwlock_read_lock(&file->node->contents_rwlock); 815 820 else … … 857 862 858 863 /* Unlock the VFS node. */ 859 if (read )864 if (read || (vi->concurrent_read_write && vi->write_retains_size)) 860 865 fibril_rwlock_read_unlock(&file->node->contents_rwlock); 861 866 else { -
uspace/srv/vfs/vfs_register.c
r07b9203e rfe2333d 333 333 } 334 334 335 /** Find the VFS info structure. 336 * 337 * @param handle FS handle for which the VFS info structure is sought. 338 * @return VFS info structure on success or NULL otherwise. 339 */ 340 vfs_info_t *fs_handle_to_info(fs_handle_t handle) 341 { 342 vfs_info_t *info = NULL; 343 link_t *cur; 344 345 fibril_mutex_lock(&fs_head_lock); 346 for (cur = fs_head.next; cur != &fs_head; cur = cur->next) { 347 fs_info_t *fs = list_get_instance(cur, fs_info_t, fs_link); 348 if (fs->fs_handle == handle) { 349 info = &fs->vfs_info; 350 break; 351 } 352 } 353 fibril_mutex_unlock(&fs_head_lock); 354 355 return info; 356 } 357 335 358 /** 336 359 * @}
Note:
See TracChangeset
for help on using the changeset viewer.