Commit d0e85e79 authored by Chandan Babu R's avatar Chandan Babu R
Browse files

Merge tag 'realtime-fixes-6.7_2023-10-19' of...

Merge tag 'realtime-fixes-6.7_2023-10-19' of https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux

 into xfs-6.7-mergeA

xfs: minor bugfixes for rt stuff [v1.1]

This is a preparatory patchset that fixes a few miscellaneous bugs
before we start in on larger cleanups of realtime units usage.

v1.1: various cleanups suggested by hch

With a bit of luck, this should all go splendidly.

Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarChandan Babu R <chandanbabu@kernel.org>

* tag 'realtime-fixes-6.7_2023-10-19' of https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux:
  xfs: rt stubs should return negative errnos when rt disabled
  xfs: prevent rt growfs when quota is enabled
  xfs: hoist freeing of rt data fork extent mappings
  xfs: bump max fsgeom struct version
parents 05d3ef8b c2988eb5
Loading
Loading
Loading
Loading
+3 −16
Original line number Diff line number Diff line
@@ -5057,33 +5057,20 @@ xfs_bmap_del_extent_real(

	flags = XFS_ILOG_CORE;
	if (whichfork == XFS_DATA_FORK && XFS_IS_REALTIME_INODE(ip)) {
		xfs_filblks_t	len;
		xfs_extlen_t	mod;

		len = div_u64_rem(del->br_blockcount, mp->m_sb.sb_rextsize,
				  &mod);
		ASSERT(mod == 0);

		if (!(bflags & XFS_BMAPI_REMAP)) {
			xfs_fsblock_t	bno;

			bno = div_u64_rem(del->br_startblock,
					mp->m_sb.sb_rextsize, &mod);
			ASSERT(mod == 0);

			error = xfs_rtfree_extent(tp, bno, (xfs_extlen_t)len);
			error = xfs_rtfree_blocks(tp, del->br_startblock,
					del->br_blockcount);
			if (error)
				goto done;
		}

		do_fx = 0;
		nblks = len * mp->m_sb.sb_rextsize;
		qfield = XFS_TRANS_DQ_RTBCOUNT;
	} else {
		do_fx = 1;
		nblks = del->br_blockcount;
		qfield = XFS_TRANS_DQ_BCOUNT;
	}
	nblks = del->br_blockcount;

	del_endblock = del->br_startblock + del->br_blockcount;
	if (cur) {
+33 −0
Original line number Diff line number Diff line
@@ -1005,6 +1005,39 @@ xfs_rtfree_extent(
	return 0;
}

/*
 * Free some blocks in the realtime subvolume.  rtbno and rtlen are in units of
 * rt blocks, not rt extents; must be aligned to the rt extent size; and rtlen
 * cannot exceed XFS_MAX_BMBT_EXTLEN.
 */
int
xfs_rtfree_blocks(
	struct xfs_trans	*tp,
	xfs_fsblock_t		rtbno,
	xfs_filblks_t		rtlen)
{
	struct xfs_mount	*mp = tp->t_mountp;
	xfs_rtblock_t		bno;
	xfs_filblks_t		len;
	xfs_extlen_t		mod;

	ASSERT(rtlen <= XFS_MAX_BMBT_EXTLEN);

	len = div_u64_rem(rtlen, mp->m_sb.sb_rextsize, &mod);
	if (mod) {
		ASSERT(mod == 0);
		return -EIO;
	}

	bno = div_u64_rem(rtbno, mp->m_sb.sb_rextsize, &mod);
	if (mod) {
		ASSERT(mod == 0);
		return -EIO;
	}

	return xfs_rtfree_extent(tp, bno, len);
}

/* Find all the free records within a given range. */
int
xfs_rtalloc_query_range(
+1 −1
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@ extern uint64_t xfs_sb_version_to_features(struct xfs_sb *sbp);

extern int	xfs_update_secondary_sbs(struct xfs_mount *mp);

#define XFS_FS_GEOM_MAX_STRUCT_VER	(4)
#define XFS_FS_GEOM_MAX_STRUCT_VER	(5)
extern void	xfs_fs_geometry(struct xfs_mount *mp, struct xfs_fsop_geom *geo,
				int struct_version);
extern int	xfs_sb_read_secondary(struct xfs_mount *mp,
+1 −1
Original line number Diff line number Diff line
@@ -954,7 +954,7 @@ xfs_growfs_rt(
		return -EINVAL;

	/* Unsupported realtime features. */
	if (xfs_has_rmapbt(mp) || xfs_has_reflink(mp))
	if (xfs_has_rmapbt(mp) || xfs_has_reflink(mp) || xfs_has_quota(mp))
		return -EOPNOTSUPP;

	nrblocks = in->newblocks;
+16 −11
Original line number Diff line number Diff line
@@ -58,6 +58,10 @@ xfs_rtfree_extent(
	xfs_rtblock_t		bno,	/* starting block number to free */
	xfs_extlen_t		len);	/* length of extent freed */

/* Same as above, but in units of rt blocks. */
int xfs_rtfree_blocks(struct xfs_trans *tp, xfs_fsblock_t rtbno,
		xfs_filblks_t rtlen);

/*
 * Initialize realtime fields in the mount structure.
 */
@@ -137,15 +141,16 @@ int xfs_rtalloc_extent_is_free(struct xfs_mount *mp, struct xfs_trans *tp,
			       bool *is_free);
int xfs_rtalloc_reinit_frextents(struct xfs_mount *mp);
#else
# define xfs_rtallocate_extent(t,b,min,max,l,f,p,rb)    (ENOSYS)
# define xfs_rtfree_extent(t,b,l)                       (ENOSYS)
# define xfs_rtpick_extent(m,t,l,rb)                    (ENOSYS)
# define xfs_growfs_rt(mp,in)                           (ENOSYS)
# define xfs_rtalloc_query_range(t,l,h,f,p)             (ENOSYS)
# define xfs_rtalloc_query_all(m,t,f,p)                 (ENOSYS)
# define xfs_rtbuf_get(m,t,b,i,p)                       (ENOSYS)
# define xfs_rtallocate_extent(t,b,min,max,l,f,p,rb)	(-ENOSYS)
# define xfs_rtfree_extent(t,b,l)			(-ENOSYS)
# define xfs_rtfree_blocks(t,rb,rl)			(-ENOSYS)
# define xfs_rtpick_extent(m,t,l,rb)			(-ENOSYS)
# define xfs_growfs_rt(mp,in)				(-ENOSYS)
# define xfs_rtalloc_query_range(m,t,l,h,f,p)		(-ENOSYS)
# define xfs_rtalloc_query_all(m,t,f,p)			(-ENOSYS)
# define xfs_rtbuf_get(m,t,b,i,p)			(-ENOSYS)
# define xfs_verify_rtbno(m, r)				(false)
# define xfs_rtalloc_extent_is_free(m,t,s,l,i)          (ENOSYS)
# define xfs_rtalloc_extent_is_free(m,t,s,l,i)		(-ENOSYS)
# define xfs_rtalloc_reinit_frextents(m)		(0)
static inline int		/* error */
xfs_rtmount_init(
@@ -157,7 +162,7 @@ xfs_rtmount_init(
	xfs_warn(mp, "Not built with CONFIG_XFS_RT");
	return -ENOSYS;
}
# define xfs_rtmount_inodes(m)  (((mp)->m_sb.sb_rblocks == 0)? 0 : (ENOSYS))
# define xfs_rtmount_inodes(m)  (((mp)->m_sb.sb_rblocks == 0)? 0 : (-ENOSYS))
# define xfs_rtunmount_inodes(m)
#endif	/* CONFIG_XFS_RT */