1/*
2** Copyright 2003, Axel D��rfler, axeld@pinc-software.de. All rights reserved.
3** Distributed under the terms of the MIT License.
4*/
5#ifndef VOLUME_H
6#define VOLUME_H
7
8
9#include <SupportDefs.h>
10
11namespace boot {
12	class Partition;
13}
14
15
16#include "bfs.h"
17
18namespace BFS {
19
20class Directory;
21
22class Volume {
23	public:
24		Volume(boot::Partition *partition);
25		~Volume();
26
27		status_t			InitCheck();
28		bool				IsValidSuperBlock();
29
30		block_run			Root() const { return fSuperBlock.root_dir; }
31		Directory			*RootNode() const { return fRootNode; }
32		block_run			Indices() const { return fSuperBlock.indices; }
33		const char			*Name() const { return fSuperBlock.name; }
34
35		int					Device() const { return fDevice; }
36
37		off_t				NumBlocks() const { return fSuperBlock.NumBlocks(); }
38		off_t				UsedBlocks() const { return fSuperBlock.UsedBlocks(); }
39		off_t				FreeBlocks() const { return NumBlocks() - UsedBlocks(); }
40
41		uint32				BlockSize() const { return fSuperBlock.BlockSize(); }
42		uint32				BlockShift() const { return fSuperBlock.BlockShift(); }
43		uint32				InodeSize() const { return fSuperBlock.InodeSize(); }
44		uint32				AllocationGroups() const { return fSuperBlock.AllocationGroups(); }
45		uint32				AllocationGroupShift() const { return fSuperBlock.AllocationGroupShift(); }
46		disk_super_block	&SuperBlock() { return fSuperBlock; }
47
48		off_t				ToOffset(block_run run) const { return ToBlock(run) << BlockShift(); }
49		off_t				ToOffset(off_t block) const { return block << BlockShift(); }
50		off_t				ToBlock(block_run run) const { return ((off_t)run.AllocationGroup() << AllocationGroupShift()) | (uint32)run.Start(); }
51		block_run			ToBlockRun(off_t block) const;
52		status_t			ValidateBlockRun(block_run run);
53
54		off_t				ToVnode(block_run run) const { return ToBlock(run); }
55		off_t				ToVnode(off_t block) const { return block; }
56
57	protected:
58		int					fDevice;
59		disk_super_block	fSuperBlock;
60
61		BFS::Directory		*fRootNode;
62};
63
64}	// namespace BFS
65
66#endif	/* VOLUME_H */
67