linux/fs/xfs/libxfs
Darrick J. Wong 6d8a45ce29 xfs: don't screw up direct writes when freesp is fragmented
xfs_bmap_btalloc is given a range of file offset blocks that must be
allocated to some data/attr/cow fork.  If the fork has an extent size
hint associated with it, the request will be enlarged on both ends to
try to satisfy the alignment hint.  If free space is fragmentated,
sometimes we can allocate some blocks but not enough to fulfill any of
the requested range.  Since bmapi_allocate always trims the new extent
mapping to match the originally requested range, this results in
bmapi_write returning zero and no mapping.

The consequences of this vary -- buffered writes will simply re-call
bmapi_write until it can satisfy at least one block from the original
request.  Direct IO overwrites notice nmaps == 0 and return -ENOSPC
through the dio mechanism out to userspace with the weird result that
writes fail even when we have enough space because the ENOSPC return
overrides any partial write status.  For direct CoW writes the situation
was disastrous because nobody notices us returning an invalid zero-length
wrong-offset mapping to iomap and the write goes off into space.

Therefore, if free space is so fragmented that we managed to allocate
some space but not enough to map into even a single block of the
original allocation request range, we should break the alignment hint in
order to guarantee at least some forward progress for the direct write.
If we return a short allocation to iomap_apply it'll call back about the
remaining blocks.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
2018-01-29 07:27:24 -08:00
..
xfs_ag_resv.c xfs: move error injection tags into their own file 2017-11-01 15:03:16 -07: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: create a new buf_ops pointer to verify structure metadata 2018-01-08 10:54:47 -08:00
xfs_alloc_btree.h
xfs_alloc.c Split buffer's b_fspriv field 2018-01-29 07:27:22 -08:00
xfs_alloc.h xfs: add scrub cross-referencing helpers for the free space btrees 2018-01-17 21:00:44 -08:00
xfs_attr_leaf.c Split buffer's b_fspriv field 2018-01-29 07:27:22 -08:00
xfs_attr_leaf.h xfs: create structure verifier function for shortform xattrs 2018-01-08 10:54:46 -08:00
xfs_attr_remote.c xfs: create a new buf_ops pointer to verify structure metadata 2018-01-08 10:54:47 -08:00
xfs_attr_remote.h
xfs_attr_sf.h xfs: remove double-underscore integer types 2017-06-19 14:11:33 -07:00
xfs_attr.c xfs: cancel tx on xfs_defer_finish() error during xattr set/remove 2018-01-16 14:53:28 -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: remove double-underscore integer types 2017-06-19 14:11:33 -07:00
xfs_bmap_btree.c xfs: create a new buf_ops pointer to verify structure metadata 2018-01-08 10:54:47 -08:00
xfs_bmap_btree.h xfs: pass struct xfs_bmbt_irec to xfs_bmbt_validate_extent 2017-11-06 11:53:41 -08:00
xfs_bmap.c xfs: don't screw up direct writes when freesp is fragmented 2018-01-29 07:27:24 -08:00
xfs_bmap.h xfs: simplify xfs_reflink_convert_cow 2017-11-06 11:53:40 -08:00
xfs_btree.c Split buffer's b_fspriv field 2018-01-29 07:27:22 -08:00
xfs_btree.h xfs: add scrub cross-referencing helpers for the free space btrees 2018-01-17 21:00:44 -08:00
xfs_cksum.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
xfs_da_btree.c Split buffer's b_fspriv field 2018-01-29 07:27:22 -08:00
xfs_da_btree.h xfs: remove double-underscore integer types 2017-06-19 14:11:33 -07:00
xfs_da_format.c xfs: remove double-underscore integer types 2017-06-19 14:11:33 -07:00
xfs_da_format.h xfs: refactor the geometry structure filling function 2018-01-08 10:54:48 -08:00
xfs_defer.c xfs: add the ability to join a held buffer to a defer_ops 2017-12-14 09:17:35 -08:00
xfs_defer.h xfs: add the ability to join a held buffer to a defer_ops 2017-12-14 09:17:35 -08:00
xfs_dir2_block.c Split buffer's b_fspriv field 2018-01-29 07:27:22 -08:00
xfs_dir2_data.c Split buffer's b_fspriv field 2018-01-29 07:27:22 -08:00
xfs_dir2_leaf.c Split buffer's b_fspriv field 2018-01-29 07:27:22 -08:00
xfs_dir2_node.c Split buffer's b_fspriv field 2018-01-29 07:27:22 -08:00
xfs_dir2_priv.h xfs: refactor short form directory structure verifier function 2018-01-08 10:54:46 -08:00
xfs_dir2_sf.c xfs: directory scrubber must walk through data block to offset 2018-01-17 21:00:46 -08:00
xfs_dir2.c xfs: refactor the geometry structure filling function 2018-01-08 10:54:48 -08:00
xfs_dir2.h xfs: directory scrubber must walk through data block to offset 2018-01-17 21:00:46 -08:00
xfs_dquot_buf.c xfs: standardize quota verification function outputs 2018-01-08 10:54:47 -08:00
xfs_errortag.h xfs: move error injection tags into their own file 2017-11-01 15:03:16 -07:00
xfs_format.h xfs: remove u_int* type usage 2017-11-09 15:50:29 -08:00
xfs_fs.h xfs: check sb_agblocks and sb_agblklog when validating superblock 2018-01-17 21:00:47 -08:00
xfs_ialloc_btree.c xfs: account finobt blocks properly in perag reservation 2018-01-12 14:09:08 -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 Split buffer's b_fspriv field 2018-01-29 07:27:22 -08:00
xfs_ialloc.h xfs: add scrub cross-referencing helpers for the inode btrees 2018-01-17 21:00:44 -08:00
xfs_iext_tree.c xfs: move xfs_iext_insert tracepoint to report useful information 2017-12-14 09:20:11 -08:00
xfs_inode_buf.c xfs: refactor inode verifier corruption error printing 2018-01-29 07:27:22 -08:00
xfs_inode_buf.h xfs: have buffer verifier functions report failing address 2018-01-08 10:54:46 -08:00
xfs_inode_fork.c xfs: btree format ifork loader should check for zero numrecs 2018-01-17 21:00:46 -08:00
xfs_inode_fork.h xfs: provide a centralized method for verifying inline fork data 2018-01-08 10:54:47 -08:00
xfs_log_format.h xfs: fix type usage 2017-11-16 12:06:45 -08:00
xfs_log_recover.h xfs: remove double-underscore integer types 2017-06-19 14:11:33 -07:00
xfs_log_rlimit.c xfs: trace log reservations at mount time 2018-01-08 10:54:47 -08:00
xfs_quota_defs.h xfs: standardize quota verification function outputs 2018-01-08 10:54:47 -08:00
xfs_refcount_btree.c xfs: create a new buf_ops pointer to verify structure metadata 2018-01-08 10:54:47 -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: add scrub cross-referencing helpers for the refcount btrees 2018-01-17 21:00:44 -08:00
xfs_refcount.h xfs: add scrub cross-referencing helpers for the refcount btrees 2018-01-17 21:00:44 -08:00
xfs_rmap_btree.c xfs: create a new buf_ops pointer to verify structure metadata 2018-01-08 10:54:47 -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: add scrub cross-referencing helpers for the rmap btrees 2018-01-17 21:00:44 -08:00
xfs_rmap.h xfs: add scrub cross-referencing helpers for the rmap btrees 2018-01-17 21:00:44 -08:00
xfs_rtbitmap.c xfs: cross-reference the realtime bitmap 2018-01-17 21:00:46 -08:00
xfs_sb.c Split buffer's b_fspriv field 2018-01-29 07:27:22 -08:00
xfs_sb.h xfs: refactor the geometry structure filling function 2018-01-08 10:54:48 -08:00
xfs_shared.h xfs: trace log reservations at mount time 2018-01-08 10:54:47 -08:00
xfs_symlink_remote.c Split buffer's b_fspriv field 2018-01-29 07:27:22 -08:00
xfs_trans_resv.c xfs: eliminate duplicate icreate tx reservation functions 2018-01-08 10:41:38 -08: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 xfs: move xfs_bmbt_irec and xfs_exntst_t to xfs_types.h 2017-11-06 11:53:41 -08:00