gfs2: Check for the end of metadata in punch_hole
authorAndreas Gruenbacher <agruenba@redhat.com>
Fri, 23 Mar 2018 14:33:25 +0000 (07:33 -0700)
committerBob Peterson <rpeterso@redhat.com>
Fri, 23 Mar 2018 18:43:02 +0000 (11:43 -0700)
commitbb491ce67aa7c1635e5ae4f2f304a7d13d3dbe71
tree540adba82703cd5cf8945be87af452f35ddc1c31
parentee6ed857c8058177614b21a0efbf27e02c4e2a77
gfs2: Check for the end of metadata in punch_hole

When punching a hole or truncating an inode down to a given size, also
check if the truncate point / start of the hole is within the range we
have metadata for.  Otherwise, we can end up freeing blocks that
shouldn't be freed, corrupting the inode, or crashing the machine when
trying to punch a hole into the void.

When growing an inode via truncate, we set the new size but we don't
allocate additional levels of indirect blocks and grow the inode height.
When shrinking that inode again, the new size may still point beyond the
end of the inode's metadata.

Fixes xfstest generic/476.

Debugged-by: Bob Peterson <rpeterso@redhat.com>
Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: Bob Peterson <rpeterso@redhat.com>
fs/gfs2/bmap.c