Commit 46944720 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'xfs-fixes-6.17-rc4' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux

Pull xfs fixes from Carlos Maiolino:
 "The highlight I'd like to point here is related to the XFS_RT
  Kconfig, which has been updated to be enabled by default now if
  CONFIG_BLK_DEV_ZONED is enabled.

  This also contains a few fixes for zoned devices support in XFS,
  specially related to swapon requests in inodes belonging to the zoned
  FS.

  A null-ptr dereference fix in the xattr data, due to a mishandling of
  medium errors generated by block devices is also included"

* tag 'xfs-fixes-6.17-rc4' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux:
  xfs: do not propagate ENODATA disk errors into xattr code
  xfs: reject swapon for inodes on a zoned file system earlier
  xfs: kick off inodegc when failing to reserve zoned blocks
  xfs: remove xfs_last_used_zone
  xfs: Default XFS_RT to Y if CONFIG_BLK_DEV_ZONED is enabled
parents 02d6eeed ae668cd5
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -105,6 +105,7 @@ config XFS_POSIX_ACL
config XFS_RT
	bool "XFS Realtime subvolume support"
	depends on XFS_FS
	default BLK_DEV_ZONED
	help
	  If you say Y here you will be able to mount and use XFS filesystems
	  which contain a realtime subvolume.  The realtime subvolume is a
+7 −0
Original line number Diff line number Diff line
@@ -435,6 +435,13 @@ xfs_attr_rmtval_get(
					0, &bp, &xfs_attr3_rmt_buf_ops);
			if (xfs_metadata_is_sick(error))
				xfs_dirattr_mark_sick(args->dp, XFS_ATTR_FORK);
			/*
			 * ENODATA from disk implies a disk medium failure;
			 * ENODATA for xattrs means attribute not found, so
			 * disambiguate that here.
			 */
			if (error == -ENODATA)
				error = -EIO;
			if (error)
				return error;

+6 −0
Original line number Diff line number Diff line
@@ -2833,6 +2833,12 @@ xfs_da_read_buf(
			&bp, ops);
	if (xfs_metadata_is_sick(error))
		xfs_dirattr_mark_sick(dp, whichfork);
	/*
	 * ENODATA from disk implies a disk medium failure; ENODATA for
	 * xattrs means attribute not found, so disambiguate that here.
	 */
	if (error == -ENODATA && whichfork == XFS_ATTR_FORK)
		error = -EIO;
	if (error)
		goto out_free;

+3 −0
Original line number Diff line number Diff line
@@ -760,6 +760,9 @@ xfs_vm_swap_activate(
{
	struct xfs_inode		*ip = XFS_I(file_inode(swap_file));

	if (xfs_is_zoned_inode(ip))
		return -EINVAL;

	/*
	 * Swap file activation can race against concurrent shared extent
	 * removal in files that have been cloned.  If this happens,
+2 −43
Original line number Diff line number Diff line
@@ -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