xfs: don't trip over negative free space in xfs_reserve_blocks
authorDarrick J. Wong <darrick.wong@oracle.com>
Fri, 22 Jun 2018 06:26:56 +0000 (23:26 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Sun, 24 Jun 2018 18:56:36 +0000 (11:56 -0700)
commitaafe12cee0b132824f5187987f8a3fb704b9f685
treeb8a63a10619de108ad967af566a1846de4f0bf42
parent10ee25268e1f8475905e1deb85bb83627dca561e
xfs: don't trip over negative free space in xfs_reserve_blocks

If we somehow end up with a filesystem that has fewer free blocks than
the blocks set aside to avoid ENOSPC deadlocks, it's possible that the
free space calculation in xfs_reserve_blocks will spit out a negative
number (because percpu_counter_sum returns s64).  We fail to notice
this negative number and set fdblks_delta to it.  Now we increment
fdblocks(!) and the unsigned type of m_resblks means that we end up
setting a ridiculously huge m_resblks reservation.

Avoid this comedy of errors by detecting the negative free space and
returning -ENOSPC.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/xfs_fsops.c