|
@@ -468,51 +468,34 @@ xfs_iroot_realloc(
|
|
|
*/
|
|
|
void
|
|
|
xfs_idata_realloc(
|
|
|
- xfs_inode_t *ip,
|
|
|
- int byte_diff,
|
|
|
- int whichfork)
|
|
|
+ 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 {
|
|
|
- /*
|
|
|
- * 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);
|
|
|
- }
|
|
|
+ ifp->if_bytes = 0;
|
|
|
+ return;
|
|
|
}
|
|
|
+
|
|
|
+ /*
|
|
|
+ * 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;
|
|
|
- ASSERT(ifp->if_bytes <= XFS_IFORK_SIZE(ip, whichfork));
|
|
|
}
|
|
|
|
|
|
void
|