xfs_repair: fix max block offset test
PATCH 1/1 xfs_repair: fix max block offset test
Eryu pointed out that in fstest xfs/071, we find corruption reported at the end. This test attempts to do IO at the maximum possible offsets, and repair yields:
inode 1027 - extent offset too large - start 70, count 1, offset 2251799813685247 correcting nextents for inode 1027
bad data fork in inode 1027
would have cleared inode 1027
Repair is complaining that an extent *starts* at the maximum block, but AFAICT, starting there is just fine, as long as we also end there. i.e. a one-block extent at the limit is just fine.
So change the xfs_repair test to allow this situation.
---
repair/dinode.c +3 -1
@@ -667,7 +667,9 @@ _("inode %" PRIu64 " - bad extent overflows - start %" PRIu64 ", " irec.br_startoff); goto done; } -if (irec.br_startoff >= fs_max_file_offset) { +/* Ensure this extent does not extend beyond the max offset */ +if (irec.br_startoff + irec.br_blockcount -1 > + fs_max_file_offset) { do_warn( _("inode %" PRIu64 " - extent offset too large - start %" PRIu64 ", " "count %" PRIu64 ", offset %" PRIu64 "\n"),
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Quoted 14 lines · Eric Sandeen
Eryu pointed out that in fstest xfs/071, we find corruption reported at the end. This test attempts to do IO at the maximum possible offsets, and repair yields:
inode 1027 - extent offset too large - start 70, count 1, offset 2251799813685247 correcting nextents for inode 1027
bad data fork in inode 1027
would have cleared inode 1027Repair is complaining that an extent *starts* at the maximum block, but AFAICT, starting there is just fine, as long as we also end there. i.e. a one-block extent at the limit is just fine.
Quoted 5 lines
So change the
xfs_repairtest to allow this situation.Reported-by Eryu Guan <[email protected]>Signed-off-by Eric Sandeen <[email protected]>---
Thought this looked familiar:
http://oss.sgi.com/archives/xfs/2014-09/msg00524.html
Either one is fine with me. If we use the fix below, I think we should update the error message since it technically refers to the extent offset and we slightly tweak the meaning of the failure.
Brian
Quoted 17 lines
repair/dinode.c +3
-1@@ -667,7 +667,9 @@ _("inode %" PRIu64 " - bad extent overflows - start %" PRIu64 ", " irec.br_startoff); goto done; } -if (irec.br_startoff >= fs_max_file_offset) { +/* Ensure this extent does not extend beyond the max offset */ +if (irec.br_startoff + irec.br_blockcount -1 > + fs_max_file_offset) { do_warn( _("inode %" PRIu64 " - extent offset too large - start %" PRIu64 ", " "count %" PRIu64 ", offset %" PRIu64 "\n"),
Quoted 4 lines
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Quoted 3 lines · Brian Foster
Thought this looked familiar:
oh, whoops. let me go read that, sorry!
-Eric
Quoted 23 lines
Either one is fine with me. If we use the fix below, I think we should update the error message since it technically refers to the extent offset and we slightly tweak the meaning of the failure.
Brian
Quoted 17 lines
repair/dinode.c +3
-1@@ -667,7 +667,9 @@ _("inode %" PRIu64 " - bad extent overflows - start %" PRIu64 ", " irec.br_startoff); goto done; } -if (irec.br_startoff >= fs_max_file_offset) { +/* Ensure this extent does not extend beyond the max offset */ +if (irec.br_startoff + irec.br_blockcount -1 > + fs_max_file_offset) { do_warn( _("inode %" PRIu64 " - extent offset too large - start %" PRIu64 ", " "count %" PRIu64 ", offset %" PRIu64 "\n"),
Quoted 4 lines
Quoted 4 lines
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
On 12/18/14 9:18 AM, Brian Foster wrote:
hought this looked familiar:
Quoted 8 lines
http://oss.sgi.com/archives/xfs/2014-09/msg00524.html
Either one is fine with me. If we use the fix below, I think we should update the error message since it technically refers to the extent offset and we slightly tweak the meaning of the failure.
Brian
Ok, so here's what I wonder about with your patch.
+ if (irec.br_startoff > fs_max_file_offset) {
What if the extent starting logical offset is *at* fs_max_file_offset (which is sadly in blocks, not bytes, for extra confusion points), but the extent is 1GB in length?
Isn't this a problem because we've now got files in the block which are beyond fs_max_file_offset, and probably also beyond sb_maxbytes?
I'm not sure I follow why you feel the message needs to change with my version:
+ /* Ensure this extent does not extend beyond the max offset */
+ if (irec.br_startoff + irec.br_blockcount - 1 >
+ fs_max_file_offset) {
do_warn(_("inode %" PRIu64 " - extent offset too large - start %" PRIu64 ", "
"count %" PRIu64 ", offset %" PRIu64 "\n"),
ino, irec.br_startblock, irec.br_blockcount, irec.br_startoff);
If any (block) offset in the file is beyond the max, then we say the offset is too large, and give it's physical block, its length, and its starting offset (granted, the message is a bit *weird* - br_startblock really doesn't matter here, but I don't think I've fundamentally changed the meaning of the test).
However, I've come to learn that you are almost always right about subtleties like this, so perhaps you can explain again to me, using smaller words. :)
-Eric
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
PATCH v2 1/1 xfs_repair: fix max block offset test
In reply to Eric SandeenEryu pointed out that in fstest xfs/071, we find corruption reported at the end. This test attempts to do IO at the maximum possible offsets, and repair yields:
inode 1027 - extent offset too large - start 70, count 1, offset 2251799813685247 correcting nextents for inode 1027
bad data fork in inode 1027
would have cleared inode 1027
Repair is complaining that an extent *starts* at the maximum block, but AFAICT, starting there is just fine, as long as we also end there. i.e. a one-block extent at the limit is just fine.
So change the xfs_repair test to allow this situation.
Also, the warning text is a bit unclear, mixing in the physical block w/ the logical block... rearrange that a little to make it obvious.
---
V2: Update the warning text
repair/dinode.c +7 -5
@@ -667,12 +667,14 @@ _("inode %" PRIu64 " - bad extent overflows - start %" PRIu64 ", " irec.br_startoff); goto done; } -if (irec.br_startoff >= fs_max_file_offset) { +/* Ensure this extent does not extend beyond the max offset */ +if (irec.br_startoff + irec.br_blockcount -1 > + fs_max_file_offset) {do_warn ( -_ ("inode %" PRIu64" - extent offset too large - start %" PRIu64", " -"count %" PRIu64", offset %" PRIu64"\n" ), - ino, irec.br_startblock, irec.br_blockcount, - irec.br_startoff); +_ ("inode %" PRIu64" - extent exceeds max offset - start %" PRIu64", " +"count %" PRIu64", physical block %" PRIu64"\n" ), + ino, irec.br_startoff, irec.br_blockcount, + irec.br_startblock); goto done; }
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Quoted 14 lines · Eric Sandeen
On 12/18/14 9:18 AM, Brian Foster wrote:
hought this looked familiar:
Quoted 8 lines
http://oss.sgi.com/archives/xfs/2014-09/msg00524.html
Either one is fine with me. If we use the fix below, I think we should update the error message since it technically refers to the extent offset and we slightly tweak the meaning of the failure.
Brian
Ok, so here's what I wonder about with your patch.
Quoted 9 lines
+ if (irec.br_startoff >
fs_max_file_offset) {What if the extent starting logical offset is *at*
fs_max_file_offset(which is sadly in blocks, not bytes, for extra confusion points), but the extent is 1GB in length?Isn't this a problem because we've now got files in the block which are beyond
fs_max_file_offset, and probably also beyondsb_maxbytes?
Yeah... at the time I simply viewed this as outside the scope of this particular check due to the logic and wording. It makes sense to widen the logic to catch anything that starts before yet extends past max offset, assuming we aren't actually checking that anywhere else.
Quoted 12 lines
I'm not sure I follow why you feel the message needs to change with my version:
repair/dinode.c +3
-0+/* Ensure this extent does not extend beyond the max offset */ +if (irec.br_startoff + irec.br_blockcount -1 > + fs_max_file_offset) { do_warn(_("inode %" PRIu64 " - extent offset too large - start %" PRIu64 ", "
"count %" PRIu64 ", offset %" PRIu64 "\n"),
ino, irec.br_startblock, irec.br_blockcount, irec.br_startoff);
Quoted 4 lines
If any (block) offset in the file is beyond the max, then we say the offset is too large, and give it's physical block, its length, and its starting offset (granted, the message is a bit *weird* -
br_startblockreally doesn't matter here, but I don't think I've fundamentally changed the meaning of the test).
As discussed on irc, I read "extent offset" as the offset of the extent in the file, so it seemed a bit confusing if br_startoff isn't necessarily the problem.
Brian
Quoted 10 lines
However, I've come to learn that you are almost always right about subtleties like this, so perhaps you can explain again to me, using smaller words. :)
-Eric
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Quoted 16 lines · Eric Sandeen
Eryu pointed out that in fstest xfs/071, we find corruption reported at the end. This test attempts to do IO at the maximum possible offsets, and repair yields:
inode 1027 - extent offset too large - start 70, count 1, offset 2251799813685247 correcting nextents for inode 1027
bad data fork in inode 1027
would have cleared inode 1027Repair is complaining that an extent *starts* at the maximum block, but AFAICT, starting there is just fine, as long as we also end there. i.e. a one-block extent at the limit is just fine.
So change the
xfs_repairtest to allow this situation.
Quoted 7 lines
Also, the warning text is a bit unclear, mixing in the physical block w/ the logical block... rearrange that a little to make it obvious.
Reported-by Eryu Guan <[email protected]>Signed-off-by Eric Sandeen <[email protected]>---
Looks good to me. Thanks for the fixup. :)
Quoted 29 lines
V2: Update the warning text
repair/dinode.c +7
-5@@ -667,12 +667,14 @@ _("inode %" PRIu64 " - bad extent overflows - start %" PRIu64 ", " irec.br_startoff); goto done; } -if (irec.br_startoff >= fs_max_file_offset) { +/* Ensure this extent does not extend beyond the max offset */ +if (irec.br_startoff + irec.br_blockcount -1 > + fs_max_file_offset) {do_warn ( -_ ("inode %" PRIu64" - extent offset too large - start %" PRIu64", " -"count %" PRIu64", offset %" PRIu64"\n" ), - ino, irec.br_startblock, irec.br_blockcount, - irec.br_startoff); +_ ("inode %" PRIu64" - extent exceeds max offset - start %" PRIu64", " +"count %" PRIu64", physical block %" PRIu64"\n" ), + ino, irec.br_startoff, irec.br_blockcount, + irec.br_startblock); goto done; }
Quoted 4 lines
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs