|
@@ -904,10 +904,22 @@ xfs_qm_dqflush(
|
|
/*
|
|
/*
|
|
* This may have been unpinned because the filesystem is shutting
|
|
* This may have been unpinned because the filesystem is shutting
|
|
* down forcibly. If that's the case we must not write this dquot
|
|
* down forcibly. If that's the case we must not write this dquot
|
|
- * to disk, because the log record didn't make it to disk!
|
|
|
|
|
|
+ * to disk, because the log record didn't make it to disk.
|
|
|
|
+ *
|
|
|
|
+ * We also have to remove the log item from the AIL in this case,
|
|
|
|
+ * as we wait for an emptry AIL as part of the unmount process.
|
|
*/
|
|
*/
|
|
if (XFS_FORCED_SHUTDOWN(mp)) {
|
|
if (XFS_FORCED_SHUTDOWN(mp)) {
|
|
|
|
+ struct xfs_log_item *lip = &dqp->q_logitem.qli_item;
|
|
dqp->dq_flags &= ~XFS_DQ_DIRTY;
|
|
dqp->dq_flags &= ~XFS_DQ_DIRTY;
|
|
|
|
+
|
|
|
|
+ spin_lock(&mp->m_ail->xa_lock);
|
|
|
|
+ if (lip->li_flags & XFS_LI_IN_AIL)
|
|
|
|
+ xfs_trans_ail_delete(mp->m_ail, lip,
|
|
|
|
+ SHUTDOWN_CORRUPT_INCORE);
|
|
|
|
+ else
|
|
|
|
+ spin_unlock(&mp->m_ail->xa_lock);
|
|
|
|
+
|
|
xfs_dqfunlock(dqp);
|
|
xfs_dqfunlock(dqp);
|
|
return XFS_ERROR(EIO);
|
|
return XFS_ERROR(EIO);
|
|
}
|
|
}
|