f2fs: introduce max_file_blocks in sbi
PATCH 1/1 f2fs: introduce max_file_blocks in sbi
Introduce max_file_blocks in sbi to store max block index of file in f2fs, it could be used to avoid unneeded calculation of max block index in runtime.
--- fs/f2fs/data.c | 2 +- fs/f2fs/f2fs.h | 2 +- fs/f2fs/super.c | 7 ++++--- 3 files changed, 6 insertions(+), 5 deletions(-)
fs/f2fs/data.c +1 -1
@@ -762,7 +762,7 @@ static int get_data_block_bmap(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create) {/* Block number less than F2FS MAX BLOCKS */ -if (unlikely (iblock >=max_file_size (0 ))) +if (unlikely (iblock >=F2FS_I_SB (inode)->max_file_blocks))return -EFBIG ; return __get_data_block(inode, iblock, bh_result, create,
fs/f2fs/f2fs.h +1 -1
@@ -786,6 +786,7 @@ struct f2fs_sb_info {unsigned int total_node_count;/* total node block count */ unsigned int total_valid_node_count;/* valid node block count */ unsigned int total_valid_inode_count;/* valid inode count */ +unsigned int max_file_blocks;/* max block index of file */ int active_logs;/* # of active logs */ int dir_level;/* directory level */ int serialized_dio_pages;/* serialized direct IO pages */
@@ -1731,7 +1732,6 @@ static inline int f2fs_add_link(struct dentry *dentry, struct inode *inode)* super.c */ int f2fs_commit_super (struct f2fs_sb_info *,bool ); -loff_t max_file_size (unsigned bits);int f2fs_sync_fs (struct super_block *,int ); extern __printf(3, 4) void f2fs_msg(struct super_block *, const char *, const char *, ...);
fs/f2fs/super.c +4 -3
@@ -909,7 +909,7 @@ static const struct export_operations f2fs_export_ops = { .get_parent = f2fs_get_parent, }; -loff_t max_file_size (unsigned bits) +static loff_t max_file_blocks (void ) {loff_t result = (DEF_ADDRS_PER_INODE -F2FS_INLINE_XATTR_ADDRS );loff_t leaf_count =ADDRS_PER_BLOCK ;
@@ -925,7 +925,6 @@ loff_t max_file_size(unsigned bits) leaf_count *=NIDS_PER_BLOCK ; result += leaf_count; - result <<= bits;return result; }
@@ -1281,7 +1280,9 @@ try_onemore:if (err) goto free_options; - sb->s_maxbytes =max_file_size (le32_to_cpu (raw_super->log_blocksize)); + sbi->max_file_blocks =max_file_blocks (); + sb->s_maxbytes = sbi->max_file_blocks << +le32_to_cpu (raw_super->log_blocksize); sb->s_max_links =F2FS_LINK_MAX ;get_random_bytes (&sbi->s_next_generation,sizeof (u32));
Signature · 1 line
2.6.3
Jaegeuk Kim
maintainerHi Chao,
Quoted 29 lines · Chao Yu
Introduce
max_file_blocksin sbi to store max block index of file in f2fs, it could be used to avoid unneeded calculation of max block index in runtime.Signed-off-by Chao Yu <[email protected]>--- fs/f2fs/data.c | 2 +- fs/f2fs/f2fs.h | 2 +- fs/f2fs/super.c | 7 ++++--- 3 files changed, 6 insertions(+), 5 deletions(-)fs/f2fs/data.c +1
-1@@ -762,7 +762,7 @@ static int get_data_block_bmap(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create) {/* Block number less than F2FS MAX BLOCKS */ -if (unlikely (iblock >=max_file_size (0 ))) +if (unlikely (iblock >=F2FS_I_SB (inode)->max_file_blocks))return -EFBIG ; return __get_data_block(inode, iblock, bh_result, create,fs/f2fs/f2fs.h +0
-0
fs/f2fs/f2fs.h struct f2fs_sb_info { · line 789
Quoted 4 lines
fs/f2fs/f2fs.h +1
-0@@ -786,6 +786,7 @@ struct f2fs_sb_info {unsigned int total_node_count;/* total node block count */ unsigned int total_valid_node_count;/* valid node block count */ unsigned int total_valid_inode_count;/* valid inode count */ +unsigned int max_file_blocks;/* max block index of file */
I found a overflow bug here and fixed this in my git. This should be loff_t, otherwise it goes about 300 MB.
Thanks,
Quoted 46 lines
fs/f2fs/f2fs.h +0
-1int active_logs;/* # of active logs */ int dir_level;/* directory level */ int serialized_dio_pages;/* serialized direct IO pages */ @@ -1731,7 +1732,6 @@ static inline int f2fs_add_link(struct dentry *dentry, struct inode *inode)* super.c */ int f2fs_commit_super (struct f2fs_sb_info *,bool ); -loff_t max_file_size (unsigned bits);int f2fs_sync_fs (struct super_block *,int ); extern __printf(3, 4) void f2fs_msg(struct super_block *, const char *, const char *, ...);fs/f2fs/super.c +4
-3@@ -909,7 +909,7 @@ static const struct export_operations f2fs_export_ops = { .get_parent = f2fs_get_parent, }; -loff_t max_file_size (unsigned bits) +static loff_t max_file_blocks (void ) {loff_t result = (DEF_ADDRS_PER_INODE -F2FS_INLINE_XATTR_ADDRS );loff_t leaf_count =ADDRS_PER_BLOCK ;@@ -925,7 +925,6 @@ loff_t max_file_size(unsigned bits) leaf_count *=NIDS_PER_BLOCK ; result += leaf_count; - result <<= bits;return result; }@@ -1281,7 +1280,9 @@ try_onemore:if (err) goto free_options; - sb->s_maxbytes =max_file_size (le32_to_cpu (raw_super->log_blocksize)); + sbi->max_file_blocks =max_file_blocks (); + sb->s_maxbytes = sbi->max_file_blocks << +le32_to_cpu (raw_super->log_blocksize); sb->s_max_links =F2FS_LINK_MAX ;get_random_bytes (&sbi->s_next_generation,sizeof (u32));Signature · 1 line
2.6.3
Hi Jaegeuk,
Quoted 33 lines
-----Original Message-----
From: Jaegeuk Kim [mailto:[email protected]]
Sent: Monday, January 04, 2016 1:43 PM
To: Chao Yu
Cc: [email protected]; [email protected]
Subject: Re: [PATCH] f2fs: introducemax_file_blocksin sbiHi Chao,
Quoted 23 lines · Chao Yu
Introduce
max_file_blocksin sbi to store max block index of file in f2fs, it could be used to avoid unneeded calculation of max block index in runtime.Signed-off-by Chao Yu <[email protected]>--- fs/f2fs/data.c | 2 +- fs/f2fs/f2fs.h | 2 +- fs/f2fs/super.c | 7 ++++--- 3 files changed, 6 insertions(+), 5 deletions(-)fs/f2fs/data.c +1
-1@@ -762,7 +762,7 @@ static int get_data_block_bmap(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create) {/* Block number less than F2FS MAX BLOCKS */ -if (unlikely (iblock >=max_file_size (0 ))) +if (unlikely (iblock >=F2FS_I_SB (inode)->max_file_blocks))return -EFBIG ;
Quoted 13 lines
fs/f2fs/f2fs.h struct f2fs_sb_info { · line 789
Quoted 10 lines
fs/f2fs/data.c +0
-0return __get_data_block(inode, iblock, bh_result, create,fs/f2fs/f2fs.h +1
-0@@ -786,6 +786,7 @@ struct f2fs_sb_info {unsigned int total_node_count;/* total node block count */ unsigned int total_valid_node_count;/* valid node block count */ unsigned int total_valid_inode_count;/* valid inode count */ +unsigned int max_file_blocks;/* max block index of file */ I found a overflow bug here and fixed this in my git. This should be
loff_t, otherwise it goes about 300 MB.
Sorry, it's my bad.
Thanks for fixing this. :)
Thanks,
Quoted 51 lines
Thanks,
fs/f2fs/f2fs.h static inline int f2fs_add_link(struct dentry *dentry, struct inode
Quoted 4 lines
fs/f2fs/f2fs.h +0
-0int active_logs;/* # of active logs */ int dir_level;/* directory level */ int serialized_dio_pages;/* serialized direct IO pages */ @@ -1731,7 +1732,6 @@ static inline int f2fs_add_link(struct dentry *dentry, struct inode*inode)
Quoted 42 lines
fs/f2fs/f2fs.h +0
-1* super.c */ int f2fs_commit_super (struct f2fs_sb_info *,bool ); -loff_t max_file_size (unsigned bits);int f2fs_sync_fs (struct super_block *,int ); extern __printf(3, 4) void f2fs_msg(struct super_block *, const char *, const char *, ...);fs/f2fs/super.c +4
-4@@ -909,7 +909,7 @@ static const struct export_operations f2fs_export_ops = { .get_parent = f2fs_get_parent, }; -loff_t max_file_size (unsigned bits) +static loff_t max_file_blocks (void ) {loff_t result = (DEF_ADDRS_PER_INODE -F2FS_INLINE_XATTR_ADDRS );loff_t leaf_count =ADDRS_PER_BLOCK ;@@ -925,7 +925,6 @@ loff_t max_file_size(unsigned bits) leaf_count *=NIDS_PER_BLOCK ; result += leaf_count; - result <<= bits;return result; }@@ -1281,7 +1280,9 @@ try_onemore:if (err) goto free_options; - sb->s_maxbytes =max_file_size (le32_to_cpu (raw_super->log_blocksize)); + sbi->max_file_blocks =max_file_blocks (); + sb->s_maxbytes = sbi->max_file_blocks << +le32_to_cpu (raw_super->log_blocksize); sb->s_max_links =F2FS_LINK_MAX ;get_random_bytes (&sbi->s_next_generation,sizeof (u32)); --2.6.3