mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
xfs: remove xfs_last_used_zone
This was my first attempt at caching the last used zone. But it turns out
for O_DIRECT or RWF_DONTCACHE that operate concurrently or in very short
sequence, the bmap btree does not record a written extent yet, so it fails.
Because it then still finds the last written zone it can lead to a weird
ping-pong around a few zones with writers seeing different values.
Remove it entirely as the later added xfs_cached_zone actually does a
much better job enforcing the locality as the zone is associated with the
inode in the MRU cache as soon as the zone is selected.
Fixes: 4e4d520755
("xfs: add the zoned space allocator")
Signed-off-by: Christoph Hellwig <hch@lst.de>
Tested-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Hans Holmberg <hans.holmberg@wdc.com>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
This commit is contained in:
parent
9ce43caa4b
commit
d004d70d6c
@ -374,44 +374,6 @@ xfs_zone_free_blocks(
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if the zone containing the data just before the offset we are
|
||||
* writing to is still open and has space.
|
||||
*/
|
||||
static struct xfs_open_zone *
|
||||
xfs_last_used_zone(
|
||||
struct iomap_ioend *ioend)
|
||||
{
|
||||
struct xfs_inode *ip = XFS_I(ioend->io_inode);
|
||||
struct xfs_mount *mp = ip->i_mount;
|
||||
xfs_fileoff_t offset_fsb = XFS_B_TO_FSB(mp, ioend->io_offset);
|
||||
struct xfs_rtgroup *rtg = NULL;
|
||||
struct xfs_open_zone *oz = NULL;
|
||||
struct xfs_iext_cursor icur;
|
||||
struct xfs_bmbt_irec got;
|
||||
|
||||
xfs_ilock(ip, XFS_ILOCK_SHARED);
|
||||
if (!xfs_iext_lookup_extent_before(ip, &ip->i_df, &offset_fsb,
|
||||
&icur, &got)) {
|
||||
xfs_iunlock(ip, XFS_ILOCK_SHARED);
|
||||
return NULL;
|
||||
}
|
||||
xfs_iunlock(ip, XFS_ILOCK_SHARED);
|
||||
|
||||
rtg = xfs_rtgroup_grab(mp, xfs_rtb_to_rgno(mp, got.br_startblock));
|
||||
if (!rtg)
|
||||
return NULL;
|
||||
|
||||
xfs_ilock(rtg_rmap(rtg), XFS_ILOCK_SHARED);
|
||||
oz = READ_ONCE(rtg->rtg_open_zone);
|
||||
if (oz && (oz->oz_is_gc || !atomic_inc_not_zero(&oz->oz_ref)))
|
||||
oz = NULL;
|
||||
xfs_iunlock(rtg_rmap(rtg), XFS_ILOCK_SHARED);
|
||||
|
||||
xfs_rtgroup_rele(rtg);
|
||||
return oz;
|
||||
}
|
||||
|
||||
static struct xfs_group *
|
||||
xfs_find_free_zone(
|
||||
struct xfs_mount *mp,
|
||||
@ -918,12 +880,9 @@ xfs_zone_alloc_and_submit(
|
||||
goto out_error;
|
||||
|
||||
/*
|
||||
* If we don't have a cached zone in this write context, see if the
|
||||
* last extent before the one we are writing to points to an active
|
||||
* zone. If so, just continue writing to it.
|
||||
* If we don't have a locally cached zone in this write context, see if
|
||||
* the inode is still associated with a zone and use that if so.
|
||||
*/
|
||||
if (!*oz && ioend->io_offset)
|
||||
*oz = xfs_last_used_zone(ioend);
|
||||
if (!*oz)
|
||||
*oz = xfs_cached_zone(mp, ip);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user