@@ -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;
@@ -1164,8 +1164,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;
@@ -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 **,
@@ -141,6 +144,13 @@ static inline int xfs_quota_reserve_blkres(struct xfs_inode *ip,
{
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)
@@ -163,10 +173,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_reserve_blkres(struct xfs_inode *ip, int64_t nblks,
unsigned int flags)
@@ -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;
@@ -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.
*/