Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/fs/ext2fs/ext2_extents.h
39483 views
1
/*-
2
* SPDX-License-Identifier: BSD-2-Clause
3
*
4
* Copyright (c) 2012, 2010 Zheng Liu <[email protected]>
5
* All rights reserved.
6
*
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions
9
* are met:
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
* 2. Redistributions in binary form must reproduce the above copyright
13
* notice, this list of conditions and the following disclaimer in the
14
* documentation and/or other materials provided with the distribution.
15
*
16
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26
* SUCH DAMAGE.
27
*/
28
#ifndef _FS_EXT2FS_EXT2_EXTENTS_H_
29
#define _FS_EXT2FS_EXT2_EXTENTS_H_
30
31
#include <sys/types.h>
32
33
#define EXT4_EXT_MAGIC 0xf30a
34
#define EXT4_MAX_BLOCKS 0xffffffff
35
#define EXT_INIT_MAX_LEN (1UL << 15)
36
#define EXT4_MAX_LEN (EXT_INIT_MAX_LEN - 1)
37
#define EXT4_EXT_DEPTH_MAX 5
38
39
#define EXT4_EXT_CACHE_NO 0
40
#define EXT4_EXT_CACHE_GAP 1
41
#define EXT4_EXT_CACHE_IN 2
42
43
/*
44
* Ext4 extent tail with csum
45
*/
46
struct ext4_extent_tail {
47
uint32_t et_checksum; /* crc32c(uuid+inum+extent_block) */
48
};
49
50
/*
51
* Ext4 file system extent on disk.
52
*/
53
struct ext4_extent {
54
uint32_t e_blk; /* first logical block */
55
uint16_t e_len; /* number of blocks */
56
uint16_t e_start_hi; /* high 16 bits of physical block */
57
uint32_t e_start_lo; /* low 32 bits of physical block */
58
};
59
60
/*
61
* Extent index on disk.
62
*/
63
struct ext4_extent_index {
64
uint32_t ei_blk; /* indexes logical blocks */
65
uint32_t ei_leaf_lo; /* points to physical block of the
66
* next level */
67
uint16_t ei_leaf_hi; /* high 16 bits of physical block */
68
uint16_t ei_unused;
69
};
70
71
/*
72
* Extent tree header.
73
*/
74
struct ext4_extent_header {
75
uint16_t eh_magic; /* magic number: 0xf30a */
76
uint16_t eh_ecount; /* number of valid entries */
77
uint16_t eh_max; /* capacity of store in entries */
78
uint16_t eh_depth; /* the depth of extent tree */
79
uint32_t eh_gen; /* generation of extent tree */
80
};
81
82
/*
83
* Save cached extent.
84
*/
85
struct ext4_extent_cache {
86
daddr_t ec_start; /* extent start */
87
uint32_t ec_blk; /* logical block */
88
uint32_t ec_len;
89
uint32_t ec_type;
90
};
91
92
/*
93
* Save path to some extent.
94
*/
95
struct ext4_extent_path {
96
int index_count;
97
uint16_t ep_depth;
98
uint64_t ep_blk;
99
char *ep_data;
100
struct ext4_extent *ep_ext;
101
struct ext4_extent_index *ep_index;
102
struct ext4_extent_header *ep_header;
103
};
104
105
#define EXT_FIRST_EXTENT(hdr) ((struct ext4_extent *)(((char *)(hdr)) + \
106
sizeof(struct ext4_extent_header)))
107
#define EXT_FIRST_INDEX(hdr) ((struct ext4_extent_index *)(((char *)(hdr)) + \
108
sizeof(struct ext4_extent_header)))
109
#define EXT_LAST_EXTENT(hdr) (EXT_FIRST_EXTENT((hdr)) + le16toh((hdr)->eh_ecount) - 1)
110
#define EXT_LAST_INDEX(hdr) (EXT_FIRST_INDEX((hdr)) + le16toh((hdr)->eh_ecount) - 1)
111
#define EXT4_EXTENT_TAIL_OFFSET(hdr) (sizeof(struct ext4_extent_header) + \
112
(sizeof(struct ext4_extent) * le16toh((hdr)->eh_max)))
113
#define EXT_HAS_FREE_INDEX(path) \
114
(le16toh((path)->ep_header->eh_ecount) < le16toh((path)->ep_header->eh_max))
115
#define EXT_MAX_EXTENT(hdr) (EXT_FIRST_EXTENT(hdr) + le16toh((hdr)->eh_max) - 1)
116
#define EXT_MAX_INDEX(hdr) (EXT_FIRST_INDEX((hdr)) + le16toh((hdr)->eh_max) - 1)
117
118
struct inode;
119
struct m_ext2fs;
120
void ext4_ext_tree_init(struct inode *ip);
121
int ext4_ext_in_cache(struct inode *, daddr_t, struct ext4_extent *);
122
void ext4_ext_put_cache(struct inode *, struct ext4_extent *, int);
123
int ext4_ext_find_extent(struct inode *, daddr_t, struct ext4_extent_path **);
124
void ext4_ext_path_free(struct ext4_extent_path *path);
125
int ext4_ext_remove_space(struct inode *ip, off_t length, int flags,
126
struct ucred *cred, struct thread *td);
127
int ext4_ext_get_blocks(struct inode *ip, int64_t iblock,
128
unsigned long max_blocks, struct ucred *cred, struct buf **bpp,
129
int *allocate, daddr_t *);
130
#ifdef EXT2FS_PRINT_EXTENTS
131
int ext4_ext_walk(struct inode *ip);
132
#endif
133
134
#endif /* !_FS_EXT2FS_EXT2_EXTENTS_H_ */
135
136