Changeset 831507b in mainline
- Timestamp:
- 2012-04-14T14:00:02Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b6d7b7c
- Parents:
- 1fff583 (diff), 1db6dfd (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. - Files:
-
- 2 added
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
tools/imgutil.py
r1fff583 r831507b 92 92 if name in exclude_names: 93 93 continue 94 94 95 item = ItemToPack(path, name) 96 95 97 if not (item.is_dir or item.is_file): 96 98 continue 99 97 100 yield item 98 101 … … 102 105 inf = open(item.path, 'rb') 103 106 rd = 0 107 104 108 while (rd < item.size): 105 109 data = bytes(inf.read(chunk_size)) 106 110 yield data 107 111 rd += len(data) 112 108 113 inf.close() -
tools/mkfat.py
r1fff583 r831507b 168 168 """ 169 169 170 LFN_ENTRY = """little: 171 uint8_t pos 172 uint16_t name1[5] 173 uint8_t attr 174 uint8_t type 175 uint8_t csum 176 uint16_t name2[6] 177 uint16_t fc 178 uint16_t name3[2] 179 """ 180 181 # Global variable to hold the file names in 8.3 format. Needed to 182 # keep track of "number" when creating a short fname from a LFN. 183 name83_list = [] 184 185 def name83(fname): 186 "Create a 8.3 name for the given fname" 187 188 # FIXME: filter illegal characters 189 parts = fname.split('.') 190 191 name = '' 192 ext = '' 193 lfn = False 194 195 if len(fname) > 11 : 170 LFN_DIR_ENTRY = """little: 171 uint8_t seq /* sequence number */ 172 char name1[10] /* first part of the name */ 173 uint8_t attr /* attributes */ 174 uint8_t rec_type /* LFN record type */ 175 uint8_t checksum /* LFN checksum */ 176 char name2[12] /* second part of the name */ 177 uint16_t cluster /* cluster */ 178 char name3[4] /* third part of the name */ 179 """ 180 181 lchars = set(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 182 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 183 'U', 'V', 'W', 'X', 'Y', 'Z', 184 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 185 '!', '#', '$', '%', '&', '\'', '(', ')', '-', '@', 186 '^', '_', '`', '{', '}', '~', '.']) 187 188 def fat_lchars(name): 189 "Filter FAT legal characters" 190 191 filtered_name = '' 192 filtered = False 193 194 for char in name.encode('ascii', 'replace').upper(): 195 if char in lchars: 196 filtered_name += char 197 else: 198 filtered_name += b'_' 199 filtered = True 200 201 return (filtered_name, filtered) 202 203 def fat_name83(name, name83_list): 204 "Create a 8.3 name for the given name" 205 206 ascii_name, lfn = fat_lchars(name) 207 ascii_parts = ascii_name.split('.') 208 209 short_name = '' 210 short_ext = '' 211 212 if len(ascii_name) > 11: 196 213 lfn = True 197 198 if len( parts) > 0:199 name =parts[0]200 if len( name) > 8:214 215 if len(ascii_parts) > 0: 216 short_name = ascii_parts[0] 217 if len(short_name) > 8: 201 218 lfn = True 202 203 if len( parts) > 1:204 ext =parts[-1]205 if len( ext) > 3:219 220 if len(ascii_parts) > 1: 221 short_ext = ascii_parts[-1] 222 if len(short_ext) > 3: 206 223 lfn = True 207 208 if len( parts) > 2:224 225 if len(ascii_parts) > 2: 209 226 lfn = True 210 211 if (lfn == False) : 212 return (name.ljust(8)[0:8], ext.ljust(3)[0:3], False) 213 227 228 if lfn == False: 229 name83_list.append(short_name + '.' + short_ext) 230 return (short_name.ljust(8)[0:8], short_ext.ljust(3)[0:3], False) 231 214 232 # For filenames with multiple extensions, we treat the last one 215 233 # as the actual extension. The rest of the filename is stripped 216 234 # of dots and concatenated to form the short name 217 for _name in parts[1:-1]: 218 name = name + _name 219 220 global name83_list 221 for number in range(1, 10000) : 222 number_str = '~' + str(number) 223 224 if len(name) + len(number_str) > 8 : 225 name = name[0:8 - len(number_str)] 226 227 name = name + number_str; 228 229 if (name + ext) not in name83_list : 235 for part in ascii_parts[1:-1]: 236 short_name += part 237 238 for number in range(1, 999999): 239 number_str = ('~' + str(number)).upper() 240 241 if len(short_name) + len(number_str) > 8: 242 short_name = short_name[0:8 - len(number_str)] 243 244 short_name += number_str; 245 246 if not (short_name + '.' + short_ext) in name83_list: 230 247 break 231 232 name83_list.append(name + ext) 233 234 return (name.ljust(8)[0:8], ext.ljust(3)[0:3], True) 235 236 def get_utf16(name, l) : 237 "Create a int array out of a string which we can store in uint16_t arrays" 238 239 bs = [0xFFFF for i in range(l)] 240 241 for i in range(len(name)) : 242 bs[i] = ord(name[i]) 243 244 if (len(name) < l) : 245 bs[len(name)] = 0; 246 247 return bs 248 249 def create_lfn_entry((name, index)) : 250 entry = xstruct.create(LFN_ENTRY) 251 252 entry.name1 = get_utf16(name[0:5], 5) 253 entry.name2 = get_utf16(name[5:11], 6) 254 entry.name3 = get_utf16(name[11:13], 2) 255 entry.pos = index 256 257 entry.attr = 0xF 258 entry.fc = 0 259 entry.type = 0 260 261 return entry 262 263 def create_dirent(name, directory, cluster, size): 248 249 name83_list.append(short_name + '.' + short_ext) 250 return (short_name.ljust(8)[0:8], short_ext.ljust(3)[0:3], True) 251 252 def create_lfn_dirent(name, seq, checksum): 253 "Create LFN directory entry" 254 255 entry = xstruct.create(LFN_DIR_ENTRY) 256 name_rest = name[26:] 257 258 if len(name_rest) > 0: 259 entry.seq = seq 260 else: 261 entry.seq = seq | 0x40 262 263 entry.name1 = name[0:10] 264 entry.name2 = name[10:22] 265 entry.name3 = name[22:26] 266 267 entry.attr = 0x0F 268 entry.rec_type = 0 269 entry.checksum = checksum 270 entry.cluster = 0 271 272 return (entry, name_rest) 273 274 def lfn_checksum(name): 275 "Calculate LFN checksum" 276 277 checksum = 0 278 for i in range(0, 11): 279 checksum = (((checksum & 1) << 7) + (checksum >> 1) + ord(name[i])) & 0xFF 280 281 return checksum 282 283 def create_dirent(name, name83_list, directory, cluster, size): 284 short_name, short_ext, lfn = fat_name83(name, name83_list) 264 285 265 286 dir_entry = xstruct.create(DIR_ENTRY) 266 287 267 dir_entry.name, dir_entry.ext, lfn = name83(name) 268 269 dir_entry.name = dir_entry.name.upper().encode('ascii') 270 dir_entry.ext = dir_entry.ext.upper().encode('ascii') 271 288 dir_entry.name = short_name 289 dir_entry.ext = short_ext 290 272 291 if (directory): 273 292 dir_entry.attr = 0x30 … … 289 308 dir_entry.size = size 290 309 291 292 310 if not lfn: 293 311 return [dir_entry] 294 295 n = len(name) / 13 + 1 296 names = [(name[i * 13: (i + 1) * 13 + 1], i + 1) for i in range(n)] 297 298 entries = sorted(map (create_lfn_entry, names), reverse = True, key = lambda e : e.pos) 299 entries[0].pos |= 0x40 300 301 fname11 = dir_entry.name + dir_entry.ext 302 303 csum = 0 304 for i in range(0, 11) : 305 csum = ((csum & 1) << 7) + (csum >> 1) + ord(fname11[i]) 306 csum = csum & 0xFF 307 308 for e in entries : 309 e.csum = csum; 310 311 entries.append(dir_entry) 312 312 313 long_name = name.encode('utf_16_le') 314 entries = [dir_entry] 315 316 seq = 1 317 checksum = lfn_checksum(dir_entry.name + dir_entry.ext) 318 319 while len(long_name) > 0: 320 long_entry, long_name = create_lfn_dirent(long_name, seq, checksum) 321 entries.append(long_entry) 322 seq += 1 323 324 entries.reverse() 313 325 return entries 314 326 … … 355 367 356 368 directory = [] 357 358 if (not head): 369 name83_list = [] 370 371 if not head: 359 372 # Directory cluster preallocation 360 373 empty_cluster = fat.index(0) 361 fat[empty_cluster] = 0x ffff374 fat[empty_cluster] = 0xFFFF 362 375 363 376 directory.append(create_dot_dirent(empty_cluster)) … … 366 379 empty_cluster = 0 367 380 368 for item in listdir_items(root): 381 for item in listdir_items(root): 369 382 if item.is_file: 370 383 rv = write_file(item, outf, cluster_size, data_start, fat, reserved_clusters) 371 directory.extend(create_dirent(item.name, False, rv[0], rv[1]))384 directory.extend(create_dirent(item.name, name83_list, False, rv[0], rv[1])) 372 385 elif item.is_dir: 373 386 rv = recursion(False, item.path, outf, cluster_size, root_start, data_start, fat, reserved_clusters, dirent_size, empty_cluster) 374 directory.extend(create_dirent(item.name, True, rv[0], rv[1]))375 376 if (head):387 directory.extend(create_dirent(item.name, name83_list, True, rv[0], rv[1])) 388 389 if head: 377 390 outf.seek(root_start) 378 391 for dir_entry in directory: … … 431 444 extra_bytes = int(sys.argv[1]) 432 445 433 path = os.path.abspath(sys.argv[2] )446 path = os.path.abspath(sys.argv[2].decode()) 434 447 if (not os.path.isdir(path)): 435 448 print("<PATH> must be a directory") … … 529 542 530 543 outf.close() 531 544 532 545 if __name__ == '__main__': 533 546 main() -
uspace/app/tester/Makefile
r1fff583 r831507b 50 50 vfs/vfs1.c \ 51 51 ipc/ping_pong.c \ 52 ipc/starve.c \ 52 53 loop/loop1.c \ 53 54 mm/common.c \ -
uspace/app/tester/tester.c
r1fff583 r831507b 60 60 #include "vfs/vfs1.def" 61 61 #include "ipc/ping_pong.def" 62 #include "ipc/starve.def" 62 63 #include "loop/loop1.def" 63 64 #include "mm/malloc1.def" -
uspace/app/tester/tester.h
r1fff583 r831507b 93 93 extern const char *test_vfs1(void); 94 94 extern const char *test_ping_pong(void); 95 extern const char *test_starve_ipc(void); 95 96 extern const char *test_loop1(void); 96 97 extern const char *test_malloc1(void); -
uspace/lib/c/generic/async.c
r1fff583 r831507b 189 189 /** If reply was received. */ 190 190 bool done; 191 192 /** If the message / reply should be discarded on arrival. */ 193 bool forget; 194 195 /** If already destroyed. */ 196 bool destroyed; 191 197 192 198 /** Pointer to where the answer data is stored. */ … … 240 246 /** Identifier of the incoming connection handled by the current fibril. */ 241 247 static fibril_local connection_t *fibril_connection; 248 249 static void to_event_initialize(to_event_t *to) 250 { 251 struct timeval tv = { 0, 0 }; 252 253 to->inlist = false; 254 to->occurred = false; 255 link_initialize(&to->link); 256 to->expires = tv; 257 } 258 259 static void wu_event_initialize(wu_event_t *wu) 260 { 261 wu->inlist = false; 262 link_initialize(&wu->link); 263 } 264 265 void awaiter_initialize(awaiter_t *aw) 266 { 267 aw->fid = 0; 268 aw->active = false; 269 to_event_initialize(&aw->to_event); 270 wu_event_initialize(&aw->wu_event); 271 } 272 273 static amsg_t *amsg_create(void) 274 { 275 amsg_t *msg; 276 277 msg = malloc(sizeof(amsg_t)); 278 if (msg) { 279 msg->done = false; 280 msg->forget = false; 281 msg->destroyed = false; 282 msg->dataptr = NULL; 283 msg->retval = (sysarg_t) EINVAL; 284 awaiter_initialize(&msg->wdata); 285 } 286 287 return msg; 288 } 289 290 static void amsg_destroy(amsg_t *msg) 291 { 292 assert(!msg->destroyed); 293 msg->destroyed = true; 294 free(msg); 295 } 242 296 243 297 static void *default_client_data_constructor(void) … … 963 1017 964 1018 suseconds_t timeout; 1019 unsigned int flags = SYNCH_FLAGS_NONE; 965 1020 if (!list_empty(&timeout_list)) { 966 1021 awaiter_t *waiter = list_get_instance( … … 973 1028 futex_up(&async_futex); 974 1029 handle_expired_timeouts(); 975 continue; 976 } else 1030 /* 1031 * Notice that even if the event(s) already 1032 * expired (and thus the other fibril was 1033 * supposed to be running already), 1034 * we check for incoming IPC. 1035 * 1036 * Otherwise, a fibril that continuously 1037 * creates (almost) expired events could 1038 * prevent IPC retrieval from the kernel. 1039 */ 1040 timeout = 0; 1041 flags = SYNCH_FLAGS_NON_BLOCKING; 1042 1043 } else { 977 1044 timeout = tv_sub(&waiter->to_event.expires, &tv); 978 } else 1045 futex_up(&async_futex); 1046 } 1047 } else { 1048 futex_up(&async_futex); 979 1049 timeout = SYNCH_NO_TIMEOUT; 980 981 futex_up(&async_futex); 1050 } 982 1051 983 1052 atomic_inc(&threads_in_ipc_wait); 984 1053 985 1054 ipc_call_t call; 986 ipc_callid_t callid = ipc_wait_cycle(&call, timeout, 987 SYNCH_FLAGS_NONE); 1055 ipc_callid_t callid = ipc_wait_cycle(&call, timeout, flags); 988 1056 989 1057 atomic_dec(&threads_in_ipc_wait); … … 1100 1168 1101 1169 msg->done = true; 1102 if (!msg->wdata.active) { 1170 1171 if (msg->forget) { 1172 assert(msg->wdata.active); 1173 amsg_destroy(msg); 1174 } else if (!msg->wdata.active) { 1103 1175 msg->wdata.active = true; 1104 1176 fibril_add_ready(msg->wdata.fid); 1105 1177 } 1106 1178 1107 1179 futex_up(&async_futex); 1108 1180 } … … 1131 1203 return 0; 1132 1204 1133 amsg_t *msg = malloc(sizeof(amsg_t));1205 amsg_t *msg = amsg_create(); 1134 1206 if (msg == NULL) 1135 1207 return 0; 1136 1208 1137 msg->done = false;1138 1209 msg->dataptr = dataptr; 1139 1140 msg->wdata.to_event.inlist = false;1141 1142 /*1143 * We may sleep in the next method,1144 * but it will use its own means1145 */1146 1210 msg->wdata.active = true; 1147 1211 … … 1177 1241 return 0; 1178 1242 1179 amsg_t *msg = malloc(sizeof(amsg_t)); 1180 1243 amsg_t *msg = amsg_create(); 1181 1244 if (msg == NULL) 1182 1245 return 0; 1183 1246 1184 msg->done = false;1185 1247 msg->dataptr = dataptr; 1186 1187 msg->wdata.to_event.inlist = false;1188 1189 /*1190 * We may sleep in the next method,1191 * but it will use its own means1192 */1193 1248 msg->wdata.active = true; 1194 1249 … … 1213 1268 1214 1269 futex_down(&async_futex); 1270 1271 assert(!msg->forget); 1272 assert(!msg->destroyed); 1273 1215 1274 if (msg->done) { 1216 1275 futex_up(&async_futex); … … 1231 1290 *retval = msg->retval; 1232 1291 1233 free(msg);1292 amsg_destroy(msg); 1234 1293 } 1235 1294 1236 1295 /** Wait for a message sent by the async framework, timeout variant. 1296 * 1297 * If the wait times out, the caller may choose to either wait again by calling 1298 * async_wait_for() or async_wait_timeout(), or forget the message via 1299 * async_forget(). 1237 1300 * 1238 1301 * @param amsgid Hash of the message to wait for. … … 1249 1312 1250 1313 amsg_t *msg = (amsg_t *) amsgid; 1251 1252 /* TODO: Let it go through the event read at least once */ 1253 if (timeout < 0) 1254 return ETIMEOUT; 1255 1314 1256 1315 futex_down(&async_futex); 1316 1317 assert(!msg->forget); 1318 assert(!msg->destroyed); 1319 1257 1320 if (msg->done) { 1258 1321 futex_up(&async_futex); … … 1260 1323 } 1261 1324 1325 /* 1326 * Negative timeout is converted to zero timeout to avoid 1327 * using tv_add with negative augmenter. 1328 */ 1329 if (timeout < 0) 1330 timeout = 0; 1331 1262 1332 gettimeofday(&msg->wdata.to_event.expires, NULL); 1263 1333 tv_add(&msg->wdata.to_event.expires, timeout); 1264 1334 1335 /* 1336 * Current fibril is inserted as waiting regardless of the 1337 * "size" of the timeout. 1338 * 1339 * Checking for msg->done and immediately bailing out when 1340 * timeout == 0 would mean that the manager fibril would never 1341 * run (consider single threaded program). 1342 * Thus the IPC answer would be never retrieved from the kernel. 1343 * 1344 * Notice that the actual delay would be very small because we 1345 * - switch to manager fibril 1346 * - the manager sees expired timeout 1347 * - and thus adds us back to ready queue 1348 * - manager switches back to some ready fibril 1349 * (prior it, it checks for incoming IPC). 1350 * 1351 */ 1265 1352 msg->wdata.fid = fibril_get_id(); 1266 1353 msg->wdata.active = false; … … 1279 1366 *retval = msg->retval; 1280 1367 1281 free(msg);1368 amsg_destroy(msg); 1282 1369 1283 1370 return 0; 1284 1371 } 1372 1373 /** Discard the message / reply on arrival. 1374 * 1375 * The message will be marked to be discarded once the reply arrives in 1376 * reply_received(). It is not allowed to call async_wait_for() or 1377 * async_wait_timeout() on this message after a call to this function. 1378 * 1379 * @param amsgid Hash of the message to forget. 1380 */ 1381 void async_forget(aid_t amsgid) 1382 { 1383 amsg_t *msg = (amsg_t *) amsgid; 1384 1385 assert(msg); 1386 assert(!msg->forget); 1387 assert(!msg->destroyed); 1388 1389 futex_down(&async_futex); 1390 if (msg->done) 1391 amsg_destroy(msg); 1392 else 1393 msg->forget = true; 1394 futex_up(&async_futex); 1395 } 1285 1396 1286 1397 /** Wait for specified time. … … 1293 1404 void async_usleep(suseconds_t timeout) 1294 1405 { 1295 amsg_t *msg = malloc(sizeof(amsg_t)); 1296 1406 amsg_t *msg = amsg_create(); 1297 1407 if (!msg) 1298 1408 return; 1299 1409 1300 1410 msg->wdata.fid = fibril_get_id(); 1301 msg->wdata.active = false;1302 1411 1303 1412 gettimeofday(&msg->wdata.to_event.expires, NULL); … … 1313 1422 /* Futex is up automatically after fibril_switch() */ 1314 1423 1315 free(msg);1424 amsg_destroy(msg); 1316 1425 } 1317 1426 … … 1584 1693 ipc_call_t result; 1585 1694 1586 amsg_t *msg = malloc(sizeof(amsg_t));1587 if ( msg == NULL) {1695 amsg_t *msg = amsg_create(); 1696 if (!msg) { 1588 1697 free(sess); 1589 1698 errno = ENOMEM; … … 1591 1700 } 1592 1701 1593 msg->done = false;1594 1702 msg->dataptr = &result; 1595 1596 msg->wdata.to_event.inlist = false;1597 1598 /*1599 * We may sleep in the next method,1600 * but it will use its own means1601 */1602 1703 msg->wdata.active = true; 1603 1704 … … 1643 1744 ipc_call_t result; 1644 1745 1645 amsg_t *msg = malloc(sizeof(amsg_t));1646 if ( msg == NULL)1746 amsg_t *msg = amsg_create(); 1747 if (!msg) 1647 1748 return ENOENT; 1648 1749 1649 msg->done = false;1650 1750 msg->dataptr = &result; 1651 1652 msg->wdata.to_event.inlist = false;1653 1654 /*1655 * We may sleep in the next method,1656 * but it will use its own means1657 */1658 1751 msg->wdata.active = true; 1659 1752 … … 2251 2344 IPC_FF_ROUTE_FROM_ME); 2252 2345 if (retval != EOK) { 2253 async_ wait_for(msg, NULL);2346 async_forget(msg); 2254 2347 ipc_answer_0(callid, retval); 2255 2348 return retval; … … 2445 2538 IPC_FF_ROUTE_FROM_ME); 2446 2539 if (retval != EOK) { 2447 async_ wait_for(msg, NULL);2540 async_forget(msg); 2448 2541 ipc_answer_0(callid, retval); 2449 2542 return retval; -
uspace/lib/c/generic/fibril_synch.c
r1fff583 r831507b 112 112 awaiter_t wdata; 113 113 114 awaiter_initialize(&wdata); 114 115 wdata.fid = fibril_get_id(); 115 wdata.active = false;116 116 wdata.wu_event.inlist = true; 117 link_initialize(&wdata.wu_event.link);118 117 list_append(&wdata.wu_event.link, &fm->waiters); 119 118 check_for_deadlock(&fm->oi); … … 205 204 awaiter_t wdata; 206 205 206 awaiter_initialize(&wdata); 207 207 wdata.fid = (fid_t) f; 208 wdata.active = false;209 208 wdata.wu_event.inlist = true; 210 link_initialize(&wdata.wu_event.link);211 209 f->flags &= ~FIBRIL_WRITER; 212 210 list_append(&wdata.wu_event.link, &frw->waiters); … … 233 231 awaiter_t wdata; 234 232 233 awaiter_initialize(&wdata); 235 234 wdata.fid = (fid_t) f; 236 wdata.active = false;237 235 wdata.wu_event.inlist = true; 238 link_initialize(&wdata.wu_event.link);239 236 f->flags |= FIBRIL_WRITER; 240 237 list_append(&wdata.wu_event.link, &frw->waiters); … … 375 372 return ETIMEOUT; 376 373 374 awaiter_initialize(&wdata); 377 375 wdata.fid = fibril_get_id(); 378 wdata.active = false;379 380 376 wdata.to_event.inlist = timeout > 0; 381 wdata.to_event.occurred = false;382 link_initialize(&wdata.to_event.link);383 384 377 wdata.wu_event.inlist = true; 385 link_initialize(&wdata.wu_event.link);386 378 387 379 futex_down(&async_futex); -
uspace/lib/c/generic/private/async.h
r1fff583 r831507b 81 81 } awaiter_t; 82 82 83 extern void awaiter_initialize(awaiter_t *); 84 83 85 extern void __async_init(void); 84 86 extern void async_insert_timeout(awaiter_t *); -
uspace/lib/c/include/async.h
r1fff583 r831507b 139 139 extern void async_wait_for(aid_t, sysarg_t *); 140 140 extern int async_wait_timeout(aid_t, sysarg_t *, suseconds_t); 141 extern void async_forget(aid_t); 141 142 142 143 extern fid_t async_new_connection(task_id_t, sysarg_t, ipc_callid_t, -
uspace/srv/fs/fat/fat_dentry.c
r1fff583 r831507b 334 334 while (i < count) { 335 335 if ((ch = str_decode(src, &off, STR_NO_LIMIT)) != 0) { 336 if (ascii_check(ch) & IS_D_CHAR(ch))336 if (ascii_check(ch) && IS_D_CHAR(ch)) 337 337 *dst = toupper(ch); 338 338 else -
uspace/srv/fs/fat/fat_directory.c
r1fff583 r831507b 162 162 int rc; 163 163 164 void *data; 165 fat_instance_t *instance; 166 167 rc = fs_instance_get(di->nodep->idx->service_id, &data); 168 assert(rc == EOK); 169 instance = (fat_instance_t *) data; 170 164 171 do { 165 172 rc = fat_directory_get(di, &d); … … 177 184 long_entry_count--; 178 185 if ((FAT_LFN_ORDER(d) == long_entry_count) && 179 186 (checksum == FAT_LFN_CHKSUM(d))) { 180 187 /* Right order! */ 181 188 fat_lfn_get_entry(d, wname, … … 189 196 long_entry = false; 190 197 } 191 } else if (FAT_IS_LFN(d) ) {198 } else if (FAT_IS_LFN(d) && instance->lfn_enabled) { 192 199 /* We found Last long entry! */ 193 200 if (FAT_LFN_COUNT(d) <= FAT_LFN_MAX_COUNT) { … … 308 315 checksum = fat_dentry_chksum(de->name); 309 316 310 rc = fat_directory_seek(di, start_pos +long_entry_count);317 rc = fat_directory_seek(di, start_pos + long_entry_count); 311 318 if (rc != EOK) 312 319 return rc;
Note:
See TracChangeset
for help on using the changeset viewer.