xref: /haiku/src/add-ons/kernel/file_systems/bfs/Utility.h (revision 23d878482ed22e55dad6d1fca1df7bea42eb157c)
1 /*
2  * Copyright 2001-2009, Axel Dörfler, axeld@pinc-software.de.
3  * This file may be used under the terms of the MIT License.
4  */
5 #ifndef UTILITY_H
6 #define UTILITY_H
7 
8 
9 #include "system_dependencies.h"
10 
11 #include "bfs.h"
12 
13 
14 enum inode_type {
15 	S_DIRECTORY		= S_IFDIR,
16 	S_FILE			= S_IFREG,
17 	S_SYMLINK		= S_IFLNK,
18 
19 	S_INDEX_TYPES	= (S_STR_INDEX | S_INT_INDEX | S_UINT_INDEX
20 						| S_LONG_LONG_INDEX | S_ULONG_LONG_INDEX
21 						| S_FLOAT_INDEX | S_DOUBLE_INDEX),
22 
23 	S_EXTENDED_TYPES = (S_ATTR_DIR | S_ATTR | S_INDEX_DIR)
24 };
25 
26 
27 /*!	\a to must be a power of 2.
28 */
29 template<typename IntType, typename RoundType>
30 inline IntType
31 round_up(const IntType& value, const RoundType& to)
32 {
33 	return (value + (to - 1)) & ~((IntType)to - 1);
34 }
35 
36 
37 /*!	\a to must be a power of 2.
38 */
39 template<typename IntType, typename RoundType>
40 inline IntType
41 round_down(const IntType& value, const RoundType& to)
42 {
43 	return value & ~((IntType)to - 1);
44 }
45 
46 
47 inline int32
48 divide_roundup(int32 num, int32 divisor)
49 {
50 	return (num + divisor - 1) / divisor;
51 }
52 
53 
54 inline int64
55 divide_roundup(int64 num, int32 divisor)
56 {
57 	return (num + divisor - 1) / divisor;
58 }
59 
60 
61 inline int
62 get_shift(uint64 i)
63 {
64 	int c;
65 	c = 0;
66 	while (i > 1) {
67 		i >>= 1;
68 		c++;
69 	}
70 	return c;
71 }
72 
73 
74 inline int32
75 runs_per_block(uint32 blockSize)
76 {
77 #ifdef _BOOT_MODE
78 	using namespace BFS;
79 #endif
80 
81 	return blockSize / sizeof(struct block_run);
82 }
83 
84 
85 inline int32
86 double_indirect_max_direct_size(uint32 baseLength, uint32 blockSize)
87 {
88 	return baseLength * blockSize;
89 }
90 
91 
92 inline int32
93 double_indirect_max_indirect_size(uint32 baseLength, uint32 blockSize)
94 {
95 	return baseLength * double_indirect_max_direct_size(baseLength, blockSize)
96 		* runs_per_block(blockSize);
97 }
98 
99 
100 inline void
101 get_double_indirect_sizes(uint32 baseLength, uint32 blockSize,
102 	int32& runsPerBlock, int32& directSize, int32& indirectSize)
103 {
104 	runsPerBlock = runs_per_block(blockSize);
105 	directSize = double_indirect_max_direct_size(baseLength, blockSize);
106 	indirectSize = baseLength * directSize * runsPerBlock;
107 }
108 
109 
110 inline uint32
111 key_align(uint32 data)
112 {
113 	// rounds up to the next off_t boundary
114 	return (data + sizeof(off_t) - 1) & ~(sizeof(off_t) - 1);
115 }
116 
117 
118 inline bool
119 is_index(int mode)
120 {
121 	return (mode & (S_EXTENDED_TYPES | 0777)) == S_INDEX_DIR;
122 		// That's a stupid check, but the only method to differentiate the
123 		// index root from an index.
124 }
125 
126 
127 inline bool
128 is_directory(int mode)
129 {
130 	return (mode & (S_EXTENDED_TYPES | S_IFDIR)) == S_IFDIR;
131 }
132 
133 
134 /*!	Converts the open mode, the open flags given to bfs_open(), into
135 	access modes, e.g. since O_RDONLY requires read access to the
136 	file, it will be converted to R_OK.
137 */
138 inline int
139 open_mode_to_access(int openMode)
140 {
141 	openMode &= O_RWMASK;
142 	if (openMode == O_RDONLY)
143 		return R_OK;
144 	if (openMode == O_WRONLY)
145 		return W_OK;
146 
147 	return R_OK | W_OK;
148 }
149 
150 #endif	// UTILITY_H
151