Changeset 89c57b6 in mainline for uspace/srv/fs/fat/fat_ops.c
- Timestamp:
- 2011-04-13T14:45:41Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 88634420
- Parents:
- cefb126 (diff), 17279ead (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 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/fat/fat_ops.c
rcefb126 r89c57b6 42 42 #include <libfs.h> 43 43 #include <libblock.h> 44 #include <ipc/ipc.h>45 44 #include <ipc/services.h> 46 45 #include <ipc/devmap.h> … … 60 59 #define FS_NODE(node) ((node) ? (node)->bp : NULL) 61 60 61 #define DPS(bs) (BPS((bs)) / sizeof(fat_dentry_t)) 62 #define BPC(bs) (BPS((bs)) * SPC((bs))) 63 62 64 /** Mutex protecting the list of cached free FAT nodes. */ 63 65 static FIBRIL_MUTEX_INITIALIZE(ffn_mutex); … … 69 71 * Forward declarations of FAT libfs operations. 70 72 */ 71 static int fat_root_get(fs_node_t **, dev _handle_t);73 static int fat_root_get(fs_node_t **, devmap_handle_t); 72 74 static int fat_match(fs_node_t **, fs_node_t *, const char *); 73 static int fat_node_get(fs_node_t **, dev _handle_t, fs_index_t);75 static int fat_node_get(fs_node_t **, devmap_handle_t, fs_index_t); 74 76 static int fat_node_open(fs_node_t *); 75 77 static int fat_node_put(fs_node_t *); 76 static int fat_create_node(fs_node_t **, dev _handle_t, int);78 static int fat_create_node(fs_node_t **, devmap_handle_t, int); 77 79 static int fat_destroy_node(fs_node_t *); 78 80 static int fat_link(fs_node_t *, fs_node_t *, const char *); … … 85 87 static bool fat_is_directory(fs_node_t *); 86 88 static bool fat_is_file(fs_node_t *node); 87 static dev _handle_t fat_device_get(fs_node_t *node);89 static devmap_handle_t fat_device_get(fs_node_t *node); 88 90 89 91 /* … … 101 103 node->refcnt = 0; 102 104 node->dirty = false; 105 node->lastc_cached_valid = false; 106 node->lastc_cached_value = FAT_CLST_LAST1; 107 node->currc_cached_valid = false; 108 node->currc_cached_bn = 0; 109 node->currc_cached_value = FAT_CLST_LAST1; 103 110 } 104 111 … … 108 115 fat_bs_t *bs; 109 116 fat_dentry_t *d; 110 uint16_t bps;111 unsigned dps;112 117 int rc; 113 118 114 119 assert(node->dirty); 115 120 116 bs = block_bb_get(node->idx->dev_handle); 117 bps = uint16_t_le2host(bs->bps); 118 dps = bps / sizeof(fat_dentry_t); 121 bs = block_bb_get(node->idx->devmap_handle); 119 122 120 123 /* Read the block that contains the dentry of interest. */ 121 rc = _fat_block_get(&b, bs, node->idx->dev_handle, node->idx->pfc, 122 (node->idx->pdi * sizeof(fat_dentry_t)) / bps, BLOCK_FLAGS_NONE); 124 rc = _fat_block_get(&b, bs, node->idx->devmap_handle, node->idx->pfc, 125 NULL, (node->idx->pdi * sizeof(fat_dentry_t)) / BPS(bs), 126 BLOCK_FLAGS_NONE); 123 127 if (rc != EOK) 124 128 return rc; 125 129 126 d = ((fat_dentry_t *)b->data) + (node->idx->pdi % dps);130 d = ((fat_dentry_t *)b->data) + (node->idx->pdi % DPS(bs)); 127 131 128 132 d->firstc = host2uint16_t_le(node->firstc); … … 140 144 } 141 145 142 static int fat_node_fini_by_dev _handle(dev_handle_t dev_handle)146 static int fat_node_fini_by_devmap_handle(devmap_handle_t devmap_handle) 143 147 { 144 148 link_t *lnk; … … 165 169 goto restart; 166 170 } 167 if (nodep->idx->dev _handle != dev_handle) {171 if (nodep->idx->devmap_handle != devmap_handle) { 168 172 fibril_mutex_unlock(&nodep->idx->lock); 169 173 fibril_mutex_unlock(&nodep->lock); … … 266 270 fat_dentry_t *d; 267 271 fat_node_t *nodep = NULL; 268 unsigned bps;269 unsigned spc;270 unsigned dps;271 272 int rc; 272 273 … … 297 298 return rc; 298 299 299 bs = block_bb_get(idxp->dev_handle); 300 bps = uint16_t_le2host(bs->bps); 301 spc = bs->spc; 302 dps = bps / sizeof(fat_dentry_t); 300 bs = block_bb_get(idxp->devmap_handle); 303 301 304 302 /* Read the block that contains the dentry of interest. */ 305 rc = _fat_block_get(&b, bs, idxp->dev _handle, idxp->pfc,306 (idxp->pdi * sizeof(fat_dentry_t)) / bps, BLOCK_FLAGS_NONE);303 rc = _fat_block_get(&b, bs, idxp->devmap_handle, idxp->pfc, NULL, 304 (idxp->pdi * sizeof(fat_dentry_t)) / BPS(bs), BLOCK_FLAGS_NONE); 307 305 if (rc != EOK) { 308 306 (void) fat_node_put(FS_NODE(nodep)); … … 310 308 } 311 309 312 d = ((fat_dentry_t *)b->data) + (idxp->pdi % dps);310 d = ((fat_dentry_t *)b->data) + (idxp->pdi % DPS(bs)); 313 311 if (d->attr & FAT_ATTR_SUBDIR) { 314 312 /* … … 324 322 */ 325 323 uint16_t clusters; 326 rc = fat_clusters_get(&clusters, bs, idxp->dev _handle,324 rc = fat_clusters_get(&clusters, bs, idxp->devmap_handle, 327 325 uint16_t_le2host(d->firstc)); 328 326 if (rc != EOK) { 327 (void) block_put(b); 329 328 (void) fat_node_put(FS_NODE(nodep)); 330 329 return rc; 331 330 } 332 nodep->size = bps * spc* clusters;331 nodep->size = BPS(bs) * SPC(bs) * clusters; 333 332 } else { 334 333 nodep->type = FAT_FILE; … … 357 356 */ 358 357 359 int fat_root_get(fs_node_t **rfn, dev _handle_t dev_handle)360 { 361 return fat_node_get(rfn, dev _handle, 0);358 int fat_root_get(fs_node_t **rfn, devmap_handle_t devmap_handle) 359 { 360 return fat_node_get(rfn, devmap_handle, 0); 362 361 } 363 362 … … 368 367 char name[FAT_NAME_LEN + 1 + FAT_EXT_LEN + 1]; 369 368 unsigned i, j; 370 unsigned bps; /* bytes per sector */371 unsigned dps; /* dentries per sector */372 369 unsigned blocks; 373 370 fat_dentry_t *d; 371 devmap_handle_t devmap_handle; 374 372 block_t *b; 375 373 int rc; 376 374 377 375 fibril_mutex_lock(&parentp->idx->lock); 378 bs = block_bb_get(parentp->idx->dev_handle); 379 bps = uint16_t_le2host(bs->bps); 380 dps = bps / sizeof(fat_dentry_t); 381 blocks = parentp->size / bps; 376 devmap_handle = parentp->idx->devmap_handle; 377 fibril_mutex_unlock(&parentp->idx->lock); 378 379 bs = block_bb_get(devmap_handle); 380 blocks = parentp->size / BPS(bs); 382 381 for (i = 0; i < blocks; i++) { 383 382 rc = fat_block_get(&b, bs, parentp, i, BLOCK_FLAGS_NONE); 384 if (rc != EOK) { 385 fibril_mutex_unlock(&parentp->idx->lock); 383 if (rc != EOK) 386 384 return rc; 387 } 388 for (j = 0; j < dps; j++) { 385 for (j = 0; j < DPS(bs); j++) { 389 386 d = ((fat_dentry_t *)b->data) + j; 390 387 switch (fat_classify_dentry(d)) { … … 395 392 /* miss */ 396 393 rc = block_put(b); 397 fibril_mutex_unlock(&parentp->idx->lock);398 394 *rfn = NULL; 399 395 return rc; … … 406 402 /* hit */ 407 403 fat_node_t *nodep; 408 /* 409 * Assume tree hierarchy for locking. We 410 * already have the parent and now we are going 411 * to lock the child. Never lock in the oposite 412 * order. 413 */ 414 fat_idx_t *idx = fat_idx_get_by_pos( 415 parentp->idx->dev_handle, parentp->firstc, 416 i * dps + j); 417 fibril_mutex_unlock(&parentp->idx->lock); 404 fat_idx_t *idx = fat_idx_get_by_pos(devmap_handle, 405 parentp->firstc, i * DPS(bs) + j); 418 406 if (!idx) { 419 407 /* … … 438 426 } 439 427 rc = block_put(b); 440 if (rc != EOK) { 441 fibril_mutex_unlock(&parentp->idx->lock); 428 if (rc != EOK) 442 429 return rc; 443 } 444 } 445 446 fibril_mutex_unlock(&parentp->idx->lock); 430 } 431 447 432 *rfn = NULL; 448 433 return EOK; … … 450 435 451 436 /** Instantiate a FAT in-core node. */ 452 int fat_node_get(fs_node_t **rfn, dev _handle_t dev_handle, fs_index_t index)437 int fat_node_get(fs_node_t **rfn, devmap_handle_t devmap_handle, fs_index_t index) 453 438 { 454 439 fat_node_t *nodep; … … 456 441 int rc; 457 442 458 idxp = fat_idx_get_by_index(dev _handle, index);443 idxp = fat_idx_get_by_index(devmap_handle, index); 459 444 if (!idxp) { 460 445 *rfn = NULL; … … 507 492 } 508 493 509 int fat_create_node(fs_node_t **rfn, dev _handle_t dev_handle, int flags)494 int fat_create_node(fs_node_t **rfn, devmap_handle_t devmap_handle, int flags) 510 495 { 511 496 fat_idx_t *idxp; … … 513 498 fat_bs_t *bs; 514 499 fat_cluster_t mcl, lcl; 515 uint16_t bps;516 500 int rc; 517 501 518 bs = block_bb_get(dev_handle); 519 bps = uint16_t_le2host(bs->bps); 502 bs = block_bb_get(devmap_handle); 520 503 if (flags & L_DIRECTORY) { 521 504 /* allocate a cluster */ 522 rc = fat_alloc_clusters(bs, dev _handle, 1, &mcl, &lcl);505 rc = fat_alloc_clusters(bs, devmap_handle, 1, &mcl, &lcl); 523 506 if (rc != EOK) 524 507 return rc; 525 508 /* populate the new cluster with unused dentries */ 526 rc = fat_zero_cluster(bs, dev _handle, mcl);509 rc = fat_zero_cluster(bs, devmap_handle, mcl); 527 510 if (rc != EOK) { 528 (void) fat_free_clusters(bs, dev _handle, mcl);511 (void) fat_free_clusters(bs, devmap_handle, mcl); 529 512 return rc; 530 513 } … … 533 516 rc = fat_node_get_new(&nodep); 534 517 if (rc != EOK) { 535 (void) fat_free_clusters(bs, dev _handle, mcl);518 (void) fat_free_clusters(bs, devmap_handle, mcl); 536 519 return rc; 537 520 } 538 rc = fat_idx_get_new(&idxp, dev _handle);539 if (rc != EOK) { 540 (void) fat_free_clusters(bs, dev _handle, mcl);521 rc = fat_idx_get_new(&idxp, devmap_handle); 522 if (rc != EOK) { 523 (void) fat_free_clusters(bs, devmap_handle, mcl); 541 524 (void) fat_node_put(FS_NODE(nodep)); 542 525 return rc; … … 546 529 nodep->type = FAT_DIRECTORY; 547 530 nodep->firstc = mcl; 548 nodep->size = bps * bs->spc;531 nodep->size = BPS(bs) * SPC(bs); 549 532 } else { 550 533 nodep->type = FAT_FILE; … … 587 570 assert(!has_children); 588 571 589 bs = block_bb_get(nodep->idx->dev _handle);572 bs = block_bb_get(nodep->idx->devmap_handle); 590 573 if (nodep->firstc != FAT_CLST_RES0) { 591 574 assert(nodep->size); 592 575 /* Free all clusters allocated to the node. */ 593 rc = fat_free_clusters(bs, nodep->idx->dev _handle,576 rc = fat_free_clusters(bs, nodep->idx->devmap_handle, 594 577 nodep->firstc); 595 578 } … … 609 592 block_t *b; 610 593 unsigned i, j; 611 uint16_t bps;612 unsigned dps;613 594 unsigned blocks; 614 595 fat_cluster_t mcl, lcl; … … 639 620 640 621 fibril_mutex_lock(&parentp->idx->lock); 641 bs = block_bb_get(parentp->idx->dev_handle); 642 bps = uint16_t_le2host(bs->bps); 643 dps = bps / sizeof(fat_dentry_t); 644 645 blocks = parentp->size / bps; 622 bs = block_bb_get(parentp->idx->devmap_handle); 623 624 blocks = parentp->size / BPS(bs); 646 625 647 626 for (i = 0; i < blocks; i++) { … … 651 630 return rc; 652 631 } 653 for (j = 0; j < dps; j++) {632 for (j = 0; j < DPS(bs); j++) { 654 633 d = ((fat_dentry_t *)b->data) + j; 655 634 switch (fat_classify_dentry(d)) { … … 680 659 return ENOSPC; 681 660 } 682 rc = fat_alloc_clusters(bs, parentp->idx->dev _handle, 1, &mcl, &lcl);661 rc = fat_alloc_clusters(bs, parentp->idx->devmap_handle, 1, &mcl, &lcl); 683 662 if (rc != EOK) { 684 663 fibril_mutex_unlock(&parentp->idx->lock); 685 664 return rc; 686 665 } 687 rc = fat_zero_cluster(bs, parentp->idx->dev _handle, mcl);688 if (rc != EOK) { 689 (void) fat_free_clusters(bs, parentp->idx->dev _handle, mcl);666 rc = fat_zero_cluster(bs, parentp->idx->devmap_handle, mcl); 667 if (rc != EOK) { 668 (void) fat_free_clusters(bs, parentp->idx->devmap_handle, mcl); 690 669 fibril_mutex_unlock(&parentp->idx->lock); 691 670 return rc; 692 671 } 693 rc = fat_append_clusters(bs, parentp, mcl );694 if (rc != EOK) { 695 (void) fat_free_clusters(bs, parentp->idx->dev _handle, mcl);672 rc = fat_append_clusters(bs, parentp, mcl, lcl); 673 if (rc != EOK) { 674 (void) fat_free_clusters(bs, parentp->idx->devmap_handle, mcl); 696 675 fibril_mutex_unlock(&parentp->idx->lock); 697 676 return rc; 698 677 } 699 parentp->size += bps * bs->spc;678 parentp->size += BPS(bs) * SPC(bs); 700 679 parentp->dirty = true; /* need to sync node */ 701 680 rc = fat_block_get(&b, bs, parentp, i, BLOCK_FLAGS_NONE); … … 743 722 (str_cmp((char *) d->name, FAT_NAME_DOT)) == 0) { 744 723 memset(d, 0, sizeof(fat_dentry_t)); 745 str_cpy((char *) d->name, 8, FAT_NAME_DOT);746 str_cpy((char *) d->ext, 3, FAT_EXT_PAD);724 memcpy(d->name, FAT_NAME_DOT, FAT_NAME_LEN); 725 memcpy(d->ext, FAT_EXT_PAD, FAT_EXT_LEN); 747 726 d->attr = FAT_ATTR_SUBDIR; 748 727 d->firstc = host2uint16_t_le(childp->firstc); … … 753 732 (str_cmp((char *) d->name, FAT_NAME_DOT_DOT) == 0)) { 754 733 memset(d, 0, sizeof(fat_dentry_t)); 755 str_cpy((char *) d->name, 8, FAT_NAME_DOT_DOT);756 str_cpy((char *) d->ext, 3, FAT_EXT_PAD);734 memcpy(d->name, FAT_NAME_DOT_DOT, FAT_NAME_LEN); 735 memcpy(d->ext, FAT_EXT_PAD, FAT_EXT_LEN); 757 736 d->attr = FAT_ATTR_SUBDIR; 758 737 d->firstc = (parentp->firstc == FAT_CLST_ROOT) ? … … 771 750 772 751 childp->idx->pfc = parentp->firstc; 773 childp->idx->pdi = i * dps+ j;752 childp->idx->pdi = i * DPS(bs) + j; 774 753 fibril_mutex_unlock(&childp->idx->lock); 775 754 … … 793 772 fat_bs_t *bs; 794 773 fat_dentry_t *d; 795 uint16_t bps;796 774 block_t *b; 797 775 bool has_children; … … 811 789 assert(childp->lnkcnt == 1); 812 790 fibril_mutex_lock(&childp->idx->lock); 813 bs = block_bb_get(childp->idx->dev_handle); 814 bps = uint16_t_le2host(bs->bps); 815 816 rc = _fat_block_get(&b, bs, childp->idx->dev_handle, childp->idx->pfc, 817 (childp->idx->pdi * sizeof(fat_dentry_t)) / bps, 791 bs = block_bb_get(childp->idx->devmap_handle); 792 793 rc = _fat_block_get(&b, bs, childp->idx->devmap_handle, childp->idx->pfc, 794 NULL, (childp->idx->pdi * sizeof(fat_dentry_t)) / BPS(bs), 818 795 BLOCK_FLAGS_NONE); 819 796 if (rc != EOK) 820 797 goto error; 821 798 d = (fat_dentry_t *)b->data + 822 (childp->idx->pdi % ( bps/ sizeof(fat_dentry_t)));799 (childp->idx->pdi % (BPS(bs) / sizeof(fat_dentry_t))); 823 800 /* mark the dentry as not-currently-used */ 824 801 d->name[0] = FAT_DENTRY_ERASED; … … 835 812 fibril_mutex_unlock(&childp->idx->lock); 836 813 childp->lnkcnt = 0; 814 childp->refcnt++; /* keep the node in memory until destroyed */ 837 815 childp->dirty = true; 838 816 fibril_mutex_unlock(&childp->lock); … … 852 830 fat_bs_t *bs; 853 831 fat_node_t *nodep = FAT_NODE(fn); 854 unsigned bps;855 unsigned dps;856 832 unsigned blocks; 857 833 block_t *b; … … 865 841 866 842 fibril_mutex_lock(&nodep->idx->lock); 867 bs = block_bb_get(nodep->idx->dev_handle); 868 bps = uint16_t_le2host(bs->bps); 869 dps = bps / sizeof(fat_dentry_t); 870 871 blocks = nodep->size / bps; 843 bs = block_bb_get(nodep->idx->devmap_handle); 844 845 blocks = nodep->size / BPS(bs); 872 846 873 847 for (i = 0; i < blocks; i++) { … … 879 853 return rc; 880 854 } 881 for (j = 0; j < dps; j++) {855 for (j = 0; j < DPS(bs); j++) { 882 856 d = ((fat_dentry_t *)b->data) + j; 883 857 switch (fat_classify_dentry(d)) { … … 941 915 } 942 916 943 dev _handle_t fat_device_get(fs_node_t *node)917 devmap_handle_t fat_device_get(fs_node_t *node) 944 918 { 945 919 return 0; … … 973 947 void fat_mounted(ipc_callid_t rid, ipc_call_t *request) 974 948 { 975 dev _handle_t dev_handle = (dev_handle_t) IPC_GET_ARG1(*request);949 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 976 950 enum cache_mode cmode; 977 951 fat_bs_t *bs; 978 uint16_t bps;979 uint16_t rde;980 952 981 953 /* Accept the mount options */ … … 984 956 985 957 if (rc != EOK) { 986 ipc_answer_0(rid, rc);958 async_answer_0(rid, rc); 987 959 return; 988 960 } … … 997 969 998 970 /* initialize libblock */ 999 rc = block_init(dev _handle, BS_SIZE);1000 if (rc != EOK) { 1001 ipc_answer_0(rid, rc);971 rc = block_init(devmap_handle, BS_SIZE); 972 if (rc != EOK) { 973 async_answer_0(rid, rc); 1002 974 return; 1003 975 } 1004 976 1005 977 /* prepare the boot block */ 1006 rc = block_bb_read(dev _handle, BS_BLOCK);1007 if (rc != EOK) { 1008 block_fini(dev _handle);1009 ipc_answer_0(rid, rc);978 rc = block_bb_read(devmap_handle, BS_BLOCK); 979 if (rc != EOK) { 980 block_fini(devmap_handle); 981 async_answer_0(rid, rc); 1010 982 return; 1011 983 } 1012 984 1013 985 /* get the buffer with the boot sector */ 1014 bs = block_bb_get(dev_handle); 1015 1016 /* Read the number of root directory entries. */ 1017 bps = uint16_t_le2host(bs->bps); 1018 rde = uint16_t_le2host(bs->root_ent_max); 1019 1020 if (bps != BS_SIZE) { 1021 block_fini(dev_handle); 1022 ipc_answer_0(rid, ENOTSUP); 986 bs = block_bb_get(devmap_handle); 987 988 if (BPS(bs) != BS_SIZE) { 989 block_fini(devmap_handle); 990 async_answer_0(rid, ENOTSUP); 1023 991 return; 1024 992 } 1025 993 1026 994 /* Initialize the block cache */ 1027 rc = block_cache_init(dev _handle, bps, 0 /* XXX */, cmode);1028 if (rc != EOK) { 1029 block_fini(dev _handle);1030 ipc_answer_0(rid, rc);995 rc = block_cache_init(devmap_handle, BPS(bs), 0 /* XXX */, cmode); 996 if (rc != EOK) { 997 block_fini(devmap_handle); 998 async_answer_0(rid, rc); 1031 999 return; 1032 1000 } 1033 1001 1034 1002 /* Do some simple sanity checks on the file system. */ 1035 rc = fat_sanity_check(bs, dev _handle);1036 if (rc != EOK) { 1037 (void) block_cache_fini(dev _handle);1038 block_fini(dev _handle);1039 ipc_answer_0(rid, rc);1040 return; 1041 } 1042 1043 rc = fat_idx_init_by_dev _handle(dev_handle);1044 if (rc != EOK) { 1045 (void) block_cache_fini(dev _handle);1046 block_fini(dev _handle);1047 ipc_answer_0(rid, rc);1003 rc = fat_sanity_check(bs, devmap_handle); 1004 if (rc != EOK) { 1005 (void) block_cache_fini(devmap_handle); 1006 block_fini(devmap_handle); 1007 async_answer_0(rid, rc); 1008 return; 1009 } 1010 1011 rc = fat_idx_init_by_devmap_handle(devmap_handle); 1012 if (rc != EOK) { 1013 (void) block_cache_fini(devmap_handle); 1014 block_fini(devmap_handle); 1015 async_answer_0(rid, rc); 1048 1016 return; 1049 1017 } … … 1052 1020 fs_node_t *rfn = (fs_node_t *)malloc(sizeof(fs_node_t)); 1053 1021 if (!rfn) { 1054 (void) block_cache_fini(dev _handle);1055 block_fini(dev _handle);1056 fat_idx_fini_by_dev _handle(dev_handle);1057 ipc_answer_0(rid, ENOMEM);1022 (void) block_cache_fini(devmap_handle); 1023 block_fini(devmap_handle); 1024 fat_idx_fini_by_devmap_handle(devmap_handle); 1025 async_answer_0(rid, ENOMEM); 1058 1026 return; 1059 1027 } … … 1062 1030 if (!rootp) { 1063 1031 free(rfn); 1064 (void) block_cache_fini(dev _handle);1065 block_fini(dev _handle);1066 fat_idx_fini_by_dev _handle(dev_handle);1067 ipc_answer_0(rid, ENOMEM);1032 (void) block_cache_fini(devmap_handle); 1033 block_fini(devmap_handle); 1034 fat_idx_fini_by_devmap_handle(devmap_handle); 1035 async_answer_0(rid, ENOMEM); 1068 1036 return; 1069 1037 } 1070 1038 fat_node_initialize(rootp); 1071 1039 1072 fat_idx_t *ridxp = fat_idx_get_by_pos(dev _handle, FAT_CLST_ROOTPAR, 0);1040 fat_idx_t *ridxp = fat_idx_get_by_pos(devmap_handle, FAT_CLST_ROOTPAR, 0); 1073 1041 if (!ridxp) { 1074 1042 free(rfn); 1075 1043 free(rootp); 1076 (void) block_cache_fini(dev _handle);1077 block_fini(dev _handle);1078 fat_idx_fini_by_dev _handle(dev_handle);1079 ipc_answer_0(rid, ENOMEM);1044 (void) block_cache_fini(devmap_handle); 1045 block_fini(devmap_handle); 1046 fat_idx_fini_by_devmap_handle(devmap_handle); 1047 async_answer_0(rid, ENOMEM); 1080 1048 return; 1081 1049 } … … 1087 1055 rootp->refcnt = 1; 1088 1056 rootp->lnkcnt = 0; /* FS root is not linked */ 1089 rootp->size = rde* sizeof(fat_dentry_t);1057 rootp->size = RDE(bs) * sizeof(fat_dentry_t); 1090 1058 rootp->idx = ridxp; 1091 1059 ridxp->nodep = rootp; … … 1095 1063 fibril_mutex_unlock(&ridxp->lock); 1096 1064 1097 ipc_answer_3(rid, EOK, ridxp->index, rootp->size, rootp->lnkcnt);1065 async_answer_3(rid, EOK, ridxp->index, rootp->size, rootp->lnkcnt); 1098 1066 } 1099 1067 … … 1105 1073 void fat_unmounted(ipc_callid_t rid, ipc_call_t *request) 1106 1074 { 1107 dev _handle_t dev_handle = (dev_handle_t) IPC_GET_ARG1(*request);1075 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 1108 1076 fs_node_t *fn; 1109 1077 fat_node_t *nodep; 1110 1078 int rc; 1111 1079 1112 rc = fat_root_get(&fn, dev _handle);1113 if (rc != EOK) { 1114 ipc_answer_0(rid, rc);1080 rc = fat_root_get(&fn, devmap_handle); 1081 if (rc != EOK) { 1082 async_answer_0(rid, rc); 1115 1083 return; 1116 1084 } … … 1123 1091 if (nodep->refcnt != 2) { 1124 1092 (void) fat_node_put(fn); 1125 ipc_answer_0(rid, EBUSY);1093 async_answer_0(rid, EBUSY); 1126 1094 return; 1127 1095 } … … 1138 1106 * stop using libblock for this instance. 1139 1107 */ 1140 (void) fat_node_fini_by_dev _handle(dev_handle);1141 fat_idx_fini_by_dev _handle(dev_handle);1142 (void) block_cache_fini(dev _handle);1143 block_fini(dev _handle);1144 1145 ipc_answer_0(rid, EOK);1108 (void) fat_node_fini_by_devmap_handle(devmap_handle); 1109 fat_idx_fini_by_devmap_handle(devmap_handle); 1110 (void) block_cache_fini(devmap_handle); 1111 block_fini(devmap_handle); 1112 1113 async_answer_0(rid, EOK); 1146 1114 } 1147 1115 … … 1158 1126 void fat_read(ipc_callid_t rid, ipc_call_t *request) 1159 1127 { 1160 dev _handle_t dev_handle = (dev_handle_t) IPC_GET_ARG1(*request);1128 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 1161 1129 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 1162 1130 aoff64_t pos = … … 1165 1133 fat_node_t *nodep; 1166 1134 fat_bs_t *bs; 1167 uint16_t bps;1168 1135 size_t bytes; 1169 1136 block_t *b; 1170 1137 int rc; 1171 1138 1172 rc = fat_node_get(&fn, dev _handle, index);1173 if (rc != EOK) { 1174 ipc_answer_0(rid, rc);1139 rc = fat_node_get(&fn, devmap_handle, index); 1140 if (rc != EOK) { 1141 async_answer_0(rid, rc); 1175 1142 return; 1176 1143 } 1177 1144 if (!fn) { 1178 ipc_answer_0(rid, ENOENT);1145 async_answer_0(rid, ENOENT); 1179 1146 return; 1180 1147 } … … 1185 1152 if (!async_data_read_receive(&callid, &len)) { 1186 1153 fat_node_put(fn); 1187 ipc_answer_0(callid, EINVAL); 1188 ipc_answer_0(rid, EINVAL); 1189 return; 1190 } 1191 1192 bs = block_bb_get(dev_handle); 1193 bps = uint16_t_le2host(bs->bps); 1154 async_answer_0(callid, EINVAL); 1155 async_answer_0(rid, EINVAL); 1156 return; 1157 } 1158 1159 bs = block_bb_get(devmap_handle); 1194 1160 1195 1161 if (nodep->type == FAT_FILE) { … … 1204 1170 (void) async_data_read_finalize(callid, NULL, 0); 1205 1171 } else { 1206 bytes = min(len, bps - pos % bps);1172 bytes = min(len, BPS(bs) - pos % BPS(bs)); 1207 1173 bytes = min(bytes, nodep->size - pos); 1208 rc = fat_block_get(&b, bs, nodep, pos / bps,1174 rc = fat_block_get(&b, bs, nodep, pos / BPS(bs), 1209 1175 BLOCK_FLAGS_NONE); 1210 1176 if (rc != EOK) { 1211 1177 fat_node_put(fn); 1212 ipc_answer_0(callid, rc);1213 ipc_answer_0(rid, rc);1178 async_answer_0(callid, rc); 1179 async_answer_0(rid, rc); 1214 1180 return; 1215 1181 } 1216 (void) async_data_read_finalize(callid, b->data + pos % bps,1217 b ytes);1182 (void) async_data_read_finalize(callid, 1183 b->data + pos % BPS(bs), bytes); 1218 1184 rc = block_put(b); 1219 1185 if (rc != EOK) { 1220 1186 fat_node_put(fn); 1221 ipc_answer_0(rid, rc);1187 async_answer_0(rid, rc); 1222 1188 return; 1223 1189 } … … 1230 1196 1231 1197 assert(nodep->type == FAT_DIRECTORY); 1232 assert(nodep->size % bps== 0);1233 assert( bps% sizeof(fat_dentry_t) == 0);1198 assert(nodep->size % BPS(bs) == 0); 1199 assert(BPS(bs) % sizeof(fat_dentry_t) == 0); 1234 1200 1235 1201 /* … … 1239 1205 * the position pointer accordingly. 1240 1206 */ 1241 bnum = (pos * sizeof(fat_dentry_t)) / bps;1242 while (bnum < nodep->size / bps) {1207 bnum = (pos * sizeof(fat_dentry_t)) / BPS(bs); 1208 while (bnum < nodep->size / BPS(bs)) { 1243 1209 aoff64_t o; 1244 1210 … … 1247 1213 if (rc != EOK) 1248 1214 goto err; 1249 for (o = pos % ( bps/ sizeof(fat_dentry_t));1250 o < bps/ sizeof(fat_dentry_t);1215 for (o = pos % (BPS(bs) / sizeof(fat_dentry_t)); 1216 o < BPS(bs) / sizeof(fat_dentry_t); 1251 1217 o++, pos++) { 1252 1218 d = ((fat_dentry_t *)b->data) + o; … … 1276 1242 miss: 1277 1243 rc = fat_node_put(fn); 1278 ipc_answer_0(callid, rc != EOK ? rc : ENOENT);1279 ipc_answer_1(rid, rc != EOK ? rc : ENOENT, 0);1244 async_answer_0(callid, rc != EOK ? rc : ENOENT); 1245 async_answer_1(rid, rc != EOK ? rc : ENOENT, 0); 1280 1246 return; 1281 1247 1282 1248 err: 1283 1249 (void) fat_node_put(fn); 1284 ipc_answer_0(callid, rc);1285 ipc_answer_0(rid, rc);1250 async_answer_0(callid, rc); 1251 async_answer_0(rid, rc); 1286 1252 return; 1287 1253 … … 1292 1258 1293 1259 rc = fat_node_put(fn); 1294 ipc_answer_1(rid, rc, (ipcarg_t)bytes);1260 async_answer_1(rid, rc, (sysarg_t)bytes); 1295 1261 } 1296 1262 1297 1263 void fat_write(ipc_callid_t rid, ipc_call_t *request) 1298 1264 { 1299 dev _handle_t dev_handle = (dev_handle_t) IPC_GET_ARG1(*request);1265 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 1300 1266 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 1301 1267 aoff64_t pos = … … 1306 1272 size_t bytes, size; 1307 1273 block_t *b; 1308 uint16_t bps;1309 unsigned spc;1310 unsigned bpc; /* bytes per cluster */1311 1274 aoff64_t boundary; 1312 1275 int flags = BLOCK_FLAGS_NONE; 1313 1276 int rc; 1314 1277 1315 rc = fat_node_get(&fn, dev _handle, index);1316 if (rc != EOK) { 1317 ipc_answer_0(rid, rc);1278 rc = fat_node_get(&fn, devmap_handle, index); 1279 if (rc != EOK) { 1280 async_answer_0(rid, rc); 1318 1281 return; 1319 1282 } 1320 1283 if (!fn) { 1321 ipc_answer_0(rid, ENOENT);1284 async_answer_0(rid, ENOENT); 1322 1285 return; 1323 1286 } … … 1328 1291 if (!async_data_write_receive(&callid, &len)) { 1329 1292 (void) fat_node_put(fn); 1330 ipc_answer_0(callid, EINVAL); 1331 ipc_answer_0(rid, EINVAL); 1332 return; 1333 } 1334 1335 bs = block_bb_get(dev_handle); 1336 bps = uint16_t_le2host(bs->bps); 1337 spc = bs->spc; 1338 bpc = bps * spc; 1293 async_answer_0(callid, EINVAL); 1294 async_answer_0(rid, EINVAL); 1295 return; 1296 } 1297 1298 bs = block_bb_get(devmap_handle); 1339 1299 1340 1300 /* … … 1345 1305 * value signalizing a smaller number of bytes written. 1346 1306 */ 1347 bytes = min(len, bps - pos % bps);1348 if (bytes == bps)1307 bytes = min(len, BPS(bs) - pos % BPS(bs)); 1308 if (bytes == BPS(bs)) 1349 1309 flags |= BLOCK_FLAGS_NOREAD; 1350 1310 1351 boundary = ROUND_UP(nodep->size, bpc);1311 boundary = ROUND_UP(nodep->size, BPC(bs)); 1352 1312 if (pos < boundary) { 1353 1313 /* … … 1360 1320 if (rc != EOK) { 1361 1321 (void) fat_node_put(fn); 1362 ipc_answer_0(callid, rc);1363 ipc_answer_0(rid, rc);1322 async_answer_0(callid, rc); 1323 async_answer_0(rid, rc); 1364 1324 return; 1365 1325 } 1366 rc = fat_block_get(&b, bs, nodep, pos / bps, flags);1326 rc = fat_block_get(&b, bs, nodep, pos / BPS(bs), flags); 1367 1327 if (rc != EOK) { 1368 1328 (void) fat_node_put(fn); 1369 ipc_answer_0(callid, rc);1370 ipc_answer_0(rid, rc);1329 async_answer_0(callid, rc); 1330 async_answer_0(rid, rc); 1371 1331 return; 1372 1332 } 1373 (void) async_data_write_finalize(callid, b->data + pos % bps,1374 b ytes);1333 (void) async_data_write_finalize(callid, 1334 b->data + pos % BPS(bs), bytes); 1375 1335 b->dirty = true; /* need to sync block */ 1376 1336 rc = block_put(b); 1377 1337 if (rc != EOK) { 1378 1338 (void) fat_node_put(fn); 1379 ipc_answer_0(rid, rc);1339 async_answer_0(rid, rc); 1380 1340 return; 1381 1341 } … … 1386 1346 size = nodep->size; 1387 1347 rc = fat_node_put(fn); 1388 ipc_answer_2(rid, rc, bytes, nodep->size);1348 async_answer_2(rid, rc, bytes, nodep->size); 1389 1349 return; 1390 1350 } else { … … 1396 1356 fat_cluster_t mcl, lcl; 1397 1357 1398 nclsts = (ROUND_UP(pos + bytes, bpc) - boundary) / bpc;1358 nclsts = (ROUND_UP(pos + bytes, BPC(bs)) - boundary) / BPC(bs); 1399 1359 /* create an independent chain of nclsts clusters in all FATs */ 1400 rc = fat_alloc_clusters(bs, dev _handle, nclsts, &mcl, &lcl);1360 rc = fat_alloc_clusters(bs, devmap_handle, nclsts, &mcl, &lcl); 1401 1361 if (rc != EOK) { 1402 1362 /* could not allocate a chain of nclsts clusters */ 1403 1363 (void) fat_node_put(fn); 1404 ipc_answer_0(callid, rc);1405 ipc_answer_0(rid, rc);1364 async_answer_0(callid, rc); 1365 async_answer_0(rid, rc); 1406 1366 return; 1407 1367 } … … 1409 1369 rc = fat_fill_gap(bs, nodep, mcl, pos); 1410 1370 if (rc != EOK) { 1411 (void) fat_free_clusters(bs, dev _handle, mcl);1371 (void) fat_free_clusters(bs, devmap_handle, mcl); 1412 1372 (void) fat_node_put(fn); 1413 ipc_answer_0(callid, rc);1414 ipc_answer_0(rid, rc);1373 async_answer_0(callid, rc); 1374 async_answer_0(rid, rc); 1415 1375 return; 1416 1376 } 1417 rc = _fat_block_get(&b, bs, dev _handle, lcl, (pos / bps) % spc,1418 flags);1377 rc = _fat_block_get(&b, bs, devmap_handle, lcl, NULL, 1378 (pos / BPS(bs)) % SPC(bs), flags); 1419 1379 if (rc != EOK) { 1420 (void) fat_free_clusters(bs, dev _handle, mcl);1380 (void) fat_free_clusters(bs, devmap_handle, mcl); 1421 1381 (void) fat_node_put(fn); 1422 ipc_answer_0(callid, rc);1423 ipc_answer_0(rid, rc);1382 async_answer_0(callid, rc); 1383 async_answer_0(rid, rc); 1424 1384 return; 1425 1385 } 1426 (void) async_data_write_finalize(callid, b->data + pos % bps,1427 b ytes);1386 (void) async_data_write_finalize(callid, 1387 b->data + pos % BPS(bs), bytes); 1428 1388 b->dirty = true; /* need to sync block */ 1429 1389 rc = block_put(b); 1430 1390 if (rc != EOK) { 1431 (void) fat_free_clusters(bs, dev _handle, mcl);1391 (void) fat_free_clusters(bs, devmap_handle, mcl); 1432 1392 (void) fat_node_put(fn); 1433 ipc_answer_0(rid, rc);1393 async_answer_0(rid, rc); 1434 1394 return; 1435 1395 } … … 1438 1398 * node's cluster chain. 1439 1399 */ 1440 rc = fat_append_clusters(bs, nodep, mcl );1400 rc = fat_append_clusters(bs, nodep, mcl, lcl); 1441 1401 if (rc != EOK) { 1442 (void) fat_free_clusters(bs, dev _handle, mcl);1402 (void) fat_free_clusters(bs, devmap_handle, mcl); 1443 1403 (void) fat_node_put(fn); 1444 ipc_answer_0(rid, rc);1404 async_answer_0(rid, rc); 1445 1405 return; 1446 1406 } … … 1448 1408 nodep->dirty = true; /* need to sync node */ 1449 1409 rc = fat_node_put(fn); 1450 ipc_answer_2(rid, rc, bytes, size);1410 async_answer_2(rid, rc, bytes, size); 1451 1411 return; 1452 1412 } … … 1455 1415 void fat_truncate(ipc_callid_t rid, ipc_call_t *request) 1456 1416 { 1457 dev _handle_t dev_handle = (dev_handle_t) IPC_GET_ARG1(*request);1417 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 1458 1418 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 1459 1419 aoff64_t size = … … 1462 1422 fat_node_t *nodep; 1463 1423 fat_bs_t *bs; 1464 uint16_t bps;1465 uint8_t spc;1466 unsigned bpc; /* bytes per cluster */1467 1424 int rc; 1468 1425 1469 rc = fat_node_get(&fn, dev _handle, index);1470 if (rc != EOK) { 1471 ipc_answer_0(rid, rc);1426 rc = fat_node_get(&fn, devmap_handle, index); 1427 if (rc != EOK) { 1428 async_answer_0(rid, rc); 1472 1429 return; 1473 1430 } 1474 1431 if (!fn) { 1475 ipc_answer_0(rid, ENOENT);1432 async_answer_0(rid, ENOENT); 1476 1433 return; 1477 1434 } 1478 1435 nodep = FAT_NODE(fn); 1479 1436 1480 bs = block_bb_get(dev_handle); 1481 bps = uint16_t_le2host(bs->bps); 1482 spc = bs->spc; 1483 bpc = bps * spc; 1437 bs = block_bb_get(devmap_handle); 1484 1438 1485 1439 if (nodep->size == size) { … … 1491 1445 */ 1492 1446 rc = EINVAL; 1493 } else if (ROUND_UP(nodep->size, bpc) == ROUND_UP(size, bpc)) {1447 } else if (ROUND_UP(nodep->size, BPC(bs)) == ROUND_UP(size, BPC(bs))) { 1494 1448 /* 1495 1449 * The node will be shrunk, but no clusters will be deallocated. … … 1508 1462 } else { 1509 1463 fat_cluster_t lastc; 1510 rc = fat_cluster_walk(bs, dev _handle, nodep->firstc,1511 &lastc, NULL, (size - 1) / bpc);1464 rc = fat_cluster_walk(bs, devmap_handle, nodep->firstc, 1465 &lastc, NULL, (size - 1) / BPC(bs)); 1512 1466 if (rc != EOK) 1513 1467 goto out; … … 1522 1476 out: 1523 1477 fat_node_put(fn); 1524 ipc_answer_0(rid, rc);1478 async_answer_0(rid, rc); 1525 1479 return; 1526 1480 } … … 1528 1482 void fat_close(ipc_callid_t rid, ipc_call_t *request) 1529 1483 { 1530 ipc_answer_0(rid, EOK);1484 async_answer_0(rid, EOK); 1531 1485 } 1532 1486 1533 1487 void fat_destroy(ipc_callid_t rid, ipc_call_t *request) 1534 1488 { 1535 dev _handle_t dev_handle = (dev_handle_t)IPC_GET_ARG1(*request);1489 devmap_handle_t devmap_handle = (devmap_handle_t)IPC_GET_ARG1(*request); 1536 1490 fs_index_t index = (fs_index_t)IPC_GET_ARG2(*request); 1537 1491 fs_node_t *fn; 1492 fat_node_t *nodep; 1538 1493 int rc; 1539 1494 1540 rc = fat_node_get(&fn, dev _handle, index);1541 if (rc != EOK) { 1542 ipc_answer_0(rid, rc);1495 rc = fat_node_get(&fn, devmap_handle, index); 1496 if (rc != EOK) { 1497 async_answer_0(rid, rc); 1543 1498 return; 1544 1499 } 1545 1500 if (!fn) { 1546 ipc_answer_0(rid, ENOENT); 1547 return; 1548 } 1501 async_answer_0(rid, ENOENT); 1502 return; 1503 } 1504 1505 nodep = FAT_NODE(fn); 1506 /* 1507 * We should have exactly two references. One for the above 1508 * call to fat_node_get() and one from fat_unlink(). 1509 */ 1510 assert(nodep->refcnt == 2); 1549 1511 1550 1512 rc = fat_destroy_node(fn); 1551 ipc_answer_0(rid, rc);1513 async_answer_0(rid, rc); 1552 1514 } 1553 1515 … … 1564 1526 void fat_sync(ipc_callid_t rid, ipc_call_t *request) 1565 1527 { 1566 /* Dummy implementation */ 1567 ipc_answer_0(rid, EOK); 1528 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 1529 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 1530 1531 fs_node_t *fn; 1532 int rc = fat_node_get(&fn, devmap_handle, index); 1533 if (rc != EOK) { 1534 async_answer_0(rid, rc); 1535 return; 1536 } 1537 if (!fn) { 1538 async_answer_0(rid, ENOENT); 1539 return; 1540 } 1541 1542 fat_node_t *nodep = FAT_NODE(fn); 1543 1544 nodep->dirty = true; 1545 rc = fat_node_sync(nodep); 1546 1547 fat_node_put(fn); 1548 async_answer_0(rid, rc); 1568 1549 } 1569 1550
Note:
See TracChangeset
for help on using the changeset viewer.