From: Su Yue <suy.fnst@xxxxxxxxxxxxxx>
For files, lowmem repair will try to check nbytes and isize,
but isize check depends nbytes.
Once bytes has been repaired, then isize should be checked and
repaired.
So move nbytes check before isize check. Also set nbytes to
extent_size once repaired successfully.
Signed-off-by: Su Yue <suy.fnst@xxxxxxxxxxxxxx>
Reviewed-by: Qu Wenruo <wqu@xxxxxxxx>
Signed-off-by: Qu Wenruo <wqu@xxxxxxxx>
---
check/mode-lowmem.c | 27 +++++++++++++++------------
1 file changed, 15 insertions(+), 12 deletions(-)
diff --git a/check/mode-lowmem.c b/check/mode-lowmem.c
index 0f8af35d4da1..3f3f90e124d8 100644
--- a/check/mode-lowmem.c
+++ b/check/mode-lowmem.c
@@ -2605,28 +2605,31 @@ out:
}
}
- if (!nbytes && !no_holes && extent_end < isize) {
- if (repair)
- ret = punch_extent_hole(root, path, inode_id,
- extent_end, isize - extent_end);
+ if (nbytes != extent_size) {
+ if (repair) {
+ ret = repair_inode_nbytes_lowmem(root, path,
+ inode_id, extent_size);
+ if (!ret)
+ nbytes = extent_size;
+ }
if (!repair || ret) {
err |= NBYTES_ERROR;
error(
- "root %llu INODE[%llu] size %llu should have a file extent hole",
- root->objectid, inode_id, isize);
+ "root %llu INODE[%llu] nbytes %llu not equal to extent_size %llu",
+ root->objectid, inode_id, nbytes,
+ extent_size);
}
}
- if (nbytes != extent_size) {
+ if (!nbytes && !no_holes && extent_end < isize) {
if (repair)
- ret = repair_inode_nbytes_lowmem(root, path,
- inode_id, extent_size);
+ ret = punch_extent_hole(root, path, inode_id,
+ extent_end, isize - extent_end);
if (!repair || ret) {
err |= NBYTES_ERROR;
error(
- "root %llu INODE[%llu] nbytes %llu not equal to extent_size %llu",
- root->objectid, inode_id, nbytes,
- extent_size);
+ "root %llu INODE[%llu] size %llu should have a file extent hole",
+ root->objectid, inode_id, isize);
}
}
}
--
2.20.0