Changes in uspace/srv/fs/fat/fat_ops.c [5ca5eaa7:efcebe1] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/fat/fat_ops.c
r5ca5eaa7 refcebe1 55 55 #include <sys/mman.h> 56 56 #include <align.h> 57 #include <malloc.h> 57 58 58 59 #define FAT_NODE(node) ((node) ? (fat_node_t *) (node)->data : NULL) … … 66 67 67 68 /** List of cached free FAT nodes. */ 68 static LIST_INITIALIZE(ffn_ head);69 static LIST_INITIALIZE(ffn_list); 69 70 70 71 /* … … 84 85 static aoff64_t fat_size_get(fs_node_t *); 85 86 static unsigned fat_lnkcnt_get(fs_node_t *); 86 static char fat_plb_get_char(unsigned);87 87 static bool fat_is_directory(fs_node_t *); 88 88 static bool fat_is_file(fs_node_t *node); … … 146 146 static int fat_node_fini_by_devmap_handle(devmap_handle_t devmap_handle) 147 147 { 148 link_t *lnk;149 148 fat_node_t *nodep; 150 149 int rc; … … 158 157 restart: 159 158 fibril_mutex_lock(&ffn_mutex); 160 for (lnk = ffn_head.next; lnk != &ffn_head; lnk = lnk->next) {159 list_foreach(ffn_list, lnk) { 161 160 nodep = list_get_instance(lnk, fat_node_t, ffn_link); 162 161 if (!fibril_mutex_trylock(&nodep->lock)) { … … 195 194 free(nodep); 196 195 197 /* Need to restart because we changed the ffn_headlist. */196 /* Need to restart because we changed ffn_list. */ 198 197 goto restart; 199 198 } … … 210 209 211 210 fibril_mutex_lock(&ffn_mutex); 212 if (!list_empty(&ffn_ head)) {211 if (!list_empty(&ffn_list)) { 213 212 /* Try to use a cached free node structure. */ 214 213 fat_idx_t *idxp_tmp; 215 nodep = list_get_instance(ffn_head.next, fat_node_t, ffn_link); 214 nodep = list_get_instance(list_first(&ffn_list), fat_node_t, 215 ffn_link); 216 216 if (!fibril_mutex_trylock(&nodep->lock)) 217 217 goto skip_cache; … … 472 472 if (nodep->idx) { 473 473 fibril_mutex_lock(&ffn_mutex); 474 list_append(&nodep->ffn_link, &ffn_ head);474 list_append(&nodep->ffn_link, &ffn_list); 475 475 fibril_mutex_unlock(&ffn_mutex); 476 476 } else { … … 722 722 (str_cmp((char *) d->name, FAT_NAME_DOT)) == 0) { 723 723 memset(d, 0, sizeof(fat_dentry_t)); 724 str_cpy((char *) d->name, 8, FAT_NAME_DOT);725 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); 726 726 d->attr = FAT_ATTR_SUBDIR; 727 727 d->firstc = host2uint16_t_le(childp->firstc); … … 732 732 (str_cmp((char *) d->name, FAT_NAME_DOT_DOT) == 0)) { 733 733 memset(d, 0, sizeof(fat_dentry_t)); 734 str_cpy((char *) d->name, 8, FAT_NAME_DOT_DOT);735 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); 736 736 d->attr = FAT_ATTR_SUBDIR; 737 737 d->firstc = (parentp->firstc == FAT_CLST_ROOT) ? … … 900 900 } 901 901 902 char fat_plb_get_char(unsigned pos)903 {904 return fat_reg.plb_ro[pos % PLB_SIZE];905 }906 907 902 bool fat_is_directory(fs_node_t *fn) 908 903 { … … 935 930 .size_get = fat_size_get, 936 931 .lnkcnt_get = fat_lnkcnt_get, 937 .plb_get_char = fat_plb_get_char,938 932 .is_directory = fat_is_directory, 939 933 .is_file = fat_is_file, … … 942 936 943 937 /* 944 * VFSoperations.938 * FAT VFS_OUT operations. 945 939 */ 946 940 947 void fat_mounted(ipc_callid_t rid, ipc_call_t *request) 948 { 949 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 941 static int 942 fat_mounted(devmap_handle_t devmap_handle, const char *opts, fs_index_t *index, 943 aoff64_t *size, unsigned *linkcnt) 944 { 950 945 enum cache_mode cmode; 951 946 fat_bs_t *bs; 952 953 /* Accept the mount options */ 954 char *opts; 955 int rc = async_data_write_accept((void **) &opts, true, 0, 0, 0, NULL); 956 957 if (rc != EOK) { 958 async_answer_0(rid, rc); 959 return; 960 } 961 947 int rc; 948 962 949 /* Check for option enabling write through. */ 963 950 if (str_cmp(opts, "wtcache") == 0) … … 966 953 cmode = CACHE_MODE_WB; 967 954 968 free(opts);969 970 955 /* initialize libblock */ 971 rc = block_init(devmap_handle, BS_SIZE); 972 if (rc != EOK) { 973 async_answer_0(rid, rc); 974 return; 975 } 956 rc = block_init(EXCHANGE_SERIALIZE, devmap_handle, BS_SIZE); 957 if (rc != EOK) 958 return rc; 976 959 977 960 /* prepare the boot block */ … … 979 962 if (rc != EOK) { 980 963 block_fini(devmap_handle); 981 async_answer_0(rid, rc); 982 return; 964 return rc; 983 965 } 984 966 … … 988 970 if (BPS(bs) != BS_SIZE) { 989 971 block_fini(devmap_handle); 990 async_answer_0(rid, ENOTSUP); 991 return; 972 return ENOTSUP; 992 973 } 993 974 … … 996 977 if (rc != EOK) { 997 978 block_fini(devmap_handle); 998 async_answer_0(rid, rc); 999 return; 979 return rc; 1000 980 } 1001 981 … … 1005 985 (void) block_cache_fini(devmap_handle); 1006 986 block_fini(devmap_handle); 1007 async_answer_0(rid, rc); 1008 return; 987 return rc; 1009 988 } 1010 989 … … 1013 992 (void) block_cache_fini(devmap_handle); 1014 993 block_fini(devmap_handle); 1015 async_answer_0(rid, rc); 1016 return; 994 return rc; 1017 995 } 1018 996 … … 1023 1001 block_fini(devmap_handle); 1024 1002 fat_idx_fini_by_devmap_handle(devmap_handle); 1025 async_answer_0(rid, ENOMEM); 1026 return; 1003 return ENOMEM; 1027 1004 } 1028 1005 fs_node_initialize(rfn); … … 1033 1010 block_fini(devmap_handle); 1034 1011 fat_idx_fini_by_devmap_handle(devmap_handle); 1035 async_answer_0(rid, ENOMEM); 1036 return; 1012 return ENOMEM; 1037 1013 } 1038 1014 fat_node_initialize(rootp); … … 1045 1021 block_fini(devmap_handle); 1046 1022 fat_idx_fini_by_devmap_handle(devmap_handle); 1047 async_answer_0(rid, ENOMEM); 1048 return; 1023 return ENOMEM; 1049 1024 } 1050 1025 assert(ridxp->index == 0); … … 1063 1038 fibril_mutex_unlock(&ridxp->lock); 1064 1039 1065 async_answer_3(rid, EOK, ridxp->index, rootp->size, rootp->lnkcnt); 1066 } 1067 1068 void fat_mount(ipc_callid_t rid, ipc_call_t *request) 1069 { 1070 libfs_mount(&fat_libfs_ops, fat_reg.fs_handle, rid, request); 1071 } 1072 1073 void fat_unmounted(ipc_callid_t rid, ipc_call_t *request) 1074 { 1075 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 1040 *index = ridxp->index; 1041 *size = rootp->size; 1042 *linkcnt = rootp->lnkcnt; 1043 1044 return EOK; 1045 } 1046 1047 static int fat_unmounted(devmap_handle_t devmap_handle) 1048 { 1076 1049 fs_node_t *fn; 1077 1050 fat_node_t *nodep; … … 1079 1052 1080 1053 rc = fat_root_get(&fn, devmap_handle); 1081 if (rc != EOK) { 1082 async_answer_0(rid, rc); 1083 return; 1084 } 1054 if (rc != EOK) 1055 return rc; 1085 1056 nodep = FAT_NODE(fn); 1086 1057 … … 1091 1062 if (nodep->refcnt != 2) { 1092 1063 (void) fat_node_put(fn); 1093 async_answer_0(rid, EBUSY); 1094 return; 1064 return EBUSY; 1095 1065 } 1096 1066 … … 1111 1081 block_fini(devmap_handle); 1112 1082 1113 async_answer_0(rid, EOK); 1114 } 1115 1116 void fat_unmount(ipc_callid_t rid, ipc_call_t *request) 1117 { 1118 libfs_unmount(&fat_libfs_ops, rid, request); 1119 } 1120 1121 void fat_lookup(ipc_callid_t rid, ipc_call_t *request) 1122 { 1123 libfs_lookup(&fat_libfs_ops, fat_reg.fs_handle, rid, request); 1124 } 1125 1126 void fat_read(ipc_callid_t rid, ipc_call_t *request) 1127 { 1128 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 1129 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 1130 aoff64_t pos = 1131 (aoff64_t) MERGE_LOUP32(IPC_GET_ARG3(*request), IPC_GET_ARG4(*request)); 1083 return EOK; 1084 } 1085 1086 static int 1087 fat_read(devmap_handle_t devmap_handle, fs_index_t index, aoff64_t pos, 1088 size_t *rbytes) 1089 { 1132 1090 fs_node_t *fn; 1133 1091 fat_node_t *nodep; … … 1138 1096 1139 1097 rc = fat_node_get(&fn, devmap_handle, index); 1140 if (rc != EOK) { 1141 async_answer_0(rid, rc); 1142 return; 1143 } 1144 if (!fn) { 1145 async_answer_0(rid, ENOENT); 1146 return; 1147 } 1098 if (rc != EOK) 1099 return rc; 1100 if (!fn) 1101 return ENOENT; 1148 1102 nodep = FAT_NODE(fn); 1149 1103 … … 1153 1107 fat_node_put(fn); 1154 1108 async_answer_0(callid, EINVAL); 1155 async_answer_0(rid, EINVAL); 1156 return; 1109 return EINVAL; 1157 1110 } 1158 1111 … … 1177 1130 fat_node_put(fn); 1178 1131 async_answer_0(callid, rc); 1179 async_answer_0(rid, rc); 1180 return; 1132 return rc; 1181 1133 } 1182 1134 (void) async_data_read_finalize(callid, … … 1185 1137 if (rc != EOK) { 1186 1138 fat_node_put(fn); 1187 async_answer_0(rid, rc); 1188 return; 1139 return rc; 1189 1140 } 1190 1141 } … … 1243 1194 rc = fat_node_put(fn); 1244 1195 async_answer_0(callid, rc != EOK ? rc : ENOENT); 1245 async_answer_1(rid, rc != EOK ? rc : ENOENT, 0);1246 return ;1196 *rbytes = 0; 1197 return rc != EOK ? rc : ENOENT; 1247 1198 1248 1199 err: 1249 1200 (void) fat_node_put(fn); 1250 1201 async_answer_0(callid, rc); 1251 async_answer_0(rid, rc); 1252 return; 1202 return rc; 1253 1203 1254 1204 hit: … … 1258 1208 1259 1209 rc = fat_node_put(fn); 1260 async_answer_1(rid, rc, (sysarg_t)bytes); 1261 } 1262 1263 void fat_write(ipc_callid_t rid, ipc_call_t *request) 1264 { 1265 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 1266 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 1267 aoff64_t pos = 1268 (aoff64_t) MERGE_LOUP32(IPC_GET_ARG3(*request), IPC_GET_ARG4(*request)); 1210 *rbytes = bytes; 1211 return rc; 1212 } 1213 1214 static int 1215 fat_write(devmap_handle_t devmap_handle, fs_index_t index, aoff64_t pos, 1216 size_t *wbytes, aoff64_t *nsize) 1217 { 1269 1218 fs_node_t *fn; 1270 1219 fat_node_t *nodep; 1271 1220 fat_bs_t *bs; 1272 size_t bytes , size;1221 size_t bytes; 1273 1222 block_t *b; 1274 1223 aoff64_t boundary; … … 1277 1226 1278 1227 rc = fat_node_get(&fn, devmap_handle, index); 1279 if (rc != EOK) { 1280 async_answer_0(rid, rc); 1281 return; 1282 } 1283 if (!fn) { 1284 async_answer_0(rid, ENOENT); 1285 return; 1286 } 1228 if (rc != EOK) 1229 return rc; 1230 if (!fn) 1231 return ENOENT; 1287 1232 nodep = FAT_NODE(fn); 1288 1233 … … 1292 1237 (void) fat_node_put(fn); 1293 1238 async_answer_0(callid, EINVAL); 1294 async_answer_0(rid, EINVAL); 1295 return; 1239 return EINVAL; 1296 1240 } 1297 1241 … … 1321 1265 (void) fat_node_put(fn); 1322 1266 async_answer_0(callid, rc); 1323 async_answer_0(rid, rc); 1324 return; 1267 return rc; 1325 1268 } 1326 1269 rc = fat_block_get(&b, bs, nodep, pos / BPS(bs), flags); … … 1328 1271 (void) fat_node_put(fn); 1329 1272 async_answer_0(callid, rc); 1330 async_answer_0(rid, rc); 1331 return; 1273 return rc; 1332 1274 } 1333 1275 (void) async_data_write_finalize(callid, … … 1337 1279 if (rc != EOK) { 1338 1280 (void) fat_node_put(fn); 1339 async_answer_0(rid, rc); 1340 return; 1281 return rc; 1341 1282 } 1342 1283 if (pos + bytes > nodep->size) { … … 1344 1285 nodep->dirty = true; /* need to sync node */ 1345 1286 } 1346 size = nodep->size; 1287 *wbytes = bytes; 1288 *nsize = nodep->size; 1347 1289 rc = fat_node_put(fn); 1348 async_answer_2(rid, rc, bytes, nodep->size); 1349 return; 1290 return rc; 1350 1291 } else { 1351 1292 /* … … 1363 1304 (void) fat_node_put(fn); 1364 1305 async_answer_0(callid, rc); 1365 async_answer_0(rid, rc); 1366 return; 1306 return rc; 1367 1307 } 1368 1308 /* zero fill any gaps */ … … 1372 1312 (void) fat_node_put(fn); 1373 1313 async_answer_0(callid, rc); 1374 async_answer_0(rid, rc); 1375 return; 1314 return rc; 1376 1315 } 1377 1316 rc = _fat_block_get(&b, bs, devmap_handle, lcl, NULL, … … 1381 1320 (void) fat_node_put(fn); 1382 1321 async_answer_0(callid, rc); 1383 async_answer_0(rid, rc); 1384 return; 1322 return rc; 1385 1323 } 1386 1324 (void) async_data_write_finalize(callid, … … 1391 1329 (void) fat_free_clusters(bs, devmap_handle, mcl); 1392 1330 (void) fat_node_put(fn); 1393 async_answer_0(rid, rc); 1394 return; 1331 return rc; 1395 1332 } 1396 1333 /* … … 1402 1339 (void) fat_free_clusters(bs, devmap_handle, mcl); 1403 1340 (void) fat_node_put(fn); 1404 async_answer_0(rid, rc);1405 return;1406 }1407 nodep->size = size = pos + bytes;1341 return rc; 1342 } 1343 *nsize = nodep->size = pos + bytes; 1344 rc = fat_node_put(fn); 1408 1345 nodep->dirty = true; /* need to sync node */ 1409 rc = fat_node_put(fn); 1410 async_answer_2(rid, rc, bytes, size); 1411 return; 1412 } 1413 } 1414 1415 void fat_truncate(ipc_callid_t rid, ipc_call_t *request) 1416 { 1417 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 1418 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 1419 aoff64_t size = 1420 (aoff64_t) MERGE_LOUP32(IPC_GET_ARG3(*request), IPC_GET_ARG4(*request)); 1346 *wbytes = bytes; 1347 return rc; 1348 } 1349 } 1350 1351 static int 1352 fat_truncate(devmap_handle_t devmap_handle, fs_index_t index, aoff64_t size) 1353 { 1421 1354 fs_node_t *fn; 1422 1355 fat_node_t *nodep; … … 1425 1358 1426 1359 rc = fat_node_get(&fn, devmap_handle, index); 1427 if (rc != EOK) { 1428 async_answer_0(rid, rc); 1429 return; 1430 } 1431 if (!fn) { 1432 async_answer_0(rid, ENOENT); 1433 return; 1434 } 1360 if (rc != EOK) 1361 return rc; 1362 if (!fn) 1363 return ENOENT; 1435 1364 nodep = FAT_NODE(fn); 1436 1365 … … 1476 1405 out: 1477 1406 fat_node_put(fn); 1478 async_answer_0(rid, rc); 1479 return; 1480 } 1481 1482 void fat_close(ipc_callid_t rid, ipc_call_t *request) 1483 { 1484 async_answer_0(rid, EOK); 1485 } 1486 1487 void fat_destroy(ipc_callid_t rid, ipc_call_t *request) 1488 { 1489 devmap_handle_t devmap_handle = (devmap_handle_t)IPC_GET_ARG1(*request); 1490 fs_index_t index = (fs_index_t)IPC_GET_ARG2(*request); 1407 return rc; 1408 } 1409 1410 static int fat_close(devmap_handle_t devmap_handle, fs_index_t index) 1411 { 1412 return EOK; 1413 } 1414 1415 static int fat_destroy(devmap_handle_t devmap_handle, fs_index_t index) 1416 { 1491 1417 fs_node_t *fn; 1492 1418 fat_node_t *nodep; … … 1494 1420 1495 1421 rc = fat_node_get(&fn, devmap_handle, index); 1496 if (rc != EOK) { 1497 async_answer_0(rid, rc); 1498 return; 1499 } 1500 if (!fn) { 1501 async_answer_0(rid, ENOENT); 1502 return; 1503 } 1422 if (rc != EOK) 1423 return rc; 1424 if (!fn) 1425 return ENOENT; 1504 1426 1505 1427 nodep = FAT_NODE(fn); … … 1511 1433 1512 1434 rc = fat_destroy_node(fn); 1513 async_answer_0(rid, rc); 1514 } 1515 1516 void fat_open_node(ipc_callid_t rid, ipc_call_t *request) 1517 { 1518 libfs_open_node(&fat_libfs_ops, fat_reg.fs_handle, rid, request); 1519 } 1520 1521 void fat_stat(ipc_callid_t rid, ipc_call_t *request) 1522 { 1523 libfs_stat(&fat_libfs_ops, fat_reg.fs_handle, rid, request); 1524 } 1525 1526 void fat_sync(ipc_callid_t rid, ipc_call_t *request) 1527 { 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 1435 return rc; 1436 } 1437 1438 static int fat_sync(devmap_handle_t devmap_handle, fs_index_t index) 1439 { 1531 1440 fs_node_t *fn; 1532 1441 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 } 1442 if (rc != EOK) 1443 return rc; 1444 if (!fn) 1445 return ENOENT; 1541 1446 1542 1447 fat_node_t *nodep = FAT_NODE(fn); … … 1546 1451 1547 1452 fat_node_put(fn); 1548 async_answer_0(rid, rc); 1549 } 1453 return rc; 1454 } 1455 1456 vfs_out_ops_t fat_ops = { 1457 .mounted = fat_mounted, 1458 .unmounted = fat_unmounted, 1459 .read = fat_read, 1460 .write = fat_write, 1461 .truncate = fat_truncate, 1462 .close = fat_close, 1463 .destroy = fat_destroy, 1464 .sync = fat_sync, 1465 }; 1550 1466 1551 1467 /**
Note:
See TracChangeset
for help on using the changeset viewer.