From 348b95e0f57b1aeb8bae44a35b4b4647facadbd3 Mon Sep 17 00:00:00 2001 From: Qu Wenruo Date: Fri, 19 Jun 2015 11:43:40 +0800 Subject: [PATCH 1/2] btrfs-progs: fsck:Add repair function for I_ERR_FILE_WRONG_NBYTES. Some unknown kernel bug makes inode nbytes modification out of sync with file extent update. But it's quite easy to fix in btrfs-progs anyway. So just fix it by adding a new function repair_inode_nbytes by using the found_size in inode_record. Reported-by: Christian Reported-by: Chris Murphy Signed-off-by: Qu Wenruo --- cmds-check.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/cmds-check.c b/cmds-check.c index 778f141de1..dd2fce3b7d 100644 --- a/cmds-check.c +++ b/cmds-check.c @@ -1918,6 +1918,39 @@ static int repair_inode_orphan_item(struct btrfs_trans_handle *trans, return ret; } +static int repair_inode_nbytes(struct btrfs_trans_handle *trans, + struct btrfs_root *root, + struct btrfs_path *path, + struct inode_record *rec) +{ + struct btrfs_inode_item *ei; + struct btrfs_key key; + int ret = 0; + + key.objectid = rec->ino; + key.type = BTRFS_INODE_ITEM_KEY; + key.offset = 0; + + ret = btrfs_search_slot(trans, root, &key, path, 0, 1); + if (ret) { + if (ret > 0) + ret = -ENOENT; + goto out; + } + + /* Since ret == 0, no need to check anything */ + ei = btrfs_item_ptr(path->nodes[0], path->slots[0], + struct btrfs_inode_item); + btrfs_set_inode_nbytes(path->nodes[0], ei, rec->found_size); + btrfs_mark_buffer_dirty(path->nodes[0]); + rec->errors &= ~I_ERR_FILE_NBYTES_WRONG; + printf("reset nbytes for ino %llu root %llu\n", + rec->ino, root->root_key.objectid); +out: + btrfs_release_path(path); + return ret; +} + static int add_missing_dir_index(struct btrfs_root *root, struct cache_tree *inode_cache, struct inode_record *rec, @@ -2661,7 +2694,8 @@ static int try_repair_inode(struct btrfs_root *root, struct inode_record *rec) I_ERR_LINK_COUNT_WRONG | I_ERR_NO_INODE_ITEM | I_ERR_FILE_EXTENT_ORPHAN | - I_ERR_FILE_EXTENT_DISCOUNT))) + I_ERR_FILE_EXTENT_DISCOUNT| + I_ERR_FILE_NBYTES_WRONG))) return rec->errors; path = btrfs_alloc_path(); @@ -2693,6 +2727,8 @@ static int try_repair_inode(struct btrfs_root *root, struct inode_record *rec) ret = repair_inode_orphan_item(trans, root, path, rec); if (!ret && rec->errors & I_ERR_LINK_COUNT_WRONG) ret = repair_inode_nlinks(trans, root, path, rec); + if (!ret && rec->errors & I_ERR_FILE_NBYTES_WRONG) + ret = repair_inode_nbytes(trans, root, path, rec); btrfs_commit_transaction(trans, root); btrfs_free_path(path); return ret; From c1b68a62acc3278667ee03ddf1c4f355339e298c Mon Sep 17 00:00:00 2001 From: Qu Wenruo Date: Thu, 2 Jul 2015 14:36:04 +0800 Subject: [PATCH 2/2] btrfs-progs: tests: Add test case for I_ERR_FILE_WRONG_NBYTES repair. Add a new test case for I_ERR_FILE_WRONG_NBYTES. The new btrfs-image dump image contains a file in 12K size. But nbytes in its inode item is a random number. Signed-off-by: Qu Wenruo --- .../016-wrong-inode-nbytes/default_case.img.xz | Bin 0 -> 1996 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/fsck-tests/016-wrong-inode-nbytes/default_case.img.xz diff --git a/tests/fsck-tests/016-wrong-inode-nbytes/default_case.img.xz b/tests/fsck-tests/016-wrong-inode-nbytes/default_case.img.xz new file mode 100644 index 0000000000000000000000000000000000000000..d513acf5d17483b43d71e081f56c6e67fd04f31d GIT binary patch literal 1996 zcmV;-2Q&EnH+ooF000E$*0e?f03iVu0001VFXf})3;zd-T>wRyj;C3^v%$$4d1t#p zhA1?^{y&>ijK;4?4d%^yX*$w_lI@Dy%uyq_K|AQukj_I9VFI8c2)bBXCHoOINKERM zx%R+wD3&9gPoI_$Fbg|G$?>R?a8Zo>&N8FQ4*{fyVwyg$_D|U~K=;J~HRe&Cad1R* z$$ESiZ$TA`O$<6V1QUO4m%15#J!fKpy#4P>Y+b-JRdXx83$n@#o3HEmtd|xFrv;pF z!ip!sB?w{O8@nx-k0`% zk~k!BMy3UN63jC#*iwT5XhL?a=M-f%Po@#qi+^$9j^r{bT|+X! zEmRN8u_{|5fL4yWll3V_lYpkyl1N3Jvdob^zSm*q;!qhgc;MWP)`| zrh%pJk}~87J{n6H_s326t#cNZ-H9YK5AQZrZD-TWNpS%KBOxy(sMt_+JvTlQiU$F;sXP)iouB*2O*FDg5T2CBBTFP z=Bm8M@A=*T5h|+iLr*-4-XTOrUbv4YI(Xt7qP4S84k`0{%Xo_lSF;O>>lyQBN~{Hx zfp%vXq&X#J`NHqjeCFY(Jm;;8w`WyhV=06Azq*x>l#YcW)fJpZ5*|m0s1DbbFu_F* z(UWl%=8)tt5@^ZYmZBeWzs3VlK{QpRW2^qD@UzBVW z-FY_eLo#;V`9d`x=6O_foj*&9?fn$rvS21cZ-hqb$!J~_&2p#4(Xj{Mpb*8s^m_1mD7R2 zMoorM<$QRoWb>1Yt|+)BB`&LjQdl5OY#x`3>%+Nylz*Lid?K%)h!C+Wr6gN?7;l{d z+*8z-b;0_2Yi;S?&xuBb4yxWOJrxJs7p4CUDm?t&)MViySl$zZ4ZWcQm?pKE9OTFi4d~I5xP6vnyXjx!l`3Gx=Tm-N;DzZu ziPx5_cg6-OMy%%oWY|uYp*R!i+M9X%eW4)3$7OHju7o0p#l2U&X4IwDnOXe3cBv2j zv#cylwQN7;LVjBkkDT(u~Arh*S%T8uLSZdm~RBU@ucy1@60c}0z?N& zF>_Z#mAWpj{*)@;HD3oFZm;apV0|XVU z$!a&)AGGUb!fTXE-4)Aq$N#6UKvPwkh?k)S5;Xh2c30#4(td0@0W4J@gR{B z$qtR{jAqjDJqCp#E5F?9cl8c=Km{|i#>-rG5{p9o4o`{NN=GtDwMI>%mz_p3 z85Q`OW9Q^ta}H7Q$cH;uk0JKaMl~jF9HOrLPdJ&Yl1yWWQrfo(UFD;MaBuTIFbMk1 z%L9|a!TGhwh!bVxm1BNN$QO2pP=2~>!oDUfBj)0S*#8FOS2%pJr^$sck|cf~Ti;+H z61u?BaVOLcOyX;4CIs|Dp0STFUo|uV#L$VIU$YRA*k}qttADLIaOe% z3c{y~@+EV*F^oz<=eR%K-v{i4Kr_uUv1;_XyW$52X^t|_DUtYPUusJz%aH>mwG3M` zQ~T94WFH$EIZ7?t>%2j6M4vRt8VY{M8XEe!O>U{KkL!{j@$@Y+>=Xb10000uOw<(T eGen610j3Xt7ytka^(=9*#Ao{g000001X)@DC&