[PATCH 08/14 V2] xfsprogs: free resources in libxfs_alloc_file_space error paths
Eric Sandeen
sandeen at sandeen.net
Fri Apr 11 17:49:29 CDT 2014
The bmap freelist & transaction pointer weren't
being freed in libxfs_alloc_file_space error paths;
more or less copy the error handling that exists
in kernelspace to resolve this.
Signed-off-by: Eric Sandeen <sandeen at redhat.com>
---
V2: Fix comment, remove XXX :)
Although: That ASSERT, while matching kernelspace, seems
weird. We *can* get other errors out of xfs_trans_reserve.
EIO etc... What's the assert all about?
libxfs/util.c | 20 +++++++++++++++++---
1 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/libxfs/util.c b/libxfs/util.c
index 1b05540..f1aa4c6 100644
--- a/libxfs/util.c
+++ b/libxfs/util.c
@@ -582,8 +582,17 @@ libxfs_alloc_file_space(
resblks = (uint)XFS_DIOSTRAT_SPACE_RES(mp, datablocks);
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write,
resblks, 0);
- if (error)
+ /*
+ * Check for running out of space
+ */
+ if (error) {
+ /*
+ * Free the transaction structure.
+ */
+ ASSERT(error == ENOSPC);
+ xfs_trans_cancel(tp, 0);
break;
+ }
xfs_trans_ijoin(tp, ip, 0);
xfs_trans_ihold(tp, ip);
@@ -593,12 +602,12 @@ libxfs_alloc_file_space(
&reccount, &free_list);
if (error)
- break;
+ goto error0;
/* complete the transaction */
error = xfs_bmap_finish(&tp, &free_list, &committed);
if (error)
- break;
+ goto error0;
error = xfs_trans_commit(tp, 0);
if (error)
@@ -612,6 +621,11 @@ libxfs_alloc_file_space(
allocatesize_fsb -= allocated_fsb;
}
return error;
+
+error0: /* Cancel bmap, cancel trans */
+ xfs_bmap_cancel(&free_list);
+ xfs_trans_cancel(tp, 0);
+ return error;
}
unsigned int
More information about the xfs
mailing list