aboutsummaryrefslogtreecommitdiff
path: root/sys/fs/ext2fs/ext2_extents.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/fs/ext2fs/ext2_extents.h')
-rw-r--r--sys/fs/ext2fs/ext2_extents.h40
1 files changed, 31 insertions, 9 deletions
diff --git a/sys/fs/ext2fs/ext2_extents.h b/sys/fs/ext2fs/ext2_extents.h
index 91cb0d32346c..b69da4cdba19 100644
--- a/sys/fs/ext2fs/ext2_extents.h
+++ b/sys/fs/ext2fs/ext2_extents.h
@@ -31,6 +31,10 @@
#include <sys/types.h>
#define EXT4_EXT_MAGIC 0xf30a
+#define EXT4_MAX_BLOCKS 0xffffffff
+#define EXT_INIT_MAX_LEN (1UL << 15)
+#define EXT4_MAX_LEN (EXT_INIT_MAX_LEN - 1)
+#define EXT4_EXT_DEPTH_MAX 5
#define EXT4_EXT_CACHE_NO 0
#define EXT4_EXT_CACHE_GAP 1
@@ -82,23 +86,41 @@ struct ext4_extent_cache {
* Save path to some extent.
*/
struct ext4_extent_path {
+ int index_count;
uint16_t ep_depth;
- struct buf *ep_bp;
- bool ep_is_sparse;
- union {
- struct ext4_extent ep_sparse_ext;
- struct ext4_extent *ep_ext;
- };
+ uint64_t ep_blk;
+ char *ep_data;
+ struct ext4_extent *ep_ext;
struct ext4_extent_index *ep_index;
struct ext4_extent_header *ep_header;
};
+#define EXT_FIRST_EXTENT(hdr) ((struct ext4_extent *)(((char *)(hdr)) + \
+ sizeof(struct ext4_extent_header)))
+#define EXT_FIRST_INDEX(hdr) ((struct ext4_extent_index *)(((char *)(hdr)) + \
+ sizeof(struct ext4_extent_header)))
+#define EXT_LAST_EXTENT(hdr) (EXT_FIRST_EXTENT((hdr)) + (hdr)->eh_ecount - 1)
+#define EXT_LAST_INDEX(hdr) (EXT_FIRST_INDEX((hdr)) + (hdr)->eh_ecount - 1)
+#define EXT4_EXTENT_TAIL_OFFSET(hdr) (sizeof(struct ext4_extent_header) + \
+ (sizeof(struct ext4_extent) * (hdr)->eh_max))
+#define EXT_HAS_FREE_INDEX(path) \
+ ((path)->ep_header->eh_ecount < (path)->ep_header->eh_max)
+#define EXT_MAX_EXTENT(hdr) (EXT_FIRST_EXTENT(hdr) + ((hdr)->eh_max) - 1)
+#define EXT_MAX_INDEX(hdr) (EXT_FIRST_INDEX((hdr)) + (hdr)->eh_max - 1)
+
struct inode;
struct m_ext2fs;
+void ext4_ext_tree_init(struct inode *ip);
int ext4_ext_in_cache(struct inode *, daddr_t, struct ext4_extent *);
void ext4_ext_put_cache(struct inode *, struct ext4_extent *, int);
-struct ext4_extent_path *
-ext4_ext_find_extent(struct m_ext2fs *fs,
- struct inode *, daddr_t, struct ext4_extent_path *);
+int ext4_ext_find_extent(struct inode *, daddr_t, struct ext4_extent_path **);
+void ext4_ext_path_free(struct ext4_extent_path *path);
+int ext4_ext_remove_space(struct inode *ip, off_t length, int flags,
+ struct ucred *cred, struct thread *td);
+int ext4_ext_get_blocks(struct inode *ip, int64_t iblock,
+ unsigned long max_blocks, struct ucred *cred, struct buf **bpp, int *allocate, uint32_t *);
+#ifdef EXT2FS_DEBUG
+void ext4_ext_print_extent_tree_status(struct inode * ip);
+#endif
#endif /* !_FS_EXT2FS_EXT2_EXTENTS_H_ */