1/*
2 * Copyright 2001-2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef USERLAND_FS_FILE_SYSTEM_H
6#define USERLAND_FS_FILE_SYSTEM_H
7
8#include <fs_interface.h>
9#include <image.h>
10#include <OS.h>
11
12#include <kernel/util/DoublyLinkedList.h>
13
14#include "FSCapabilities.h"
15#include "Locker.h"
16
17
18namespace UserlandFS {
19
20class RequestThreadContext;
21class Volume;
22
23
24class FileSystem {
25public:
26								FileSystem(const char* fsName);
27	virtual						~FileSystem();
28
29	static	FileSystem*			GetInstance();
30
31			const char*			GetName() const	{ return fName; }
32
33	virtual	status_t			CreateVolume(Volume** volume, dev_t id) = 0;
34	virtual	status_t			DeleteVolume(Volume* volume) = 0;
35
36	virtual	void				InitRequestThreadContext(
37									RequestThreadContext* context);
38
39			void				RegisterVolume(Volume* volume);
40			void				UnregisterVolume(Volume* volume);
41			Volume*				VolumeWithID(dev_t id);
42
43			void				GetCapabilities(
44									FSCapabilities& capabilities) const
45									{ capabilities = fCapabilities; }
46			client_fs_type		GetClientFSType() const
47									{ return fClientFSType; }
48
49protected:
50			typedef DoublyLinkedList<Volume> VolumeList;
51
52protected:
53			Locker				fLock;
54			VolumeList			fVolumes;
55			FSCapabilities		fCapabilities;
56			client_fs_type		fClientFSType;
57			char				fName[B_FILE_NAME_LENGTH];
58
59	static	FileSystem*			sInstance;
60};
61
62}	// namespace UserlandFS
63
64using UserlandFS::FileSystem;
65
66
67// implemented by the interface implementations
68extern "C" status_t userlandfs_create_file_system(const char* fsName,
69	image_id image, FileSystem** _fileSystem);
70
71#endif	// USERLAND_FS_FILE_SYSTEM_H
72