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>
---
Changelog:
v2
Remove one unrelated change.
---
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 3dce4d3b5fc1..58f8f6fabed7 100644
--- a/check/mode-lowmem.c
+++ b/check/mode-lowmem.c
@@ -2541,28 +2541,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.19.1