+ // TODO: If this needs to be rescanned later, having the subvolume list separate might be an idea
+ size_t allocsize = sizeof(tLVM_Vol) + strlen(Name) + 1 + sizeof(tLVM_SubVolume*) * dummy_vol.nSubVolumes;
+ tLVM_Vol *real_vol = malloc( allocsize );
+ if( !real_vol ) {
+ Log_Error("LVM", "LVM_AddVolume - malloc error on %i bytes", allocsize);
+ free(first_block);
+ return NULL;
+ }
+ real_vol->Next = NULL;
+ real_vol->Type = Type;
+ real_vol->Ptr = Ptr;
+ real_vol->BlockSize = BlockSize;
+ real_vol->BlockCount = BlockCount;
+ real_vol->nSubVolumes = dummy_vol.nSubVolumes;
+ real_vol->SubVolumes = (void*)( real_vol->Name + strlen(Name) + 1 );
+ real_vol->BlockSize = BlockSize;
+ strcpy(real_vol->Name, Name);
+ memset(real_vol->SubVolumes, 0, sizeof(tLVM_SubVolume*) * real_vol->nSubVolumes);
+ // - VFS Nodes
+ memset(&real_vol->DirNode, 0, sizeof(tVFS_Node));
+ real_vol->DirNode.Type = &gLVM_VolNodeType;
+ real_vol->DirNode.ImplPtr = real_vol;
+ real_vol->DirNode.Flags = VFS_FFLAG_DIRECTORY;
+ real_vol->DirNode.Size = -1;
+ memset(&real_vol->VolNode, 0, sizeof(tVFS_Node));
+ real_vol->VolNode.Type = &gLVM_VolNodeType;
+ real_vol->VolNode.ImplPtr = real_vol;
+ real_vol->VolNode.Size = BlockCount * BlockSize;
+
+ // TODO: Better selection of cache size
+ // TODO: Allow a volume type to disallow caching
+ #if USE_IOCACHE
+ real_vol->CacheHandle = IOCache_Create(LVM_int_CacheWriteback, real_vol, BlockSize, 1024);
+ #else
+ real_vol->CacheHandle = NULL;
+ #endif