ext4_extents.h 8.6 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0
A
Alex Tomas 已提交
2 3 4 5 6
/*
 * Copyright (c) 2003-2006, Cluster File Systems, Inc, info@clusterfs.com
 * Written by Alex Tomas <alex@clusterfs.com>
 */

7 8
#ifndef _EXT4_EXTENTS
#define _EXT4_EXTENTS
A
Alex Tomas 已提交
9

10
#include "ext4.h"
A
Alex Tomas 已提交
11 12

/*
13
 * With AGGRESSIVE_TEST defined, the capacity of index/leaf blocks
14 15 16
 * becomes very small, so index split, in-depth growing and
 * other hard changes happen much more often.
 * This is for debug purposes only.
A
Alex Tomas 已提交
17
 */
18
#define AGGRESSIVE_TEST_
A
Alex Tomas 已提交
19 20

/*
21 22 23
 * With EXTENTS_STATS defined, the number of blocks and extents
 * are collected in the truncate path. They'll be shown at
 * umount time.
A
Alex Tomas 已提交
24 25 26 27
 */
#define EXTENTS_STATS__

/*
28 29
 * If CHECK_BINSEARCH is defined, then the results of the binary search
 * will also be checked by linear search.
A
Alex Tomas 已提交
30 31 32 33
 */
#define CHECK_BINSEARCH__

/*
34 35
 * If EXT_STATS is defined then stats numbers are collected.
 * These number will be displayed at umount time.
A
Alex Tomas 已提交
36 37 38 39 40
 */
#define EXT_STATS_


/*
41 42 43
 * ext4_inode has i_block array (60 bytes total).
 * The first 12 bytes store ext4_extent_header;
 * the remainder stores an array of ext4_extent.
44 45
 * For non-inode extent blocks, ext4_extent_tail
 * follows the array.
A
Alex Tomas 已提交
46 47
 */

48 49 50 51 52 53 54 55 56 57 58
/*
 * This is the extent tail on-disk structure.
 * All other extent structures are 12 bytes long.  It turns out that
 * block_size % 12 >= 4 for at least all powers of 2 greater than 512, which
 * covers all valid ext4 block sizes.  Therefore, this tail structure can be
 * crammed into the end of the block without having to rebalance the tree.
 */
struct ext4_extent_tail {
	__le32	et_checksum;	/* crc32c(uuid+inum+extent_block) */
};

A
Alex Tomas 已提交
59
/*
60 61
 * This is the extent on-disk structure.
 * It's used at the bottom of the tree.
A
Alex Tomas 已提交
62 63 64 65 66
 */
struct ext4_extent {
	__le32	ee_block;	/* first logical block extent covers */
	__le16	ee_len;		/* number of blocks covered by extent */
	__le16	ee_start_hi;	/* high 16 bits of physical block */
67
	__le32	ee_start_lo;	/* low 32 bits of physical block */
A
Alex Tomas 已提交
68 69 70
};

/*
71 72
 * This is index on-disk structure.
 * It's used at all the levels except the bottom.
A
Alex Tomas 已提交
73 74 75
 */
struct ext4_extent_idx {
	__le32	ei_block;	/* index covers logical blocks from 'block' */
76
	__le32	ei_leaf_lo;	/* pointer to the physical block of the next *
77
				 * level. leaf or next index could be there */
A
Alex Tomas 已提交
78 79 80 81 82
	__le16	ei_leaf_hi;	/* high 16 bits of physical block */
	__u16	ei_unused;
};

/*
83
 * Each block (leaves and indexes), even inode-stored has header.
A
Alex Tomas 已提交
84 85 86 87 88
 */
struct ext4_extent_header {
	__le16	eh_magic;	/* probably will support different formats */
	__le16	eh_entries;	/* number of valid entries */
	__le16	eh_max;		/* capacity of store in entries */
89
	__le16	eh_depth;	/* has tree real underlying blocks? */
A
Alex Tomas 已提交
90 91 92 93
	__le32	eh_generation;	/* generation of the tree */
};

#define EXT4_EXT_MAGIC		cpu_to_le16(0xf30a)
94
#define EXT4_MAX_EXTENT_DEPTH 5
A
Alex Tomas 已提交
95

96 97 98 99 100 101 102 103 104 105 106
#define EXT4_EXTENT_TAIL_OFFSET(hdr) \
	(sizeof(struct ext4_extent_header) + \
	 (sizeof(struct ext4_extent) * le16_to_cpu((hdr)->eh_max)))

static inline struct ext4_extent_tail *
find_ext4_extent_tail(struct ext4_extent_header *eh)
{
	return (struct ext4_extent_tail *)(((void *)eh) +
					   EXT4_EXTENT_TAIL_OFFSET(eh));
}

A
Alex Tomas 已提交
107
/*
108 109 110
 * Array of ext4_ext_path contains path to some extent.
 * Creation/lookup routines use it for traversal/splitting/etc.
 * Truncate uses it to simulate recursive walking.
A
Alex Tomas 已提交
111 112
 */
struct ext4_ext_path {
113
	ext4_fsblk_t			p_block;
A
Alex Tomas 已提交
114
	__u16				p_depth;
115
	__u16				p_maxdepth;
A
Alex Tomas 已提交
116 117 118 119 120 121
	struct ext4_extent		*p_ext;
	struct ext4_extent_idx		*p_idx;
	struct ext4_extent_header	*p_hdr;
	struct buffer_head		*p_bh;
};

122 123 124 125 126 127 128 129 130 131 132 133 134
/*
 * Used to record a portion of a cluster found at the beginning or end
 * of an extent while traversing the extent tree during space removal.
 * A partial cluster may be removed if it does not contain blocks shared
 * with extents that aren't being deleted (tofree state).  Otherwise,
 * it cannot be removed (nofree state).
 */
struct partial_cluster {
	ext4_fsblk_t pclu;  /* physical cluster number */
	ext4_lblk_t lblk;   /* logical block number within logical cluster */
	enum {initial, tofree, nofree} state;
};

A
Alex Tomas 已提交
135 136 137 138
/*
 * structure for external API
 */

139 140 141 142
/*
 * EXT_INIT_MAX_LEN is the maximum number of blocks we can have in an
 * initialized extent. This is 2^15 and not (2^16 - 1), since we use the
 * MSB of ee_len field in the extent datastructure to signify if this
143
 * particular extent is an initialized extent or an unwritten (i.e.
144
 * preallocated).
145 146
 * EXT_UNWRITTEN_MAX_LEN is the maximum number of blocks we can have in an
 * unwritten extent.
147
 * If ee_len is <= 0x8000, it is an initialized extent. Otherwise, it is an
148 149 150
 * unwritten one. In other words, if MSB of ee_len is set, it is an
 * unwritten extent with only one special scenario when ee_len = 0x8000.
 * In this case we can not have an unwritten extent of zero length and
151 152 153
 * thus we make it as a special case of initialized extent with 0x8000 length.
 * This way we get better extent-to-group alignment for initialized extents.
 * Hence, the maximum number of blocks we can have in an *initialized*
154
 * extent is 2^15 (32768) and in an *unwritten* extent is 2^15-1 (32767).
155 156
 */
#define EXT_INIT_MAX_LEN	(1UL << 15)
157
#define EXT_UNWRITTEN_MAX_LEN	(EXT_INIT_MAX_LEN - 1)
158

A
Alex Tomas 已提交
159 160 161 162 163 164 165 166

#define EXT_FIRST_EXTENT(__hdr__) \
	((struct ext4_extent *) (((char *) (__hdr__)) +		\
				 sizeof(struct ext4_extent_header)))
#define EXT_FIRST_INDEX(__hdr__) \
	((struct ext4_extent_idx *) (((char *) (__hdr__)) +	\
				     sizeof(struct ext4_extent_header)))
#define EXT_HAS_FREE_INDEX(__path__) \
D
Dave Kleikamp 已提交
167 168
	(le16_to_cpu((__path__)->p_hdr->eh_entries) \
				     < le16_to_cpu((__path__)->p_hdr->eh_max))
A
Alex Tomas 已提交
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
#define EXT_LAST_EXTENT(__hdr__) \
	(EXT_FIRST_EXTENT((__hdr__)) + le16_to_cpu((__hdr__)->eh_entries) - 1)
#define EXT_LAST_INDEX(__hdr__) \
	(EXT_FIRST_INDEX((__hdr__)) + le16_to_cpu((__hdr__)->eh_entries) - 1)
#define EXT_MAX_EXTENT(__hdr__) \
	(EXT_FIRST_EXTENT((__hdr__)) + le16_to_cpu((__hdr__)->eh_max) - 1)
#define EXT_MAX_INDEX(__hdr__) \
	(EXT_FIRST_INDEX((__hdr__)) + le16_to_cpu((__hdr__)->eh_max) - 1)

static inline struct ext4_extent_header *ext_inode_hdr(struct inode *inode)
{
	return (struct ext4_extent_header *) EXT4_I(inode)->i_data;
}

static inline struct ext4_extent_header *ext_block_hdr(struct buffer_head *bh)
{
	return (struct ext4_extent_header *) bh->b_data;
}

static inline unsigned short ext_depth(struct inode *inode)
{
	return le16_to_cpu(ext_inode_hdr(inode)->eh_depth);
}

193
static inline void ext4_ext_mark_unwritten(struct ext4_extent *ext)
A
Amit Arora 已提交
194
{
195
	/* We can not have an unwritten extent of zero length! */
196 197
	BUG_ON((le16_to_cpu(ext->ee_len) & ~EXT_INIT_MAX_LEN) == 0);
	ext->ee_len |= cpu_to_le16(EXT_INIT_MAX_LEN);
A
Amit Arora 已提交
198 199
}

200
static inline int ext4_ext_is_unwritten(struct ext4_extent *ext)
A
Amit Arora 已提交
201
{
202 203
	/* Extent with ee_len of 0x8000 is treated as an initialized extent */
	return (le16_to_cpu(ext->ee_len) > EXT_INIT_MAX_LEN);
A
Amit Arora 已提交
204 205 206 207
}

static inline int ext4_ext_get_actual_len(struct ext4_extent *ext)
{
208 209 210
	return (le16_to_cpu(ext->ee_len) <= EXT_INIT_MAX_LEN ?
		le16_to_cpu(ext->ee_len) :
		(le16_to_cpu(ext->ee_len) - EXT_INIT_MAX_LEN));
A
Amit Arora 已提交
211 212
}

213 214 215 216 217
static inline void ext4_ext_mark_initialized(struct ext4_extent *ext)
{
	ext->ee_len = cpu_to_le16(ext4_ext_get_actual_len(ext));
}

218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269
/*
 * ext4_ext_pblock:
 * combine low and high parts of physical block number into ext4_fsblk_t
 */
static inline ext4_fsblk_t ext4_ext_pblock(struct ext4_extent *ex)
{
	ext4_fsblk_t block;

	block = le32_to_cpu(ex->ee_start_lo);
	block |= ((ext4_fsblk_t) le16_to_cpu(ex->ee_start_hi) << 31) << 1;
	return block;
}

/*
 * ext4_idx_pblock:
 * combine low and high parts of a leaf physical block number into ext4_fsblk_t
 */
static inline ext4_fsblk_t ext4_idx_pblock(struct ext4_extent_idx *ix)
{
	ext4_fsblk_t block;

	block = le32_to_cpu(ix->ei_leaf_lo);
	block |= ((ext4_fsblk_t) le16_to_cpu(ix->ei_leaf_hi) << 31) << 1;
	return block;
}

/*
 * ext4_ext_store_pblock:
 * stores a large physical block number into an extent struct,
 * breaking it into parts
 */
static inline void ext4_ext_store_pblock(struct ext4_extent *ex,
					 ext4_fsblk_t pb)
{
	ex->ee_start_lo = cpu_to_le32((unsigned long) (pb & 0xffffffff));
	ex->ee_start_hi = cpu_to_le16((unsigned long) ((pb >> 31) >> 1) &
				      0xffff);
}

/*
 * ext4_idx_store_pblock:
 * stores a large physical block number into an index struct,
 * breaking it into parts
 */
static inline void ext4_idx_store_pblock(struct ext4_extent_idx *ix,
					 ext4_fsblk_t pb)
{
	ix->ei_leaf_lo = cpu_to_le32((unsigned long) (pb & 0xffffffff));
	ix->ei_leaf_hi = cpu_to_le16((unsigned long) ((pb >> 31) >> 1) &
				     0xffff);
}

270 271 272 273 274
#define ext4_ext_dirty(handle, inode, path) \
		__ext4_ext_dirty(__func__, __LINE__, (handle), (inode), (path))
int __ext4_ext_dirty(const char *where, unsigned int line, handle_t *handle,
		     struct inode *inode, struct ext4_ext_path *path);

275
#endif /* _EXT4_EXTENTS */
A
Alex Tomas 已提交
276