aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/f2fs/checkpoint.c21
-rw-r--r--include/linux/f2fs_fs.h13
2 files changed, 20 insertions, 14 deletions
diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c
index c9c08d52ecfd..ec3b7a5381fa 100644
--- a/fs/f2fs/checkpoint.c
+++ b/fs/f2fs/checkpoint.c
@@ -443,8 +443,8 @@ static void write_orphan_inodes(struct f2fs_sb_info *sbi, block_t start_blk)
443 struct f2fs_orphan_block *orphan_blk = NULL; 443 struct f2fs_orphan_block *orphan_blk = NULL;
444 unsigned int nentries = 0; 444 unsigned int nentries = 0;
445 unsigned short index; 445 unsigned short index;
446 unsigned short orphan_blocks = (unsigned short)((sbi->n_orphans + 446 unsigned short orphan_blocks =
447 (F2FS_ORPHANS_PER_BLOCK - 1)) / F2FS_ORPHANS_PER_BLOCK); 447 (unsigned short)GET_ORPHAN_BLOCKS(sbi->n_orphans);
448 struct page *page = NULL; 448 struct page *page = NULL;
449 struct ino_entry *orphan = NULL; 449 struct ino_entry *orphan = NULL;
450 450
@@ -837,7 +837,7 @@ static void do_checkpoint(struct f2fs_sb_info *sbi, bool is_umount)
837 ckpt->elapsed_time = cpu_to_le64(get_mtime(sbi)); 837 ckpt->elapsed_time = cpu_to_le64(get_mtime(sbi));
838 ckpt->valid_block_count = cpu_to_le64(valid_user_blocks(sbi)); 838 ckpt->valid_block_count = cpu_to_le64(valid_user_blocks(sbi));
839 ckpt->free_segment_count = cpu_to_le32(free_segments(sbi)); 839 ckpt->free_segment_count = cpu_to_le32(free_segments(sbi));
840 for (i = 0; i < 3; i++) { 840 for (i = 0; i < NR_CURSEG_NODE_TYPE; i++) {
841 ckpt->cur_node_segno[i] = 841 ckpt->cur_node_segno[i] =
842 cpu_to_le32(curseg_segno(sbi, i + CURSEG_HOT_NODE)); 842 cpu_to_le32(curseg_segno(sbi, i + CURSEG_HOT_NODE));
843 ckpt->cur_node_blkoff[i] = 843 ckpt->cur_node_blkoff[i] =
@@ -845,7 +845,7 @@ static void do_checkpoint(struct f2fs_sb_info *sbi, bool is_umount)
845 ckpt->alloc_type[i + CURSEG_HOT_NODE] = 845 ckpt->alloc_type[i + CURSEG_HOT_NODE] =
846 curseg_alloc_type(sbi, i + CURSEG_HOT_NODE); 846 curseg_alloc_type(sbi, i + CURSEG_HOT_NODE);
847 } 847 }
848 for (i = 0; i < 3; i++) { 848 for (i = 0; i < NR_CURSEG_DATA_TYPE; i++) {
849 ckpt->cur_data_segno[i] = 849 ckpt->cur_data_segno[i] =
850 cpu_to_le32(curseg_segno(sbi, i + CURSEG_HOT_DATA)); 850 cpu_to_le32(curseg_segno(sbi, i + CURSEG_HOT_DATA));
851 ckpt->cur_data_blkoff[i] = 851 ckpt->cur_data_blkoff[i] =
@@ -860,24 +860,23 @@ static void do_checkpoint(struct f2fs_sb_info *sbi, bool is_umount)
860 860
861 /* 2 cp + n data seg summary + orphan inode blocks */ 861 /* 2 cp + n data seg summary + orphan inode blocks */
862 data_sum_blocks = npages_for_summary_flush(sbi); 862 data_sum_blocks = npages_for_summary_flush(sbi);
863 if (data_sum_blocks < 3) 863 if (data_sum_blocks < NR_CURSEG_DATA_TYPE)
864 set_ckpt_flags(ckpt, CP_COMPACT_SUM_FLAG); 864 set_ckpt_flags(ckpt, CP_COMPACT_SUM_FLAG);
865 else 865 else
866 clear_ckpt_flags(ckpt, CP_COMPACT_SUM_FLAG); 866 clear_ckpt_flags(ckpt, CP_COMPACT_SUM_FLAG);
867 867
868 orphan_blocks = (sbi->n_orphans + F2FS_ORPHANS_PER_BLOCK - 1) 868 orphan_blocks = GET_ORPHAN_BLOCKS(sbi->n_orphans);
869 / F2FS_ORPHANS_PER_BLOCK;
870 ckpt->cp_pack_start_sum = cpu_to_le32(1 + cp_payload_blks + 869 ckpt->cp_pack_start_sum = cpu_to_le32(1 + cp_payload_blks +
871 orphan_blocks); 870 orphan_blocks);
872 871
873 if (is_umount) { 872 if (is_umount) {
874 set_ckpt_flags(ckpt, CP_UMOUNT_FLAG); 873 set_ckpt_flags(ckpt, CP_UMOUNT_FLAG);
875 ckpt->cp_pack_total_block_count = cpu_to_le32(2 + 874 ckpt->cp_pack_total_block_count = cpu_to_le32(F2FS_CP_PACKS+
876 cp_payload_blks + data_sum_blocks + 875 cp_payload_blks + data_sum_blocks +
877 orphan_blocks + NR_CURSEG_NODE_TYPE); 876 orphan_blocks + NR_CURSEG_NODE_TYPE);
878 } else { 877 } else {
879 clear_ckpt_flags(ckpt, CP_UMOUNT_FLAG); 878 clear_ckpt_flags(ckpt, CP_UMOUNT_FLAG);
880 ckpt->cp_pack_total_block_count = cpu_to_le32(2 + 879 ckpt->cp_pack_total_block_count = cpu_to_le32(F2FS_CP_PACKS +
881 cp_payload_blks + data_sum_blocks + 880 cp_payload_blks + data_sum_blocks +
882 orphan_blocks); 881 orphan_blocks);
883 } 882 }
@@ -1022,8 +1021,8 @@ void init_ino_entry_info(struct f2fs_sb_info *sbi)
1022 * for cp pack we can have max 1020*504 orphan entries 1021 * for cp pack we can have max 1020*504 orphan entries
1023 */ 1022 */
1024 sbi->n_orphans = 0; 1023 sbi->n_orphans = 0;
1025 sbi->max_orphans = (sbi->blocks_per_seg - 2 - NR_CURSEG_TYPE) 1024 sbi->max_orphans = (sbi->blocks_per_seg - F2FS_CP_PACKS -
1026 * F2FS_ORPHANS_PER_BLOCK; 1025 NR_CURSEG_TYPE) * F2FS_ORPHANS_PER_BLOCK;
1027} 1026}
1028 1027
1029int __init create_checkpoint_caches(void) 1028int __init create_checkpoint_caches(void)
diff --git a/include/linux/f2fs_fs.h b/include/linux/f2fs_fs.h
index 0ed77f32c9ac..08ed2b0a96e6 100644
--- a/include/linux/f2fs_fs.h
+++ b/include/linux/f2fs_fs.h
@@ -90,6 +90,8 @@ struct f2fs_super_block {
90#define CP_ORPHAN_PRESENT_FLAG 0x00000002 90#define CP_ORPHAN_PRESENT_FLAG 0x00000002
91#define CP_UMOUNT_FLAG 0x00000001 91#define CP_UMOUNT_FLAG 0x00000001
92 92
93#define F2FS_CP_PACKS 2 /* # of checkpoint packs */
94
93struct f2fs_checkpoint { 95struct f2fs_checkpoint {
94 __le64 checkpoint_ver; /* checkpoint block version number */ 96 __le64 checkpoint_ver; /* checkpoint block version number */
95 __le64 user_block_count; /* # of user blocks */ 97 __le64 user_block_count; /* # of user blocks */
@@ -126,6 +128,9 @@ struct f2fs_checkpoint {
126 */ 128 */
127#define F2FS_ORPHANS_PER_BLOCK 1020 129#define F2FS_ORPHANS_PER_BLOCK 1020
128 130
131#define GET_ORPHAN_BLOCKS(n) ((n + F2FS_ORPHANS_PER_BLOCK - 1) / \
132 F2FS_ORPHANS_PER_BLOCK)
133
129struct f2fs_orphan_block { 134struct f2fs_orphan_block {
130 __le32 ino[F2FS_ORPHANS_PER_BLOCK]; /* inode numbers */ 135 __le32 ino[F2FS_ORPHANS_PER_BLOCK]; /* inode numbers */
131 __le32 reserved; /* reserved */ 136 __le32 reserved; /* reserved */
@@ -147,6 +152,7 @@ struct f2fs_extent {
147#define F2FS_NAME_LEN 255 152#define F2FS_NAME_LEN 255
148#define F2FS_INLINE_XATTR_ADDRS 50 /* 200 bytes for inline xattrs */ 153#define F2FS_INLINE_XATTR_ADDRS 50 /* 200 bytes for inline xattrs */
149#define DEF_ADDRS_PER_INODE 923 /* Address Pointers in an Inode */ 154#define DEF_ADDRS_PER_INODE 923 /* Address Pointers in an Inode */
155#define DEF_NIDS_PER_INODE 5 /* Node IDs in an Inode */
150#define ADDRS_PER_INODE(fi) addrs_per_inode(fi) 156#define ADDRS_PER_INODE(fi) addrs_per_inode(fi)
151#define ADDRS_PER_BLOCK 1018 /* Address Pointers in a Direct Block */ 157#define ADDRS_PER_BLOCK 1018 /* Address Pointers in a Direct Block */
152#define NIDS_PER_BLOCK 1018 /* Node IDs in an Indirect Block */ 158#define NIDS_PER_BLOCK 1018 /* Node IDs in an Indirect Block */
@@ -166,8 +172,9 @@ struct f2fs_extent {
166#define MAX_INLINE_DATA (sizeof(__le32) * (DEF_ADDRS_PER_INODE - \ 172#define MAX_INLINE_DATA (sizeof(__le32) * (DEF_ADDRS_PER_INODE - \
167 F2FS_INLINE_XATTR_ADDRS - 1)) 173 F2FS_INLINE_XATTR_ADDRS - 1))
168 174
169#define INLINE_DATA_OFFSET (PAGE_CACHE_SIZE - sizeof(struct node_footer) \ 175#define INLINE_DATA_OFFSET (PAGE_CACHE_SIZE - sizeof(struct node_footer) -\
170 - sizeof(__le32) * (DEF_ADDRS_PER_INODE + 5 - 1)) 176 sizeof(__le32) * (DEF_ADDRS_PER_INODE + \
177 DEF_NIDS_PER_INODE - 1))
171 178
172struct f2fs_inode { 179struct f2fs_inode {
173 __le16 i_mode; /* file mode */ 180 __le16 i_mode; /* file mode */
@@ -197,7 +204,7 @@ struct f2fs_inode {
197 204
198 __le32 i_addr[DEF_ADDRS_PER_INODE]; /* Pointers to data blocks */ 205 __le32 i_addr[DEF_ADDRS_PER_INODE]; /* Pointers to data blocks */
199 206
200 __le32 i_nid[5]; /* direct(2), indirect(2), 207 __le32 i_nid[DEF_NIDS_PER_INODE]; /* direct(2), indirect(2),
201 double_indirect(1) node id */ 208 double_indirect(1) node id */
202} __packed; 209} __packed;
203 210