// _UnregisterFileSystem status_t UserlandFS::_UnregisterFileSystem(const char* name) { if (!name) return B_BAD_VALUE; // find the FS and decrement its reference counter FileSystemInitializer* fileSystemInitializer = NULL; bool deleteFS = false; { FileSystemLocker _(fFileSystems); fileSystemInitializer = fFileSystems->Get(name); if (!fileSystemInitializer) return B_BAD_VALUE; deleteFS = fileSystemInitializer->RemoveReference(); if (deleteFS) fFileSystems->Remove(name); } // delete the FS, if the last reference has been removed if (deleteFS) delete fileSystemInitializer; return B_OK; }
// RegisterFileSystem status_t UserlandFS::RegisterFileSystem(const char* name, FileSystem** _fileSystem) { // check parameters if (!name || !_fileSystem) return B_BAD_VALUE; // check, if we do already know this file system, and create it, if not FileSystemInitializer* fileSystemInitializer; { FileSystemLocker _(fFileSystems); fileSystemInitializer = fFileSystems->Get(name); if (fileSystemInitializer) { fileSystemInitializer->AddReference(); } else { fileSystemInitializer = new(nothrow) FileSystemInitializer(name); if (!fileSystemInitializer) return B_NO_MEMORY; status_t error = fFileSystems->Put(name, fileSystemInitializer); if (error != B_OK) { delete fileSystemInitializer; return error; } } } // prepare the file system status_t error = fileSystemInitializer->Access(); if (error != B_OK) { _UnregisterFileSystem(name); return error; } *_fileSystem = fileSystemInitializer->GetFileSystem(); return error; }
// DebugUFS int KernelDebug::DebugUFS(int argc, char** argv) { typedef HashMap<String, FileSystemInitializer*> KDebugFSMap; UserlandFS* userlandFS = UserlandFS::GetUserlandFS(); KDebugFSMap& fileSystems = userlandFS->fFileSystems->GetUnsynchronizedMap(); for (KDebugFSMap::Iterator it = fileSystems.GetIterator(); it.HasNext();) { KDebugFSMap::Entry entry = it.Next(); FileSystemInitializer* fsInitializer = entry.value; FileSystem* fs = fsInitializer->GetFileSystem(); kprintf("file system %p: %s\n", fs, (fs ? fs->GetName() : NULL)); if (fs) { kprintf(" port pool %p\n", fs->GetPortPool()); int32 volumeCount = fs->fVolumes.Count(); for (int32 i = 0; i < volumeCount; i++) { Volume* volume = fs->fVolumes.ElementAt(i); kprintf(" volume %p: %ld\n", volume, volume->GetID()); } } } return 0; }