linux/fs/xfs/libxfs
Brian Foster 0daaecacb8 xfs: fix indlen accounting error on partial delalloc conversion
The delalloc -> real block conversion path uses an incorrect
calculation in the case where the middle part of a delalloc extent
is being converted. This is documented as a rare situation because
XFS generally attempts to maximize contiguity by converting as much
of a delalloc extent as possible.

If this situation does occur, the indlen reservation for the two new
delalloc extents left behind by the conversion of the middle range
is calculated and compared with the original reservation. If more
blocks are required, the delta is allocated from the global block
pool. This delta value can be characterized as the difference
between the new total requirement (temp + temp2) and the currently
available reservation minus those blocks that have already been
allocated (startblockval(PREV.br_startblock) - allocated).

The problem is that the current code does not account for previously
allocated blocks correctly. It subtracts the current allocation
count from the (new - old) delta rather than the old indlen
reservation. This means that more indlen blocks than have been
allocated end up stashed in the remaining extents and free space
accounting is broken as a result.

Fix up the calculation to subtract the allocated block count from
the original extent indlen and thus correctly allocate the
reservation delta based on the difference between the new total
requirement and the unused blocks from the original reservation.
Also remove a bogus assert that contradicts the fact that the new
indlen reservation can be larger than the original indlen
reservation.

Signed-off-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
2017-05-16 09:24:35 -07:00
..
xfs_ag_resv.c xfs: use per-AG reservations for the finobt 2017-01-25 07:49:35 -08:00
xfs_ag_resv.h xfs: set up per-AG free space reservations 2016-09-19 10:30:52 +10:00
xfs_alloc_btree.c xfs: plumb in needed functions for range querying of the freespace btrees 2017-04-03 15:18:17 -07:00
xfs_alloc_btree.h
xfs_alloc.c xfs: create a function to query all records in a btree 2017-04-03 15:18:17 -07:00
xfs_alloc.h xfs: create a function to query all records in a btree 2017-04-03 15:18:17 -07:00
xfs_attr_leaf.c xfs: ignore leaf attr ichdr.count in verifier during log replay 2016-12-09 16:49:47 +11:00
xfs_attr_leaf.h Merge branch 'xfs-4.10-misc-fixes-3' into for-next 2016-12-07 17:42:30 +11:00
xfs_attr_remote.c xfs: rename flist/free_list to dfops 2016-08-03 11:19:29 +10:00
xfs_attr_remote.h
xfs_attr_sf.h xfs: move struct xfs_attr_shortform to xfs_da_format.h 2016-02-08 15:00:01 +11:00
xfs_attr.c xfs: remove racy hasattr check from attr ops 2017-01-25 07:53:43 -08:00
xfs_bit.c libxfs: Optimize the loop for xfs_bitmap_empty 2016-01-04 16:10:19 +11:00
xfs_bit.h
xfs_bmap_btree.c xfs: simplify validation of the unwritten extent bit 2017-04-25 09:40:41 -07:00
xfs_bmap_btree.h xfs: simplify validation of the unwritten extent bit 2017-04-25 09:40:41 -07:00
xfs_bmap.c xfs: fix indlen accounting error on partial delalloc conversion 2017-05-16 09:24:35 -07:00
xfs_bmap.h xfs: simplify validation of the unwritten extent bit 2017-04-25 09:40:41 -07:00
xfs_btree.c Changes for 4.12: 2017-05-06 11:46:16 -07:00
xfs_btree.h xfs: create a function to query all records in a btree 2017-04-03 15:18:17 -07:00
xfs_cksum.h xfs: optimise CRC updates 2016-12-05 14:40:32 +11:00
xfs_da_btree.c xfs: fail _dir_open when readahead fails 2017-02-02 15:13:58 -08:00
xfs_da_btree.h xfs: fail _dir_open when readahead fails 2017-02-02 15:13:58 -08:00
xfs_da_format.c xfs: kill xfs_dir2_inou_t 2016-07-20 11:48:31 +10:00
xfs_da_format.h xfs: fix attr shortform structure alignment on cris 2016-08-03 10:59:42 +10:00
xfs_defer.c xfs: defer should abort intent items if the trans roll fails 2016-10-24 14:21:18 +11:00
xfs_defer.h xfs: implement deferred bmbt map/unmap operations 2016-10-04 11:05:44 -07:00
xfs_dir2_block.c xfs: print name of verifier if it fails 2016-01-04 16:10:19 +11:00
xfs_dir2_data.c Merge branch 'xfs-4.10-misc-fixes-3' into for-next 2016-12-07 17:42:30 +11:00
xfs_dir2_leaf.c xfs: print name of verifier if it fails 2016-01-04 16:10:19 +11:00
xfs_dir2_node.c xfs: verify free block header fields 2017-02-02 15:14:00 -08:00
xfs_dir2_priv.h xfs: rework the inline directory verifiers 2017-04-03 12:22:20 -07:00
xfs_dir2_sf.c xfs: rework the inline directory verifiers 2017-04-03 12:22:20 -07:00
xfs_dir2.c xfs: fix xfs_mode_to_ftype() prototype 2017-01-18 12:39:21 -08:00
xfs_dir2.h xfs: fix xfs_mode_to_ftype() prototype 2017-01-18 12:39:21 -08:00
xfs_dquot_buf.c xfs: simplify xfs_calc_dquots_per_chunk 2017-04-12 08:42:51 -07:00
xfs_format.h xfs: simplify validation of the unwritten extent bit 2017-04-25 09:40:41 -07:00
xfs_fs.h xfs: implement the GETFSMAP ioctl 2017-04-03 15:18:17 -07:00
xfs_ialloc_btree.c xfs: use per-AG reservations for the finobt 2017-01-25 07:49:35 -08:00
xfs_ialloc_btree.h xfs: use per-AG reservations for the finobt 2017-01-25 07:49:35 -08:00
xfs_ialloc.c xfs: Use xfs_icluster_size_fsb() to calculate inode chunk alignment 2017-02-16 17:20:38 -08:00
xfs_ialloc.h xfs: rename flist/free_list to dfops 2016-08-03 11:19:29 +10:00
xfs_inode_buf.c xfs: fix up inode validation failure message 2017-04-03 15:18:16 -07:00
xfs_inode_buf.h libxfs: convert ushort to unsigned short 2016-11-08 11:55:48 +11:00
xfs_inode_fork.c xfs: simplify validation of the unwritten extent bit 2017-04-25 09:40:41 -07:00
xfs_inode_fork.h xfs: rework the inline directory verifiers 2017-04-03 12:22:20 -07:00
xfs_log_format.h libxfs: convert ushort to unsigned short 2016-11-08 11:55:48 +11:00
xfs_log_recover.h xfs: remove unused struct declarations 2017-01-30 16:32:25 -08:00
xfs_log_rlimit.c xfs: move most of xfs_sb.h to xfs_format.h 2014-11-28 14:27:09 +11:00
xfs_quota_defs.h xfs: wire up Q_XGETNEXTQUOTA / get_nextdqblk 2016-02-08 11:27:38 +11:00
xfs_refcount_btree.c xfs: use the actual AG length when reserving blocks 2017-01-03 18:39:33 -08:00
xfs_refcount_btree.h xfs: use the actual AG length when reserving blocks 2017-01-03 18:39:33 -08:00
xfs_refcount.c xfs: rework refcount cow recovery error handling 2016-10-10 17:23:07 +11:00
xfs_refcount.h xfs: store in-progress CoW allocations in the refcount btree 2016-10-05 16:26:05 -07:00
xfs_rmap_btree.c xfs: use the actual AG length when reserving blocks 2017-01-03 18:39:33 -08:00
xfs_rmap_btree.h xfs: use the actual AG length when reserving blocks 2017-01-03 18:39:33 -08:00
xfs_rmap.c xfs: implement the GETFSMAP ioctl 2017-04-03 15:18:17 -07:00
xfs_rmap.h xfs: implement the GETFSMAP ioctl 2017-04-03 15:18:17 -07:00
xfs_rtbitmap.c xfs: add a couple of queries to iterate free extents in the rtbitmap 2017-04-03 15:18:17 -07:00
xfs_sb.c xfs: verify dirblocklog correctly 2017-01-24 12:23:33 -08:00
xfs_sb.h xfs: remove unused function definitions 2016-02-08 14:58:07 +11:00
xfs_shared.h xfs: define the on-disk refcount btree format 2016-10-03 09:11:18 -07:00
xfs_symlink_remote.c xfs: print name of verifier if it fails 2016-01-04 16:10:19 +11:00
xfs_trans_resv.c xfs: increase log reservations for reflink 2016-10-05 16:26:29 -07:00
xfs_trans_resv.h xfs: increase log reservations for reflink 2016-10-05 16:26:29 -07:00
xfs_trans_space.h xfs: reserve enough blocks to handle btree splits when remapping 2017-05-03 13:21:40 -07:00
xfs_types.h Merge branch 'xfs-4.10-extent-lookup' into for-next 2016-11-24 11:41:59 +11:00