[PATCH 08/14] xfsprogs: free resources in libxfs_alloc_file_space error paths
Eric Sandeen
sandeen at redhat.com
Tue Apr 8 18:24:58 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>
---
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); /* XXX ERS? */
+ 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, unlock inode, cancel trans */
+ xfs_bmap_cancel(&free_list);
+ xfs_trans_cancel(tp, 0);
+ return error;
}
unsigned int
--
1.7.1
More information about the xfs
mailing list