f2fs: allow address pointer number of dnode aligning to specified size
This patch expands scalability of dnode layout, it allows address pointer number of dnode aligning to specified size (now, the size is one byte by default), and later the number can align to compress cluster size (1 << n bytes, n=[2,..)), it can avoid cluster acrossing two dnode, making design of compress meta layout simple. Signed-off-by: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
2df0ab0457
commit
d02a6e6174
@ -2574,7 +2574,14 @@ static inline int f2fs_has_inline_xattr(struct inode *inode)
|
||||
|
||||
static inline unsigned int addrs_per_inode(struct inode *inode)
|
||||
{
|
||||
return CUR_ADDRS_PER_INODE(inode) - get_inline_xattr_addrs(inode);
|
||||
unsigned int addrs = CUR_ADDRS_PER_INODE(inode) -
|
||||
get_inline_xattr_addrs(inode);
|
||||
return ALIGN_DOWN(addrs, 1);
|
||||
}
|
||||
|
||||
static inline unsigned int addrs_per_block(struct inode *inode)
|
||||
{
|
||||
return ALIGN_DOWN(DEF_ADDRS_PER_BLOCK, 1);
|
||||
}
|
||||
|
||||
static inline void *inline_xattr_addr(struct inode *inode, struct page *page)
|
||||
|
@ -552,7 +552,7 @@ void f2fs_truncate_data_blocks_range(struct dnode_of_data *dn, int count)
|
||||
|
||||
void f2fs_truncate_data_blocks(struct dnode_of_data *dn)
|
||||
{
|
||||
f2fs_truncate_data_blocks_range(dn, ADDRS_PER_BLOCK);
|
||||
f2fs_truncate_data_blocks_range(dn, ADDRS_PER_BLOCK(dn->inode));
|
||||
}
|
||||
|
||||
static int truncate_partial_data_page(struct inode *inode, u64 from,
|
||||
@ -1006,7 +1006,8 @@ next_dnode:
|
||||
} else if (ret == -ENOENT) {
|
||||
if (dn.max_level == 0)
|
||||
return -ENOENT;
|
||||
done = min((pgoff_t)ADDRS_PER_BLOCK - dn.ofs_in_node, len);
|
||||
done = min((pgoff_t)ADDRS_PER_BLOCK(inode) - dn.ofs_in_node,
|
||||
len);
|
||||
blkaddr += done;
|
||||
do_replace += done;
|
||||
goto next;
|
||||
@ -1157,7 +1158,7 @@ static int __exchange_data_block(struct inode *src_inode,
|
||||
int ret;
|
||||
|
||||
while (len) {
|
||||
olen = min((pgoff_t)4 * ADDRS_PER_BLOCK, len);
|
||||
olen = min((pgoff_t)4 * ADDRS_PER_BLOCK(src_inode), len);
|
||||
|
||||
src_blkaddr = f2fs_kvzalloc(F2FS_I_SB(src_inode),
|
||||
array_size(olen, sizeof(block_t)),
|
||||
|
@ -591,7 +591,7 @@ block_t f2fs_start_bidx_of_node(unsigned int node_ofs, struct inode *inode)
|
||||
int dec = (node_ofs - indirect_blks - 3) / (NIDS_PER_BLOCK + 1);
|
||||
bidx = node_ofs - 5 - dec;
|
||||
}
|
||||
return bidx * ADDRS_PER_BLOCK + ADDRS_PER_INODE(inode);
|
||||
return bidx * ADDRS_PER_BLOCK(inode) + ADDRS_PER_INODE(inode);
|
||||
}
|
||||
|
||||
static bool is_alive(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,
|
||||
|
@ -600,9 +600,9 @@ static void f2fs_ra_node_pages(struct page *parent, int start, int n)
|
||||
pgoff_t f2fs_get_next_page_offset(struct dnode_of_data *dn, pgoff_t pgofs)
|
||||
{
|
||||
const long direct_index = ADDRS_PER_INODE(dn->inode);
|
||||
const long direct_blks = ADDRS_PER_BLOCK;
|
||||
const long indirect_blks = ADDRS_PER_BLOCK * NIDS_PER_BLOCK;
|
||||
unsigned int skipped_unit = ADDRS_PER_BLOCK;
|
||||
const long direct_blks = ADDRS_PER_BLOCK(dn->inode);
|
||||
const long indirect_blks = ADDRS_PER_BLOCK(dn->inode) * NIDS_PER_BLOCK;
|
||||
unsigned int skipped_unit = ADDRS_PER_BLOCK(dn->inode);
|
||||
int cur_level = dn->cur_level;
|
||||
int max_level = dn->max_level;
|
||||
pgoff_t base = 0;
|
||||
@ -636,9 +636,9 @@ static int get_node_path(struct inode *inode, long block,
|
||||
int offset[4], unsigned int noffset[4])
|
||||
{
|
||||
const long direct_index = ADDRS_PER_INODE(inode);
|
||||
const long direct_blks = ADDRS_PER_BLOCK;
|
||||
const long direct_blks = ADDRS_PER_BLOCK(inode);
|
||||
const long dptrs_per_blk = NIDS_PER_BLOCK;
|
||||
const long indirect_blks = ADDRS_PER_BLOCK * NIDS_PER_BLOCK;
|
||||
const long indirect_blks = ADDRS_PER_BLOCK(inode) * NIDS_PER_BLOCK;
|
||||
const long dindirect_blks = indirect_blks * NIDS_PER_BLOCK;
|
||||
int n = 0;
|
||||
int level = 0;
|
||||
|
@ -2276,7 +2276,7 @@ static const struct export_operations f2fs_export_ops = {
|
||||
static loff_t max_file_blocks(void)
|
||||
{
|
||||
loff_t result = 0;
|
||||
loff_t leaf_count = ADDRS_PER_BLOCK;
|
||||
loff_t leaf_count = DEF_ADDRS_PER_BLOCK;
|
||||
|
||||
/*
|
||||
* note: previously, result is equal to (DEF_ADDRS_PER_INODE -
|
||||
|
@ -198,11 +198,12 @@ struct f2fs_extent {
|
||||
get_extra_isize(inode))
|
||||
#define DEF_NIDS_PER_INODE 5 /* Node IDs in an Inode */
|
||||
#define ADDRS_PER_INODE(inode) addrs_per_inode(inode)
|
||||
#define ADDRS_PER_BLOCK 1018 /* Address Pointers in a Direct Block */
|
||||
#define DEF_ADDRS_PER_BLOCK 1018 /* Address Pointers in a Direct Block */
|
||||
#define ADDRS_PER_BLOCK(inode) addrs_per_block(inode)
|
||||
#define NIDS_PER_BLOCK 1018 /* Node IDs in an Indirect Block */
|
||||
|
||||
#define ADDRS_PER_PAGE(page, inode) \
|
||||
(IS_INODE(page) ? ADDRS_PER_INODE(inode) : ADDRS_PER_BLOCK)
|
||||
(IS_INODE(page) ? ADDRS_PER_INODE(inode) : ADDRS_PER_BLOCK(inode))
|
||||
|
||||
#define NODE_DIR1_BLOCK (DEF_ADDRS_PER_INODE + 1)
|
||||
#define NODE_DIR2_BLOCK (DEF_ADDRS_PER_INODE + 2)
|
||||
@ -267,7 +268,7 @@ struct f2fs_inode {
|
||||
} __packed;
|
||||
|
||||
struct direct_node {
|
||||
__le32 addr[ADDRS_PER_BLOCK]; /* array of data block address */
|
||||
__le32 addr[DEF_ADDRS_PER_BLOCK]; /* array of data block address */
|
||||
} __packed;
|
||||
|
||||
struct indirect_node {
|
||||
|
Loading…
Reference in New Issue
Block a user