Changeset a33f0a6 in mainline for uspace/srv/fs/fat/fat_ops.c
- Timestamp:
- 2011-08-03T17:34:57Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 1940326
- Parents:
- 52a79081 (diff), 3fab770 (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
r52a79081 ra33f0a6 70 70 71 71 /** List of cached free FAT nodes. */ 72 static LIST_INITIALIZE(ffn_ head);72 static LIST_INITIALIZE(ffn_list); 73 73 74 74 /* … … 88 88 static aoff64_t fat_size_get(fs_node_t *); 89 89 static unsigned fat_lnkcnt_get(fs_node_t *); 90 static char fat_plb_get_char(unsigned);91 90 static bool fat_is_directory(fs_node_t *); 92 91 static bool fat_is_file(fs_node_t *node); … … 150 149 static int fat_node_fini_by_devmap_handle(devmap_handle_t devmap_handle) 151 150 { 152 link_t *lnk;153 151 fat_node_t *nodep; 154 152 int rc; … … 162 160 restart: 163 161 fibril_mutex_lock(&ffn_mutex); 164 for (lnk = ffn_head.next; lnk != &ffn_head; lnk = lnk->next) {162 list_foreach(ffn_list, lnk) { 165 163 nodep = list_get_instance(lnk, fat_node_t, ffn_link); 166 164 if (!fibril_mutex_trylock(&nodep->lock)) { … … 199 197 free(nodep); 200 198 201 /* Need to restart because we changed the ffn_headlist. */199 /* Need to restart because we changed ffn_list. */ 202 200 goto restart; 203 201 } … … 214 212 215 213 fibril_mutex_lock(&ffn_mutex); 216 if (!list_empty(&ffn_ head)) {214 if (!list_empty(&ffn_list)) { 217 215 /* Try to use a cached free node structure. */ 218 216 fat_idx_t *idxp_tmp; 219 nodep = list_get_instance(ffn_head.next, fat_node_t, ffn_link); 217 nodep = list_get_instance(list_first(&ffn_list), fat_node_t, 218 ffn_link); 220 219 if (!fibril_mutex_trylock(&nodep->lock)) 221 220 goto skip_cache; … … 464 463 if (nodep->idx) { 465 464 fibril_mutex_lock(&ffn_mutex); 466 list_append(&nodep->ffn_link, &ffn_ head);465 list_append(&nodep->ffn_link, &ffn_list); 467 466 fibril_mutex_unlock(&ffn_mutex); 468 467 } else { … … 823 822 } 824 823 825 char fat_plb_get_char(unsigned pos)826 {827 return fat_reg.plb_ro[pos % PLB_SIZE];828 }829 830 824 bool fat_is_directory(fs_node_t *fn) 831 825 { … … 858 852 .size_get = fat_size_get, 859 853 .lnkcnt_get = fat_lnkcnt_get, 860 .plb_get_char = fat_plb_get_char,861 854 .is_directory = fat_is_directory, 862 855 .is_file = fat_is_file, … … 865 858 866 859 /* 867 * VFSoperations.860 * FAT VFS_OUT operations. 868 861 */ 869 862 870 void fat_mounted(ipc_callid_t rid, ipc_call_t *request) 871 { 872 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 863 static int 864 fat_mounted(devmap_handle_t devmap_handle, const char *opts, fs_index_t *index, 865 aoff64_t *size, unsigned *linkcnt) 866 { 873 867 enum cache_mode cmode; 874 868 fat_bs_t *bs; 875 876 /* Accept the mount options */ 877 char *opts; 878 int rc = async_data_write_accept((void **) &opts, true, 0, 0, 0, NULL); 879 880 if (rc != EOK) { 881 async_answer_0(rid, rc); 882 return; 883 } 869 int rc; 884 870 885 871 /* Check for option enabling write through. */ … … 889 875 cmode = CACHE_MODE_WB; 890 876 891 free(opts);892 893 877 /* initialize libblock */ 894 rc = block_init(devmap_handle, BS_SIZE); 895 if (rc != EOK) { 896 async_answer_0(rid, rc); 897 return; 898 } 878 rc = block_init(EXCHANGE_SERIALIZE, devmap_handle, BS_SIZE); 879 if (rc != EOK) 880 return rc; 899 881 900 882 /* prepare the boot block */ … … 902 884 if (rc != EOK) { 903 885 block_fini(devmap_handle); 904 async_answer_0(rid, rc); 905 return; 886 return rc; 906 887 } 907 888 … … 911 892 if (BPS(bs) != BS_SIZE) { 912 893 block_fini(devmap_handle); 913 async_answer_0(rid, ENOTSUP); 914 return; 894 return ENOTSUP; 915 895 } 916 896 … … 919 899 if (rc != EOK) { 920 900 block_fini(devmap_handle); 921 async_answer_0(rid, rc); 922 return; 901 return rc; 923 902 } 924 903 … … 928 907 (void) block_cache_fini(devmap_handle); 929 908 block_fini(devmap_handle); 930 async_answer_0(rid, rc); 931 return; 909 return rc; 932 910 } 933 911 … … 936 914 (void) block_cache_fini(devmap_handle); 937 915 block_fini(devmap_handle); 938 async_answer_0(rid, rc); 939 return; 916 return rc; 940 917 } 941 918 … … 946 923 block_fini(devmap_handle); 947 924 fat_idx_fini_by_devmap_handle(devmap_handle); 948 async_answer_0(rid, ENOMEM); 949 return; 925 return ENOMEM; 950 926 } 951 927 … … 957 933 block_fini(devmap_handle); 958 934 fat_idx_fini_by_devmap_handle(devmap_handle); 959 async_answer_0(rid, ENOMEM); 960 return; 935 return ENOMEM; 961 936 } 962 937 fat_node_initialize(rootp); … … 969 944 block_fini(devmap_handle); 970 945 fat_idx_fini_by_devmap_handle(devmap_handle); 971 async_answer_0(rid, ENOMEM); 972 return; 946 return ENOMEM; 973 947 } 974 948 assert(ridxp->index == 0); … … 1004 978 fibril_mutex_unlock(&ridxp->lock); 1005 979 1006 async_answer_3(rid, EOK, ridxp->index, rootp->size, rootp->lnkcnt); 1007 } 1008 1009 void fat_mount(ipc_callid_t rid, ipc_call_t *request) 1010 { 1011 libfs_mount(&fat_libfs_ops, fat_reg.fs_handle, rid, request); 1012 } 1013 1014 void fat_unmounted(ipc_callid_t rid, ipc_call_t *request) 1015 { 1016 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 980 *index = ridxp->index; 981 *size = rootp->size; 982 *linkcnt = rootp->lnkcnt; 983 984 return EOK; 985 } 986 987 static int fat_unmounted(devmap_handle_t devmap_handle) 988 { 1017 989 fs_node_t *fn; 1018 990 fat_node_t *nodep; … … 1020 992 1021 993 rc = fat_root_get(&fn, devmap_handle); 1022 if (rc != EOK) { 1023 async_answer_0(rid, rc); 1024 return; 1025 } 994 if (rc != EOK) 995 return rc; 1026 996 nodep = FAT_NODE(fn); 1027 997 … … 1032 1002 if (nodep->refcnt != 2) { 1033 1003 (void) fat_node_put(fn); 1034 async_answer_0(rid, EBUSY); 1035 return; 1004 return EBUSY; 1036 1005 } 1037 1006 … … 1052 1021 block_fini(devmap_handle); 1053 1022 1054 async_answer_0(rid, EOK); 1055 } 1056 1057 void fat_unmount(ipc_callid_t rid, ipc_call_t *request) 1058 { 1059 libfs_unmount(&fat_libfs_ops, rid, request); 1060 } 1061 1062 void fat_lookup(ipc_callid_t rid, ipc_call_t *request) 1063 { 1064 libfs_lookup(&fat_libfs_ops, fat_reg.fs_handle, rid, request); 1065 } 1066 1067 void fat_read(ipc_callid_t rid, ipc_call_t *request) 1068 { 1069 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 1070 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 1071 aoff64_t pos = 1072 (aoff64_t) MERGE_LOUP32(IPC_GET_ARG3(*request), IPC_GET_ARG4(*request)); 1023 return EOK; 1024 } 1025 1026 static int 1027 fat_read(devmap_handle_t devmap_handle, fs_index_t index, aoff64_t pos, 1028 size_t *rbytes) 1029 { 1073 1030 fs_node_t *fn; 1074 1031 fat_node_t *nodep; … … 1079 1036 1080 1037 rc = fat_node_get(&fn, devmap_handle, index); 1081 if (rc != EOK) { 1082 async_answer_0(rid, rc); 1083 return; 1084 } 1085 if (!fn) { 1086 async_answer_0(rid, ENOENT); 1087 return; 1088 } 1038 if (rc != EOK) 1039 return rc; 1040 if (!fn) 1041 return ENOENT; 1089 1042 nodep = FAT_NODE(fn); 1090 1043 … … 1094 1047 fat_node_put(fn); 1095 1048 async_answer_0(callid, EINVAL); 1096 async_answer_0(rid, EINVAL); 1097 return; 1049 return EINVAL; 1098 1050 } 1099 1051 … … 1118 1070 fat_node_put(fn); 1119 1071 async_answer_0(callid, rc); 1120 async_answer_0(rid, rc); 1121 return; 1072 return rc; 1122 1073 } 1123 1074 (void) async_data_read_finalize(callid, … … 1126 1077 if (rc != EOK) { 1127 1078 fat_node_put(fn); 1128 async_answer_0(rid, rc); 1129 return; 1079 return rc; 1130 1080 } 1131 1081 } … … 1155 1105 (void) fat_node_put(fn); 1156 1106 async_answer_0(callid, rc); 1157 async_answer_0(rid, rc); 1158 return; 1107 return rc; 1159 1108 1160 1109 miss: … … 1164 1113 rc = fat_node_put(fn); 1165 1114 async_answer_0(callid, rc != EOK ? rc : ENOENT); 1166 async_answer_1(rid, rc != EOK ? rc : ENOENT, 0);1167 return ;1115 *rbytes = 0; 1116 return rc != EOK ? rc : ENOENT; 1168 1117 1169 1118 hit: … … 1177 1126 1178 1127 rc = fat_node_put(fn); 1179 async_answer_1(rid, rc, (sysarg_t)bytes); 1180 } 1181 1182 void fat_write(ipc_callid_t rid, ipc_call_t *request) 1183 { 1184 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 1185 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 1186 aoff64_t pos = 1187 (aoff64_t) MERGE_LOUP32(IPC_GET_ARG3(*request), IPC_GET_ARG4(*request)); 1128 *rbytes = bytes; 1129 return rc; 1130 } 1131 1132 static int 1133 fat_write(devmap_handle_t devmap_handle, fs_index_t index, aoff64_t pos, 1134 size_t *wbytes, aoff64_t *nsize) 1135 { 1188 1136 fs_node_t *fn; 1189 1137 fat_node_t *nodep; 1190 1138 fat_bs_t *bs; 1191 size_t bytes , size;1139 size_t bytes; 1192 1140 block_t *b; 1193 1141 aoff64_t boundary; … … 1196 1144 1197 1145 rc = fat_node_get(&fn, devmap_handle, index); 1198 if (rc != EOK) { 1199 async_answer_0(rid, rc); 1200 return; 1201 } 1202 if (!fn) { 1203 async_answer_0(rid, ENOENT); 1204 return; 1205 } 1146 if (rc != EOK) 1147 return rc; 1148 if (!fn) 1149 return ENOENT; 1206 1150 nodep = FAT_NODE(fn); 1207 1151 … … 1211 1155 (void) fat_node_put(fn); 1212 1156 async_answer_0(callid, EINVAL); 1213 async_answer_0(rid, EINVAL); 1214 return; 1157 return EINVAL; 1215 1158 } 1216 1159 … … 1240 1183 (void) fat_node_put(fn); 1241 1184 async_answer_0(callid, rc); 1242 async_answer_0(rid, rc); 1243 return; 1185 return rc; 1244 1186 } 1245 1187 rc = fat_block_get(&b, bs, nodep, pos / BPS(bs), flags); … … 1247 1189 (void) fat_node_put(fn); 1248 1190 async_answer_0(callid, rc); 1249 async_answer_0(rid, rc); 1250 return; 1191 return rc; 1251 1192 } 1252 1193 (void) async_data_write_finalize(callid, … … 1256 1197 if (rc != EOK) { 1257 1198 (void) fat_node_put(fn); 1258 async_answer_0(rid, rc); 1259 return; 1199 return rc; 1260 1200 } 1261 1201 if (pos + bytes > nodep->size) { … … 1263 1203 nodep->dirty = true; /* need to sync node */ 1264 1204 } 1265 size = nodep->size; 1205 *wbytes = bytes; 1206 *nsize = nodep->size; 1266 1207 rc = fat_node_put(fn); 1267 async_answer_2(rid, rc, bytes, nodep->size); 1268 return; 1208 return rc; 1269 1209 } else { 1270 1210 /* … … 1282 1222 (void) fat_node_put(fn); 1283 1223 async_answer_0(callid, rc); 1284 async_answer_0(rid, rc); 1285 return; 1224 return rc; 1286 1225 } 1287 1226 /* zero fill any gaps */ … … 1291 1230 (void) fat_node_put(fn); 1292 1231 async_answer_0(callid, rc); 1293 async_answer_0(rid, rc); 1294 return; 1232 return rc; 1295 1233 } 1296 1234 rc = _fat_block_get(&b, bs, devmap_handle, lcl, NULL, … … 1300 1238 (void) fat_node_put(fn); 1301 1239 async_answer_0(callid, rc); 1302 async_answer_0(rid, rc); 1303 return; 1240 return rc; 1304 1241 } 1305 1242 (void) async_data_write_finalize(callid, … … 1310 1247 (void) fat_free_clusters(bs, devmap_handle, mcl); 1311 1248 (void) fat_node_put(fn); 1312 async_answer_0(rid, rc); 1313 return; 1249 return rc; 1314 1250 } 1315 1251 /* … … 1321 1257 (void) fat_free_clusters(bs, devmap_handle, mcl); 1322 1258 (void) fat_node_put(fn); 1323 async_answer_0(rid, rc);1324 return;1325 }1326 nodep->size = size = pos + bytes;1259 return rc; 1260 } 1261 *nsize = nodep->size = pos + bytes; 1262 rc = fat_node_put(fn); 1327 1263 nodep->dirty = true; /* need to sync node */ 1328 rc = fat_node_put(fn); 1329 async_answer_2(rid, rc, bytes, size); 1330 return; 1331 } 1332 } 1333 1334 void fat_truncate(ipc_callid_t rid, ipc_call_t *request) 1335 { 1336 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 1337 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 1338 aoff64_t size = 1339 (aoff64_t) MERGE_LOUP32(IPC_GET_ARG3(*request), IPC_GET_ARG4(*request)); 1264 *wbytes = bytes; 1265 return rc; 1266 } 1267 } 1268 1269 static int 1270 fat_truncate(devmap_handle_t devmap_handle, fs_index_t index, aoff64_t size) 1271 { 1340 1272 fs_node_t *fn; 1341 1273 fat_node_t *nodep; … … 1344 1276 1345 1277 rc = fat_node_get(&fn, devmap_handle, index); 1346 if (rc != EOK) { 1347 async_answer_0(rid, rc); 1348 return; 1349 } 1350 if (!fn) { 1351 async_answer_0(rid, ENOENT); 1352 return; 1353 } 1278 if (rc != EOK) 1279 return rc; 1280 if (!fn) 1281 return ENOENT; 1354 1282 nodep = FAT_NODE(fn); 1355 1283 … … 1395 1323 out: 1396 1324 fat_node_put(fn); 1397 async_answer_0(rid, rc); 1398 return; 1399 } 1400 1401 void fat_close(ipc_callid_t rid, ipc_call_t *request) 1402 { 1403 async_answer_0(rid, EOK); 1404 } 1405 1406 void fat_destroy(ipc_callid_t rid, ipc_call_t *request) 1407 { 1408 devmap_handle_t devmap_handle = (devmap_handle_t)IPC_GET_ARG1(*request); 1409 fs_index_t index = (fs_index_t)IPC_GET_ARG2(*request); 1325 return rc; 1326 } 1327 1328 static int fat_close(devmap_handle_t devmap_handle, fs_index_t index) 1329 { 1330 return EOK; 1331 } 1332 1333 static int fat_destroy(devmap_handle_t devmap_handle, fs_index_t index) 1334 { 1410 1335 fs_node_t *fn; 1411 1336 fat_node_t *nodep; … … 1413 1338 1414 1339 rc = fat_node_get(&fn, devmap_handle, index); 1415 if (rc != EOK) { 1416 async_answer_0(rid, rc); 1417 return; 1418 } 1419 if (!fn) { 1420 async_answer_0(rid, ENOENT); 1421 return; 1422 } 1340 if (rc != EOK) 1341 return rc; 1342 if (!fn) 1343 return ENOENT; 1423 1344 1424 1345 nodep = FAT_NODE(fn); … … 1430 1351 1431 1352 rc = fat_destroy_node(fn); 1432 async_answer_0(rid, rc); 1433 } 1434 1435 void fat_open_node(ipc_callid_t rid, ipc_call_t *request) 1436 { 1437 libfs_open_node(&fat_libfs_ops, fat_reg.fs_handle, rid, request); 1438 } 1439 1440 void fat_stat(ipc_callid_t rid, ipc_call_t *request) 1441 { 1442 libfs_stat(&fat_libfs_ops, fat_reg.fs_handle, rid, request); 1443 } 1444 1445 void fat_sync(ipc_callid_t rid, ipc_call_t *request) 1446 { 1447 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 1448 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 1449 1353 return rc; 1354 } 1355 1356 static int fat_sync(devmap_handle_t devmap_handle, fs_index_t index) 1357 { 1450 1358 fs_node_t *fn; 1451 1359 int rc = fat_node_get(&fn, devmap_handle, index); 1452 if (rc != EOK) { 1453 async_answer_0(rid, rc); 1454 return; 1455 } 1456 if (!fn) { 1457 async_answer_0(rid, ENOENT); 1458 return; 1459 } 1360 if (rc != EOK) 1361 return rc; 1362 if (!fn) 1363 return ENOENT; 1460 1364 1461 1365 fat_node_t *nodep = FAT_NODE(fn); … … 1465 1369 1466 1370 fat_node_put(fn); 1467 async_answer_0(rid, rc); 1468 } 1371 return rc; 1372 } 1373 1374 vfs_out_ops_t fat_ops = { 1375 .mounted = fat_mounted, 1376 .unmounted = fat_unmounted, 1377 .read = fat_read, 1378 .write = fat_write, 1379 .truncate = fat_truncate, 1380 .close = fat_close, 1381 .destroy = fat_destroy, 1382 .sync = fat_sync, 1383 }; 1469 1384 1470 1385 /**
Note:
See TracChangeset
for help on using the changeset viewer.