Message ID | 161142791730.2170981.16295389347749875438.stgit@magnolia (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | xfs: minor cleanups of the quota functions | expand |
On Sat, Jan 23, 2021 at 10:51:57AM -0800, Darrick J. Wong wrote: > From: Darrick J. Wong <djwong@kernel.org> > > Create a proper helper so that inode creation calls can reserve quota > with a dedicated function. > > Signed-off-by: Darrick J. Wong <djwong@kernel.org> > Reviewed-by: Christoph Hellwig <hch@lst.de> > --- > fs/xfs/xfs_inode.c | 8 ++++---- > fs/xfs/xfs_quota.h | 15 +++++++++++---- > fs/xfs/xfs_symlink.c | 4 ++-- > fs/xfs/xfs_trans_dquot.c | 21 +++++++++++++++++++++ > 4 files changed, 38 insertions(+), 10 deletions(-) > > ... > diff --git a/fs/xfs/xfs_trans_dquot.c b/fs/xfs/xfs_trans_dquot.c > index 28b8ac701919..3315498a6fa1 100644 > --- a/fs/xfs/xfs_trans_dquot.c > +++ b/fs/xfs/xfs_trans_dquot.c > @@ -804,6 +804,27 @@ 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_inode *dp, > + struct xfs_dquot *udqp, > + struct xfs_dquot *gdqp, > + struct xfs_dquot *pdqp, > + int64_t nblks) > +{ > + struct xfs_mount *mp = dp->i_mount; > + > + if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp)) > + return 0; > + > + ASSERT(!xfs_is_quota_inode(&mp->m_sb, dp->i_ino)); > + > + return xfs_trans_reserve_quota_bydquots(tp, dp->i_mount, udqp, gdqp, > + pdqp, nblks, 1, XFS_QMOPT_RES_REGBLKS); Considering we can get mp from tp (and it looks like we always pass tp), is it worth even passing in dp for an (unlikely) assert? That seems a little odd anyways since nothing down in this path actually uses or cares about the parent inode. Also, no need to pass dp->i_mount above if we've already defined mp, at least. Brian > +} > + > /* > * This routine is called to allocate a quotaoff log item. > */ >
On Mon, Jan 25, 2021 at 10:17:22AM -0500, Brian Foster wrote: > On Sat, Jan 23, 2021 at 10:51:57AM -0800, Darrick J. Wong wrote: > > From: Darrick J. Wong <djwong@kernel.org> > > > > Create a proper helper so that inode creation calls can reserve quota > > with a dedicated function. > > > > Signed-off-by: Darrick J. Wong <djwong@kernel.org> > > Reviewed-by: Christoph Hellwig <hch@lst.de> > > --- > > fs/xfs/xfs_inode.c | 8 ++++---- > > fs/xfs/xfs_quota.h | 15 +++++++++++---- > > fs/xfs/xfs_symlink.c | 4 ++-- > > fs/xfs/xfs_trans_dquot.c | 21 +++++++++++++++++++++ > > 4 files changed, 38 insertions(+), 10 deletions(-) > > > > > ... > > diff --git a/fs/xfs/xfs_trans_dquot.c b/fs/xfs/xfs_trans_dquot.c > > index 28b8ac701919..3315498a6fa1 100644 > > --- a/fs/xfs/xfs_trans_dquot.c > > +++ b/fs/xfs/xfs_trans_dquot.c > > @@ -804,6 +804,27 @@ 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_inode *dp, > > + struct xfs_dquot *udqp, > > + struct xfs_dquot *gdqp, > > + struct xfs_dquot *pdqp, > > + int64_t nblks) > > +{ > > + struct xfs_mount *mp = dp->i_mount; > > + > > + if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp)) > > + return 0; > > + > > + ASSERT(!xfs_is_quota_inode(&mp->m_sb, dp->i_ino)); > > + > > + return xfs_trans_reserve_quota_bydquots(tp, dp->i_mount, udqp, gdqp, > > + pdqp, nblks, 1, XFS_QMOPT_RES_REGBLKS); > > Considering we can get mp from tp (and it looks like we always pass tp), > is it worth even passing in dp for an (unlikely) assert? That seems a > little odd anyways since nothing down in this path actually uses or > cares about the parent inode. Also, no need to pass dp->i_mount above if > we've already defined mp, at least. You're correct, we can drop the *dp parameter entirely. --D > Brian > > > +} > > + > > /* > > * This routine is called to allocate a quotaoff log item. > > */ > > >
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index e2a1db4cee43..e909da05cd28 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1037,8 +1037,8 @@ 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, dp, udqp, gdqp, pdqp, + resblks); if (error) goto out_trans_cancel; @@ -1169,8 +1169,8 @@ 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, dp, 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 a25e3ce04c60..16a2e7adf4da 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_inode *dp, + struct xfs_dquot *udqp, struct xfs_dquot *gdqp, + struct xfs_dquot *pdqp, int64_t nblks); 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,14 @@ xfs_quota_reserve_blkres(struct xfs_inode *ip, int64_t nblks, bool isrt) return 0; } +static inline int +xfs_trans_reserve_quota_icreate(struct xfs_trans *tp, struct xfs_inode *dp, + struct xfs_dquot *udqp, struct xfs_dquot *gdqp, + struct xfs_dquot *pdqp, int64_t nblks) +{ + 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) @@ -171,10 +182,6 @@ xfs_trans_unreserve_quota_nblks(struct xfs_trans *tp, struct xfs_inode *ip, return xfs_trans_reserve_quota_nblks(tp, ip, -nblks, -ninos, flags); } -#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 nblks, bool isrt) { diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index 7f96649e918a..f8bfa51bdeef 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -215,8 +215,8 @@ 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, dp, 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..3315498a6fa1 100644 --- a/fs/xfs/xfs_trans_dquot.c +++ b/fs/xfs/xfs_trans_dquot.c @@ -804,6 +804,27 @@ 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_inode *dp, + struct xfs_dquot *udqp, + struct xfs_dquot *gdqp, + struct xfs_dquot *pdqp, + int64_t nblks) +{ + struct xfs_mount *mp = dp->i_mount; + + if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp)) + return 0; + + ASSERT(!xfs_is_quota_inode(&mp->m_sb, dp->i_ino)); + + return xfs_trans_reserve_quota_bydquots(tp, dp->i_mount, udqp, gdqp, + pdqp, nblks, 1, XFS_QMOPT_RES_REGBLKS); +} + /* * This routine is called to allocate a quotaoff log item. */