2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2024-12-26 14:14:01 +08:00
linux-next/fs/xfs/libxfs
Dave Chinner 7a1df15616 xfs: fix premature enospc on inode allocation
After growing a filesystem, XFS can fail to allocate inodes even
though there is a large amount of space available in the filesystem
for inodes. The issue is caused by a nearly full allocation group
having enough free space in it to be considered for inode
allocation, but not enough contiguous free space to actually
allocation inodes.  This situation results in successful selection
of the AG for allocation, then failure of the allocation resulting
in ENOSPC being reported to the caller.

It is caused by two possible issues. Firstly, we only consider the
lognest free extent and whether it would fit an inode chunk. If the
extent is not correctly aligned, then we can't allocate an inode
chunk in it regardless of the fact that it is large enough. This
tends to be a permanent error until space in the AG is freed.

The second issue is that we don't actually lock the AGI or AGF when
we are doing these checks, and so by the time we get to actually
allocating the inode chunk the space we thought we had in the AG may
have been allocated. This tends to be a spurious error as it
requires a race to trigger. Hence this case is ignored in this patch
as the reported problem is for permanent errors.

The first issue could be addressed by simply taking into account the
alignment when checking the longest extent. This, however, would
prevent allocation in AGs that have aligned, exact sized extents
free. However, this case should be fairly rare compared to the
number of allocations that occur near ENOSPC that would trigger this
condition.

Hence, when selecting the inode AG, take into account the inode
cluster alignment when checking the lognest free extent in the AG.
If we can't find any AGs with a contiguous free space large
enough to be aligned, drop the alignment addition and just try for
an AG that has enough contiguous free space available for an inode
chunk. This won't prevent issues from occurring, but should avoid
situations where other AGs have lots of free space but the selected
AG can't allocate due to alignment constraints.

Reported-by: Arkadiusz Miskiewicz <arekm@maven.pl>
Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
2014-12-04 09:42:21 +11:00
..
xfs_ag.h
xfs_alloc_btree.c
xfs_alloc_btree.h
xfs_alloc.c xfs: add a few more verifier tests 2014-09-09 11:47:24 +10:00
xfs_alloc.h
xfs_attr_leaf.c
xfs_attr_leaf.h
xfs_attr_remote.c
xfs_attr_remote.h
xfs_attr_sf.h
xfs_attr.c
xfs_bit.h
xfs_bmap_btree.c xfs: require 64-bit sector_t 2014-07-30 09:12:05 +10:00
xfs_bmap_btree.h
xfs_bmap.c xfs: fix simple_return.cocci warning in xfs_bmse_shift_one 2014-12-01 08:42:52 +11:00
xfs_bmap.h xfs: track collapse via file offset rather than extent index 2014-09-23 15:37:09 +10:00
xfs_btree.c Merge branch 'xfs-misc-fixes-3.17-1' into for-next 2014-08-04 13:54:14 +10:00
xfs_btree.h xfs: require 64-bit sector_t 2014-07-30 09:12:05 +10:00
xfs_cksum.h
xfs_da_btree.c xfs: don't send null bp to xfs_trans_brelse() 2014-10-02 09:23:49 +10:00
xfs_da_btree.h
xfs_da_format.c xfs: don't ASSERT on corrupt ftype 2014-09-23 16:05:32 +10:00
xfs_da_format.h
xfs_dinode.h
xfs_dir2_block.c
xfs_dir2_data.c
xfs_dir2_leaf.c
xfs_dir2_node.c
xfs_dir2_priv.h
xfs_dir2_sf.c xfs: require 64-bit sector_t 2014-07-30 09:12:05 +10:00
xfs_dir2.c xfs: combine xfs_dir_canenter into xfs_dir_createname 2014-09-09 11:58:07 +10:00
xfs_dir2.h xfs: check resblks before calling xfs_dir_canenter 2014-09-09 11:57:52 +10:00
xfs_dquot_buf.c
xfs_format.h xfs: require 64-bit sector_t 2014-07-30 09:12:05 +10:00
xfs_ialloc_btree.c
xfs_ialloc_btree.h
xfs_ialloc.c xfs: fix premature enospc on inode allocation 2014-12-04 09:42:21 +11:00
xfs_ialloc.h
xfs_inode_buf.c
xfs_inode_buf.h
xfs_inode_fork.c xfs: require 64-bit sector_t 2014-07-30 09:12:05 +10:00
xfs_inode_fork.h
xfs_inum.h xfs: require 64-bit sector_t 2014-07-30 09:12:05 +10:00
xfs_log_format.h xfs: require 64-bit sector_t 2014-07-30 09:12:05 +10:00
xfs_log_recover.h
xfs_log_rlimit.c
xfs_quota_defs.h
xfs_rtbitmap.c xfs: remove rbpp check from xfs_rtmodify_summary_int 2014-09-09 11:59:12 +10:00
xfs_sb.c xfs: fix crc field handling in xfs_sb_to/from_disk 2014-10-02 09:24:11 +10:00
xfs_sb.h xfs: require 64-bit sector_t 2014-07-30 09:12:05 +10:00
xfs_shared.h
xfs_symlink_remote.c
xfs_trans_resv.c
xfs_trans_resv.h
xfs_trans_space.h