@@ -434,7 +434,13 @@ void __xfs_buf_mark_corrupt(struct xfs_buf *bp, xfs_failaddr_t fa);
#define xfs_filestream_select_ag(...) (-ENOSYS)
/* quota bits */
-#define xfs_trans_mod_dquot_byino(t,i,f,d) ((void) 0)
+
+/* Silence GCC unused variable warning on xfs_bmap.c */
+#define xfs_trans_mod_dquot_byino(t,i,f,d) ({ \
+ uint _f = (f); \
+ _f = _f; \
+})
+
#define xfs_trans_reserve_quota_nblks(t,i,b,n,f) (0)
/* hack too silence gcc */
@@ -3257,10 +3257,14 @@ xfs_bmap_btalloc_select_lengths(
}
/* Update all inode and quota accounting for the allocation we just did. */
-static void
-xfs_bmap_btalloc_accounting(
+void
+xfs_bmap_alloc_account(
struct xfs_bmalloca *ap)
{
+ bool isrt = XFS_IS_REALTIME_INODE(ap->ip) &&
+ (ap->flags & XFS_BMAPI_ATTRFORK);
+ uint fld;
+
if (ap->flags & XFS_BMAPI_COWFORK) {
/*
* COW fork blocks are in-core only and thus are treated as
@@ -3285,7 +3289,8 @@ xfs_bmap_btalloc_accounting(
* to that of a delalloc extent.
*/
ap->ip->i_delayed_blks += ap->length;
- xfs_trans_mod_dquot_byino(ap->tp, ap->ip, XFS_TRANS_DQ_RES_BLKS,
+ xfs_trans_mod_dquot_byino(ap->tp, ap->ip, isrt ?
+ XFS_TRANS_DQ_RES_RTBLKS : XFS_TRANS_DQ_RES_BLKS,
-(long)ap->length);
return;
}
@@ -3296,10 +3301,12 @@ xfs_bmap_btalloc_accounting(
if (ap->wasdel) {
ap->ip->i_delayed_blks -= ap->length;
xfs_mod_delalloc(ap->ip->i_mount, -(int64_t)ap->length);
+ fld = isrt ? XFS_TRANS_DQ_DELRTBCOUNT : XFS_TRANS_DQ_DELBCOUNT;
+ } else {
+ fld = isrt ? XFS_TRANS_DQ_RTBCOUNT : XFS_TRANS_DQ_BCOUNT;
}
- xfs_trans_mod_dquot_byino(ap->tp, ap->ip,
- ap->wasdel ? XFS_TRANS_DQ_DELBCOUNT : XFS_TRANS_DQ_BCOUNT,
- ap->length);
+
+ xfs_trans_mod_dquot_byino(ap->tp, ap->ip, fld, ap->length);
}
static int
@@ -3373,7 +3380,7 @@ xfs_bmap_process_allocated_extent(
ap->offset = orig_offset;
else if (ap->offset + ap->length < orig_offset + orig_length)
ap->offset = orig_offset + orig_length - ap->length;
- xfs_bmap_btalloc_accounting(ap);
+ xfs_bmap_alloc_account(ap);
}
#ifdef DEBUG
@@ -116,6 +116,8 @@ static inline int xfs_bmapi_whichfork(uint32_t bmapi_flags)
return XFS_DATA_FORK;
}
+void xfs_bmap_alloc_account(struct xfs_bmalloca *ap);
+
/*
* Special values for xfs_bmbt_irec_t br_startblock field.
*/
@@ -21,6 +21,7 @@
#include "xfs_trace.h"
#include "xfs_rmap.h"
#include "xfs_ag.h"
+#include "xfs_quota_defs.h"
static struct kmem_cache *xfs_bmbt_cur_cache;