Changeset 925a21e in mainline for uspace/srv/fs/locfs/locfs_ops.c
- Timestamp:
- 2011-09-24T14:20:29Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 5bf76c1
- Parents:
- 867e2555 (diff), 1ab4aca (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. - File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/locfs/locfs_ops.c
r867e2555 r925a21e 32 32 33 33 /** 34 * @file devfs_ops.c35 * @brief Implementation of VFS operations for the devfs file system server.34 * @file locfs_ops.c 35 * @brief Implementation of VFS operations for the locfs file system server. 36 36 */ 37 37 … … 44 44 #include <fibril_synch.h> 45 45 #include <adt/hash_table.h> 46 #include <ipc/ devmap.h>46 #include <ipc/loc.h> 47 47 #include <sys/stat.h> 48 48 #include <libfs.h> 49 49 #include <assert.h> 50 #include " devfs.h"51 #include " devfs_ops.h"50 #include "locfs.h" 51 #include "locfs_ops.h" 52 52 53 53 typedef struct { 54 devmap_handle_type_t type;55 devmap_handle_t handle;56 } devfs_node_t;57 58 /** Opened devices structure */54 loc_object_type_t type; 55 service_id_t service_id; 56 } locfs_node_t; 57 58 /** Opened services structure */ 59 59 typedef struct { 60 devmap_handle_t handle;60 service_id_t service_id; 61 61 async_sess_t *sess; /**< If NULL, the structure is incomplete. */ 62 62 size_t refcount; 63 63 link_t link; 64 64 fibril_condvar_t cv; /**< Broadcast when completed. */ 65 } device_t;66 67 /** Hash table of opened devices */68 static hash_table_t devices;65 } service_t; 66 67 /** Hash table of opened services */ 68 static hash_table_t services; 69 69 70 70 /** Hash table mutex */ 71 static FIBRIL_MUTEX_INITIALIZE( devices_mutex);72 73 #define DEVICES_KEYS 174 #define DEVICES_KEY_HANDLE 075 #define DEVICES_BUCKETS 25671 static FIBRIL_MUTEX_INITIALIZE(services_mutex); 72 73 #define SERVICES_KEYS 1 74 #define SERVICES_KEY_HANDLE 0 75 #define SERVICES_BUCKETS 256 76 76 77 77 /* Implementation of hash table interface for the nodes hash table. */ 78 static hash_index_t devices_hash(unsigned long key[])79 { 80 return key[ DEVICES_KEY_HANDLE] % DEVICES_BUCKETS;81 } 82 83 static int devices_compare(unsigned long key[], hash_count_t keys, link_t *item)84 { 85 device_t *dev = hash_table_get_instance(item, device_t, link);86 return (dev-> handle == (devmap_handle_t) key[DEVICES_KEY_HANDLE]);87 } 88 89 static void devices_remove_callback(link_t *item)90 { 91 free(hash_table_get_instance(item, device_t, link));92 } 93 94 static hash_table_operations_t devices_ops = {95 .hash = devices_hash,96 .compare = devices_compare,97 .remove_callback = devices_remove_callback78 static hash_index_t services_hash(unsigned long key[]) 79 { 80 return key[SERVICES_KEY_HANDLE] % SERVICES_BUCKETS; 81 } 82 83 static int services_compare(unsigned long key[], hash_count_t keys, link_t *item) 84 { 85 service_t *dev = hash_table_get_instance(item, service_t, link); 86 return (dev->service_id == (service_id_t) key[SERVICES_KEY_HANDLE]); 87 } 88 89 static void services_remove_callback(link_t *item) 90 { 91 free(hash_table_get_instance(item, service_t, link)); 92 } 93 94 static hash_table_operations_t services_ops = { 95 .hash = services_hash, 96 .compare = services_compare, 97 .remove_callback = services_remove_callback 98 98 }; 99 99 100 static int devfs_node_get_internal(fs_node_t **rfn, devmap_handle_type_t type,101 devmap_handle_t handle)102 { 103 devfs_node_t *node = (devfs_node_t *) malloc(sizeof(devfs_node_t));100 static int locfs_node_get_internal(fs_node_t **rfn, loc_object_type_t type, 101 service_id_t service_id) 102 { 103 locfs_node_t *node = (locfs_node_t *) malloc(sizeof(locfs_node_t)); 104 104 if (node == NULL) { 105 105 *rfn = NULL; … … 116 116 fs_node_initialize(*rfn); 117 117 node->type = type; 118 node-> handle = handle;118 node->service_id = service_id; 119 119 120 120 (*rfn)->data = node; … … 122 122 } 123 123 124 static int devfs_root_get(fs_node_t **rfn, devmap_handle_t devmap_handle)125 { 126 return devfs_node_get_internal(rfn, DEV_HANDLE_NONE, 0);127 } 128 129 static int devfs_match(fs_node_t **rfn, fs_node_t *pfn, const char *component)130 { 131 devfs_node_t *node = (devfs_node_t *) pfn->data;124 static int locfs_root_get(fs_node_t **rfn, service_id_t service_id) 125 { 126 return locfs_node_get_internal(rfn, LOC_OBJECT_NONE, 0); 127 } 128 129 static int locfs_match(fs_node_t **rfn, fs_node_t *pfn, const char *component) 130 { 131 locfs_node_t *node = (locfs_node_t *) pfn->data; 132 132 int ret; 133 133 134 if (node-> handle== 0) {134 if (node->service_id == 0) { 135 135 /* Root directory */ 136 136 137 dev_desc_t *devs;138 size_t count = devmap_get_namespaces(&devs);137 loc_sdesc_t *nspaces; 138 size_t count = loc_get_namespaces(&nspaces); 139 139 140 140 if (count > 0) { … … 142 142 for (pos = 0; pos < count; pos++) { 143 143 /* Ignore root namespace */ 144 if (str_cmp( devs[pos].name, "") == 0)144 if (str_cmp(nspaces[pos].name, "") == 0) 145 145 continue; 146 146 147 if (str_cmp( devs[pos].name, component) == 0) {148 ret = devfs_node_get_internal(rfn, DEV_HANDLE_NAMESPACE, devs[pos].handle);149 free( devs);147 if (str_cmp(nspaces[pos].name, component) == 0) { 148 ret = locfs_node_get_internal(rfn, LOC_OBJECT_NAMESPACE, nspaces[pos].id); 149 free(nspaces); 150 150 return ret; 151 151 } 152 152 } 153 153 154 free( devs);154 free(nspaces); 155 155 } 156 156 157 157 /* Search root namespace */ 158 devmap_handle_t namespace; 159 if (devmap_namespace_get_handle("", &namespace, 0) == EOK) { 160 count = devmap_get_devices(namespace, &devs); 158 service_id_t namespace; 159 loc_sdesc_t *svcs; 160 if (loc_namespace_get_id("", &namespace, 0) == EOK) { 161 count = loc_get_services(namespace, &svcs); 161 162 162 163 if (count > 0) { 163 164 size_t pos; 164 165 for (pos = 0; pos < count; pos++) { 165 if (str_cmp( devs[pos].name, component) == 0) {166 ret = devfs_node_get_internal(rfn, DEV_HANDLE_DEVICE, devs[pos].handle);167 free( devs);166 if (str_cmp(svcs[pos].name, component) == 0) { 167 ret = locfs_node_get_internal(rfn, LOC_OBJECT_SERVICE, svcs[pos].id); 168 free(svcs); 168 169 return ret; 169 170 } 170 171 } 171 172 172 free( devs);173 free(svcs); 173 174 } 174 175 } … … 178 179 } 179 180 180 if (node->type == DEV_HANDLE_NAMESPACE) {181 if (node->type == LOC_OBJECT_NAMESPACE) { 181 182 /* Namespace directory */ 182 183 183 dev_desc_t *devs;184 size_t count = devmap_get_devices(node->handle, &devs);184 loc_sdesc_t *svcs; 185 size_t count = loc_get_services(node->service_id, &svcs); 185 186 if (count > 0) { 186 187 size_t pos; 187 188 for (pos = 0; pos < count; pos++) { 188 if (str_cmp( devs[pos].name, component) == 0) {189 ret = devfs_node_get_internal(rfn, DEV_HANDLE_DEVICE, devs[pos].handle);190 free( devs);189 if (str_cmp(svcs[pos].name, component) == 0) { 190 ret = locfs_node_get_internal(rfn, LOC_OBJECT_SERVICE, svcs[pos].id); 191 free(svcs); 191 192 return ret; 192 193 } 193 194 } 194 195 195 free( devs);196 free(svcs); 196 197 } 197 198 … … 204 205 } 205 206 206 static int devfs_node_get(fs_node_t **rfn, devmap_handle_t devmap_handle, fs_index_t index)207 { 208 return devfs_node_get_internal(rfn, devmap_handle_probe(index), index);209 } 210 211 static int devfs_node_open(fs_node_t *fn)212 { 213 devfs_node_t *node = (devfs_node_t *) fn->data;214 215 if (node-> handle== 0) {207 static int locfs_node_get(fs_node_t **rfn, service_id_t service_id, fs_index_t index) 208 { 209 return locfs_node_get_internal(rfn, loc_id_probe(index), index); 210 } 211 212 static int locfs_node_open(fs_node_t *fn) 213 { 214 locfs_node_t *node = (locfs_node_t *) fn->data; 215 216 if (node->service_id == 0) { 216 217 /* Root directory */ 217 218 return EOK; 218 219 } 219 220 220 devmap_handle_type_t type = devmap_handle_probe(node->handle);221 222 if (type == DEV_HANDLE_NAMESPACE) {221 loc_object_type_t type = loc_id_probe(node->service_id); 222 223 if (type == LOC_OBJECT_NAMESPACE) { 223 224 /* Namespace directory */ 224 225 return EOK; 225 226 } 226 227 227 if (type == DEV_HANDLE_DEVICE) {228 if (type == LOC_OBJECT_SERVICE) { 228 229 /* Device node */ 229 230 230 231 unsigned long key[] = { 231 [ DEVICES_KEY_HANDLE] = (unsigned long) node->handle232 [SERVICES_KEY_HANDLE] = (unsigned long) node->service_id 232 233 }; 233 234 link_t *lnk; 234 235 235 fibril_mutex_lock(& devices_mutex);236 fibril_mutex_lock(&services_mutex); 236 237 restart: 237 lnk = hash_table_find(& devices, key);238 lnk = hash_table_find(&services, key); 238 239 if (lnk == NULL) { 239 device_t *dev = (device_t *) malloc(sizeof(device_t));240 service_t *dev = (service_t *) malloc(sizeof(service_t)); 240 241 if (dev == NULL) { 241 fibril_mutex_unlock(& devices_mutex);242 fibril_mutex_unlock(&services_mutex); 242 243 return ENOMEM; 243 244 } 244 245 245 dev-> handle = node->handle;246 dev->service_id = node->service_id; 246 247 247 248 /* Mark as incomplete */ … … 255 256 * below. 256 257 */ 257 hash_table_insert(& devices, key, &dev->link);258 hash_table_insert(&services, key, &dev->link); 258 259 259 260 /* 260 * Drop the mutex to allow recursive devfs requests.261 * Drop the mutex to allow recursive locfs requests. 261 262 */ 262 fibril_mutex_unlock(& devices_mutex);263 264 async_sess_t *sess = devmap_device_connect(EXCHANGE_SERIALIZE,265 node->handle, 0);266 267 fibril_mutex_lock(& devices_mutex);263 fibril_mutex_unlock(&services_mutex); 264 265 async_sess_t *sess = loc_service_connect( 266 EXCHANGE_SERIALIZE, node->service_id, 0); 267 268 fibril_mutex_lock(&services_mutex); 268 269 269 270 /* … … 278 279 * entry and free the device structure. 279 280 */ 280 hash_table_remove(& devices, key, DEVICES_KEYS);281 fibril_mutex_unlock(& devices_mutex);281 hash_table_remove(&services, key, SERVICES_KEYS); 282 fibril_mutex_unlock(&services_mutex); 282 283 283 284 return ENOENT; … … 287 288 dev->sess = sess; 288 289 } else { 289 device_t *dev = hash_table_get_instance(lnk, device_t, link);290 service_t *dev = hash_table_get_instance(lnk, service_t, link); 290 291 291 292 if (!dev->sess) { … … 297 298 * fibril_condvar_wait(). 298 299 */ 299 fibril_condvar_wait(&dev->cv, & devices_mutex);300 fibril_condvar_wait(&dev->cv, &services_mutex); 300 301 goto restart; 301 302 } … … 304 305 } 305 306 306 fibril_mutex_unlock(& devices_mutex);307 fibril_mutex_unlock(&services_mutex); 307 308 308 309 return EOK; … … 312 313 } 313 314 314 static int devfs_node_put(fs_node_t *fn)315 static int locfs_node_put(fs_node_t *fn) 315 316 { 316 317 free(fn->data); … … 319 320 } 320 321 321 static int devfs_create_node(fs_node_t **rfn, devmap_handle_t devmap_handle, int lflag)322 static int locfs_create_node(fs_node_t **rfn, service_id_t service_id, int lflag) 322 323 { 323 324 assert((lflag & L_FILE) ^ (lflag & L_DIRECTORY)); … … 327 328 } 328 329 329 static int devfs_destroy_node(fs_node_t *fn)330 static int locfs_destroy_node(fs_node_t *fn) 330 331 { 331 332 return ENOTSUP; 332 333 } 333 334 334 static int devfs_link_node(fs_node_t *pfn, fs_node_t *cfn, const char *nm)335 static int locfs_link_node(fs_node_t *pfn, fs_node_t *cfn, const char *nm) 335 336 { 336 337 return ENOTSUP; 337 338 } 338 339 339 static int devfs_unlink_node(fs_node_t *pfn, fs_node_t *cfn, const char *nm)340 static int locfs_unlink_node(fs_node_t *pfn, fs_node_t *cfn, const char *nm) 340 341 { 341 342 return ENOTSUP; 342 343 } 343 344 344 static int devfs_has_children(bool *has_children, fs_node_t *fn)345 { 346 devfs_node_t *node = (devfs_node_t *) fn->data;347 348 if (node-> handle== 0) {349 size_t count = devmap_count_namespaces();345 static int locfs_has_children(bool *has_children, fs_node_t *fn) 346 { 347 locfs_node_t *node = (locfs_node_t *) fn->data; 348 349 if (node->service_id == 0) { 350 size_t count = loc_count_namespaces(); 350 351 if (count > 0) { 351 352 *has_children = true; … … 354 355 355 356 /* Root namespace */ 356 devmap_handle_t namespace;357 if ( devmap_namespace_get_handle("", &namespace, 0) == EOK) {358 count = devmap_count_devices(namespace);357 service_id_t namespace; 358 if (loc_namespace_get_id("", &namespace, 0) == EOK) { 359 count = loc_count_services(namespace); 359 360 if (count > 0) { 360 361 *has_children = true; … … 367 368 } 368 369 369 if (node->type == DEV_HANDLE_NAMESPACE) {370 size_t count = devmap_count_devices(node->handle);370 if (node->type == LOC_OBJECT_NAMESPACE) { 371 size_t count = loc_count_services(node->service_id); 371 372 if (count > 0) { 372 373 *has_children = true; … … 382 383 } 383 384 384 static fs_index_t devfs_index_get(fs_node_t *fn)385 { 386 devfs_node_t *node = (devfs_node_t *) fn->data;387 return node-> handle;388 } 389 390 static aoff64_t devfs_size_get(fs_node_t *fn)385 static fs_index_t locfs_index_get(fs_node_t *fn) 386 { 387 locfs_node_t *node = (locfs_node_t *) fn->data; 388 return node->service_id; 389 } 390 391 static aoff64_t locfs_size_get(fs_node_t *fn) 391 392 { 392 393 return 0; 393 394 } 394 395 395 static unsigned int devfs_lnkcnt_get(fs_node_t *fn)396 { 397 devfs_node_t *node = (devfs_node_t *) fn->data;398 399 if (node-> handle== 0)396 static unsigned int locfs_lnkcnt_get(fs_node_t *fn) 397 { 398 locfs_node_t *node = (locfs_node_t *) fn->data; 399 400 if (node->service_id == 0) 400 401 return 0; 401 402 … … 403 404 } 404 405 405 static bool devfs_is_directory(fs_node_t *fn)406 { 407 devfs_node_t *node = (devfs_node_t *) fn->data;408 409 return ((node->type == DEV_HANDLE_NONE) || (node->type == DEV_HANDLE_NAMESPACE));410 } 411 412 static bool devfs_is_file(fs_node_t *fn)413 { 414 devfs_node_t *node = (devfs_node_t *) fn->data;415 416 return (node->type == DEV_HANDLE_DEVICE);417 } 418 419 static devmap_handle_t devfs_device_get(fs_node_t *fn)420 { 421 devfs_node_t *node = (devfs_node_t *) fn->data;422 423 if (node->type == DEV_HANDLE_DEVICE)424 return node-> handle;406 static bool locfs_is_directory(fs_node_t *fn) 407 { 408 locfs_node_t *node = (locfs_node_t *) fn->data; 409 410 return ((node->type == LOC_OBJECT_NONE) || (node->type == LOC_OBJECT_NAMESPACE)); 411 } 412 413 static bool locfs_is_file(fs_node_t *fn) 414 { 415 locfs_node_t *node = (locfs_node_t *) fn->data; 416 417 return (node->type == LOC_OBJECT_SERVICE); 418 } 419 420 static service_id_t locfs_service_get(fs_node_t *fn) 421 { 422 locfs_node_t *node = (locfs_node_t *) fn->data; 423 424 if (node->type == LOC_OBJECT_SERVICE) 425 return node->service_id; 425 426 426 427 return 0; … … 428 429 429 430 /** libfs operations */ 430 libfs_ops_t devfs_libfs_ops = {431 .root_get = devfs_root_get,432 .match = devfs_match,433 .node_get = devfs_node_get,434 .node_open = devfs_node_open,435 .node_put = devfs_node_put,436 .create = devfs_create_node,437 .destroy = devfs_destroy_node,438 .link = devfs_link_node,439 .unlink = devfs_unlink_node,440 .has_children = devfs_has_children,441 .index_get = devfs_index_get,442 .size_get = devfs_size_get,443 .lnkcnt_get = devfs_lnkcnt_get,444 .is_directory = devfs_is_directory,445 .is_file = devfs_is_file,446 . device_get = devfs_device_get431 libfs_ops_t locfs_libfs_ops = { 432 .root_get = locfs_root_get, 433 .match = locfs_match, 434 .node_get = locfs_node_get, 435 .node_open = locfs_node_open, 436 .node_put = locfs_node_put, 437 .create = locfs_create_node, 438 .destroy = locfs_destroy_node, 439 .link = locfs_link_node, 440 .unlink = locfs_unlink_node, 441 .has_children = locfs_has_children, 442 .index_get = locfs_index_get, 443 .size_get = locfs_size_get, 444 .lnkcnt_get = locfs_lnkcnt_get, 445 .is_directory = locfs_is_directory, 446 .is_file = locfs_is_file, 447 .service_get = locfs_service_get 447 448 }; 448 449 449 bool devfs_init(void)450 { 451 if (!hash_table_create(& devices, DEVICES_BUCKETS,452 DEVICES_KEYS, &devices_ops))450 bool locfs_init(void) 451 { 452 if (!hash_table_create(&services, SERVICES_BUCKETS, 453 SERVICES_KEYS, &services_ops)) 453 454 return false; 454 455 … … 456 457 } 457 458 458 static int devfs_mounted(devmap_handle_t devmap_handle, const char *opts,459 static int locfs_mounted(service_id_t service_id, const char *opts, 459 460 fs_index_t *index, aoff64_t *size, unsigned *lnkcnt) 460 461 { … … 465 466 } 466 467 467 static int devfs_unmounted(devmap_handle_t devmap_handle)468 static int locfs_unmounted(service_id_t service_id) 468 469 { 469 470 return ENOTSUP; … … 471 472 472 473 static int 473 devfs_read(devmap_handle_t devmap_handle, fs_index_t index, aoff64_t pos,474 locfs_read(service_id_t service_id, fs_index_t index, aoff64_t pos, 474 475 size_t *rbytes) 475 476 { … … 482 483 } 483 484 484 dev_desc_t *desc;485 size_t count = devmap_get_namespaces(&desc);485 loc_sdesc_t *desc; 486 size_t count = loc_get_namespaces(&desc); 486 487 487 488 /* Get rid of root namespace */ … … 507 508 508 509 /* Search root namespace */ 509 devmap_handle_t namespace;510 if ( devmap_namespace_get_handle("", &namespace, 0) == EOK) {511 count = devmap_get_devices(namespace, &desc);510 service_id_t namespace; 511 if (loc_namespace_get_id("", &namespace, 0) == EOK) { 512 count = loc_get_services(namespace, &desc); 512 513 513 514 if (pos < count) { … … 525 526 } 526 527 527 devmap_handle_type_t type = devmap_handle_probe(index);528 529 if (type == DEV_HANDLE_NAMESPACE) {528 loc_object_type_t type = loc_id_probe(index); 529 530 if (type == LOC_OBJECT_NAMESPACE) { 530 531 /* Namespace directory */ 531 532 ipc_callid_t callid; … … 536 537 } 537 538 538 dev_desc_t *desc;539 size_t count = devmap_get_devices(index, &desc);539 loc_sdesc_t *desc; 540 size_t count = loc_get_services(index, &desc); 540 541 541 542 if (pos < count) { … … 551 552 } 552 553 553 if (type == DEV_HANDLE_DEVICE) {554 if (type == LOC_OBJECT_SERVICE) { 554 555 /* Device node */ 555 556 556 557 unsigned long key[] = { 557 [ DEVICES_KEY_HANDLE] = (unsigned long) index558 [SERVICES_KEY_HANDLE] = (unsigned long) index 558 559 }; 559 560 560 fibril_mutex_lock(& devices_mutex);561 link_t *lnk = hash_table_find(& devices, key);561 fibril_mutex_lock(&services_mutex); 562 link_t *lnk = hash_table_find(&services, key); 562 563 if (lnk == NULL) { 563 fibril_mutex_unlock(& devices_mutex);564 fibril_mutex_unlock(&services_mutex); 564 565 return ENOENT; 565 566 } 566 567 567 device_t *dev = hash_table_get_instance(lnk, device_t, link);568 service_t *dev = hash_table_get_instance(lnk, service_t, link); 568 569 assert(dev->sess); 569 570 570 571 ipc_callid_t callid; 571 572 if (!async_data_read_receive(&callid, NULL)) { 572 fibril_mutex_unlock(& devices_mutex);573 fibril_mutex_unlock(&services_mutex); 573 574 async_answer_0(callid, EINVAL); 574 575 return EINVAL; … … 579 580 580 581 ipc_call_t answer; 581 aid_t msg = async_send_4(exch, VFS_OUT_READ, devmap_handle,582 aid_t msg = async_send_4(exch, VFS_OUT_READ, service_id, 582 583 index, LOWER32(pos), UPPER32(pos), &answer); 583 584 … … 587 588 async_exchange_end(exch); 588 589 589 fibril_mutex_unlock(& devices_mutex);590 fibril_mutex_unlock(&services_mutex); 590 591 591 592 /* Wait for reply from the driver. */ 592 593 sysarg_t rc; 593 594 async_wait_for(msg, &rc); 595 596 /* Do not propagate EHANGUP back to VFS. */ 597 if ((int) rc == EHANGUP) 598 rc = ENOTSUP; 594 599 595 600 *rbytes = IPC_GET_ARG1(answer); … … 601 606 602 607 static int 603 devfs_write(devmap_handle_t devmap_handle, fs_index_t index, aoff64_t pos,608 locfs_write(service_id_t service_id, fs_index_t index, aoff64_t pos, 604 609 size_t *wbytes, aoff64_t *nsize) 605 610 { … … 607 612 return ENOTSUP; 608 613 609 devmap_handle_type_t type = devmap_handle_probe(index);610 611 if (type == DEV_HANDLE_NAMESPACE) {614 loc_object_type_t type = loc_id_probe(index); 615 616 if (type == LOC_OBJECT_NAMESPACE) { 612 617 /* Namespace directory */ 613 618 return ENOTSUP; 614 619 } 615 620 616 if (type == DEV_HANDLE_DEVICE) {621 if (type == LOC_OBJECT_SERVICE) { 617 622 /* Device node */ 618 623 unsigned long key[] = { 619 [ DEVICES_KEY_HANDLE] = (unsigned long) index624 [SERVICES_KEY_HANDLE] = (unsigned long) index 620 625 }; 621 626 622 fibril_mutex_lock(& devices_mutex);623 link_t *lnk = hash_table_find(& devices, key);627 fibril_mutex_lock(&services_mutex); 628 link_t *lnk = hash_table_find(&services, key); 624 629 if (lnk == NULL) { 625 fibril_mutex_unlock(& devices_mutex);630 fibril_mutex_unlock(&services_mutex); 626 631 return ENOENT; 627 632 } 628 633 629 device_t *dev = hash_table_get_instance(lnk, device_t, link);634 service_t *dev = hash_table_get_instance(lnk, service_t, link); 630 635 assert(dev->sess); 631 636 632 637 ipc_callid_t callid; 633 638 if (!async_data_write_receive(&callid, NULL)) { 634 fibril_mutex_unlock(& devices_mutex);639 fibril_mutex_unlock(&services_mutex); 635 640 async_answer_0(callid, EINVAL); 636 641 return EINVAL; … … 641 646 642 647 ipc_call_t answer; 643 aid_t msg = async_send_4(exch, VFS_OUT_WRITE, devmap_handle,648 aid_t msg = async_send_4(exch, VFS_OUT_WRITE, service_id, 644 649 index, LOWER32(pos), UPPER32(pos), &answer); 645 650 … … 649 654 async_exchange_end(exch); 650 655 651 fibril_mutex_unlock(& devices_mutex);656 fibril_mutex_unlock(&services_mutex); 652 657 653 658 /* Wait for reply from the driver. */ 654 659 sysarg_t rc; 655 660 async_wait_for(msg, &rc); 661 662 /* Do not propagate EHANGUP back to VFS. */ 663 if ((int) rc == EHANGUP) 664 rc = ENOTSUP; 656 665 657 666 *wbytes = IPC_GET_ARG1(answer); … … 664 673 665 674 static int 666 devfs_truncate(devmap_handle_t devmap_handle, fs_index_t index, aoff64_t size)675 locfs_truncate(service_id_t service_id, fs_index_t index, aoff64_t size) 667 676 { 668 677 return ENOTSUP; 669 678 } 670 679 671 static int devfs_close(devmap_handle_t devmap_handle, fs_index_t index)680 static int locfs_close(service_id_t service_id, fs_index_t index) 672 681 { 673 682 if (index == 0) 674 683 return EOK; 675 684 676 devmap_handle_type_t type = devmap_handle_probe(index);677 678 if (type == DEV_HANDLE_NAMESPACE) {685 loc_object_type_t type = loc_id_probe(index); 686 687 if (type == LOC_OBJECT_NAMESPACE) { 679 688 /* Namespace directory */ 680 689 return EOK; 681 690 } 682 691 683 if (type == DEV_HANDLE_DEVICE) {692 if (type == LOC_OBJECT_SERVICE) { 684 693 unsigned long key[] = { 685 [ DEVICES_KEY_HANDLE] = (unsigned long) index694 [SERVICES_KEY_HANDLE] = (unsigned long) index 686 695 }; 687 696 688 fibril_mutex_lock(& devices_mutex);689 link_t *lnk = hash_table_find(& devices, key);697 fibril_mutex_lock(&services_mutex); 698 link_t *lnk = hash_table_find(&services, key); 690 699 if (lnk == NULL) { 691 fibril_mutex_unlock(& devices_mutex);700 fibril_mutex_unlock(&services_mutex); 692 701 return ENOENT; 693 702 } 694 703 695 device_t *dev = hash_table_get_instance(lnk, device_t, link);704 service_t *dev = hash_table_get_instance(lnk, service_t, link); 696 705 assert(dev->sess); 697 706 dev->refcount--; … … 699 708 if (dev->refcount == 0) { 700 709 async_hangup(dev->sess); 701 hash_table_remove(& devices, key, DEVICES_KEYS);702 } 703 704 fibril_mutex_unlock(& devices_mutex);710 hash_table_remove(&services, key, SERVICES_KEYS); 711 } 712 713 fibril_mutex_unlock(&services_mutex); 705 714 706 715 return EOK; … … 710 719 } 711 720 712 static int devfs_sync(devmap_handle_t devmap_handle, fs_index_t index)721 static int locfs_sync(service_id_t service_id, fs_index_t index) 713 722 { 714 723 if (index == 0) 715 724 return EOK; 716 725 717 devmap_handle_type_t type = devmap_handle_probe(index);718 719 if (type == DEV_HANDLE_NAMESPACE) {726 loc_object_type_t type = loc_id_probe(index); 727 728 if (type == LOC_OBJECT_NAMESPACE) { 720 729 /* Namespace directory */ 721 730 return EOK; 722 731 } 723 732 724 if (type == DEV_HANDLE_DEVICE) {733 if (type == LOC_OBJECT_SERVICE) { 725 734 unsigned long key[] = { 726 [ DEVICES_KEY_HANDLE] = (unsigned long) index735 [SERVICES_KEY_HANDLE] = (unsigned long) index 727 736 }; 728 737 729 fibril_mutex_lock(& devices_mutex);730 link_t *lnk = hash_table_find(& devices, key);738 fibril_mutex_lock(&services_mutex); 739 link_t *lnk = hash_table_find(&services, key); 731 740 if (lnk == NULL) { 732 fibril_mutex_unlock(& devices_mutex);741 fibril_mutex_unlock(&services_mutex); 733 742 return ENOENT; 734 743 } 735 744 736 device_t *dev = hash_table_get_instance(lnk, device_t, link);745 service_t *dev = hash_table_get_instance(lnk, service_t, link); 737 746 assert(dev->sess); 738 747 … … 741 750 742 751 ipc_call_t answer; 743 aid_t msg = async_send_2(exch, VFS_OUT_SYNC, devmap_handle,752 aid_t msg = async_send_2(exch, VFS_OUT_SYNC, service_id, 744 753 index, &answer); 745 754 746 755 async_exchange_end(exch); 747 756 748 fibril_mutex_unlock(& devices_mutex);757 fibril_mutex_unlock(&services_mutex); 749 758 750 759 /* Wait for reply from the driver */ … … 758 767 } 759 768 760 static int devfs_destroy(devmap_handle_t devmap_handle, fs_index_t index)769 static int locfs_destroy(service_id_t service_id, fs_index_t index) 761 770 { 762 771 return ENOTSUP; 763 772 } 764 773 765 vfs_out_ops_t devfs_ops = {766 .mounted = devfs_mounted,767 .unmounted = devfs_unmounted,768 .read = devfs_read,769 .write = devfs_write,770 .truncate = devfs_truncate,771 .close = devfs_close,772 .destroy = devfs_destroy,773 .sync = devfs_sync,774 vfs_out_ops_t locfs_ops = { 775 .mounted = locfs_mounted, 776 .unmounted = locfs_unmounted, 777 .read = locfs_read, 778 .write = locfs_write, 779 .truncate = locfs_truncate, 780 .close = locfs_close, 781 .destroy = locfs_destroy, 782 .sync = locfs_sync, 774 783 }; 775 784
Note:
See TracChangeset
for help on using the changeset viewer.