diff options
| -rw-r--r-- | fs/xfs/libxfs/xfs_ag_resv.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/fs/xfs/libxfs/xfs_ag_resv.c b/fs/xfs/libxfs/xfs_ag_resv.c index b008ff3250eb..df3e600835e8 100644 --- a/fs/xfs/libxfs/xfs_ag_resv.c +++ b/fs/xfs/libxfs/xfs_ag_resv.c | |||
| @@ -156,7 +156,8 @@ __xfs_ag_resv_free( | |||
| 156 | trace_xfs_ag_resv_free(pag, type, 0); | 156 | trace_xfs_ag_resv_free(pag, type, 0); |
| 157 | 157 | ||
| 158 | resv = xfs_perag_resv(pag, type); | 158 | resv = xfs_perag_resv(pag, type); |
| 159 | pag->pag_mount->m_ag_max_usable += resv->ar_asked; | 159 | if (pag->pag_agno == 0) |
| 160 | pag->pag_mount->m_ag_max_usable += resv->ar_asked; | ||
| 160 | /* | 161 | /* |
| 161 | * AGFL blocks are always considered "free", so whatever | 162 | * AGFL blocks are always considered "free", so whatever |
| 162 | * was reserved at mount time must be given back at umount. | 163 | * was reserved at mount time must be given back at umount. |
| @@ -216,7 +217,14 @@ __xfs_ag_resv_init( | |||
| 216 | return error; | 217 | return error; |
| 217 | } | 218 | } |
| 218 | 219 | ||
| 219 | mp->m_ag_max_usable -= ask; | 220 | /* |
| 221 | * Reduce the maximum per-AG allocation length by however much we're | ||
| 222 | * trying to reserve for an AG. Since this is a filesystem-wide | ||
| 223 | * counter, we only make the adjustment for AG 0. This assumes that | ||
| 224 | * there aren't any AGs hungrier for per-AG reservation than AG 0. | ||
| 225 | */ | ||
| 226 | if (pag->pag_agno == 0) | ||
| 227 | mp->m_ag_max_usable -= ask; | ||
| 220 | 228 | ||
| 221 | resv = xfs_perag_resv(pag, type); | 229 | resv = xfs_perag_resv(pag, type); |
| 222 | resv->ar_asked = ask; | 230 | resv->ar_asked = ask; |
