return (xfs_lsn_t)-1;
 }
 
+STATIC void
+xfs_qm_qoff_logitem_release(
+       struct xfs_log_item     *lip)
+{
+       struct xfs_qoff_logitem *qoff = QOFF_ITEM(lip);
+
+       if (test_bit(XFS_LI_ABORTED, &lip->li_flags)) {
+               if (qoff->qql_start_lip)
+                       xfs_qm_qoff_logitem_relse(qoff->qql_start_lip);
+               xfs_qm_qoff_logitem_relse(qoff);
+       }
+}
+
 static const struct xfs_item_ops xfs_qm_qoffend_logitem_ops = {
        .iop_size       = xfs_qm_qoff_logitem_size,
        .iop_format     = xfs_qm_qoff_logitem_format,
        .iop_committed  = xfs_qm_qoffend_logitem_committed,
        .iop_push       = xfs_qm_qoff_logitem_push,
+       .iop_release    = xfs_qm_qoff_logitem_release,
 };
 
 static const struct xfs_item_ops xfs_qm_qoff_logitem_ops = {
        .iop_size       = xfs_qm_qoff_logitem_size,
        .iop_format     = xfs_qm_qoff_logitem_format,
        .iop_push       = xfs_qm_qoff_logitem_push,
+       .iop_release    = xfs_qm_qoff_logitem_release,
 };
 
 /*
 
        int                     error;
        struct xfs_qoff_logitem *qoffi;
 
-       *qoffstartp = NULL;
-
        error = xfs_trans_alloc(mp, &M_RES(mp)->tr_qm_quotaoff, 0, 0, 0, &tp);
        if (error)
                goto out;
 STATIC int
 xfs_qm_log_quotaoff_end(
        struct xfs_mount        *mp,
-       struct xfs_qoff_logitem *startqoff,
+       struct xfs_qoff_logitem **startqoff,
        uint                    flags)
 {
        struct xfs_trans        *tp;
        if (error)
                return error;
 
-       qoffi = xfs_trans_get_qoff_item(tp, startqoff,
+       qoffi = xfs_trans_get_qoff_item(tp, *startqoff,
                                        flags & XFS_ALL_QUOTA_ACCT);
        xfs_trans_log_quotaoff_item(tp, qoffi);
+       *startqoff = NULL;
 
        /*
         * We have to make sure that the transaction is secure on disk before we
        uint                    dqtype;
        int                     error;
        uint                    inactivate_flags;
-       struct xfs_qoff_logitem *qoffstart;
+       struct xfs_qoff_logitem *qoffstart = NULL;
 
        /*
         * No file system can have quotas enabled on disk but not in core.
         * So, we have QUOTAOFF start and end logitems; the start
         * logitem won't get overwritten until the end logitem appears...
         */
-       error = xfs_qm_log_quotaoff_end(mp, qoffstart, flags);
+       error = xfs_qm_log_quotaoff_end(mp, &qoffstart, flags);
        if (error) {
                /* We're screwed now. Shutdown is the only option. */
                xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
        }
 
 out_unlock:
+       if (error && qoffstart)
+               xfs_qm_qoff_logitem_relse(qoffstart);
        mutex_unlock(&q->qi_quotaofflock);
        return error;
 }