Changeset 15f3c3f in mainline for uspace/srv/fs/fat/fat_ops.c
- Timestamp:
- 2011-06-22T22:00:52Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 86ffa27f
- Parents:
- ef09a7a
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/fat/fat_ops.c
ref09a7a r15f3c3f 43 43 #include <libblock.h> 44 44 #include <ipc/services.h> 45 #include <ipc/ devmap.h>45 #include <ipc/loc.h> 46 46 #include <macros.h> 47 47 #include <async.h> … … 72 72 * Forward declarations of FAT libfs operations. 73 73 */ 74 static int fat_root_get(fs_node_t **, devmap_handle_t);74 static int fat_root_get(fs_node_t **, service_id_t); 75 75 static int fat_match(fs_node_t **, fs_node_t *, const char *); 76 static int fat_node_get(fs_node_t **, devmap_handle_t, fs_index_t);76 static int fat_node_get(fs_node_t **, service_id_t, fs_index_t); 77 77 static int fat_node_open(fs_node_t *); 78 78 static int fat_node_put(fs_node_t *); 79 static int fat_create_node(fs_node_t **, devmap_handle_t, int);79 static int fat_create_node(fs_node_t **, service_id_t, int); 80 80 static int fat_destroy_node(fs_node_t *); 81 81 static int fat_link(fs_node_t *, fs_node_t *, const char *); … … 88 88 static bool fat_is_directory(fs_node_t *); 89 89 static bool fat_is_file(fs_node_t *node); 90 static devmap_handle_t fat_device_get(fs_node_t *node);90 static service_id_t fat_device_get(fs_node_t *node); 91 91 92 92 /* … … 120 120 assert(node->dirty); 121 121 122 bs = block_bb_get(node->idx-> devmap_handle);122 bs = block_bb_get(node->idx->service_id); 123 123 124 124 /* Read the block that contains the dentry of interest. */ 125 rc = _fat_block_get(&b, bs, node->idx-> devmap_handle, node->idx->pfc,125 rc = _fat_block_get(&b, bs, node->idx->service_id, node->idx->pfc, 126 126 NULL, (node->idx->pdi * sizeof(fat_dentry_t)) / BPS(bs), 127 127 BLOCK_FLAGS_NONE); … … 145 145 } 146 146 147 static int fat_node_fini_by_ devmap_handle(devmap_handle_t devmap_handle)147 static int fat_node_fini_by_service_id(service_id_t service_id) 148 148 { 149 149 fat_node_t *nodep; … … 169 169 goto restart; 170 170 } 171 if (nodep->idx-> devmap_handle != devmap_handle) {171 if (nodep->idx->service_id != service_id) { 172 172 fibril_mutex_unlock(&nodep->idx->lock); 173 173 fibril_mutex_unlock(&nodep->lock); … … 299 299 return rc; 300 300 301 bs = block_bb_get(idxp-> devmap_handle);301 bs = block_bb_get(idxp->service_id); 302 302 303 303 /* Read the block that contains the dentry of interest. */ 304 rc = _fat_block_get(&b, bs, idxp-> devmap_handle, idxp->pfc, NULL,304 rc = _fat_block_get(&b, bs, idxp->service_id, idxp->pfc, NULL, 305 305 (idxp->pdi * sizeof(fat_dentry_t)) / BPS(bs), BLOCK_FLAGS_NONE); 306 306 if (rc != EOK) { … … 323 323 */ 324 324 uint16_t clusters; 325 rc = fat_clusters_get(&clusters, bs, idxp-> devmap_handle,325 rc = fat_clusters_get(&clusters, bs, idxp->service_id, 326 326 uint16_t_le2host(d->firstc)); 327 327 if (rc != EOK) { … … 357 357 */ 358 358 359 int fat_root_get(fs_node_t **rfn, devmap_handle_t devmap_handle)360 { 361 return fat_node_get(rfn, devmap_handle, 0);359 int fat_root_get(fs_node_t **rfn, service_id_t service_id) 360 { 361 return fat_node_get(rfn, service_id, 0); 362 362 } 363 363 … … 370 370 unsigned blocks; 371 371 fat_dentry_t *d; 372 devmap_handle_t devmap_handle;372 service_id_t service_id; 373 373 block_t *b; 374 374 int rc; 375 375 376 376 fibril_mutex_lock(&parentp->idx->lock); 377 devmap_handle = parentp->idx->devmap_handle;377 service_id = parentp->idx->service_id; 378 378 fibril_mutex_unlock(&parentp->idx->lock); 379 379 380 bs = block_bb_get( devmap_handle);380 bs = block_bb_get(service_id); 381 381 blocks = parentp->size / BPS(bs); 382 382 for (i = 0; i < blocks; i++) { … … 403 403 /* hit */ 404 404 fat_node_t *nodep; 405 fat_idx_t *idx = fat_idx_get_by_pos( devmap_handle,405 fat_idx_t *idx = fat_idx_get_by_pos(service_id, 406 406 parentp->firstc, i * DPS(bs) + j); 407 407 if (!idx) { … … 436 436 437 437 /** Instantiate a FAT in-core node. */ 438 int fat_node_get(fs_node_t **rfn, devmap_handle_t devmap_handle, fs_index_t index)438 int fat_node_get(fs_node_t **rfn, service_id_t service_id, fs_index_t index) 439 439 { 440 440 fat_node_t *nodep; … … 442 442 int rc; 443 443 444 idxp = fat_idx_get_by_index( devmap_handle, index);444 idxp = fat_idx_get_by_index(service_id, index); 445 445 if (!idxp) { 446 446 *rfn = NULL; … … 493 493 } 494 494 495 int fat_create_node(fs_node_t **rfn, devmap_handle_t devmap_handle, int flags)495 int fat_create_node(fs_node_t **rfn, service_id_t service_id, int flags) 496 496 { 497 497 fat_idx_t *idxp; … … 501 501 int rc; 502 502 503 bs = block_bb_get( devmap_handle);503 bs = block_bb_get(service_id); 504 504 if (flags & L_DIRECTORY) { 505 505 /* allocate a cluster */ 506 rc = fat_alloc_clusters(bs, devmap_handle, 1, &mcl, &lcl);506 rc = fat_alloc_clusters(bs, service_id, 1, &mcl, &lcl); 507 507 if (rc != EOK) 508 508 return rc; 509 509 /* populate the new cluster with unused dentries */ 510 rc = fat_zero_cluster(bs, devmap_handle, mcl);510 rc = fat_zero_cluster(bs, service_id, mcl); 511 511 if (rc != EOK) { 512 (void) fat_free_clusters(bs, devmap_handle, mcl);512 (void) fat_free_clusters(bs, service_id, mcl); 513 513 return rc; 514 514 } … … 517 517 rc = fat_node_get_new(&nodep); 518 518 if (rc != EOK) { 519 (void) fat_free_clusters(bs, devmap_handle, mcl);519 (void) fat_free_clusters(bs, service_id, mcl); 520 520 return rc; 521 521 } 522 rc = fat_idx_get_new(&idxp, devmap_handle);523 if (rc != EOK) { 524 (void) fat_free_clusters(bs, devmap_handle, mcl);522 rc = fat_idx_get_new(&idxp, service_id); 523 if (rc != EOK) { 524 (void) fat_free_clusters(bs, service_id, mcl); 525 525 (void) fat_node_put(FS_NODE(nodep)); 526 526 return rc; … … 571 571 assert(!has_children); 572 572 573 bs = block_bb_get(nodep->idx-> devmap_handle);573 bs = block_bb_get(nodep->idx->service_id); 574 574 if (nodep->firstc != FAT_CLST_RES0) { 575 575 assert(nodep->size); 576 576 /* Free all clusters allocated to the node. */ 577 rc = fat_free_clusters(bs, nodep->idx-> devmap_handle,577 rc = fat_free_clusters(bs, nodep->idx->service_id, 578 578 nodep->firstc); 579 579 } … … 621 621 622 622 fibril_mutex_lock(&parentp->idx->lock); 623 bs = block_bb_get(parentp->idx-> devmap_handle);623 bs = block_bb_get(parentp->idx->service_id); 624 624 625 625 blocks = parentp->size / BPS(bs); … … 660 660 return ENOSPC; 661 661 } 662 rc = fat_alloc_clusters(bs, parentp->idx-> devmap_handle, 1, &mcl, &lcl);662 rc = fat_alloc_clusters(bs, parentp->idx->service_id, 1, &mcl, &lcl); 663 663 if (rc != EOK) { 664 664 fibril_mutex_unlock(&parentp->idx->lock); 665 665 return rc; 666 666 } 667 rc = fat_zero_cluster(bs, parentp->idx-> devmap_handle, mcl);668 if (rc != EOK) { 669 (void) fat_free_clusters(bs, parentp->idx-> devmap_handle, mcl);667 rc = fat_zero_cluster(bs, parentp->idx->service_id, mcl); 668 if (rc != EOK) { 669 (void) fat_free_clusters(bs, parentp->idx->service_id, mcl); 670 670 fibril_mutex_unlock(&parentp->idx->lock); 671 671 return rc; … … 673 673 rc = fat_append_clusters(bs, parentp, mcl, lcl); 674 674 if (rc != EOK) { 675 (void) fat_free_clusters(bs, parentp->idx-> devmap_handle, mcl);675 (void) fat_free_clusters(bs, parentp->idx->service_id, mcl); 676 676 fibril_mutex_unlock(&parentp->idx->lock); 677 677 return rc; … … 790 790 assert(childp->lnkcnt == 1); 791 791 fibril_mutex_lock(&childp->idx->lock); 792 bs = block_bb_get(childp->idx-> devmap_handle);793 794 rc = _fat_block_get(&b, bs, childp->idx-> devmap_handle, childp->idx->pfc,792 bs = block_bb_get(childp->idx->service_id); 793 794 rc = _fat_block_get(&b, bs, childp->idx->service_id, childp->idx->pfc, 795 795 NULL, (childp->idx->pdi * sizeof(fat_dentry_t)) / BPS(bs), 796 796 BLOCK_FLAGS_NONE); … … 842 842 843 843 fibril_mutex_lock(&nodep->idx->lock); 844 bs = block_bb_get(nodep->idx-> devmap_handle);844 bs = block_bb_get(nodep->idx->service_id); 845 845 846 846 blocks = nodep->size / BPS(bs); … … 916 916 } 917 917 918 devmap_handle_t fat_device_get(fs_node_t *node)918 service_id_t fat_device_get(fs_node_t *node) 919 919 { 920 920 return 0; … … 948 948 void fat_mounted(ipc_callid_t rid, ipc_call_t *request) 949 949 { 950 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request);950 service_id_t service_id = (service_id_t) IPC_GET_ARG1(*request); 951 951 enum cache_mode cmode; 952 952 fat_bs_t *bs; … … 970 970 971 971 /* initialize libblock */ 972 rc = block_init(EXCHANGE_SERIALIZE, devmap_handle, BS_SIZE);972 rc = block_init(EXCHANGE_SERIALIZE, service_id, BS_SIZE); 973 973 if (rc != EOK) { 974 974 async_answer_0(rid, rc); … … 977 977 978 978 /* prepare the boot block */ 979 rc = block_bb_read( devmap_handle, BS_BLOCK);980 if (rc != EOK) { 981 block_fini( devmap_handle);979 rc = block_bb_read(service_id, BS_BLOCK); 980 if (rc != EOK) { 981 block_fini(service_id); 982 982 async_answer_0(rid, rc); 983 983 return; … … 985 985 986 986 /* get the buffer with the boot sector */ 987 bs = block_bb_get( devmap_handle);987 bs = block_bb_get(service_id); 988 988 989 989 if (BPS(bs) != BS_SIZE) { 990 block_fini( devmap_handle);990 block_fini(service_id); 991 991 async_answer_0(rid, ENOTSUP); 992 992 return; … … 994 994 995 995 /* Initialize the block cache */ 996 rc = block_cache_init( devmap_handle, BPS(bs), 0 /* XXX */, cmode);997 if (rc != EOK) { 998 block_fini( devmap_handle);996 rc = block_cache_init(service_id, BPS(bs), 0 /* XXX */, cmode); 997 if (rc != EOK) { 998 block_fini(service_id); 999 999 async_answer_0(rid, rc); 1000 1000 return; … … 1002 1002 1003 1003 /* Do some simple sanity checks on the file system. */ 1004 rc = fat_sanity_check(bs, devmap_handle);1005 if (rc != EOK) { 1006 (void) block_cache_fini( devmap_handle);1007 block_fini( devmap_handle);1004 rc = fat_sanity_check(bs, service_id); 1005 if (rc != EOK) { 1006 (void) block_cache_fini(service_id); 1007 block_fini(service_id); 1008 1008 async_answer_0(rid, rc); 1009 1009 return; 1010 1010 } 1011 1011 1012 rc = fat_idx_init_by_ devmap_handle(devmap_handle);1013 if (rc != EOK) { 1014 (void) block_cache_fini( devmap_handle);1015 block_fini( devmap_handle);1012 rc = fat_idx_init_by_service_id(service_id); 1013 if (rc != EOK) { 1014 (void) block_cache_fini(service_id); 1015 block_fini(service_id); 1016 1016 async_answer_0(rid, rc); 1017 1017 return; … … 1021 1021 fs_node_t *rfn = (fs_node_t *)malloc(sizeof(fs_node_t)); 1022 1022 if (!rfn) { 1023 (void) block_cache_fini( devmap_handle);1024 block_fini( devmap_handle);1025 fat_idx_fini_by_ devmap_handle(devmap_handle);1023 (void) block_cache_fini(service_id); 1024 block_fini(service_id); 1025 fat_idx_fini_by_service_id(service_id); 1026 1026 async_answer_0(rid, ENOMEM); 1027 1027 return; … … 1031 1031 if (!rootp) { 1032 1032 free(rfn); 1033 (void) block_cache_fini( devmap_handle);1034 block_fini( devmap_handle);1035 fat_idx_fini_by_ devmap_handle(devmap_handle);1033 (void) block_cache_fini(service_id); 1034 block_fini(service_id); 1035 fat_idx_fini_by_service_id(service_id); 1036 1036 async_answer_0(rid, ENOMEM); 1037 1037 return; … … 1039 1039 fat_node_initialize(rootp); 1040 1040 1041 fat_idx_t *ridxp = fat_idx_get_by_pos( devmap_handle, FAT_CLST_ROOTPAR, 0);1041 fat_idx_t *ridxp = fat_idx_get_by_pos(service_id, FAT_CLST_ROOTPAR, 0); 1042 1042 if (!ridxp) { 1043 1043 free(rfn); 1044 1044 free(rootp); 1045 (void) block_cache_fini( devmap_handle);1046 block_fini( devmap_handle);1047 fat_idx_fini_by_ devmap_handle(devmap_handle);1045 (void) block_cache_fini(service_id); 1046 block_fini(service_id); 1047 fat_idx_fini_by_service_id(service_id); 1048 1048 async_answer_0(rid, ENOMEM); 1049 1049 return; … … 1074 1074 void fat_unmounted(ipc_callid_t rid, ipc_call_t *request) 1075 1075 { 1076 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request);1076 service_id_t service_id = (service_id_t) IPC_GET_ARG1(*request); 1077 1077 fs_node_t *fn; 1078 1078 fat_node_t *nodep; 1079 1079 int rc; 1080 1080 1081 rc = fat_root_get(&fn, devmap_handle);1081 rc = fat_root_get(&fn, service_id); 1082 1082 if (rc != EOK) { 1083 1083 async_answer_0(rid, rc); … … 1107 1107 * stop using libblock for this instance. 1108 1108 */ 1109 (void) fat_node_fini_by_ devmap_handle(devmap_handle);1110 fat_idx_fini_by_ devmap_handle(devmap_handle);1111 (void) block_cache_fini( devmap_handle);1112 block_fini( devmap_handle);1109 (void) fat_node_fini_by_service_id(service_id); 1110 fat_idx_fini_by_service_id(service_id); 1111 (void) block_cache_fini(service_id); 1112 block_fini(service_id); 1113 1113 1114 1114 async_answer_0(rid, EOK); … … 1127 1127 void fat_read(ipc_callid_t rid, ipc_call_t *request) 1128 1128 { 1129 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request);1129 service_id_t service_id = (service_id_t) IPC_GET_ARG1(*request); 1130 1130 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 1131 1131 aoff64_t pos = … … 1138 1138 int rc; 1139 1139 1140 rc = fat_node_get(&fn, devmap_handle, index);1140 rc = fat_node_get(&fn, service_id, index); 1141 1141 if (rc != EOK) { 1142 1142 async_answer_0(rid, rc); … … 1158 1158 } 1159 1159 1160 bs = block_bb_get( devmap_handle);1160 bs = block_bb_get(service_id); 1161 1161 1162 1162 if (nodep->type == FAT_FILE) { … … 1264 1264 void fat_write(ipc_callid_t rid, ipc_call_t *request) 1265 1265 { 1266 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request);1266 service_id_t service_id = (service_id_t) IPC_GET_ARG1(*request); 1267 1267 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 1268 1268 aoff64_t pos = … … 1277 1277 int rc; 1278 1278 1279 rc = fat_node_get(&fn, devmap_handle, index);1279 rc = fat_node_get(&fn, service_id, index); 1280 1280 if (rc != EOK) { 1281 1281 async_answer_0(rid, rc); … … 1297 1297 } 1298 1298 1299 bs = block_bb_get( devmap_handle);1299 bs = block_bb_get(service_id); 1300 1300 1301 1301 /* … … 1359 1359 nclsts = (ROUND_UP(pos + bytes, BPC(bs)) - boundary) / BPC(bs); 1360 1360 /* create an independent chain of nclsts clusters in all FATs */ 1361 rc = fat_alloc_clusters(bs, devmap_handle, nclsts, &mcl, &lcl);1361 rc = fat_alloc_clusters(bs, service_id, nclsts, &mcl, &lcl); 1362 1362 if (rc != EOK) { 1363 1363 /* could not allocate a chain of nclsts clusters */ … … 1370 1370 rc = fat_fill_gap(bs, nodep, mcl, pos); 1371 1371 if (rc != EOK) { 1372 (void) fat_free_clusters(bs, devmap_handle, mcl);1372 (void) fat_free_clusters(bs, service_id, mcl); 1373 1373 (void) fat_node_put(fn); 1374 1374 async_answer_0(callid, rc); … … 1376 1376 return; 1377 1377 } 1378 rc = _fat_block_get(&b, bs, devmap_handle, lcl, NULL,1378 rc = _fat_block_get(&b, bs, service_id, lcl, NULL, 1379 1379 (pos / BPS(bs)) % SPC(bs), flags); 1380 1380 if (rc != EOK) { 1381 (void) fat_free_clusters(bs, devmap_handle, mcl);1381 (void) fat_free_clusters(bs, service_id, mcl); 1382 1382 (void) fat_node_put(fn); 1383 1383 async_answer_0(callid, rc); … … 1390 1390 rc = block_put(b); 1391 1391 if (rc != EOK) { 1392 (void) fat_free_clusters(bs, devmap_handle, mcl);1392 (void) fat_free_clusters(bs, service_id, mcl); 1393 1393 (void) fat_node_put(fn); 1394 1394 async_answer_0(rid, rc); … … 1401 1401 rc = fat_append_clusters(bs, nodep, mcl, lcl); 1402 1402 if (rc != EOK) { 1403 (void) fat_free_clusters(bs, devmap_handle, mcl);1403 (void) fat_free_clusters(bs, service_id, mcl); 1404 1404 (void) fat_node_put(fn); 1405 1405 async_answer_0(rid, rc); … … 1416 1416 void fat_truncate(ipc_callid_t rid, ipc_call_t *request) 1417 1417 { 1418 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request);1418 service_id_t service_id = (service_id_t) IPC_GET_ARG1(*request); 1419 1419 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 1420 1420 aoff64_t size = … … 1425 1425 int rc; 1426 1426 1427 rc = fat_node_get(&fn, devmap_handle, index);1427 rc = fat_node_get(&fn, service_id, index); 1428 1428 if (rc != EOK) { 1429 1429 async_answer_0(rid, rc); … … 1436 1436 nodep = FAT_NODE(fn); 1437 1437 1438 bs = block_bb_get( devmap_handle);1438 bs = block_bb_get(service_id); 1439 1439 1440 1440 if (nodep->size == size) { … … 1463 1463 } else { 1464 1464 fat_cluster_t lastc; 1465 rc = fat_cluster_walk(bs, devmap_handle, nodep->firstc,1465 rc = fat_cluster_walk(bs, service_id, nodep->firstc, 1466 1466 &lastc, NULL, (size - 1) / BPC(bs)); 1467 1467 if (rc != EOK) … … 1488 1488 void fat_destroy(ipc_callid_t rid, ipc_call_t *request) 1489 1489 { 1490 devmap_handle_t devmap_handle = (devmap_handle_t)IPC_GET_ARG1(*request);1490 service_id_t service_id = (service_id_t)IPC_GET_ARG1(*request); 1491 1491 fs_index_t index = (fs_index_t)IPC_GET_ARG2(*request); 1492 1492 fs_node_t *fn; … … 1494 1494 int rc; 1495 1495 1496 rc = fat_node_get(&fn, devmap_handle, index);1496 rc = fat_node_get(&fn, service_id, index); 1497 1497 if (rc != EOK) { 1498 1498 async_answer_0(rid, rc); … … 1527 1527 void fat_sync(ipc_callid_t rid, ipc_call_t *request) 1528 1528 { 1529 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request);1529 service_id_t service_id = (service_id_t) IPC_GET_ARG1(*request); 1530 1530 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 1531 1531 1532 1532 fs_node_t *fn; 1533 int rc = fat_node_get(&fn, devmap_handle, index);1533 int rc = fat_node_get(&fn, service_id, index); 1534 1534 if (rc != EOK) { 1535 1535 async_answer_0(rid, rc);
Note:
See TracChangeset
for help on using the changeset viewer.