Index: apps/main.c =================================================================== --- apps/main.c (revision 18881) +++ apps/main.c (working copy) @@ -143,12 +143,12 @@ int result = 0; bool clear = false; + if (preinit) - dircache_init(); + dircache_init(global_settings.dircache); if (!global_settings.dircache) return 0; - # ifdef HAVE_EEPROM_SETTINGS if (firmware_settings.initialized && firmware_settings.disk_clean && preinit) Index: firmware/include/dircache.h =================================================================== --- firmware/include/dircache.h (revision 18881) +++ firmware/include/dircache.h (working copy) @@ -85,7 +85,7 @@ DIR_UNCACHED *regulardir; } DIR_CACHED; -void dircache_init(void); +void dircache_init(bool); int dircache_load(void); int dircache_save(void); int dircache_build(int last_size); Index: firmware/common/dircache.c =================================================================== --- firmware/common/dircache.c (revision 18881) +++ firmware/common/dircache.c (working copy) @@ -74,7 +74,8 @@ static char dircache_cur_path[MAX_PATH*2]; static struct event_queue dircache_queue; -static long dircache_stack[(DEFAULT_STACK_SIZE + 0x900)/sizeof(long)]; +#define DIRCACHE_STACK_SIZE (DEFAULT_STACK_SIZE + 0x900)/sizeof(long) +static long *dircache_stack; static const char dircache_thread_name[] = "dircache"; static struct fdbind_queue fdbind_cache[MAX_PENDING_BINDINGS]; @@ -744,7 +745,7 @@ * Main initialization function that must be called before any other * operations within the dircache. */ -void dircache_init(void) +void dircache_init(bool start) { int i; @@ -756,8 +757,10 @@ { opendirs[i].secondary_entry.d_name = buffer_alloc(MAX_PATH); } - + if (!start) + return; queue_init(&dircache_queue, true); + dircache_stack = (long*)buffer_alloc(DIRCACHE_STACK_SIZE); create_thread(dircache_thread, dircache_stack, sizeof(dircache_stack), 0, dircache_thread_name IF_PRIO(, PRIORITY_BACKGROUND)