Changeset 903bac0a in mainline for uspace/srv/fs/locfs/locfs_ops.c
- Timestamp:
- 2011-08-19T09:00:38Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- e2ab36f1
- Parents:
- d894fbd (diff), 42a619b (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
rd894fbd r903bac0a 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_device_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 .device_get = locfs_device_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. */ … … 601 602 602 603 static int 603 devfs_write(devmap_handle_t devmap_handle, fs_index_t index, aoff64_t pos,604 locfs_write(service_id_t service_id, fs_index_t index, aoff64_t pos, 604 605 size_t *wbytes, aoff64_t *nsize) 605 606 { … … 607 608 return ENOTSUP; 608 609 609 devmap_handle_type_t type = devmap_handle_probe(index);610 611 if (type == DEV_HANDLE_NAMESPACE) {610 loc_object_type_t type = loc_id_probe(index); 611 612 if (type == LOC_OBJECT_NAMESPACE) { 612 613 /* Namespace directory */ 613 614 return ENOTSUP; 614 615 } 615 616 616 if (type == DEV_HANDLE_DEVICE) {617 if (type == LOC_OBJECT_SERVICE) { 617 618 /* Device node */ 618 619 unsigned long key[] = { 619 [ DEVICES_KEY_HANDLE] = (unsigned long) index620 [SERVICES_KEY_HANDLE] = (unsigned long) index 620 621 }; 621 622 622 fibril_mutex_lock(& devices_mutex);623 link_t *lnk = hash_table_find(& devices, key);623 fibril_mutex_lock(&services_mutex); 624 link_t *lnk = hash_table_find(&services, key); 624 625 if (lnk == NULL) { 625 fibril_mutex_unlock(& devices_mutex);626 fibril_mutex_unlock(&services_mutex); 626 627 return ENOENT; 627 628 } 628 629 629 device_t *dev = hash_table_get_instance(lnk, device_t, link);630 service_t *dev = hash_table_get_instance(lnk, service_t, link); 630 631 assert(dev->sess); 631 632 632 633 ipc_callid_t callid; 633 634 if (!async_data_write_receive(&callid, NULL)) { 634 fibril_mutex_unlock(& devices_mutex);635 fibril_mutex_unlock(&services_mutex); 635 636 async_answer_0(callid, EINVAL); 636 637 return EINVAL; … … 641 642 642 643 ipc_call_t answer; 643 aid_t msg = async_send_4(exch, VFS_OUT_WRITE, devmap_handle,644 aid_t msg = async_send_4(exch, VFS_OUT_WRITE, service_id, 644 645 index, LOWER32(pos), UPPER32(pos), &answer); 645 646 … … 649 650 async_exchange_end(exch); 650 651 651 fibril_mutex_unlock(& devices_mutex);652 fibril_mutex_unlock(&services_mutex); 652 653 653 654 /* Wait for reply from the driver. */ … … 664 665 665 666 static int 666 devfs_truncate(devmap_handle_t devmap_handle, fs_index_t index, aoff64_t size)667 locfs_truncate(service_id_t service_id, fs_index_t index, aoff64_t size) 667 668 { 668 669 return ENOTSUP; 669 670 } 670 671 671 static int devfs_close(devmap_handle_t devmap_handle, fs_index_t index)672 static int locfs_close(service_id_t service_id, fs_index_t index) 672 673 { 673 674 if (index == 0) 674 675 return EOK; 675 676 676 devmap_handle_type_t type = devmap_handle_probe(index);677 678 if (type == DEV_HANDLE_NAMESPACE) {677 loc_object_type_t type = loc_id_probe(index); 678 679 if (type == LOC_OBJECT_NAMESPACE) { 679 680 /* Namespace directory */ 680 681 return EOK; 681 682 } 682 683 683 if (type == DEV_HANDLE_DEVICE) {684 if (type == LOC_OBJECT_SERVICE) { 684 685 unsigned long key[] = { 685 [ DEVICES_KEY_HANDLE] = (unsigned long) index686 [SERVICES_KEY_HANDLE] = (unsigned long) index 686 687 }; 687 688 688 fibril_mutex_lock(& devices_mutex);689 link_t *lnk = hash_table_find(& devices, key);689 fibril_mutex_lock(&services_mutex); 690 link_t *lnk = hash_table_find(&services, key); 690 691 if (lnk == NULL) { 691 fibril_mutex_unlock(& devices_mutex);692 fibril_mutex_unlock(&services_mutex); 692 693 return ENOENT; 693 694 } 694 695 695 device_t *dev = hash_table_get_instance(lnk, device_t, link);696 service_t *dev = hash_table_get_instance(lnk, service_t, link); 696 697 assert(dev->sess); 697 698 dev->refcount--; … … 699 700 if (dev->refcount == 0) { 700 701 async_hangup(dev->sess); 701 hash_table_remove(& devices, key, DEVICES_KEYS);702 } 703 704 fibril_mutex_unlock(& devices_mutex);702 hash_table_remove(&services, key, SERVICES_KEYS); 703 } 704 705 fibril_mutex_unlock(&services_mutex); 705 706 706 707 return EOK; … … 710 711 } 711 712 712 static int devfs_sync(devmap_handle_t devmap_handle, fs_index_t index)713 static int locfs_sync(service_id_t service_id, fs_index_t index) 713 714 { 714 715 if (index == 0) 715 716 return EOK; 716 717 717 devmap_handle_type_t type = devmap_handle_probe(index);718 719 if (type == DEV_HANDLE_NAMESPACE) {718 loc_object_type_t type = loc_id_probe(index); 719 720 if (type == LOC_OBJECT_NAMESPACE) { 720 721 /* Namespace directory */ 721 722 return EOK; 722 723 } 723 724 724 if (type == DEV_HANDLE_DEVICE) {725 if (type == LOC_OBJECT_SERVICE) { 725 726 unsigned long key[] = { 726 [ DEVICES_KEY_HANDLE] = (unsigned long) index727 [SERVICES_KEY_HANDLE] = (unsigned long) index 727 728 }; 728 729 729 fibril_mutex_lock(& devices_mutex);730 link_t *lnk = hash_table_find(& devices, key);730 fibril_mutex_lock(&services_mutex); 731 link_t *lnk = hash_table_find(&services, key); 731 732 if (lnk == NULL) { 732 fibril_mutex_unlock(& devices_mutex);733 fibril_mutex_unlock(&services_mutex); 733 734 return ENOENT; 734 735 } 735 736 736 device_t *dev = hash_table_get_instance(lnk, device_t, link);737 service_t *dev = hash_table_get_instance(lnk, service_t, link); 737 738 assert(dev->sess); 738 739 … … 741 742 742 743 ipc_call_t answer; 743 aid_t msg = async_send_2(exch, VFS_OUT_SYNC, devmap_handle,744 aid_t msg = async_send_2(exch, VFS_OUT_SYNC, service_id, 744 745 index, &answer); 745 746 746 747 async_exchange_end(exch); 747 748 748 fibril_mutex_unlock(& devices_mutex);749 fibril_mutex_unlock(&services_mutex); 749 750 750 751 /* Wait for reply from the driver */ … … 758 759 } 759 760 760 static int devfs_destroy(devmap_handle_t devmap_handle, fs_index_t index)761 static int locfs_destroy(service_id_t service_id, fs_index_t index) 761 762 { 762 763 return ENOTSUP; 763 764 } 764 765 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,766 vfs_out_ops_t locfs_ops = { 767 .mounted = locfs_mounted, 768 .unmounted = locfs_unmounted, 769 .read = locfs_read, 770 .write = locfs_write, 771 .truncate = locfs_truncate, 772 .close = locfs_close, 773 .destroy = locfs_destroy, 774 .sync = locfs_sync, 774 775 }; 775 776
Note:
See TracChangeset
for help on using the changeset viewer.