[XFS] Check for xfs_free_extent() failing.
authorDavid Chinner <dgc@sgi.com>
Thu, 10 Apr 2008 02:21:53 +0000 (12:21 +1000)
committerLachlan McIlroy <lachlan@redback.melbourne.sgi.com>
Fri, 18 Apr 2008 01:59:23 +0000 (11:59 +1000)
xfs_free_extent() can fail, but log recovery never bothers to check if it
successfully free the extent it was supposed to. This could lead to silent
corruption during log recovery. Abort log recovery if we fail to free an
extent.

SGI-PV: 980084
SGI-Modid: xfs-linux-melb:xfs-kern:30801a

Signed-off-by: David Chinner <dgc@sgi.com>
Signed-off-by: Niv Sardi <xaiki@sgi.com>
Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
fs/xfs/xfs_log_recover.c

index 418582b709ebcdfcb99f35f84aeec037854842bb..3a8fe7bfa2af18e75b0425daaeb638a0ad2d8a2c 100644 (file)
@@ -3003,15 +3003,15 @@ xlog_recover_process_efi(
 
        tp = xfs_trans_alloc(mp, 0);
        error = xfs_trans_reserve(tp, 0, XFS_ITRUNCATE_LOG_RES(mp), 0, 0, 0);
-       if (error) {
-               xfs_trans_cancel(tp, XFS_TRANS_ABORT);
-               return error;
-       }
+       if (error)
+               goto abort_error;
        efdp = xfs_trans_get_efd(tp, efip, efip->efi_format.efi_nextents);
 
        for (i = 0; i < efip->efi_format.efi_nextents; i++) {
                extp = &(efip->efi_format.efi_extents[i]);
-               xfs_free_extent(tp, extp->ext_start, extp->ext_len);
+               error = xfs_free_extent(tp, extp->ext_start, extp->ext_len);
+               if (error)
+                       goto abort_error;
                xfs_trans_log_efd_extent(tp, efdp, extp->ext_start,
                                         extp->ext_len);
        }
@@ -3019,6 +3019,10 @@ xlog_recover_process_efi(
        efip->efi_flags |= XFS_EFI_RECOVERED;
        error = xfs_trans_commit(tp, 0);
        return error;
+
+abort_error:
+       xfs_trans_cancel(tp, XFS_TRANS_ABORT);
+       return error;
 }
 
 /*