Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1216b58b authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Darrick J. Wong
Browse files

xfs: simplify xfs_idata_realloc



Streamline the code and take advantage of the fact that kmem_realloc
through krealloc will be have like a normal allocation if passing in a
NULL old pointer.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
parent fcacbc3f
Loading
Loading
Loading
Loading
+19 −36
Original line number Diff line number Diff line
@@ -468,51 +468,34 @@ xfs_iroot_realloc(
 */
void
xfs_idata_realloc(
	xfs_inode_t	*ip,
	struct xfs_inode	*ip,
	int			byte_diff,
	int			whichfork)
{
	xfs_ifork_t	*ifp;
	int		new_size;
	int		real_size;

	if (byte_diff == 0) {
		return;
	}
	struct xfs_ifork	*ifp = XFS_IFORK_PTR(ip, whichfork);
	int			new_size = (int)ifp->if_bytes + byte_diff;

	ifp = XFS_IFORK_PTR(ip, whichfork);
	new_size = (int)ifp->if_bytes + byte_diff;
	ASSERT(new_size >= 0);
	ASSERT(new_size <= XFS_IFORK_SIZE(ip, whichfork));

	if (byte_diff == 0)
		return;

	if (new_size == 0) {
		kmem_free(ifp->if_u1.if_data);
		ifp->if_u1.if_data = NULL;
		real_size = 0;
	} else {
		/*
		 * Stuck with malloc/realloc.
		 * For inline data, the underlying buffer must be
		 * a multiple of 4 bytes in size so that it can be
		 * logged and stay on word boundaries.  We enforce
		 * that here.
		 */
		real_size = roundup(new_size, 4);
		if (ifp->if_u1.if_data == NULL) {
			ifp->if_u1.if_data = kmem_alloc(real_size,
							KM_SLEEP | KM_NOFS);
		} else {
		ifp->if_bytes = 0;
		return;
	}

	/*
			 * Only do the realloc if the underlying size
			 * is really changing.
	 * For inline data, the underlying buffer must be a multiple of 4 bytes
	 * in size so that it can be logged and stay on word boundaries.
	 * We enforce that here.
	 */
			ifp->if_u1.if_data =
				kmem_realloc(ifp->if_u1.if_data,
						real_size,
						KM_SLEEP | KM_NOFS);
		}
	}
	ifp->if_u1.if_data = kmem_realloc(ifp->if_u1.if_data,
			roundup(new_size, 4), KM_SLEEP | KM_NOFS);
	ifp->if_bytes = new_size;
	ASSERT(ifp->if_bytes <= XFS_IFORK_SIZE(ip, whichfork));
}

void