On Wed, Jan 27, 2021 at 10:01:27PM -0800, Darrick J. Wong wrote: > From: Darrick J. Wong <djwong@xxxxxxxxxx> > > Create a proper helper so that inode creation calls can reserve quota > with a dedicated function. > > Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> > Reviewed-by: Christoph Hellwig <hch@xxxxxx> > --- Reviewed-by: Brian Foster <bfoster@xxxxxxxxxx> > fs/xfs/xfs_inode.c | 6 ++---- > fs/xfs/xfs_quota.h | 14 ++++++++++---- > fs/xfs/xfs_symlink.c | 3 +-- > fs/xfs/xfs_trans_dquot.c | 18 ++++++++++++++++++ > 4 files changed, 31 insertions(+), 10 deletions(-) > > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index e2a1db4cee43..4bbd2fb628f7 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -1037,8 +1037,7 @@ xfs_create( > /* > * Reserve disk quota and the inode. > */ > - error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp, > - pdqp, resblks, 1, 0); > + error = xfs_trans_reserve_quota_icreate(tp, udqp, gdqp, pdqp, resblks); > if (error) > goto out_trans_cancel; > > @@ -1169,8 +1168,7 @@ xfs_create_tmpfile( > if (error) > goto out_release_inode; > > - error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp, > - pdqp, resblks, 1, 0); > + error = xfs_trans_reserve_quota_icreate(tp, udqp, gdqp, pdqp, resblks); > if (error) > goto out_trans_cancel; > > diff --git a/fs/xfs/xfs_quota.h b/fs/xfs/xfs_quota.h > index a395dabee033..d1e3f94140b4 100644 > --- a/fs/xfs/xfs_quota.h > +++ b/fs/xfs/xfs_quota.h > @@ -86,6 +86,9 @@ extern int xfs_trans_reserve_quota_nblks(struct xfs_trans *, > extern int xfs_trans_reserve_quota_bydquots(struct xfs_trans *, > struct xfs_mount *, struct xfs_dquot *, > struct xfs_dquot *, struct xfs_dquot *, int64_t, long, uint); > +int xfs_trans_reserve_quota_icreate(struct xfs_trans *tp, > + struct xfs_dquot *udqp, struct xfs_dquot *gdqp, > + struct xfs_dquot *pdqp, int64_t dblocks); > > extern int xfs_qm_vop_dqalloc(struct xfs_inode *, kuid_t, kgid_t, > prid_t, uint, struct xfs_dquot **, struct xfs_dquot **, > @@ -149,6 +152,13 @@ xfs_quota_reserve_blkres(struct xfs_inode *ip, int64_t dblocks) > return 0; > } > > +static inline int > +xfs_trans_reserve_quota_icreate(struct xfs_trans *tp, struct xfs_dquot *udqp, > + struct xfs_dquot *gdqp, struct xfs_dquot *pdqp, int64_t dblocks) > +{ > + return 0; > +} > + > #define xfs_qm_vop_create_dqattach(tp, ip, u, g, p) > #define xfs_qm_vop_rename_dqattach(it) (0) > #define xfs_qm_vop_chown(tp, ip, old, new) (NULL) > @@ -164,10 +174,6 @@ xfs_quota_reserve_blkres(struct xfs_inode *ip, int64_t dblocks) > #define xfs_qm_unmount_quotas(mp) > #endif /* CONFIG_XFS_QUOTA */ > > -#define xfs_trans_reserve_quota(tp, mp, ud, gd, pd, nb, ni, f) \ > - xfs_trans_reserve_quota_bydquots(tp, mp, ud, gd, pd, nb, ni, \ > - f | XFS_QMOPT_RES_REGBLKS) > - > static inline int > xfs_quota_unreserve_blkres(struct xfs_inode *ip, int64_t dblocks) > { > diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c > index 7f96649e918a..d5dee8f409b2 100644 > --- a/fs/xfs/xfs_symlink.c > +++ b/fs/xfs/xfs_symlink.c > @@ -215,8 +215,7 @@ xfs_symlink( > /* > * Reserve disk quota : blocks and inode. > */ > - error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp, > - pdqp, resblks, 1, 0); > + error = xfs_trans_reserve_quota_icreate(tp, udqp, gdqp, pdqp, resblks); > if (error) > goto out_trans_cancel; > > diff --git a/fs/xfs/xfs_trans_dquot.c b/fs/xfs/xfs_trans_dquot.c > index 28b8ac701919..22aa875b84f7 100644 > --- a/fs/xfs/xfs_trans_dquot.c > +++ b/fs/xfs/xfs_trans_dquot.c > @@ -804,6 +804,24 @@ xfs_trans_reserve_quota_nblks( > nblks, ninos, flags); > } > > +/* Change the quota reservations for an inode creation activity. */ > +int > +xfs_trans_reserve_quota_icreate( > + struct xfs_trans *tp, > + struct xfs_dquot *udqp, > + struct xfs_dquot *gdqp, > + struct xfs_dquot *pdqp, > + int64_t dblocks) > +{ > + struct xfs_mount *mp = tp->t_mountp; > + > + if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp)) > + return 0; > + > + return xfs_trans_reserve_quota_bydquots(tp, mp, udqp, gdqp, pdqp, > + dblocks, 1, XFS_QMOPT_RES_REGBLKS); > +} > + > /* > * This routine is called to allocate a quotaoff log item. > */ >