On Tue, Jan 24, 2017 at 09:16:19PM +0100, Christoph Hellwig wrote: > Try to reserve the blocks first and only then update the fields in > or hanging off the mount structure. This way we can call __xfs_ag_resv_init > again after a previous failure. > > Signed-off-by: Christoph Hellwig <hch@xxxxxx> Looks ok to me, Reviewed-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> --D > --- > fs/xfs/libxfs/xfs_ag_resv.c | 23 ++++++++++++++--------- > 1 file changed, 14 insertions(+), 9 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_ag_resv.c b/fs/xfs/libxfs/xfs_ag_resv.c > index d346d42..94234bf 100644 > --- a/fs/xfs/libxfs/xfs_ag_resv.c > +++ b/fs/xfs/libxfs/xfs_ag_resv.c > @@ -200,22 +200,27 @@ __xfs_ag_resv_init( > struct xfs_mount *mp = pag->pag_mount; > struct xfs_ag_resv *resv; > int error; > + xfs_extlen_t reserved; > > - resv = xfs_perag_resv(pag, type); > if (used > ask) > ask = used; > - resv->ar_asked = ask; > - resv->ar_reserved = resv->ar_orig_reserved = ask - used; > - mp->m_ag_max_usable -= ask; > + reserved = ask - used; > > - trace_xfs_ag_resv_init(pag, type, ask); > - > - error = xfs_mod_fdblocks(mp, -(int64_t)resv->ar_reserved, true); > - if (error) > + error = xfs_mod_fdblocks(mp, -(int64_t)reserved, true); > + if (error) { > trace_xfs_ag_resv_init_error(pag->pag_mount, pag->pag_agno, > error, _RET_IP_); > + return error; > + } > > - return error; > + mp->m_ag_max_usable -= ask; > + > + resv = xfs_perag_resv(pag, type); > + resv->ar_asked = ask; > + resv->ar_reserved = resv->ar_orig_reserved = reserved; > + > + trace_xfs_ag_resv_init(pag, type, ask); > + return 0; > } > > /* Create a per-AG block reservation. */ > -- > 2.1.4 > -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html