Commit b31c2bdc authored by Darrick J. Wong's avatar Darrick J. Wong

xfs: reserve blocks for refcount / rmap log item recovery

During log recovery, the per-AG reservations aren't yet set up, so log
recovery has to reserve enough blocks to handle all possible btree
splits.
Reported-by: default avatarDave Chinner <david@fromorbit.com>
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
parent 86516eff
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include "xfs_log_format.h" #include "xfs_log_format.h"
#include "xfs_trans_resv.h" #include "xfs_trans_resv.h"
#include "xfs_bit.h" #include "xfs_bit.h"
#include "xfs_shared.h"
#include "xfs_mount.h" #include "xfs_mount.h"
#include "xfs_defer.h" #include "xfs_defer.h"
#include "xfs_trans.h" #include "xfs_trans.h"
...@@ -456,10 +457,12 @@ xfs_cui_recover( ...@@ -456,10 +457,12 @@ xfs_cui_recover(
* transaction. Normally, any work that needs to be deferred * transaction. Normally, any work that needs to be deferred
* gets attached to the same defer_ops that scheduled the * gets attached to the same defer_ops that scheduled the
* refcount update. However, we're in log recovery here, so we * refcount update. However, we're in log recovery here, so we
* we create our own defer_ops and use that to finish up any * we use the passed in defer_ops and to finish up any work that
* work that doesn't fit. * doesn't fit. We need to reserve enough blocks to handle a
* full btree split on either end of the refcount range.
*/ */
error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp); error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate,
mp->m_refc_maxlevels * 2, 0, XFS_TRANS_RESERVE, &tp);
if (error) if (error)
return error; return error;
cudp = xfs_trans_get_cud(tp, cuip); cudp = xfs_trans_get_cud(tp, cuip);
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include "xfs_log_format.h" #include "xfs_log_format.h"
#include "xfs_trans_resv.h" #include "xfs_trans_resv.h"
#include "xfs_bit.h" #include "xfs_bit.h"
#include "xfs_shared.h"
#include "xfs_mount.h" #include "xfs_mount.h"
#include "xfs_defer.h" #include "xfs_defer.h"
#include "xfs_trans.h" #include "xfs_trans.h"
...@@ -470,7 +471,8 @@ xfs_rui_recover( ...@@ -470,7 +471,8 @@ xfs_rui_recover(
} }
} }
error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp); error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate,
mp->m_rmap_maxlevels, 0, XFS_TRANS_RESERVE, &tp);
if (error) if (error)
return error; return error;
rudp = xfs_trans_get_rud(tp, ruip); rudp = xfs_trans_get_rud(tp, ruip);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment