It'd better to split directory data out although directory data is still not lazy written since it tends to put directory data next to the corresponding inode metadata.
Laterly, aligned directory data could be written in a batching way so that inodes can be more compact. Signed-off-by: Gao Xiang <[email protected]> --- include/erofs/cache.h | 9 +++++++-- lib/inode.c | 11 ++++++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/include/erofs/cache.h b/include/erofs/cache.h index 1461305..b04eb47 100644 --- a/include/erofs/cache.h +++ b/include/erofs/cache.h @@ -22,10 +22,12 @@ struct erofs_buffer_block; #define META 1 /* including inline xattrs, extent */ #define INODE 2 +/* directory data */ +#define DIRA 3 /* shared xattrs */ -#define XATTR 3 +#define XATTR 4 /* device table */ -#define DEVT 4 +#define DEVT 5 struct erofs_bhops { bool (*preflush)(struct erofs_buffer_head *bh); @@ -60,6 +62,9 @@ static inline const int get_alignsize(int type, int *type_ret) if (type == INODE) { *type_ret = META; return sizeof(struct erofs_inode_compact); + } else if (type == DIRA) { + *type_ret = META; + return erofs_blksiz(); } else if (type == XATTR) { *type_ret = META; return sizeof(struct erofs_xattr_entry); diff --git a/lib/inode.c b/lib/inode.c index 7167f19..9db84a8 100644 --- a/lib/inode.c +++ b/lib/inode.c @@ -142,7 +142,8 @@ struct erofs_dentry *erofs_d_alloc(struct erofs_inode *parent, /* allocate main data for a inode */ static int __allocate_inode_bh_data(struct erofs_inode *inode, - unsigned long nblocks) + unsigned long nblocks, + int type) { struct erofs_buffer_head *bh; int ret; @@ -154,7 +155,7 @@ static int __allocate_inode_bh_data(struct erofs_inode *inode, } /* allocate main data buffer */ - bh = erofs_balloc(DATA, erofs_pos(nblocks), 0, 0); + bh = erofs_balloc(type, erofs_pos(nblocks), 0, 0); if (IS_ERR(bh)) return PTR_ERR(bh); @@ -305,7 +306,7 @@ static int erofs_write_dir_file(struct erofs_inode *dir) q = used = blkno = 0; /* allocate dir main data */ - ret = __allocate_inode_bh_data(dir, erofs_blknr(dir->i_size)); + ret = __allocate_inode_bh_data(dir, erofs_blknr(dir->i_size), DIRA); if (ret) return ret; @@ -353,7 +354,7 @@ static int erofs_write_file_from_buffer(struct erofs_inode *inode, char *buf) inode->datalayout = EROFS_INODE_FLAT_INLINE; - ret = __allocate_inode_bh_data(inode, nblocks); + ret = __allocate_inode_bh_data(inode, nblocks, DATA); if (ret) return ret; @@ -386,7 +387,7 @@ static int write_uncompressed_file_from_fd(struct erofs_inode *inode, int fd) inode->datalayout = EROFS_INODE_FLAT_INLINE; nblocks = inode->i_size / erofs_blksiz(); - ret = __allocate_inode_bh_data(inode, nblocks); + ret = __allocate_inode_bh_data(inode, nblocks, DATA); if (ret) return ret; -- 2.24.4
