|
@@ -156,7 +156,8 @@ __xfs_ag_resv_free(
|
|
|
trace_xfs_ag_resv_free(pag, type, 0);
|
|
|
|
|
|
resv = xfs_perag_resv(pag, type);
|
|
|
- pag->pag_mount->m_ag_max_usable += resv->ar_asked;
|
|
|
+ if (pag->pag_agno == 0)
|
|
|
+ pag->pag_mount->m_ag_max_usable += resv->ar_asked;
|
|
|
/*
|
|
|
* AGFL blocks are always considered "free", so whatever
|
|
|
* was reserved at mount time must be given back at umount.
|
|
@@ -216,7 +217,14 @@ __xfs_ag_resv_init(
|
|
|
return error;
|
|
|
}
|
|
|
|
|
|
- mp->m_ag_max_usable -= ask;
|
|
|
+ /*
|
|
|
+ * Reduce the maximum per-AG allocation length by however much we're
|
|
|
+ * trying to reserve for an AG. Since this is a filesystem-wide
|
|
|
+ * counter, we only make the adjustment for AG 0. This assumes that
|
|
|
+ * there aren't any AGs hungrier for per-AG reservation than AG 0.
|
|
|
+ */
|
|
|
+ if (pag->pag_agno == 0)
|
|
|
+ mp->m_ag_max_usable -= ask;
|
|
|
|
|
|
resv = xfs_perag_resv(pag, type);
|
|
|
resv->ar_asked = ask;
|