Changes in / [fe2333d:07b9203e] in mainline
- Files:
-
- 3 added
- 13 deleted
- 30 edited
Legend:
- Unmodified
- Added
- Removed
-
HelenOS.config
rfe2333d r07b9203e 545 545 % Line debugging information 546 546 ! [CONFIG_STRIP_BINARIES!=y] CONFIG_LINE_DEBUG (n/y) 547 548 % Launch (devman) test drivers549 ! [CONFIG_DEBUG=y] CONFIG_TEST_DRIVERS (y/n)550 -
Makefile
rfe2333d r07b9203e 41 41 CONFIG_HEADER = config.h 42 42 43 .PHONY: all precheck cscope autotool config_ auto config_default config distclean clean43 .PHONY: all precheck cscope autotool config_default config distclean clean 44 44 45 45 all: $(COMMON_MAKEFILE) $(COMMON_HEADER) $(CONFIG_MAKEFILE) $(CONFIG_HEADER) … … 66 66 67 67 config_default: $(CONFIG_RULES) 68 ifeq ($(HANDS_OFF),y) 69 $(CONFIG) $< hands-off $(PROFILE) 70 else 71 $(CONFIG) $< default $(PROFILE) 72 endif 68 $(CONFIG) $< default 73 69 74 70 config: $(CONFIG_RULES) -
boot/Makefile.common
rfe2333d r07b9203e 111 111 RD_DRVS = \ 112 112 root \ 113 rootvirt \114 test1 \115 test2 \116 113 vhc 117 114 -
boot/arch/amd64/Makefile.inc
rfe2333d r07b9203e 37 37 38 38 RD_DRVS += \ 39 root pc\39 rootia32 \ 40 40 pciintel \ 41 41 isa \ -
tools/config.py
rfe2333d r07b9203e 47 47 48 48 def read_config(fname, config): 49 "Read saved values from last configuration run or a preset file"49 "Read saved values from last configuration run" 50 50 51 51 inf = open(fname, 'r') … … 218 218 # and verify that all variables have a value (previously specified or inferred). 219 219 # 220 # @param config 221 # @param rules 222 # 223 # @return 224 # 220 # @param config Configuration to work on 221 # @param rules Rules 222 # 223 # @return True if configuration is complete and valid, False 224 # otherwise. 225 225 # 226 226 def infer_verify_choices(config, rules): … … 229 229 for rule in rules: 230 230 varname, vartype, name, choices, cond = rule 231 231 232 232 if cond and (not check_condition(cond, config, rules)): 233 233 continue … … 237 237 else: 238 238 value = config[varname] 239 240 if not validate_rule_value(rule, value):239 240 if not rule_value_is_valid(rule, value): 241 241 value = None 242 243 default = get_default_rule(rule) 244 245 # 246 # If we don't have a value but we do have 247 # a default, use it. 248 # 249 if value == None and default != None: 250 value = default 242 243 default = rule_get_default(rule) 244 if default != None: 251 245 config[varname] = default 252 246 253 247 if not varname in config: 254 248 return False … … 257 251 258 252 ## Get default value from a rule. 259 def get_default_rule(rule):253 def rule_get_default(rule): 260 254 varname, vartype, name, choices, cond = rule 261 255 262 256 default = None 263 257 264 258 if vartype == 'choice': 265 259 # If there is just one option, use it … … 276 270 else: 277 271 raise RuntimeError("Unknown variable type: %s" % vartype) 278 272 279 273 return default 280 274 281 275 ## Get option from a rule. 282 276 # 283 # @param rule 284 # @param value 277 # @param rule Rule for a variable 278 # @param value Current value of the variable 285 279 # 286 280 # @return Option (string) to ask or None which means not to ask. 287 281 # 288 def get_rule_option(rule, value):282 def rule_get_option(rule, value): 289 283 varname, vartype, name, choices, cond = rule 290 284 291 285 option = None 292 286 293 287 if vartype == 'choice': 294 288 # If there is just one option, don't ask … … 308 302 else: 309 303 raise RuntimeError("Unknown variable type: %s" % vartype) 310 304 311 305 return option 312 306 313 307 ## Check if variable value is valid. 314 308 # 315 # @param rule 316 # @param value 317 # 318 # @return 319 # 320 def validate_rule_value(rule, value):309 # @param rule Rule for the variable 310 # @param value Value of the variable 311 # 312 # @return True if valid, False if not valid. 313 # 314 def rule_value_is_valid(rule, value): 321 315 varname, vartype, name, choices, cond = rule 322 316 323 317 if value == None: 324 318 return True 325 319 326 320 if vartype == 'choice': 327 321 if not value in [choice[0] for choice in choices]: … … 341 335 else: 342 336 raise RuntimeError("Unknown variable type: %s" % vartype) 343 337 344 338 return True 345 339 … … 419 413 return list 420 414 421 ## Ask user to choose a configuration profile.422 # 423 def choose_profile(root, fname, screen, config):415 ## Choose a profile and load configuration presets. 416 # 417 def load_presets(root, fname, screen, config): 424 418 options = [] 425 419 opt2path = {} … … 442 436 subprofile = True 443 437 options.append("%s (%s)" % (name, subname)) 444 opt2path[cnt] = [name, subname]438 opt2path[cnt] = (canon, subcanon) 445 439 cnt += 1 446 440 447 441 if not subprofile: 448 442 options.append(name) 449 opt2path[cnt] = [name]443 opt2path[cnt] = (canon, None) 450 444 cnt += 1 451 445 … … 455 449 return None 456 450 457 return opt2path[value] 458 459 ## Read presets from a configuration profile. 460 # 461 # @param profile Profile to load from (a list of string components) 462 # @param config Output configuration 463 # 464 def read_presets(profile, config): 465 path = os.path.join(PRESETS_DIR, profile[0], MAKEFILE) 466 read_config(path, config) 467 468 if len(profile) > 1: 469 path = os.path.join(PRESETS_DIR, profile[0], profile[1], MAKEFILE) 470 read_config(path, config) 471 472 ## Parse profile name (relative OS path) into a list of components. 473 # 474 # @param profile_name Relative path (using OS separator) 475 # @return List of components 476 # 477 def parse_profile_name(profile_name): 478 profile = [] 479 480 head, tail = os.path.split(profile_name) 481 if head != '': 482 profile.append(head) 483 484 profile.append(tail) 485 return profile 451 read_config(opt2path[value][0], config) 452 if opt2path[value][1] != None: 453 read_config(opt2path[value][1], config) 486 454 487 455 def main(): 488 profile = None489 456 config = {} 490 457 rules = [] … … 493 460 parse_rules(RULES_FILE, rules) 494 461 495 # Input configuration file can be specified on command line 496 # otherwise configuration from previous run is used. 497 if len(sys.argv) >= 4: 498 profile = parse_profile_name(sys.argv[3]) 499 read_presets(profile, config) 500 elif os.path.exists(MAKEFILE): 462 # Read configuration from previous run 463 if os.path.exists(MAKEFILE): 501 464 read_config(MAKEFILE, config) 502 465 503 # Default mode: check values and regenerate configuration files466 # Default mode: only check values and regenerate configuration files 504 467 if (len(sys.argv) >= 3) and (sys.argv[2] == 'default'): 505 468 if (infer_verify_choices(config, rules)): 506 469 create_output(MAKEFILE, MACROS, config, rules) 507 470 return 0 508 509 # Hands-off mode: check values and regenerate configuration files,510 # but no interactive fallback511 if (len(sys.argv) >= 3) and (sys.argv[2] == 'hands-off'):512 # We deliberately test sys.argv >= 4 because we do not want513 # to read implicitly any possible previous run configuration514 if len(sys.argv) < 4:515 sys.stderr.write("Configuration error: No presets specified\n")516 return 2517 518 if (infer_verify_choices(config, rules)):519 create_output(MAKEFILE, MACROS, config, rules)520 return 0521 522 sys.stderr.write("Configuration error: The presets are ambiguous\n")523 return 1524 471 525 472 # Check mode: only check configuration … … 560 507 value = config[varname] 561 508 562 if not validate_rule_value(rule, value):509 if not rule_value_is_valid(rule, value): 563 510 value = None 564 565 default = get_default_rule(rule) 566 567 # 568 # If we don't have a value but we do have 569 # a default, use it. 570 # 571 if value == None and default != None: 511 512 default = rule_get_default(rule) 513 if default != None: 572 514 value = default 573 515 config[varname] = default 574 575 option = get_rule_option(rule, value)516 517 option = rule_get_option(rule, value) 576 518 if option != None: 577 519 options.append(option) 578 else:579 continue580 520 581 521 opt2row[cnt] = (varname, vartype, name, choices) … … 599 539 600 540 if value == 0: 601 profile = choose_profile(PRESETS_DIR, MAKEFILE, screen, config) 602 if profile != None: 603 read_presets(profile, config) 541 load_presets(PRESETS_DIR, MAKEFILE, screen, config) 604 542 position = 1 605 543 continue -
uspace/Makefile
rfe2333d r07b9203e 88 88 srv/net/net \ 89 89 drv/root \ 90 drv/rootvirt \91 drv/test1 \92 drv/test2 \93 90 drv/vhc 94 91 … … 114 111 115 112 ifeq ($(UARCH),amd64) 116 DIRS += drv/rootpc117 DIRS += drv/pciintel118 DIRS += drv/isa119 DIRS += drv/ns8250120 113 endif 121 114 122 115 ifeq ($(UARCH),ia32) 123 DIRS += drv/root pc116 DIRS += drv/rootia32 124 117 DIRS += drv/pciintel 125 118 DIRS += drv/isa -
uspace/app/netecho/print_error.c
rfe2333d r07b9203e 164 164 case EDESTADDRREQ: 165 165 fprintf(output, "Destination address required (%d) error", error_code); 166 case EAGAIN:166 case TRY_AGAIN: 167 167 fprintf(output, "Try again (%d) error", error_code); 168 168 default: -
uspace/drv/isa/isa.c
rfe2333d r07b9203e 282 282 283 283 printf(NAME ": added io range (addr=0x%x, size=0x%x) to " 284 "device %s\n", (unsigned int) addr, (unsigned int) len, 285 dev->name); 284 "device %s\n", addr, len, dev->name); 286 285 } 287 286 } … … 490 489 static int isa_add_device(device_t *dev) 491 490 { 492 printf(NAME ": isa_add_device, device handle = %d\n", 493 (int) dev->handle); 491 printf(NAME ": isa_add_device, device handle = %d\n", dev->handle); 494 492 495 493 /* Add child devices. */ -
uspace/drv/ns8250/ns8250.c
rfe2333d r07b9203e 274 274 275 275 /* Gain control over port's registers. */ 276 if (pio_enable((void *) (uintptr_t)data->io_addr, REG_COUNT,276 if (pio_enable((void *) data->io_addr, REG_COUNT, 277 277 (void **) &data->port)) { 278 278 printf(NAME ": error - cannot gain the port %#" PRIx32 " for device " … … 727 727 { 728 728 printf(NAME ": ns8250_add_device %s (handle = %d)\n", 729 dev->name, (int)dev->handle);729 dev->name, dev->handle); 730 730 731 731 int res = ns8250_dev_initialize(dev); -
uspace/drv/pciintel/pci.c
rfe2333d r07b9203e 324 324 printf(NAME ": device %s : ", dev->name); 325 325 printf("address = %" PRIx64, range_addr); 326 printf(", size = %x\n", (unsigned int)range_size);326 printf(", size = %x\n", range_size); 327 327 } 328 328 … … 489 489 (uint32_t) hw_resources.resources[0].res.io_range.address; 490 490 491 if (pio_enable((void *) (uintptr_t)bus_data->conf_io_addr, 8,491 if (pio_enable((void *)bus_data->conf_io_addr, 8, 492 492 &bus_data->conf_addr_port)) { 493 493 printf(NAME ": failed to enable configuration ports.\n"); -
uspace/drv/root/root.c
rfe2333d r07b9203e 1 1 /* 2 2 * Copyright (c) 2010 Lenka Trochtova 3 * Copyright (c) 2010 Vojtech Horky4 3 * All rights reserved. 5 4 * … … 54 53 #define NAME "root" 55 54 56 #define PLATFORM_DEVICE_NAME "hw"57 #define PLATFORM_DEVICE_MATCH_ID STRING(UARCH)58 #define PLATFORM_DEVICE_MATCH_SCORE 10059 60 #define VIRTUAL_DEVICE_NAME "virt"61 #define VIRTUAL_DEVICE_MATCH_ID "rootvirt"62 #define VIRTUAL_DEVICE_MATCH_SCORE 10063 64 55 static int root_add_device(device_t *dev); 65 56 … … 75 66 }; 76 67 77 /** Create the device which represents the root of virtual device tree.78 *79 * @param parent Parent of the newly created device.80 * @return Error code.81 */82 static int add_virtual_root_child(device_t *parent)83 {84 printf(NAME ": adding new child for virtual devices.\n");85 printf(NAME ": device node is `%s' (%d %s)\n", VIRTUAL_DEVICE_NAME,86 VIRTUAL_DEVICE_MATCH_SCORE, VIRTUAL_DEVICE_MATCH_ID);87 88 int res = child_device_register_wrapper(parent, VIRTUAL_DEVICE_NAME,89 VIRTUAL_DEVICE_MATCH_ID, VIRTUAL_DEVICE_MATCH_SCORE);90 91 return res;92 }93 94 68 /** Create the device which represents the root of HW device tree. 95 69 * … … 100 74 { 101 75 printf(NAME ": adding new child for platform device.\n"); 102 printf(NAME ": device node is `%s' (%d %s)\n", PLATFORM_DEVICE_NAME, 103 PLATFORM_DEVICE_MATCH_SCORE, PLATFORM_DEVICE_MATCH_ID); 104 105 int res = child_device_register_wrapper(parent, PLATFORM_DEVICE_NAME, 106 PLATFORM_DEVICE_MATCH_ID, PLATFORM_DEVICE_MATCH_SCORE); 107 76 77 int res = EOK; 78 device_t *platform = NULL; 79 match_id_t *match_id = NULL; 80 81 /* Create new device. */ 82 platform = create_device(); 83 if (NULL == platform) { 84 res = ENOMEM; 85 goto failure; 86 } 87 88 platform->name = "hw"; 89 printf(NAME ": the new device's name is %s.\n", platform->name); 90 91 /* Initialize match id list. */ 92 match_id = create_match_id(); 93 if (NULL == match_id) { 94 res = ENOMEM; 95 goto failure; 96 } 97 98 /* TODO - replace this with some better solution (sysinfo ?) */ 99 match_id->id = STRING(UARCH); 100 match_id->score = 100; 101 add_match_id(&platform->match_ids, match_id); 102 103 /* Register child device. */ 104 res = child_device_register(platform, parent); 105 if (EOK != res) 106 goto failure; 107 108 return res; 109 110 failure: 111 if (NULL != match_id) 112 match_id->id = NULL; 113 114 if (NULL != platform) { 115 platform->name = NULL; 116 delete_device(platform); 117 } 118 108 119 return res; 109 120 } … … 173 184 dev->handle); 174 185 175 /*176 * Register virtual devices root.177 * We ignore error occurrence because virtual devices shall not be178 * vital for the system.179 */180 add_virtual_root_child(dev);181 182 186 /* Register root device's children. */ 183 187 int res = add_platform_child(dev); -
uspace/lib/c/generic/adt/char_map.c
rfe2333d r07b9203e 90 90 } 91 91 92 map->items[map->next]->c = * identifier;93 identifier++;94 map->next++;95 if ((length > 1) || ((length == 0) && *identifier)) {92 map->items[map->next]->c = * identifier; 93 ++ identifier; 94 ++ map->next; 95 if ((length > 1) || ((length == 0) && (*identifier))) { 96 96 map->items[map->next - 1]->value = CHAR_MAP_NULL; 97 97 return char_map_add_item(map->items[map->next - 1], identifier, … … 142 142 const int value) 143 143 { 144 if (char_map_is_valid(map) && identifier && (length || *identifier)) { 144 if (char_map_is_valid(map) && (identifier) && 145 ((length) || (*identifier))) { 145 146 int index; 146 147 147 for (index = 0; index < map->next; index++) {148 for (index = 0; index < map->next; ++ index) { 148 149 if (map->items[index]->c != *identifier) 149 150 continue; 150 151 151 identifier++;152 if((length > 1) || ((length == 0) && *identifier)) {152 ++ identifier; 153 if((length > 1) || ((length == 0) && (*identifier))) { 153 154 return char_map_add(map->items[index], 154 155 identifier, length ? length - 1 : 0, value); … … 177 178 178 179 map->magic = 0; 179 for (index = 0; index < map->next; index++)180 for (index = 0; index < map->next; ++index) 180 181 char_map_destroy(map->items[index]); 181 182 … … 206 207 return NULL; 207 208 208 if (length || *identifier) {209 if (length || (*identifier)) { 209 210 int index; 210 211 211 for (index = 0; index < map->next; index++) {212 for (index = 0; index < map->next; ++index) { 212 213 if (map->items[index]->c == *identifier) { 213 identifier++;214 ++identifier; 214 215 if (length == 1) 215 216 return map->items[index]; -
uspace/lib/c/generic/devman.c
rfe2333d r07b9203e 116 116 { 117 117 ipc_call_t answer; 118 a id_t req = async_send_1(phone, DEVMAN_ADD_MATCH_ID, match_id->score, &answer);118 async_send_1(phone, DEVMAN_ADD_MATCH_ID, match_id->score, &answer); 119 119 int retval = async_data_write_start(phone, match_id->id, str_size(match_id->id)); 120 async_wait_for(req, NULL); 121 return retval; 120 return retval; 122 121 } 123 122 -
uspace/lib/c/include/adt/generic_field.h
rfe2333d r07b9203e 91 91 } \ 92 92 field->items[field->next] = value; \ 93 field->next++; \93 ++field->next; \ 94 94 field->items[field->next] = NULL; \ 95 95 return field->next - 1; \ … … 108 108 int index; \ 109 109 field->magic = 0; \ 110 for (index = 0; index < field->next; index++) { \110 for (index = 0; index < field->next; ++ index) { \ 111 111 if (field->items[index]) \ 112 112 free(field->items[index]); \ -
uspace/lib/c/include/errno.h
rfe2333d r07b9203e 83 83 #define ENOTCONN (-10057) 84 84 85 /** The requested operation was not performed. Try again later. */ 86 #define EAGAIN (-11002) 85 /** The requested operation was not performed. 86 * Try again later. 87 */ 88 #define TRY_AGAIN (-11002) 87 89 88 90 /** No data. -
uspace/lib/c/include/ipc/vfs.h
rfe2333d r07b9203e 36 36 #define LIBC_IPC_VFS_H_ 37 37 38 #include <sys/types.h> 38 39 #include <ipc/ipc.h> 39 #include <sys/types.h>40 #include <bool.h>41 40 42 41 #define FS_NAME_MAXLEN 20 … … 56 55 /** Unique identifier of the fs. */ 57 56 char name[FS_NAME_MAXLEN + 1]; 58 bool concurrent_read_write;59 bool write_retains_size;60 57 } vfs_info_t; 61 58 -
uspace/lib/drv/generic/driver.c
rfe2333d r07b9203e 381 381 } 382 382 383 /** Wrapper for child_device_register for devices with single match id.384 *385 * @param parent Parent device.386 * @param child_name Child device name.387 * @param child_match_id Child device match id.388 * @param child_match_score Child device match score.389 * @return Error code.390 */391 int child_device_register_wrapper(device_t *parent, const char *child_name,392 const char *child_match_id, int child_match_score)393 {394 device_t *child = NULL;395 match_id_t *match_id = NULL;396 int rc;397 398 child = create_device();399 if (child == NULL) {400 rc = ENOMEM;401 goto failure;402 }403 404 child->name = child_name;405 406 match_id = create_match_id();407 if (match_id == NULL) {408 rc = ENOMEM;409 goto failure;410 }411 412 match_id->id = child_match_id;413 match_id->score = child_match_score;414 add_match_id(&child->match_ids, match_id);415 416 rc = child_device_register(child, parent);417 if (EOK != rc)418 goto failure;419 420 return EOK;421 422 failure:423 if (match_id != NULL) {424 match_id->id = NULL;425 delete_match_id(match_id);426 }427 428 if (child != NULL) {429 child->name = NULL;430 delete_device(child);431 }432 433 return rc;434 }435 436 383 int driver_main(driver_t *drv) 437 384 { -
uspace/lib/drv/include/driver.h
rfe2333d r07b9203e 199 199 200 200 int child_device_register(device_t *, device_t *); 201 int child_device_register_wrapper(device_t *, const char *, const char *, int);202 201 203 202 -
uspace/srv/devman/devman.c
rfe2333d r07b9203e 516 516 /** Notify driver about the devices to which it was assigned. 517 517 * 518 * The driver's mutex must be locked. 519 * 518 520 * @param driver The driver to which the devices are passed. 519 521 */ … … 524 526 int phone; 525 527 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) { 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 533 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); 545 537 link = link->next; 546 continue;547 538 } 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 */ 579 link = driver->devices.next; 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); 539 540 ipc_hangup(phone); 541 } 597 542 } 598 543 … … 608 553 void initialize_running_driver(driver_t *driver, dev_tree_t *tree) 609 554 { 610 printf(NAME ": initialize_running_driver (`%s')\n", driver->name); 555 printf(NAME ": initialize_running_driver\n"); 556 fibril_mutex_lock(&driver->driver_mutex); 611 557 612 558 /* … … 615 561 */ 616 562 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); 617 568 } 618 569 … … 686 637 } 687 638 688 static FIBRIL_MUTEX_INITIALIZE(add_device_guard);689 639 690 640 /** Pass a device to running driver. … … 695 645 void add_device(int phone, driver_t *drv, node_t *node, dev_tree_t *tree) 696 646 { 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); 647 printf(NAME ": add_device\n"); 705 648 706 649 ipcarg_t rc; … … 714 657 parent_handle = 0; 715 658 } 716 717 659 aid_t req = async_send_2(phone, DRIVER_ADD_DEVICE, node->handle, 718 660 parent_handle, &answer); … … 724 666 /* TODO handle error */ 725 667 } 726 668 727 669 /* Wait for answer from the driver. */ 728 670 async_wait_for(req, &rc); 729 730 fibril_mutex_unlock(&add_device_guard);731 732 671 switch(rc) { 733 672 case EOK: … … 742 681 } 743 682 744 node->passed_to_driver = true;745 746 683 return; 747 684 } … … 769 706 attach_driver(node, drv); 770 707 771 fibril_mutex_lock(&drv->driver_mutex);772 708 if (drv->state == DRIVER_NOT_STARTED) { 773 709 /* Start the driver. */ 774 710 start_driver(drv); 775 711 } 776 bool is_running = drv->state == DRIVER_RUNNING; 777 fibril_mutex_unlock(&drv->driver_mutex); 778 779 if (is_running) { 712 713 if (drv->state == DRIVER_RUNNING) { 780 714 /* Notify the driver about the new device. */ 781 int phone = async_connect_me_to(drv->phone, DRIVER_DEVMAN, 0, 0);715 int phone = ipc_connect_me_to(drv->phone, DRIVER_DEVMAN, 0, 0); 782 716 if (phone > 0) { 783 717 add_device(phone, drv, node, tree); … … 941 875 node->name = dev_name; 942 876 if (!set_dev_path(node, parent)) { 877 fibril_rwlock_write_unlock(&tree->rwlock); 943 878 return false; 944 879 } … … 1162 1097 while (link != &class_list->classes) { 1163 1098 cl = list_get_instance(link, dev_class_t, link); 1164 if (str_cmp(cl->name, class_name) == 0) {1099 if (str_cmp(cl->name, class_name) == 0) 1165 1100 return cl; 1166 }1167 link = link->next;1168 1101 } 1169 1102 -
uspace/srv/devman/devman.h
rfe2333d r07b9203e 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;175 170 }; 176 171 -
uspace/srv/devman/main.c
rfe2333d r07b9203e 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 206 199 /** Handle child device registration. 207 200 * … … 244 237 245 238 devman_receive_match_ids(match_count, &node->match_ids); 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 239 265 240 /* Return device handle to parent's driver. */ 266 241 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); 267 245 } 268 246 … … 319 297 printf(NAME ": device '%s' added to class '%s', class name '%s' was " 320 298 "asigned to it\n", dev->pathname, class_name, class_info->dev_name); 321 299 322 300 ipc_answer_0(callid, EOK); 323 301 } -
uspace/srv/devman/match.c
rfe2333d r07b9203e 46 46 if (str_cmp(driver->id, device->id) == 0) { 47 47 /* 48 * The strings match , return the product of their scores.48 * The strings matches, return their score multiplied. 49 49 */ 50 50 return driver->score * device->score; … … 66 66 67 67 /* 68 * Go through all pairs, return the highest score obtaine d.68 * Go through all pairs, return the highest score obtainetd. 69 69 */ 70 70 int highest_score = 0; -
uspace/srv/fs/devfs/devfs.c
rfe2333d r07b9203e 53 53 static vfs_info_t devfs_vfs_info = { 54 54 .name = NAME, 55 .concurrent_read_write = false,56 .write_retains_size = false,57 55 }; 58 56 -
uspace/srv/fs/fat/fat.c
rfe2333d r07b9203e 52 52 vfs_info_t fat_vfs_info = { 53 53 .name = NAME, 54 .concurrent_read_write = false,55 .write_retains_size = false,56 54 }; 57 55 -
uspace/srv/fs/tmpfs/tmpfs.c
rfe2333d r07b9203e 57 57 vfs_info_t tmpfs_vfs_info = { 58 58 .name = NAME, 59 .concurrent_read_write = false,60 .write_retains_size = false,61 59 }; 62 60 -
uspace/srv/net/il/arp/arp.c
rfe2333d r07b9203e 72 72 #define NAME "arp" 73 73 74 /** Number of microseconds to wait for an ARP reply. */75 #define ARP_TRANS_WAIT 100000076 77 74 /** ARP global data. */ 78 75 arp_globals_t arp_globals; … … 80 77 DEVICE_MAP_IMPLEMENT(arp_cache, arp_device_t); 81 78 INT_MAP_IMPLEMENT(arp_protos, arp_proto_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 79 GENERIC_CHAR_MAP_IMPLEMENT(arp_addr, measured_string_t); 105 80 106 81 /** Clears the device specific data. … … 121 96 if (proto->addr_data) 122 97 free(proto->addr_data); 123 arp_clear_addr(&proto->addresses);124 98 arp_addr_destroy(&proto->addresses); 125 99 } … … 133 107 arp_device_t *device; 134 108 135 fibril_ mutex_lock(&arp_globals.lock);109 fibril_rwlock_write_lock(&arp_globals.lock); 136 110 for (count = arp_cache_count(&arp_globals.cache) - 1; count >= 0; 137 111 count--) { … … 146 120 } 147 121 arp_cache_clear(&arp_globals.cache); 148 fibril_ mutex_unlock(&arp_globals.lock);122 fibril_rwlock_write_unlock(&arp_globals.lock); 149 123 printf("Cache cleaned\n"); 150 124 return EOK; … … 156 130 arp_device_t *device; 157 131 arp_proto_t *proto; 158 arp_trans_t *trans; 159 160 fibril_mutex_lock(&arp_globals.lock); 132 133 fibril_rwlock_write_lock(&arp_globals.lock); 161 134 device = arp_cache_find(&arp_globals.cache, device_id); 162 135 if (!device) { 163 fibril_ mutex_unlock(&arp_globals.lock);136 fibril_rwlock_write_unlock(&arp_globals.lock); 164 137 return ENOENT; 165 138 } 166 139 proto = arp_protos_find(&device->protos, protocol); 167 140 if (!proto) { 168 fibril_ mutex_unlock(&arp_globals.lock);141 fibril_rwlock_write_unlock(&arp_globals.lock); 169 142 return ENOENT; 170 143 } 171 trans = arp_addr_find(&proto->addresses, address->value, address->length);172 if (trans)173 arp_clear_trans(trans);174 144 arp_addr_exclude(&proto->addresses, address->value, address->length); 175 fibril_ mutex_unlock(&arp_globals.lock);145 fibril_rwlock_write_unlock(&arp_globals.lock); 176 146 return EOK; 177 147 } … … 182 152 arp_device_t *device; 183 153 184 fibril_ mutex_lock(&arp_globals.lock);154 fibril_rwlock_write_lock(&arp_globals.lock); 185 155 device = arp_cache_find(&arp_globals.cache, device_id); 186 156 if (!device) { 187 fibril_ mutex_unlock(&arp_globals.lock);157 fibril_rwlock_write_unlock(&arp_globals.lock); 188 158 return ENOENT; 189 159 } 190 160 arp_clear_device(device); 191 161 printf("Device %d cleared\n", device_id); 192 fibril_ mutex_unlock(&arp_globals.lock);162 fibril_rwlock_write_unlock(&arp_globals.lock); 193 163 return EOK; 194 164 } … … 251 221 int rc; 252 222 253 fibril_ mutex_lock(&arp_globals.lock);223 fibril_rwlock_write_lock(&arp_globals.lock); 254 224 255 225 /* An existing device? */ … … 259 229 if (device->service != service) { 260 230 printf("Device %d already exists\n", device->device_id); 261 fibril_ mutex_unlock(&arp_globals.lock);231 fibril_rwlock_write_unlock(&arp_globals.lock); 262 232 return EEXIST; 263 233 } … … 271 241 rc = arp_proto_create(&proto, protocol, address); 272 242 if (rc != EOK) { 273 fibril_ mutex_unlock(&arp_globals.lock);243 fibril_rwlock_write_unlock(&arp_globals.lock); 274 244 return rc; 275 245 } … … 277 247 proto); 278 248 if (index < 0) { 279 fibril_ mutex_unlock(&arp_globals.lock);249 fibril_rwlock_write_unlock(&arp_globals.lock); 280 250 free(proto); 281 251 return index; … … 292 262 device = (arp_device_t *) malloc(sizeof(arp_device_t)); 293 263 if (!device) { 294 fibril_ mutex_unlock(&arp_globals.lock);264 fibril_rwlock_write_unlock(&arp_globals.lock); 295 265 return ENOMEM; 296 266 } … … 299 269 rc = arp_protos_initialize(&device->protos); 300 270 if (rc != EOK) { 301 fibril_ mutex_unlock(&arp_globals.lock);271 fibril_rwlock_write_unlock(&arp_globals.lock); 302 272 free(device); 303 273 return rc; … … 305 275 rc = arp_proto_create(&proto, protocol, address); 306 276 if (rc != EOK) { 307 fibril_ mutex_unlock(&arp_globals.lock);277 fibril_rwlock_write_unlock(&arp_globals.lock); 308 278 free(device); 309 279 return rc; … … 311 281 index = arp_protos_add(&device->protos, proto->service, proto); 312 282 if (index < 0) { 313 fibril_ mutex_unlock(&arp_globals.lock);283 fibril_rwlock_write_unlock(&arp_globals.lock); 314 284 arp_protos_destroy(&device->protos); 315 285 free(device); … … 323 293 arp_globals.client_connection); 324 294 if (device->phone < 0) { 325 fibril_ mutex_unlock(&arp_globals.lock);295 fibril_rwlock_write_unlock(&arp_globals.lock); 326 296 arp_protos_destroy(&device->protos); 327 297 free(device); … … 333 303 &device->packet_dimension); 334 304 if (rc != EOK) { 335 fibril_ mutex_unlock(&arp_globals.lock);305 fibril_rwlock_write_unlock(&arp_globals.lock); 336 306 arp_protos_destroy(&device->protos); 337 307 free(device); … … 343 313 &device->addr_data); 344 314 if (rc != EOK) { 345 fibril_ mutex_unlock(&arp_globals.lock);315 fibril_rwlock_write_unlock(&arp_globals.lock); 346 316 arp_protos_destroy(&device->protos); 347 317 free(device); … … 353 323 &device->broadcast_addr, &device->broadcast_data); 354 324 if (rc != EOK) { 355 fibril_ mutex_unlock(&arp_globals.lock);325 fibril_rwlock_write_unlock(&arp_globals.lock); 356 326 free(device->addr); 357 327 free(device->addr_data); … … 364 334 device); 365 335 if (rc != EOK) { 366 fibril_ mutex_unlock(&arp_globals.lock);336 fibril_rwlock_write_unlock(&arp_globals.lock); 367 337 free(device->addr); 368 338 free(device->addr_data); … … 377 347 device->service, protocol); 378 348 } 379 fibril_ mutex_unlock(&arp_globals.lock);349 fibril_rwlock_write_unlock(&arp_globals.lock); 380 350 381 351 return EOK; … … 393 363 int rc; 394 364 395 fibril_ mutex_initialize(&arp_globals.lock);396 fibril_ mutex_lock(&arp_globals.lock);365 fibril_rwlock_initialize(&arp_globals.lock); 366 fibril_rwlock_write_lock(&arp_globals.lock); 397 367 arp_globals.client_connection = client_connection; 398 368 rc = arp_cache_initialize(&arp_globals.cache); 399 fibril_ mutex_unlock(&arp_globals.lock);369 fibril_rwlock_write_unlock(&arp_globals.lock); 400 370 401 371 return rc; … … 413 383 arp_device_t *device; 414 384 415 fibril_ mutex_lock(&arp_globals.lock);385 fibril_rwlock_write_lock(&arp_globals.lock); 416 386 device = arp_cache_find(&arp_globals.cache, device_id); 417 387 if (!device) { 418 fibril_ mutex_unlock(&arp_globals.lock);388 fibril_rwlock_write_unlock(&arp_globals.lock); 419 389 return ENOENT; 420 390 } 421 391 device->packet_dimension.content = mtu; 422 fibril_ mutex_unlock(&arp_globals.lock);392 fibril_rwlock_write_unlock(&arp_globals.lock); 423 393 printf("arp - device %d changed mtu to %zu\n\n", device_id, mtu); 424 394 return EOK; … … 451 421 arp_device_t *device; 452 422 arp_proto_t *proto; 453 arp_trans_t *trans;423 measured_string_t *hw_source; 454 424 uint8_t *src_hw; 455 425 uint8_t *src_proto; … … 482 452 des_hw = src_proto + header->protocol_length; 483 453 des_proto = des_hw + header->hardware_length; 484 trans= arp_addr_find(&proto->addresses, (char *) src_proto,454 hw_source = arp_addr_find(&proto->addresses, (char *) src_proto, 485 455 CONVERT_SIZE(uint8_t, char, header->protocol_length)); 486 456 /* Exists? */ 487 if ( trans && trans->hw_addr) {488 if ( trans->hw_addr->length != CONVERT_SIZE(uint8_t, char,457 if (hw_source) { 458 if (hw_source->length != CONVERT_SIZE(uint8_t, char, 489 459 header->hardware_length)) { 490 460 return EINVAL; 491 461 } 492 memcpy( trans->hw_addr->value, src_hw, trans->hw_addr->length);462 memcpy(hw_source->value, src_hw, hw_source->length); 493 463 } 494 464 /* Is my protocol address? */ … … 500 470 proto->addr->length)) { 501 471 /* Not already updated? */ 502 if (!trans) { 503 trans = (arp_trans_t *) malloc(sizeof(arp_trans_t)); 504 if (!trans) 472 if (!hw_source) { 473 hw_source = measured_string_create_bulk((char *) src_hw, 474 CONVERT_SIZE(uint8_t, char, 475 header->hardware_length)); 476 if (!hw_source) 505 477 return ENOMEM; 506 trans->hw_addr = NULL; 507 fibril_condvar_initialize(&trans->cv); 478 508 479 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! */ 480 CONVERT_SIZE(uint8_t, char, 481 header->protocol_length), hw_source); 482 if (rc != EOK) 513 483 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,519 header->hardware_length));520 if (!trans->hw_addr)521 return ENOMEM;522 523 /* Notify the fibrils that wait for the translation. */524 fibril_condvar_broadcast(&trans->cv);525 484 } 526 485 if (ntohs(header->operation) == ARPOP_REQUEST) { … … 531 490 memcpy(src_hw, device->addr->value, 532 491 device->packet_dimension.addr_len); 533 memcpy(des_hw, trans->hw_addr->value,492 memcpy(des_hw, hw_source->value, 534 493 header->hardware_length); 535 494 … … 557 516 * @param[in] protocol The protocol service. 558 517 * @param[in] target The target protocol address. 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 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 * 565 526 arp_translate_message(device_id_t device_id, services_t protocol, 566 measured_string_t *target , measured_string_t **translation)527 measured_string_t *target) 567 528 { 568 529 arp_device_t *device; 569 530 arp_proto_t *proto; 570 arp_trans_t *trans;531 measured_string_t *addr; 571 532 size_t length; 572 533 packet_t *packet; 573 534 arp_header_t *header; 574 bool retry = false; 575 int rc; 576 577 restart: 578 if (!target || !translation) 579 return EBADMEM; 535 536 if (!target) 537 return NULL; 580 538 581 539 device = arp_cache_find(&arp_globals.cache, device_id); 582 540 if (!device) 583 return ENOENT;541 return NULL; 584 542 585 543 proto = arp_protos_find(&device->protos, protocol); 586 544 if (!proto || (proto->addr->length != target->length)) 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; 545 return NULL; 546 547 addr = arp_addr_find(&proto->addresses, target->value, target->length); 548 if (addr) 549 return addr; 606 550 607 551 /* ARP packet content size = header + (address + translation) * 2 */ … … 609 553 CONVERT_SIZE(char, uint8_t, device->addr->length)); 610 554 if (length > device->packet_dimension.content) 611 return ELIMIT;555 return NULL; 612 556 613 557 packet = packet_get_4_remote(arp_globals.net_phone, … … 615 559 length, device->packet_dimension.suffix); 616 560 if (!packet) 617 return ENOMEM;561 return NULL; 618 562 619 563 header = (arp_header_t *) packet_suffix(packet, length); 620 564 if (!header) { 621 565 pq_release_remote(arp_globals.net_phone, packet_get_id(packet)); 622 return ENOMEM;566 return NULL; 623 567 } 624 568 … … 639 583 memcpy(((uint8_t *) header) + length, target->value, target->length); 640 584 641 rc =packet_set_addr(packet, (uint8_t *) device->addr->value,585 if (packet_set_addr(packet, (uint8_t *) device->addr->value, 642 586 (uint8_t *) device->broadcast_addr->value, 643 CONVERT_SIZE(char, uint8_t, device->addr->length)); 644 if (rc != EOK) { 587 CONVERT_SIZE(char, uint8_t, device->addr->length)) != EOK) { 645 588 pq_release_remote(arp_globals.net_phone, packet_get_id(packet)); 646 return rc;589 return NULL; 647 590 } 648 591 649 592 nil_send_msg(device->phone, device_id, packet, SERVICE_ARP); 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; 593 return NULL; 669 594 } 670 595 … … 717 642 return rc; 718 643 719 fibril_ mutex_lock(&arp_globals.lock);720 rc= arp_translate_message(IPC_GET_DEVICE(call),721 IPC_GET_SERVICE(call), address , &translation);644 fibril_rwlock_read_lock(&arp_globals.lock); 645 translation = arp_translate_message(IPC_GET_DEVICE(call), 646 IPC_GET_SERVICE(call), address); 722 647 free(address); 723 648 free(data); 724 if (rc != EOK) {725 fibril_mutex_unlock(&arp_globals.lock);726 return rc;727 }728 649 if (!translation) { 729 fibril_ mutex_unlock(&arp_globals.lock);650 fibril_rwlock_read_unlock(&arp_globals.lock); 730 651 return ENOENT; 731 652 } 732 653 rc = measured_strings_reply(translation, 1); 733 fibril_ mutex_unlock(&arp_globals.lock);654 fibril_rwlock_read_unlock(&arp_globals.lock); 734 655 return rc; 735 656 … … 761 682 return rc; 762 683 763 fibril_ mutex_lock(&arp_globals.lock);684 fibril_rwlock_read_lock(&arp_globals.lock); 764 685 do { 765 686 next = pq_detach(packet); … … 771 692 packet = next; 772 693 } while (packet); 773 fibril_ mutex_unlock(&arp_globals.lock);694 fibril_rwlock_read_unlock(&arp_globals.lock); 774 695 775 696 return EOK; -
uspace/srv/net/il/arp/arp.h
rfe2333d r07b9203e 65 65 typedef struct arp_proto arp_proto_t; 66 66 67 /** Type definition of the ARP address translation record.68 * @see arp_trans69 */70 typedef struct arp_trans arp_trans_t;71 72 67 /** ARP address map. 73 68 * … … 75 70 * @see generic_char_map.h 76 71 */ 77 GENERIC_CHAR_MAP_DECLARE(arp_addr, arp_trans_t);72 GENERIC_CHAR_MAP_DECLARE(arp_addr, measured_string_t); 78 73 79 74 /** ARP address cache. … … 94 89 struct arp_device { 95 90 /** Actual device hardware address. */ 96 measured_string_t * addr;91 measured_string_t * addr; 97 92 /** Actual device hardware address data. */ 98 93 char *addr_data; 99 94 /** Broadcast device hardware address. */ 100 measured_string_t * broadcast_addr;95 measured_string_t * broadcast_addr; 101 96 /** Broadcast device hardware address data. */ 102 97 char *broadcast_data; … … 134 129 int net_phone; 135 130 /** Safety lock. */ 136 fibril_ mutex_t lock;131 fibril_rwlock_t lock; 137 132 }; 138 133 … … 149 144 }; 150 145 151 /** ARP address translation record. */152 struct arp_trans {153 /**154 * Hardware address for the translation. NULL denotes an incomplete155 * 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 162 146 #endif 163 147 164 148 /** @} 165 149 */ 166 -
uspace/srv/vfs/vfs.h
rfe2333d r07b9203e 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);175 174 176 175 extern int vfs_lookup_internal(char *, int, vfs_lookup_res_t *, -
uspace/srv/vfs/vfs_ops.c
rfe2333d r07b9203e 781 781 static void vfs_rdwr(ipc_callid_t rid, ipc_call_t *request, bool read) 782 782 { 783 vfs_info_t *vi;784 783 785 784 /* … … 808 807 fibril_mutex_lock(&file->lock); 809 808 810 vi = fs_handle_to_info(file->node->fs_handle);811 assert(vi);812 813 809 /* 814 810 * Lock the file's node so that no other client can read/write to it at 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)) 811 * the same time. 812 */ 813 if (read) 819 814 fibril_rwlock_read_lock(&file->node->contents_rwlock); 820 815 else … … 862 857 863 858 /* Unlock the VFS node. */ 864 if (read || (vi->concurrent_read_write && vi->write_retains_size))859 if (read) 865 860 fibril_rwlock_read_unlock(&file->node->contents_rwlock); 866 861 else { -
uspace/srv/vfs/vfs_register.c
rfe2333d r07b9203e 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 358 335 /** 359 336 * @}
Note:
See TracChangeset
for help on using the changeset viewer.