1/*
2 * Copyright 2010, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef VOLUME_H
6#define VOLUME_H
7
8
9#include <fs_info.h>
10#include <fs_interface.h>
11#include <fs_volume.h>
12
13#include <lock.h>
14
15
16class BlockAllocator;
17class Directory;
18class File;
19class Node;
20class SymLink;
21class Transaction;
22
23
24class Volume {
25public:
26								Volume(uint32 flags);
27								~Volume();
28
29			status_t			Init(const char* device);
30			status_t			Init(int fd, uint64 totalBlocks);
31
32			status_t			Mount(fs_volume* fsVolume);
33			void				Unmount();
34
35			status_t			Initialize(const char* name);
36
37			void				GetInfo(fs_info& info);
38
39			status_t			NewNode(Node* node);
40			status_t			PublishNode(Node* node, uint32 flags);
41			status_t			GetNode(uint64 blockIndex, Node*& _node);
42			status_t			PutNode(Node* node);
43			status_t			RemoveNode(Node* node);
44			status_t			UnremoveNode(Node* node);
45
46			status_t			ReadNode(uint64 blockIndex, Node*& _node);
47
48			status_t			CreateDirectory(mode_t mode,
49									Transaction& transaction,
50									Directory*& _directory);
51			status_t			CreateFile(mode_t mode,
52									Transaction& transaction, File*& _file);
53			status_t			CreateSymLink(mode_t mode,
54									Transaction& transaction,
55									SymLink*& _symLink);
56			status_t			DeleteNode(Node* node);
57
58			status_t			SetName(const char* name);
59
60	inline	void				TransactionStarted();
61	inline	void				TransactionFinished();
62
63	inline	dev_t				ID() const			{ return fFSVolume->id; }
64	inline	int					FD() const			{ return fFD; }
65	inline	bool				IsReadOnly() const;
66	inline	uint64				TotalBlocks() const	{ return fTotalBlocks; }
67	inline	void*				BlockCache() const	{ return fBlockCache; }
68	inline	const char*			Name() const		{ return fName; }
69	inline	BlockAllocator*		GetBlockAllocator() const
70									{ return fBlockAllocator; }
71	inline	Directory*			RootDirectory() const
72									{ return fRootDirectory; }
73
74private:
75			status_t			_Init(uint64 totalBlocks);
76
77			status_t			_CreateNode(Node* node,
78									Transaction& transaction);
79			status_t			_DeleteDirectoryEntries(Directory* directory);
80
81private:
82			fs_volume*			fFSVolume;
83			int					fFD;
84			uint32				fFlags;
85			void*				fBlockCache;
86			uint64				fTotalBlocks;
87			char*				fName;
88			BlockAllocator*		fBlockAllocator;
89			Directory*			fRootDirectory;
90			mutex				fLock;
91			mutex				fTransactionLock;
92};
93
94
95void
96Volume::TransactionStarted()
97{
98	mutex_lock(&fTransactionLock);
99}
100
101
102void
103Volume::TransactionFinished()
104{
105	mutex_unlock(&fTransactionLock);
106}
107
108
109bool
110Volume::IsReadOnly() const
111{
112	return (fFlags & B_FS_IS_READONLY) != 0;
113}
114
115
116#endif	// VOLUME_H
117