@@ -893,14 +893,15 @@ static bool cluster_has_invalid_data(struct compress_ctx *cc)
893
893
894
894
bool f2fs_sanity_check_cluster (struct dnode_of_data * dn )
895
895
{
896
+ #ifdef CONFIG_F2FS_CHECK_FS
896
897
struct f2fs_sb_info * sbi = F2FS_I_SB (dn -> inode );
897
898
unsigned int cluster_size = F2FS_I (dn -> inode )-> i_cluster_size ;
898
- bool compressed = dn -> data_blkaddr == COMPRESS_ADDR ;
899
899
int cluster_end = 0 ;
900
+ unsigned int count ;
900
901
int i ;
901
902
char * reason = "" ;
902
903
903
- if (! compressed )
904
+ if (dn -> data_blkaddr != COMPRESS_ADDR )
904
905
return false;
905
906
906
907
/* [..., COMPR_ADDR, ...] */
@@ -909,7 +910,7 @@ bool f2fs_sanity_check_cluster(struct dnode_of_data *dn)
909
910
goto out ;
910
911
}
911
912
912
- for (i = 1 ; i < cluster_size ; i ++ ) {
913
+ for (i = 1 , count = 1 ; i < cluster_size ; i ++ , count ++ ) {
913
914
block_t blkaddr = data_blkaddr (dn -> inode , dn -> node_page ,
914
915
dn -> ofs_in_node + i );
915
916
@@ -929,19 +930,42 @@ bool f2fs_sanity_check_cluster(struct dnode_of_data *dn)
929
930
goto out ;
930
931
}
931
932
}
933
+
934
+ f2fs_bug_on (F2FS_I_SB (dn -> inode ), count != cluster_size &&
935
+ !is_inode_flag_set (dn -> inode , FI_COMPRESS_RELEASED ));
936
+
932
937
return false;
933
938
out :
934
939
f2fs_warn (sbi , "access invalid cluster, ino:%lu, nid:%u, ofs_in_node:%u, reason:%s" ,
935
940
dn -> inode -> i_ino , dn -> nid , dn -> ofs_in_node , reason );
936
941
set_sbi_flag (sbi , SBI_NEED_FSCK );
937
942
return true;
943
+ #else
944
+ return false;
945
+ #endif
946
+ }
947
+
948
+ static int __f2fs_get_cluster_blocks (struct inode * inode ,
949
+ struct dnode_of_data * dn )
950
+ {
951
+ unsigned int cluster_size = F2FS_I (inode )-> i_cluster_size ;
952
+ int count , i ;
953
+
954
+ for (i = 1 , count = 1 ; i < cluster_size ; i ++ ) {
955
+ block_t blkaddr = data_blkaddr (dn -> inode , dn -> node_page ,
956
+ dn -> ofs_in_node + i );
957
+
958
+ if (__is_valid_data_blkaddr (blkaddr ))
959
+ count ++ ;
960
+ }
961
+
962
+ return count ;
938
963
}
939
964
940
965
static int __f2fs_cluster_blocks (struct inode * inode ,
941
- unsigned int cluster_idx , bool compr )
966
+ unsigned int cluster_idx , bool compr_blks )
942
967
{
943
968
struct dnode_of_data dn ;
944
- unsigned int cluster_size = F2FS_I (inode )-> i_cluster_size ;
945
969
unsigned int start_idx = cluster_idx <<
946
970
F2FS_I (inode )-> i_log_cluster_size ;
947
971
int ret ;
@@ -956,31 +980,14 @@ static int __f2fs_cluster_blocks(struct inode *inode,
956
980
957
981
if (f2fs_sanity_check_cluster (& dn )) {
958
982
ret = - EFSCORRUPTED ;
959
- f2fs_handle_error (F2FS_I_SB (inode ), ERROR_CORRUPTED_CLUSTER );
960
983
goto fail ;
961
984
}
962
985
963
986
if (dn .data_blkaddr == COMPRESS_ADDR ) {
964
- int i ;
965
-
966
- ret = 1 ;
967
- for (i = 1 ; i < cluster_size ; i ++ ) {
968
- block_t blkaddr ;
969
-
970
- blkaddr = data_blkaddr (dn .inode ,
971
- dn .node_page , dn .ofs_in_node + i );
972
- if (compr ) {
973
- if (__is_valid_data_blkaddr (blkaddr ))
974
- ret ++ ;
975
- } else {
976
- if (blkaddr != NULL_ADDR )
977
- ret ++ ;
978
- }
979
- }
980
-
981
- f2fs_bug_on (F2FS_I_SB (inode ),
982
- !compr && ret != cluster_size &&
983
- !is_inode_flag_set (inode , FI_COMPRESS_RELEASED ));
987
+ if (compr_blks )
988
+ ret = __f2fs_get_cluster_blocks (inode , & dn );
989
+ else
990
+ ret = 1 ;
984
991
}
985
992
fail :
986
993
f2fs_put_dnode (& dn );
@@ -993,7 +1000,7 @@ static int f2fs_compressed_blocks(struct compress_ctx *cc)
993
1000
return __f2fs_cluster_blocks (cc -> inode , cc -> cluster_idx , true);
994
1001
}
995
1002
996
- /* return # of valid blocks in compressed cluster */
1003
+ /* return whether cluster is compressed one or not */
997
1004
int f2fs_is_compressed_cluster (struct inode * inode , pgoff_t index )
998
1005
{
999
1006
return __f2fs_cluster_blocks (inode ,
0 commit comments