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

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
...@@ -468,51 +468,34 @@ xfs_iroot_realloc( ...@@ -468,51 +468,34 @@ xfs_iroot_realloc(
*/ */
void void
xfs_idata_realloc( xfs_idata_realloc(
xfs_inode_t *ip, struct xfs_inode *ip,
int byte_diff, int byte_diff,
int whichfork) int whichfork)
{ {
xfs_ifork_t *ifp; struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork);
int new_size; int new_size = (int)ifp->if_bytes + byte_diff;
int real_size;
if (byte_diff == 0) {
return;
}
ifp = XFS_IFORK_PTR(ip, whichfork);
new_size = (int)ifp->if_bytes + byte_diff;
ASSERT(new_size >= 0); ASSERT(new_size >= 0);
ASSERT(new_size <= XFS_IFORK_SIZE(ip, whichfork));
if (byte_diff == 0)
return;
if (new_size == 0) { if (new_size == 0) {
kmem_free(ifp->if_u1.if_data); kmem_free(ifp->if_u1.if_data);
ifp->if_u1.if_data = NULL; ifp->if_u1.if_data = NULL;
real_size = 0; ifp->if_bytes = 0;
} else { return;
/*
* 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 {
/*
* Only do the realloc if the underlying size
* is really changing.
*/
ifp->if_u1.if_data =
kmem_realloc(ifp->if_u1.if_data,
real_size,
KM_SLEEP | KM_NOFS);
}
} }
/*
* 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,
roundup(new_size, 4), KM_SLEEP | KM_NOFS);
ifp->if_bytes = new_size; ifp->if_bytes = new_size;
ASSERT(ifp->if_bytes <= XFS_IFORK_SIZE(ip, whichfork));
} }
void void
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment