Changeset b6035ba in mainline for uspace/srv/fs/fat/fat_ops.c
- Timestamp:
- 2009-05-05T22:09:13Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 770d281
- Parents:
- c852f4be
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/fat/fat_ops.c
rc852f4be rb6035ba 56 56 #include <align.h> 57 57 58 #define FAT_NODE(node) ((node) ? (fat_node_t *) (node)->data : NULL) 59 #define FS_NODE(node) ((node) ? (node)->bp : NULL) 60 58 61 /** Futex protecting the list of cached free FAT nodes. */ 59 62 static futex_t ffn_futex = FUTEX_INITIALIZER; … … 65 68 { 66 69 futex_initialize(&node->lock, 1); 70 node->bp = NULL; 67 71 node->idx = NULL; 68 72 node->type = 0; … … 109 113 static fat_node_t *fat_node_get_new(void) 110 114 { 115 fs_node_t *fn; 111 116 fat_node_t *nodep; 112 117 … … 130 135 futex_up(&nodep->lock); 131 136 futex_up(&idxp_tmp->lock); 137 fn = FS_NODE(nodep); 132 138 } else { 133 139 skip_cache: 134 140 /* Try to allocate a new node structure. */ 135 141 futex_up(&ffn_futex); 142 fn = (fs_node_t *)malloc(sizeof(fs_node_t)); 143 if (!fn) 144 return NULL; 136 145 nodep = (fat_node_t *)malloc(sizeof(fat_node_t)); 137 if (!nodep) 146 if (!nodep) { 147 free(fn); 138 148 return NULL; 149 } 139 150 } 140 151 fat_node_initialize(nodep); 152 fn->data = nodep; 153 nodep->bp = fn; 141 154 142 155 return nodep; … … 147 160 * @param idxp Locked index structure. 148 161 */ 149 static void*fat_node_get_core(fat_idx_t *idxp)162 static fat_node_t *fat_node_get_core(fat_idx_t *idxp) 150 163 { 151 164 block_t *b; … … 224 237 * Forward declarations of FAT libfs operations. 225 238 */ 226 static void*fat_node_get(dev_handle_t, fs_index_t);227 static void fat_node_put( void*);228 static void*fat_create_node(dev_handle_t, int);229 static int fat_destroy_node( void*);230 static int fat_link( void *, void*, const char *);231 static int fat_unlink( void *, void*);232 static void *fat_match(void*, const char *);233 static fs_index_t fat_index_get( void*);234 static size_t fat_size_get( void*);235 static unsigned fat_lnkcnt_get( void*);236 static bool fat_has_children( void*);237 static void*fat_root_get(dev_handle_t);239 static fs_node_t *fat_node_get(dev_handle_t, fs_index_t); 240 static void fat_node_put(fs_node_t *); 241 static fs_node_t *fat_create_node(dev_handle_t, int); 242 static int fat_destroy_node(fs_node_t *); 243 static int fat_link(fs_node_t *, fs_node_t *, const char *); 244 static int fat_unlink(fs_node_t *, fs_node_t *); 245 static fs_node_t *fat_match(fs_node_t *, const char *); 246 static fs_index_t fat_index_get(fs_node_t *); 247 static size_t fat_size_get(fs_node_t *); 248 static unsigned fat_lnkcnt_get(fs_node_t *); 249 static bool fat_has_children(fs_node_t *); 250 static fs_node_t *fat_root_get(dev_handle_t); 238 251 static char fat_plb_get_char(unsigned); 239 static bool fat_is_directory( void*);240 static bool fat_is_file( void*node);252 static bool fat_is_directory(fs_node_t *); 253 static bool fat_is_file(fs_node_t *node); 241 254 242 255 /* … … 245 258 246 259 /** Instantiate a FAT in-core node. */ 247 void*fat_node_get(dev_handle_t dev_handle, fs_index_t index)248 { 249 void *node;260 fs_node_t *fat_node_get(dev_handle_t dev_handle, fs_index_t index) 261 { 262 fat_node_t *nodep; 250 263 fat_idx_t *idxp; 251 264 … … 254 267 return NULL; 255 268 /* idxp->lock held */ 256 node = fat_node_get_core(idxp);269 nodep = fat_node_get_core(idxp); 257 270 futex_up(&idxp->lock); 258 return node;259 } 260 261 void fat_node_put( void *node)262 { 263 fat_node_t *nodep = (fat_node_t *)node;271 return FS_NODE(nodep); 272 } 273 274 void fat_node_put(fs_node_t *fn) 275 { 276 fat_node_t *nodep = FAT_NODE(fn); 264 277 bool destroy = false; 265 278 … … 281 294 } 282 295 futex_up(&nodep->lock); 283 if (destroy) 284 free(node); 285 } 286 287 void *fat_create_node(dev_handle_t dev_handle, int flags) 296 if (destroy) { 297 free(nodep->bp); 298 free(nodep); 299 } 300 } 301 302 fs_node_t *fat_create_node(dev_handle_t dev_handle, int flags) 288 303 { 289 304 fat_idx_t *idxp; … … 311 326 if (!idxp) { 312 327 fat_free_clusters(bs, dev_handle, mcl); 313 fat_node_put( nodep);328 fat_node_put(FS_NODE(nodep)); 314 329 return NULL; 315 330 } … … 346 361 347 362 futex_up(&idxp->lock); 348 return nodep;349 } 350 351 int fat_destroy_node( void *node)352 { 353 fat_node_t *nodep = (fat_node_t *)node;363 return FS_NODE(nodep); 364 } 365 366 int fat_destroy_node(fs_node_t *fn) 367 { 368 fat_node_t *nodep = FAT_NODE(fn); 354 369 fat_bs_t *bs; 355 370 … … 365 380 * The node may not have any children. 366 381 */ 367 assert(fat_has_children( node) == false);382 assert(fat_has_children(fn) == false); 368 383 369 384 bs = block_bb_get(nodep->idx->dev_handle); … … 375 390 376 391 fat_idx_destroy(nodep->idx); 392 free(nodep->bp); 377 393 free(nodep); 378 394 return EOK; 379 395 } 380 396 381 int fat_link( void *prnt, void *chld, const char *name)382 { 383 fat_node_t *parentp = (fat_node_t *)prnt;384 fat_node_t *childp = (fat_node_t *)chld;397 int fat_link(fs_node_t *pfn, fs_node_t *cfn, const char *name) 398 { 399 fat_node_t *parentp = FAT_NODE(pfn); 400 fat_node_t *childp = FAT_NODE(cfn); 385 401 fat_dentry_t *d; 386 402 fat_bs_t *bs; … … 528 544 } 529 545 530 int fat_unlink( void *prnt, void *chld)531 { 532 fat_node_t *parentp = (fat_node_t *)prnt;533 fat_node_t *childp = (fat_node_t *)chld;546 int fat_unlink(fs_node_t *pfn, fs_node_t *cfn) 547 { 548 fat_node_t *parentp = FAT_NODE(pfn); 549 fat_node_t *childp = FAT_NODE(cfn); 534 550 fat_bs_t *bs; 535 551 fat_dentry_t *d; … … 568 584 } 569 585 570 void *fat_match(void *prnt, const char *component)586 fs_node_t *fat_match(fs_node_t *pfn, const char *component) 571 587 { 572 588 fat_bs_t *bs; 573 fat_node_t *parentp = (fat_node_t *)prnt;589 fat_node_t *parentp = FAT_NODE(pfn); 574 590 char name[FAT_NAME_LEN + 1 + FAT_EXT_LEN + 1]; 575 591 unsigned i, j; … … 604 620 if (fat_dentry_namecmp(name, component) == 0) { 605 621 /* hit */ 606 void *node;622 fat_node_t *nodep; 607 623 /* 608 624 * Assume tree hierarchy for locking. We … … 623 639 return NULL; 624 640 } 625 node = fat_node_get_core(idx);641 nodep = fat_node_get_core(idx); 626 642 futex_up(&idx->lock); 627 643 block_put(b); 628 return node;644 return FS_NODE(nodep); 629 645 } 630 646 } … … 636 652 } 637 653 638 fs_index_t fat_index_get(void *node) 639 { 640 fat_node_t *fnodep = (fat_node_t *)node; 641 if (!fnodep) 642 return 0; 643 return fnodep->idx->index; 644 } 645 646 size_t fat_size_get(void *node) 647 { 648 return ((fat_node_t *)node)->size; 649 } 650 651 unsigned fat_lnkcnt_get(void *node) 652 { 653 return ((fat_node_t *)node)->lnkcnt; 654 } 655 656 bool fat_has_children(void *node) 654 fs_index_t fat_index_get(fs_node_t *fn) 655 { 656 return FAT_NODE(fn)->idx->index; 657 } 658 659 size_t fat_size_get(fs_node_t *fn) 660 { 661 return FAT_NODE(fn)->size; 662 } 663 664 unsigned fat_lnkcnt_get(fs_node_t *fn) 665 { 666 return FAT_NODE(fn)->lnkcnt; 667 } 668 669 bool fat_has_children(fs_node_t *fn) 657 670 { 658 671 fat_bs_t *bs; 659 fat_node_t *nodep = (fat_node_t *)node;672 fat_node_t *nodep = FAT_NODE(fn); 660 673 unsigned bps; 661 674 unsigned dps; … … 705 718 } 706 719 707 void*fat_root_get(dev_handle_t dev_handle)720 fs_node_t *fat_root_get(dev_handle_t dev_handle) 708 721 { 709 722 return fat_node_get(dev_handle, 0); … … 715 728 } 716 729 717 bool fat_is_directory( void *node)718 { 719 return ((fat_node_t *)node)->type == FAT_DIRECTORY;720 } 721 722 bool fat_is_file( void *node)723 { 724 return ((fat_node_t *)node)->type == FAT_FILE;730 bool fat_is_directory(fs_node_t *fn) 731 { 732 return FAT_NODE(fn)->type == FAT_DIRECTORY; 733 } 734 735 bool fat_is_file(fs_node_t *fn) 736 { 737 return FAT_NODE(fn)->type == FAT_FILE; 725 738 } 726 739 … … 822 835 823 836 /* Initialize the root node. */ 824 f at_node_t *rootp = (fat_node_t *)malloc(sizeof(fat_node_t));825 if (!r ootp) {837 fs_node_t *rfn = (fs_node_t *)malloc(sizeof(fs_node_t)); 838 if (!rfn) { 826 839 block_fini(dev_handle); 827 840 fat_idx_fini_by_dev_handle(dev_handle); … … 829 842 return; 830 843 } 844 fat_node_t *rootp = (fat_node_t *)malloc(sizeof(fat_node_t)); 845 if (!rootp) { 846 free(rfn); 847 block_fini(dev_handle); 848 fat_idx_fini_by_dev_handle(dev_handle); 849 ipc_answer_0(rid, ENOMEM); 850 return; 851 } 831 852 fat_node_initialize(rootp); 832 853 833 854 fat_idx_t *ridxp = fat_idx_get_by_pos(dev_handle, FAT_CLST_ROOTPAR, 0); 834 855 if (!ridxp) { 856 free(rfn); 857 free(rootp); 835 858 block_fini(dev_handle); 836 free(rootp);837 859 fat_idx_fini_by_dev_handle(dev_handle); 838 860 ipc_answer_0(rid, ENOMEM); … … 849 871 rootp->idx = ridxp; 850 872 ridxp->nodep = rootp; 873 rootp->bp = rfn; 874 rfn->data = rootp; 851 875 852 876 futex_up(&ridxp->lock); … … 870 894 fs_index_t index = (fs_index_t)IPC_GET_ARG2(*request); 871 895 off_t pos = (off_t)IPC_GET_ARG3(*request); 872 fat_node_t *nodep = (fat_node_t *)fat_node_get(dev_handle, index); 896 fs_node_t *fn = fat_node_get(dev_handle, index); 897 fat_node_t *nodep; 873 898 fat_bs_t *bs; 874 899 uint16_t bps; … … 876 901 block_t *b; 877 902 878 if (! nodep) {903 if (!fn) { 879 904 ipc_answer_0(rid, ENOENT); 880 905 return; 881 906 } 907 nodep = FAT_NODE(fn); 882 908 883 909 ipc_callid_t callid; 884 910 size_t len; 885 911 if (!ipc_data_read_receive(&callid, &len)) { 886 fat_node_put( nodep);912 fat_node_put(fn); 887 913 ipc_answer_0(callid, EINVAL); 888 914 ipc_answer_0(rid, EINVAL); … … 955 981 } 956 982 miss: 957 fat_node_put( nodep);983 fat_node_put(fn); 958 984 ipc_answer_0(callid, ENOENT); 959 985 ipc_answer_1(rid, ENOENT, 0); … … 964 990 } 965 991 966 fat_node_put( nodep);992 fat_node_put(fn); 967 993 ipc_answer_1(rid, EOK, (ipcarg_t)bytes); 968 994 } … … 973 999 fs_index_t index = (fs_index_t)IPC_GET_ARG2(*request); 974 1000 off_t pos = (off_t)IPC_GET_ARG3(*request); 975 fat_node_t *nodep = (fat_node_t *)fat_node_get(dev_handle, index); 1001 fs_node_t *fn = fat_node_get(dev_handle, index); 1002 fat_node_t *nodep; 976 1003 fat_bs_t *bs; 977 1004 size_t bytes; … … 983 1010 int flags = BLOCK_FLAGS_NONE; 984 1011 985 if (! nodep) {1012 if (!fn) { 986 1013 ipc_answer_0(rid, ENOENT); 987 1014 return; 988 1015 } 1016 nodep = FAT_NODE(fn); 989 1017 990 1018 ipc_callid_t callid; 991 1019 size_t len; 992 1020 if (!ipc_data_write_receive(&callid, &len)) { 993 fat_node_put( nodep);1021 fat_node_put(fn); 994 1022 ipc_answer_0(callid, EINVAL); 995 1023 ipc_answer_0(rid, EINVAL); … … 1032 1060 } 1033 1061 ipc_answer_2(rid, EOK, bytes, nodep->size); 1034 fat_node_put( nodep);1062 fat_node_put(fn); 1035 1063 return; 1036 1064 } else { … … 1048 1076 if (status != EOK) { 1049 1077 /* could not allocate a chain of nclsts clusters */ 1050 fat_node_put( nodep);1078 fat_node_put(fn); 1051 1079 ipc_answer_0(callid, status); 1052 1080 ipc_answer_0(rid, status); … … 1069 1097 nodep->dirty = true; /* need to sync node */ 1070 1098 ipc_answer_2(rid, EOK, bytes, nodep->size); 1071 fat_node_put( nodep);1099 fat_node_put(fn); 1072 1100 return; 1073 1101 } … … 1079 1107 fs_index_t index = (fs_index_t)IPC_GET_ARG2(*request); 1080 1108 size_t size = (off_t)IPC_GET_ARG3(*request); 1081 fat_node_t *nodep = (fat_node_t *)fat_node_get(dev_handle, index); 1109 fs_node_t *fn = fat_node_get(dev_handle, index); 1110 fat_node_t *nodep; 1082 1111 fat_bs_t *bs; 1083 1112 uint16_t bps; … … 1086 1115 int rc; 1087 1116 1088 if (! nodep) {1117 if (!fn) { 1089 1118 ipc_answer_0(rid, ENOENT); 1090 1119 return; 1091 1120 } 1121 nodep = FAT_NODE(fn); 1092 1122 1093 1123 bs = block_bb_get(dev_handle); … … 1127 1157 rc = EOK; 1128 1158 } 1129 fat_node_put( nodep);1159 fat_node_put(fn); 1130 1160 ipc_answer_0(rid, rc); 1131 1161 return; … … 1138 1168 int rc; 1139 1169 1140 f at_node_t *nodep= fat_node_get(dev_handle, index);1141 if (! nodep) {1170 fs_node_t *fn = fat_node_get(dev_handle, index); 1171 if (!fn) { 1142 1172 ipc_answer_0(rid, ENOENT); 1143 1173 return; 1144 1174 } 1145 1175 1146 rc = fat_destroy_node( nodep);1176 rc = fat_destroy_node(fn); 1147 1177 ipc_answer_0(rid, rc); 1148 1178 }
Note:
See TracChangeset
for help on using the changeset viewer.