diff options
author | Fedor Uporov <fsu@FreeBSD.org> | 2017-10-17 20:45:44 +0000 |
---|---|---|
committer | Fedor Uporov <fsu@FreeBSD.org> | 2017-10-17 20:45:44 +0000 |
commit | b394cd1e28f1a094742434474ebe4f5004bf0ce3 (patch) | |
tree | 4a903d2c90a5b6b6660009ceba227c563b50628b /sys/fs/ext2fs/ext2_extents.h | |
parent | b541ba195ccc4806d94348fa328d620e3261c05a (diff) | |
download | src-b394cd1e28f1a094742434474ebe4f5004bf0ce3.tar.gz src-b394cd1e28f1a094742434474ebe4f5004bf0ce3.zip |
Add inital extents read-write support.
Approved by: pfg (mentor)
MFC after: 6 months
RelNotes: Yes
Differential Revision: https://reviews.freebsd.org/D12087
Notes
Notes:
svn path=/head/; revision=324706
Diffstat (limited to 'sys/fs/ext2fs/ext2_extents.h')
-rw-r--r-- | sys/fs/ext2fs/ext2_extents.h | 40 |
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_ */ |