Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

f2fs: use generic EFSBADCRC/EFSCORRUPTED

f2fs uses EFAULT as error number to indicate filesystem is corrupted
all the time, but generic filesystems use EUCLEAN for such condition,
we need to change to follow others.

This patch adds two new macros as below to wrap more generic error
code macros, and spread them in code.

EFSBADCRC EBADMSG /* Bad CRC detected */
EFSCORRUPTED EUCLEAN /* Filesystem is corrupted */

Reported-by: Pavel Machek <pavel@ucw.cz>
Signed-off-by: Chao Yu <yuchao0@huawei.com>
Acked-by: Pavel Machek <pavel@ucw.cz>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>

authored by

Chao Yu and committed by
Jaegeuk Kim
10f966bb f91108b8

+46 -37
+9 -3
fs/f2fs/checkpoint.c
··· 890 890 unsigned int cp_blks = 1 + __cp_payload(sbi); 891 891 block_t cp_blk_no; 892 892 int i; 893 + int err; 893 894 894 895 sbi->ckpt = f2fs_kzalloc(sbi, array_size(blk_size, cp_blks), 895 896 GFP_KERNEL); ··· 918 917 } else if (cp2) { 919 918 cur_page = cp2; 920 919 } else { 920 + err = -EFSCORRUPTED; 921 921 goto fail_no_cp; 922 922 } 923 923 ··· 931 929 sbi->cur_cp_pack = 2; 932 930 933 931 /* Sanity checking of checkpoint */ 934 - if (f2fs_sanity_check_ckpt(sbi)) 932 + if (f2fs_sanity_check_ckpt(sbi)) { 933 + err = -EFSCORRUPTED; 935 934 goto free_fail_no_cp; 935 + } 936 936 937 937 if (cp_blks <= 1) 938 938 goto done; ··· 948 944 unsigned char *ckpt = (unsigned char *)sbi->ckpt; 949 945 950 946 cur_page = f2fs_get_meta_page(sbi, cp_blk_no + i); 951 - if (IS_ERR(cur_page)) 947 + if (IS_ERR(cur_page)) { 948 + err = PTR_ERR(cur_page); 952 949 goto free_fail_no_cp; 950 + } 953 951 sit_bitmap_ptr = page_address(cur_page); 954 952 memcpy(ckpt + i * blk_size, sit_bitmap_ptr, blk_size); 955 953 f2fs_put_page(cur_page, 1); ··· 966 960 f2fs_put_page(cp2, 1); 967 961 fail_no_cp: 968 962 kvfree(sbi->ckpt); 969 - return -EINVAL; 963 + return err; 970 964 } 971 965 972 966 static void __add_dirty_inode(struct inode *inode, enum inode_type type)
+9 -9
fs/f2fs/data.c
··· 455 455 if (!f2fs_is_valid_blkaddr(fio->sbi, fio->new_blkaddr, 456 456 fio->is_por ? META_POR : (__is_meta_io(fio) ? 457 457 META_GENERIC : DATA_GENERIC_ENHANCE))) 458 - return -EFAULT; 458 + return -EFSCORRUPTED; 459 459 460 460 trace_f2fs_submit_page_bio(page, fio); 461 461 f2fs_trace_ios(fio, 0); ··· 489 489 490 490 if (!f2fs_is_valid_blkaddr(fio->sbi, fio->new_blkaddr, 491 491 __is_meta_io(fio) ? META_GENERIC : DATA_GENERIC)) 492 - return -EFAULT; 492 + return -EFSCORRUPTED; 493 493 494 494 trace_f2fs_submit_page_bio(page, fio); 495 495 f2fs_trace_ios(fio, 0); ··· 789 789 dn.data_blkaddr = ei.blk + index - ei.fofs; 790 790 if (!f2fs_is_valid_blkaddr(F2FS_I_SB(inode), dn.data_blkaddr, 791 791 DATA_GENERIC_ENHANCE_READ)) { 792 - err = -EFAULT; 792 + err = -EFSCORRUPTED; 793 793 goto put_err; 794 794 } 795 795 goto got_it; ··· 809 809 !f2fs_is_valid_blkaddr(F2FS_I_SB(inode), 810 810 dn.data_blkaddr, 811 811 DATA_GENERIC_ENHANCE)) { 812 - err = -EFAULT; 812 + err = -EFSCORRUPTED; 813 813 goto put_err; 814 814 } 815 815 got_it: ··· 1155 1155 1156 1156 if (__is_valid_data_blkaddr(blkaddr) && 1157 1157 !f2fs_is_valid_blkaddr(sbi, blkaddr, DATA_GENERIC_ENHANCE)) { 1158 - err = -EFAULT; 1158 + err = -EFSCORRUPTED; 1159 1159 goto sync_out; 1160 1160 } 1161 1161 ··· 1625 1625 1626 1626 if (!f2fs_is_valid_blkaddr(F2FS_I_SB(inode), block_nr, 1627 1627 DATA_GENERIC_ENHANCE_READ)) { 1628 - ret = -EFAULT; 1628 + ret = -EFSCORRUPTED; 1629 1629 goto out; 1630 1630 } 1631 1631 } else { ··· 1906 1906 1907 1907 if (!f2fs_is_valid_blkaddr(fio->sbi, fio->old_blkaddr, 1908 1908 DATA_GENERIC_ENHANCE)) 1909 - return -EFAULT; 1909 + return -EFSCORRUPTED; 1910 1910 1911 1911 ipu_force = true; 1912 1912 fio->need_lock = LOCK_DONE; ··· 1933 1933 if (__is_valid_data_blkaddr(fio->old_blkaddr) && 1934 1934 !f2fs_is_valid_blkaddr(fio->sbi, fio->old_blkaddr, 1935 1935 DATA_GENERIC_ENHANCE)) { 1936 - err = -EFAULT; 1936 + err = -EFSCORRUPTED; 1937 1937 goto out_writepage; 1938 1938 } 1939 1939 /* ··· 2606 2606 } else { 2607 2607 if (!f2fs_is_valid_blkaddr(sbi, blkaddr, 2608 2608 DATA_GENERIC_ENHANCE_READ)) { 2609 - err = -EFAULT; 2609 + err = -EFSCORRUPTED; 2610 2610 goto fail; 2611 2611 } 2612 2612 err = f2fs_submit_page_read(inode, page, blkaddr);
+1 -1
fs/f2fs/dir.c
··· 818 818 f2fs_warn(sbi, "%s: corrupted namelen=%d, run fsck to fix.", 819 819 __func__, le16_to_cpu(de->name_len)); 820 820 set_sbi_flag(sbi, SBI_NEED_FSCK); 821 - err = -EINVAL; 821 + err = -EFSCORRUPTED; 822 822 goto out; 823 823 } 824 824
+3
fs/f2fs/f2fs.h
··· 3708 3708 return false; 3709 3709 } 3710 3710 3711 + #define EFSBADCRC EBADMSG /* Bad CRC detected */ 3712 + #define EFSCORRUPTED EUCLEAN /* Filesystem is corrupted */ 3713 + 3711 3714 #endif /* _LINUX_F2FS_H */
+1 -1
fs/f2fs/file.c
··· 1023 1023 !f2fs_is_valid_blkaddr(sbi, *blkaddr, 1024 1024 DATA_GENERIC_ENHANCE)) { 1025 1025 f2fs_put_dnode(&dn); 1026 - return -EFAULT; 1026 + return -EFSCORRUPTED; 1027 1027 } 1028 1028 1029 1029 if (!f2fs_is_checkpointed_data(sbi, *blkaddr)) {
+3 -3
fs/f2fs/gc.c
··· 660 660 dn.data_blkaddr = ei.blk + index - ei.fofs; 661 661 if (unlikely(!f2fs_is_valid_blkaddr(sbi, dn.data_blkaddr, 662 662 DATA_GENERIC_ENHANCE_READ))) { 663 - err = -EFAULT; 663 + err = -EFSCORRUPTED; 664 664 goto put_page; 665 665 } 666 666 goto got_it; ··· 678 678 } 679 679 if (unlikely(!f2fs_is_valid_blkaddr(sbi, dn.data_blkaddr, 680 680 DATA_GENERIC_ENHANCE))) { 681 - err = -EFAULT; 681 + err = -EFSCORRUPTED; 682 682 goto put_page; 683 683 } 684 684 got_it: ··· 1454 1454 1455 1455 if (is_sbi_flag_set(sbi, SBI_NEED_FSCK)) { 1456 1456 f2fs_err(sbi, "Should run fsck to repair first."); 1457 - return -EINVAL; 1457 + return -EFSCORRUPTED; 1458 1458 } 1459 1459 1460 1460 if (test_opt(sbi, DISABLE_CHECKPOINT)) {
+2 -2
fs/f2fs/inline.c
··· 142 142 set_sbi_flag(fio.sbi, SBI_NEED_FSCK); 143 143 f2fs_warn(fio.sbi, "%s: corrupted inline inode ino=%lx, i_addr[0]:0x%x, run fsck to fix.", 144 144 __func__, dn->inode->i_ino, dn->data_blkaddr); 145 - return -EINVAL; 145 + return -EFSCORRUPTED; 146 146 } 147 147 148 148 f2fs_bug_on(F2FS_P_SB(page), PageWriteback(page)); ··· 383 383 set_sbi_flag(F2FS_P_SB(page), SBI_NEED_FSCK); 384 384 f2fs_warn(F2FS_P_SB(page), "%s: corrupted inline inode ino=%lx, i_addr[0]:0x%x, run fsck to fix.", 385 385 __func__, dir->i_ino, dn.data_blkaddr); 386 - err = -EINVAL; 386 + err = -EFSCORRUPTED; 387 387 goto out; 388 388 } 389 389
+2 -2
fs/f2fs/inode.c
··· 74 74 if (!__is_valid_data_blkaddr(addr)) 75 75 return 1; 76 76 if (!f2fs_is_valid_blkaddr(sbi, addr, DATA_GENERIC_ENHANCE)) 77 - return -EFAULT; 77 + return -EFSCORRUPTED; 78 78 return 0; 79 79 } 80 80 ··· 358 358 359 359 if (!sanity_check_inode(inode, node_page)) { 360 360 f2fs_put_page(node_page, 1); 361 - return -EINVAL; 361 + return -EFSCORRUPTED; 362 362 } 363 363 364 364 /* check data exist */
+3 -3
fs/f2fs/node.c
··· 36 36 set_sbi_flag(sbi, SBI_NEED_FSCK); 37 37 f2fs_warn(sbi, "%s: out-of-range nid=%x, run fsck to fix.", 38 38 __func__, nid); 39 - return -EINVAL; 39 + return -EFSCORRUPTED; 40 40 } 41 41 return 0; 42 42 } ··· 1288 1288 if (PageUptodate(page)) { 1289 1289 if (!f2fs_inode_chksum_verify(sbi, page)) { 1290 1290 ClearPageUptodate(page); 1291 - return -EBADMSG; 1291 + return -EFSBADCRC; 1292 1292 } 1293 1293 return LOCKED_PAGE; 1294 1294 } ··· 1372 1372 } 1373 1373 1374 1374 if (!f2fs_inode_chksum_verify(sbi, page)) { 1375 - err = -EBADMSG; 1375 + err = -EFSBADCRC; 1376 1376 goto out_err; 1377 1377 } 1378 1378 page_hit:
+3 -3
fs/f2fs/recovery.c
··· 553 553 f2fs_warn(sbi, "Inconsistent ofs_of_node, ino:%lu, ofs:%u, %u", 554 554 inode->i_ino, ofs_of_node(dn.node_page), 555 555 ofs_of_node(page)); 556 - err = -EFAULT; 556 + err = -EFSCORRUPTED; 557 557 goto err; 558 558 } 559 559 ··· 565 565 566 566 if (__is_valid_data_blkaddr(src) && 567 567 !f2fs_is_valid_blkaddr(sbi, src, META_POR)) { 568 - err = -EFAULT; 568 + err = -EFSCORRUPTED; 569 569 goto err; 570 570 } 571 571 572 572 if (__is_valid_data_blkaddr(dest) && 573 573 !f2fs_is_valid_blkaddr(sbi, dest, META_POR)) { 574 - err = -EFAULT; 574 + err = -EFSCORRUPTED; 575 575 goto err; 576 576 } 577 577
+5 -5
fs/f2fs/segment.c
··· 2819 2819 2820 2820 if (is_sbi_flag_set(sbi, SBI_NEED_FSCK)) { 2821 2821 f2fs_warn(sbi, "Found FS corruption, run fsck to fix."); 2822 - return -EIO; 2822 + return -EFSCORRUPTED; 2823 2823 } 2824 2824 2825 2825 /* start/end segment number in main_area */ ··· 3244 3244 set_sbi_flag(sbi, SBI_NEED_FSCK); 3245 3245 f2fs_warn(sbi, "%s: incorrect segment(%u) type, run fsck to fix.", 3246 3246 __func__, segno); 3247 - return -EFAULT; 3247 + return -EFSCORRUPTED; 3248 3248 } 3249 3249 3250 3250 stat_inc_inplace_blocks(fio->sbi); ··· 4153 4153 f2fs_err(sbi, "Wrong journal entry on segno %u", 4154 4154 start); 4155 4155 set_sbi_flag(sbi, SBI_NEED_FSCK); 4156 - err = -EINVAL; 4156 + err = -EFSCORRUPTED; 4157 4157 break; 4158 4158 } 4159 4159 ··· 4193 4193 f2fs_err(sbi, "SIT is corrupted node# %u vs %u", 4194 4194 total_node_blocks, valid_node_count(sbi)); 4195 4195 set_sbi_flag(sbi, SBI_NEED_FSCK); 4196 - err = -EINVAL; 4196 + err = -EFSCORRUPTED; 4197 4197 } 4198 4198 4199 4199 return err; ··· 4311 4311 "Current segment's next free block offset is inconsistent with bitmap, logtype:%u, segno:%u, type:%u, next_blkoff:%u, blkofs:%u", 4312 4312 i, curseg->segno, curseg->alloc_type, 4313 4313 curseg->next_blkoff, blkofs); 4314 - return -EINVAL; 4314 + return -EFSCORRUPTED; 4315 4315 } 4316 4316 } 4317 4317 return 0;
+2 -2
fs/f2fs/segment.h
··· 696 696 f2fs_err(sbi, "Mismatch valid blocks %d vs. %d", 697 697 GET_SIT_VBLOCKS(raw_sit), valid_blocks); 698 698 set_sbi_flag(sbi, SBI_NEED_FSCK); 699 - return -EINVAL; 699 + return -EFSCORRUPTED; 700 700 } 701 701 702 702 /* check segment usage, and check boundary of a given segment number */ ··· 705 705 f2fs_err(sbi, "Wrong valid blocks %d or segno %u", 706 706 GET_SIT_VBLOCKS(raw_sit), segno); 707 707 set_sbi_flag(sbi, SBI_NEED_FSCK); 708 - return -EINVAL; 708 + return -EFSCORRUPTED; 709 709 } 710 710 return 0; 711 711 }
+1 -1
fs/f2fs/super.c
··· 2846 2846 if (sanity_check_raw_super(sbi, bh)) { 2847 2847 f2fs_err(sbi, "Can't find valid F2FS filesystem in %dth superblock", 2848 2848 block + 1); 2849 - err = -EINVAL; 2849 + err = -EFSCORRUPTED; 2850 2850 brelse(bh); 2851 2851 continue; 2852 2852 }
+2 -2
fs/f2fs/xattr.c
··· 346 346 347 347 *xe = __find_xattr(cur_addr, last_txattr_addr, index, len, name); 348 348 if (!*xe) { 349 - err = -EFAULT; 349 + err = -EFSCORRUPTED; 350 350 goto out; 351 351 } 352 352 check: ··· 622 622 /* find entry with wanted name. */ 623 623 here = __find_xattr(base_addr, last_base_addr, index, len, name); 624 624 if (!here) { 625 - error = -EFAULT; 625 + error = -EFSCORRUPTED; 626 626 goto exit; 627 627 } 628 628