All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] xfs: kill xfs_qmops
@ 2009-02-24 14:37 Christoph Hellwig
  2009-03-16  7:55 ` Christoph Hellwig
  2009-05-26 17:34 ` Eric Sandeen
  0 siblings, 2 replies; 6+ messages in thread
From: Christoph Hellwig @ 2009-02-24 14:37 UTC (permalink / raw)
  To: xfs


Kill the quota ops function vector and replace it with direct calls or
stubs in the CONFIG_XFS_QUOTA=n case.

Make sure we check XFS_IS_QUOTA_RUNNING in the right spots.  We can remove
the number of those checks because the XFS_TRANS_DQ_DIRTY flag can't be set
otherwise.

This brings us back closer to the way this code worked in IRIX and earlier
Linux versions, but we keep a lot of the more useful factoring of common
code.

Eventually we should also kill xfs_qm_bhv.c, but that's left for a later
patch.

Reduces the size of the source code by about 250 lines and the size of
XFS module by about 1.5 kilobytes with quotas enabled:

   text	   data	    bss	    dec	    hex	filename
 615957	   2960	   3848	 622765	  980ad	fs/xfs/xfs.o
 617231	   3152	   3848	 624231	  98667	fs/xfs/xfs.o.old


Fallout:

 - xfs_qm_dqattach is split into xfs_qm_dqattach_locked which expects
   the inode locked and xfs_qm_dqattach which does the locking around it,
   thus removing XFS_QMOPT_ILOCKED.

Signed-off-by: Christoph Hellwig <hch@lst.de>

Index: xfs/fs/xfs/quota/xfs_trans_dquot.c
===================================================================
--- xfs.orig/fs/xfs/quota/xfs_trans_dquot.c	2009-02-24 15:32:16.063369993 +0100
+++ xfs/fs/xfs/quota/xfs_trans_dquot.c	2009-02-24 15:32:35.845494182 +0100
@@ -111,7 +111,7 @@ xfs_trans_log_dquot(
  * Carry forward whatever is left of the quota blk reservation to
  * the spanky new transaction
  */
-STATIC void
+void
 xfs_trans_dup_dqinfo(
 	xfs_trans_t	*otp,
 	xfs_trans_t	*ntp)
@@ -167,19 +167,17 @@ xfs_trans_dup_dqinfo(
 /*
  * Wrap around mod_dquot to account for both user and group quotas.
  */
-STATIC void
+void
 xfs_trans_mod_dquot_byino(
 	xfs_trans_t	*tp,
 	xfs_inode_t	*ip,
 	uint		field,
 	long		delta)
 {
-	xfs_mount_t	*mp;
+	xfs_mount_t	*mp = tp->t_mountp;
 
-	ASSERT(tp);
-	mp = tp->t_mountp;
-
-	if (!XFS_IS_QUOTA_ON(mp) ||
+	if (!XFS_IS_QUOTA_RUNNING(mp) ||
+	    !XFS_IS_QUOTA_ON(mp) ||
 	    ip->i_ino == mp->m_sb.sb_uquotino ||
 	    ip->i_ino == mp->m_sb.sb_gquotino)
 		return;
@@ -229,6 +227,7 @@ xfs_trans_mod_dquot(
 	xfs_dqtrx_t	*qtrx;
 
 	ASSERT(tp);
+	ASSERT(XFS_IS_QUOTA_RUNNING(tp->t_mountp));
 	qtrx = NULL;
 
 	if (tp->t_dqinfo == NULL)
@@ -346,7 +345,7 @@ xfs_trans_dqlockedjoin(
  * Unreserve just the reservations done by this transaction.
  * dquot is still left locked at exit.
  */
-STATIC void
+void
 xfs_trans_apply_dquot_deltas(
 	xfs_trans_t		*tp)
 {
@@ -357,7 +356,7 @@ xfs_trans_apply_dquot_deltas(
 	long			totalbdelta;
 	long			totalrtbdelta;
 
-	if (! (tp->t_flags & XFS_TRANS_DQ_DIRTY))
+	if (!(tp->t_flags & XFS_TRANS_DQ_DIRTY))
 		return;
 
 	ASSERT(tp->t_dqinfo);
@@ -531,7 +530,7 @@ xfs_trans_apply_dquot_deltas(
  * we simply throw those away, since that's the expected behavior
  * when a transaction is curtailed without a commit.
  */
-STATIC void
+void
 xfs_trans_unreserve_and_mod_dquots(
 	xfs_trans_t		*tp)
 {
@@ -768,6 +767,8 @@ xfs_trans_reserve_quota_bydquots(
 {
 	int		resvd = 0, error;
 
+	if (!XFS_IS_QUOTA_RUNNING(mp))
+		return 0;
 	if (!XFS_IS_QUOTA_ON(mp))
 		return 0;
 
@@ -811,17 +812,18 @@ xfs_trans_reserve_quota_bydquots(
  * This doesn't change the actual usage, just the reservation.
  * The inode sent in is locked.
  */
-STATIC int
+int
 xfs_trans_reserve_quota_nblks(
-	xfs_trans_t	*tp,
-	xfs_mount_t	*mp,
-	xfs_inode_t	*ip,
-	long		nblks,
-	long		ninos,
-	uint		flags)
+	struct xfs_trans	*tp,
+	struct xfs_inode	*ip,
+	long			nblks,
+	long			ninos,
+	uint			flags)
 {
-	int		error;
+	struct xfs_mount	*mp = ip->i_mount;
 
+	if (!XFS_IS_QUOTA_RUNNING(mp))
+		return 0;
 	if (!XFS_IS_QUOTA_ON(mp))
 		return 0;
 	if (XFS_IS_PQUOTA_ON(mp))
@@ -831,7 +833,6 @@ xfs_trans_reserve_quota_nblks(
 	ASSERT(ip->i_ino != mp->m_sb.sb_gquotino);
 
 	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
-	ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount));
 	ASSERT((flags & ~(XFS_QMOPT_FORCE_RES | XFS_QMOPT_ENOSPC)) ==
 				XFS_TRANS_DQ_RES_RTBLKS ||
 	       (flags & ~(XFS_QMOPT_FORCE_RES | XFS_QMOPT_ENOSPC)) ==
@@ -840,11 +841,9 @@ xfs_trans_reserve_quota_nblks(
 	/*
 	 * Reserve nblks against these dquots, with trans as the mediator.
 	 */
-	error = xfs_trans_reserve_quota_bydquots(tp, mp,
-						 ip->i_udquot, ip->i_gdquot,
-						 nblks, ninos,
-						 flags);
-	return error;
+	return xfs_trans_reserve_quota_bydquots(tp, mp,
+						ip->i_udquot, ip->i_gdquot,
+						nblks, ninos, flags);
 }
 
 /*
@@ -895,25 +894,15 @@ STATIC void
 xfs_trans_alloc_dqinfo(
 	xfs_trans_t	*tp)
 {
-	(tp)->t_dqinfo = kmem_zone_zalloc(xfs_Gqm->qm_dqtrxzone, KM_SLEEP);
+	tp->t_dqinfo = kmem_zone_zalloc(xfs_Gqm->qm_dqtrxzone, KM_SLEEP);
 }
 
-STATIC void
+void
 xfs_trans_free_dqinfo(
 	xfs_trans_t	*tp)
 {
 	if (!tp->t_dqinfo)
 		return;
-	kmem_zone_free(xfs_Gqm->qm_dqtrxzone, (tp)->t_dqinfo);
-	(tp)->t_dqinfo = NULL;
+	kmem_zone_free(xfs_Gqm->qm_dqtrxzone, tp->t_dqinfo);
+	tp->t_dqinfo = NULL;
 }
-
-xfs_dqtrxops_t	xfs_trans_dquot_ops = {
-	.qo_dup_dqinfo			= xfs_trans_dup_dqinfo,
-	.qo_free_dqinfo			= xfs_trans_free_dqinfo,
-	.qo_mod_dquot_byino		= xfs_trans_mod_dquot_byino,
-	.qo_apply_dquot_deltas		= xfs_trans_apply_dquot_deltas,
-	.qo_reserve_quota_nblks		= xfs_trans_reserve_quota_nblks,
-	.qo_reserve_quota_bydquots	= xfs_trans_reserve_quota_bydquots,
-	.qo_unreserve_and_mod_dquots	= xfs_trans_unreserve_and_mod_dquots,
-};
Index: xfs/fs/xfs/xfs_quota.h
===================================================================
--- xfs.orig/fs/xfs/xfs_quota.h	2009-02-24 15:32:16.089369812 +0100
+++ xfs/fs/xfs/xfs_quota.h	2009-02-24 15:32:35.846494310 +0100
@@ -197,7 +197,6 @@ typedef struct xfs_qoff_logformat {
 #define XFS_QMOPT_UMOUNTING	0x0000100 /* filesys is being unmounted */
 #define XFS_QMOPT_DOLOG		0x0000200 /* log buf changes (in quotacheck) */
 #define XFS_QMOPT_DOWARN        0x0000400 /* increase warning cnt if needed */
-#define XFS_QMOPT_ILOCKED	0x0000800 /* inode is already locked (excl) */
 #define XFS_QMOPT_DQREPAIR	0x0001000 /* repair dquot if damaged */
 #define XFS_QMOPT_GQUOTA	0x0002000 /* group dquot requested */
 #define XFS_QMOPT_ENOSPC	0x0004000 /* enospc instead of edquot (prj) */
@@ -302,69 +301,72 @@ typedef struct xfs_dqtrx {
 	long		qt_delrtb_delta;  /* delayed RT blk count changes */
 } xfs_dqtrx_t;
 
-/*
- * Dquot transaction functions, used if quota is enabled.
- */
-typedef void	(*qo_dup_dqinfo_t)(struct xfs_trans *, struct xfs_trans *);
-typedef void	(*qo_mod_dquot_byino_t)(struct xfs_trans *,
-				struct xfs_inode *, uint, long);
-typedef void	(*qo_free_dqinfo_t)(struct xfs_trans *);
-typedef void	(*qo_apply_dquot_deltas_t)(struct xfs_trans *);
-typedef void	(*qo_unreserve_and_mod_dquots_t)(struct xfs_trans *);
-typedef int	(*qo_reserve_quota_nblks_t)(
-				struct xfs_trans *, struct xfs_mount *,
-				struct xfs_inode *, long, long, uint);
-typedef int	(*qo_reserve_quota_bydquots_t)(
-				struct xfs_trans *, struct xfs_mount *,
-				struct xfs_dquot *, struct xfs_dquot *,
-				long, long, uint);
-typedef struct xfs_dqtrxops {
-	qo_dup_dqinfo_t			qo_dup_dqinfo;
-	qo_free_dqinfo_t		qo_free_dqinfo;
-	qo_mod_dquot_byino_t		qo_mod_dquot_byino;
-	qo_apply_dquot_deltas_t		qo_apply_dquot_deltas;
-	qo_reserve_quota_nblks_t	qo_reserve_quota_nblks;
-	qo_reserve_quota_bydquots_t	qo_reserve_quota_bydquots;
-	qo_unreserve_and_mod_dquots_t	qo_unreserve_and_mod_dquots;
-} xfs_dqtrxops_t;
-
-#define XFS_DQTRXOP(mp, tp, op, args...) \
-		((mp)->m_qm_ops->xfs_dqtrxops ? \
-		((mp)->m_qm_ops->xfs_dqtrxops->op)(tp, ## args) : 0)
-
-#define XFS_DQTRXOP_VOID(mp, tp, op, args...) \
-		((mp)->m_qm_ops->xfs_dqtrxops ? \
-		((mp)->m_qm_ops->xfs_dqtrxops->op)(tp, ## args) : (void)0)
-
-#define XFS_TRANS_DUP_DQINFO(mp, otp, ntp) \
-	XFS_DQTRXOP_VOID(mp, otp, qo_dup_dqinfo, ntp)
-#define XFS_TRANS_FREE_DQINFO(mp, tp) \
-	XFS_DQTRXOP_VOID(mp, tp, qo_free_dqinfo)
-#define XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, field, delta) \
-	XFS_DQTRXOP_VOID(mp, tp, qo_mod_dquot_byino, ip, field, delta)
-#define XFS_TRANS_APPLY_DQUOT_DELTAS(mp, tp) \
-	XFS_DQTRXOP_VOID(mp, tp, qo_apply_dquot_deltas)
-#define XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip, nblks, ninos, fl) \
-	XFS_DQTRXOP(mp, tp, qo_reserve_quota_nblks, mp, ip, nblks, ninos, fl)
-#define XFS_TRANS_RESERVE_QUOTA_BYDQUOTS(mp, tp, ud, gd, nb, ni, fl) \
-	XFS_DQTRXOP(mp, tp, qo_reserve_quota_bydquots, mp, ud, gd, nb, ni, fl)
-#define XFS_TRANS_UNRESERVE_AND_MOD_DQUOTS(mp, tp) \
-	XFS_DQTRXOP_VOID(mp, tp, qo_unreserve_and_mod_dquots)
-
-#define XFS_TRANS_UNRESERVE_QUOTA_NBLKS(mp, tp, ip, nblks, ninos, flags) \
-	XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip, -(nblks), -(ninos), flags)
-#define XFS_TRANS_RESERVE_QUOTA(mp, tp, ud, gd, nb, ni, f) \
-	XFS_TRANS_RESERVE_QUOTA_BYDQUOTS(mp, tp, ud, gd, nb, ni, \
-				f | XFS_QMOPT_RES_REGBLKS)
-#define XFS_TRANS_UNRESERVE_QUOTA(mp, tp, ud, gd, nb, ni, f) \
-	XFS_TRANS_RESERVE_QUOTA_BYDQUOTS(mp, tp, ud, gd, -(nb), -(ni), \
+#ifdef CONFIG_XFS_QUOTA
+extern void xfs_trans_dup_dqinfo(struct xfs_trans *, struct xfs_trans *);
+extern void xfs_trans_free_dqinfo(struct xfs_trans *);
+extern void xfs_trans_mod_dquot_byino(struct xfs_trans *, struct xfs_inode *,
+		uint, long);
+extern void xfs_trans_apply_dquot_deltas(struct xfs_trans *);
+extern void xfs_trans_unreserve_and_mod_dquots(struct xfs_trans *);
+extern int xfs_trans_reserve_quota_nblks(struct xfs_trans *,
+		struct xfs_inode *, long, long, uint);
+extern int xfs_trans_reserve_quota_bydquots(struct xfs_trans *,
+		struct xfs_mount *, struct xfs_dquot *,
+		struct xfs_dquot *, long, long, uint);
+
+extern int xfs_qm_vop_dqalloc(struct xfs_inode *, uid_t, gid_t, prid_t, uint,
+		struct xfs_dquot **, struct xfs_dquot **);
+extern void xfs_qm_vop_create_dqattach(struct xfs_trans *, struct xfs_inode *,
+		struct xfs_dquot *, struct xfs_dquot *);
+extern int xfs_qm_vop_rename_dqattach(struct xfs_inode **);
+extern struct xfs_dquot *xfs_qm_vop_chown(struct xfs_trans *,
+		struct xfs_inode *, struct xfs_dquot **, struct xfs_dquot *);
+extern int xfs_qm_vop_chown_reserve(struct xfs_trans *, struct xfs_inode *,
+		struct xfs_dquot *, struct xfs_dquot *, uint);
+extern int xfs_qm_dqattach(struct xfs_inode *, uint);
+extern int xfs_qm_dqattach_locked(struct xfs_inode *, uint);
+extern void xfs_qm_dqdetach(struct xfs_inode *);
+extern void xfs_qm_dqrele(struct xfs_dquot *);
+extern void xfs_qm_statvfs(struct xfs_inode *, struct kstatfs *);
+extern int xfs_qm_sync(struct xfs_mount *, int);
+extern int xfs_qm_newmount(struct xfs_mount *, uint *, uint *);
+extern void xfs_qm_mount_quotas(struct xfs_mount *);
+extern void xfs_qm_unmount(struct xfs_mount *);
+extern void xfs_qm_unmount_quotas(struct xfs_mount *);
+
+#else
+#define xfs_trans_dup_dqinfo(tp, tp2)
+#define xfs_trans_free_dqinfo(tp)
+#define xfs_trans_mod_dquot_byino(tp, ip, fields, delta)
+#define xfs_trans_apply_dquot_deltas(tp)
+#define xfs_trans_unreserve_and_mod_dquots(tp)
+#define xfs_trans_reserve_quota_nblks(tp, ip, nblks, ninos, flags)	(0)
+#define xfs_trans_reserve_quota_bydquots(tp, mp, u, g, nb, ni, fl)	(0)
+#define xfs_qm_vop_dqalloc(ip, uid, gid, prid, fl, ou, og)		(0)
+#define xfs_qm_vop_create_dqattach(tp, ip, u, g)
+#define xfs_qm_vop_rename_dqattach(it)					(0)
+#define xfs_qm_vop_chown(tp, ip, old, new)				(NULL)
+#define xfs_qm_vop_chown_reserve(tp, ip, u, g, fl)			(0)
+#define xfs_qm_dqattach(ip, fl)						(0)
+#define xfs_qm_dqattach_locked(ip, fl)					(0)
+#define xfs_qm_dqdetach(ip)
+#define xfs_qm_dqrele(d)
+#define xfs_qm_statvfs(ip, s)
+#define xfs_qm_sync(mp, fl)						(0)
+#define xfs_qm_newmount(mp, a, b)					(0)
+#define xfs_qm_mount_quotas(mp)
+#define xfs_qm_unmount(mp)
+#define xfs_qm_unmount_quotas(mp)					(0)
+#endif /* CONFIG_XFS_QUOTA */
+
+#define xfs_trans_unreserve_quota_nblks(tp, ip, nblks, ninos, flags) \
+	xfs_trans_reserve_quota_nblks(tp, ip, -(nblks), -(ninos), flags)
+#define xfs_trans_reserve_quota(tp, mp, ud, gd, nb, ni, f) \
+	xfs_trans_reserve_quota_bydquots(tp, mp, ud, gd, nb, ni, \
 				f | XFS_QMOPT_RES_REGBLKS)
 
 extern int xfs_qm_dqcheck(xfs_disk_dquot_t *, xfs_dqid_t, uint, uint, char *);
 extern int xfs_mount_reset_sbqflags(struct xfs_mount *);
 
-extern struct xfs_qmops xfs_qmcore_xfs;
-
 #endif	/* __KERNEL__ */
-
 #endif	/* __XFS_QUOTA_H__ */
Index: xfs/fs/xfs/xfs_trans.c
===================================================================
--- xfs.orig/fs/xfs/xfs_trans.c	2009-02-24 15:32:16.093370321 +0100
+++ xfs/fs/xfs/xfs_trans.c	2009-02-24 15:32:35.847494368 +0100
@@ -297,7 +297,7 @@ xfs_trans_dup(
 	tp->t_rtx_res = tp->t_rtx_res_used;
 	ntp->t_pflags = tp->t_pflags;
 
-	XFS_TRANS_DUP_DQINFO(tp->t_mountp, tp, ntp);
+	xfs_trans_dup_dqinfo(tp, ntp);
 
 	atomic_inc(&tp->t_mountp->m_active_trans);
 	return ntp;
@@ -831,7 +831,7 @@ shut_us_down:
 		 * means is that we have some (non-persistent) quota
 		 * reservations that need to be unreserved.
 		 */
-		XFS_TRANS_UNRESERVE_AND_MOD_DQUOTS(mp, tp);
+		xfs_trans_unreserve_and_mod_dquots(tp);
 		if (tp->t_ticket) {
 			commit_lsn = xfs_log_done(mp, tp->t_ticket,
 							NULL, log_flags);
@@ -850,10 +850,9 @@ shut_us_down:
 	/*
 	 * If we need to update the superblock, then do it now.
 	 */
-	if (tp->t_flags & XFS_TRANS_SB_DIRTY) {
+	if (tp->t_flags & XFS_TRANS_SB_DIRTY)
 		xfs_trans_apply_sb_deltas(tp);
-	}
-	XFS_TRANS_APPLY_DQUOT_DELTAS(mp, tp);
+	xfs_trans_apply_dquot_deltas(tp);
 
 	/*
 	 * Ask each log item how many log_vector entries it will
@@ -1058,7 +1057,7 @@ xfs_trans_uncommit(
 	}
 
 	xfs_trans_unreserve_and_mod_sb(tp);
-	XFS_TRANS_UNRESERVE_AND_MOD_DQUOTS(tp->t_mountp, tp);
+	xfs_trans_unreserve_and_mod_dquots(tp);
 
 	xfs_trans_free_items(tp, flags);
 	xfs_trans_free_busy(tp);
@@ -1183,7 +1182,7 @@ xfs_trans_cancel(
 	}
 #endif
 	xfs_trans_unreserve_and_mod_sb(tp);
-	XFS_TRANS_UNRESERVE_AND_MOD_DQUOTS(mp, tp);
+	xfs_trans_unreserve_and_mod_dquots(tp);
 
 	if (tp->t_ticket) {
 		if (flags & XFS_TRANS_RELEASE_LOG_RES) {
@@ -1213,7 +1212,7 @@ xfs_trans_free(
 	xfs_trans_t	*tp)
 {
 	atomic_dec(&tp->t_mountp->m_active_trans);
-	XFS_TRANS_FREE_DQINFO(tp->t_mountp, tp);
+	xfs_trans_free_dqinfo(tp);
 	kmem_zone_free(xfs_trans_zone, tp);
 }
 
Index: xfs/fs/xfs/xfs_utils.c
===================================================================
--- xfs.orig/fs/xfs/xfs_utils.c	2009-02-24 15:32:16.098369701 +0100
+++ xfs/fs/xfs/xfs_utils.c	2009-02-24 15:32:35.848494914 +0100
@@ -166,7 +166,7 @@ xfs_dir_ialloc(
 			xfs_buf_relse(ialloc_context);
 			if (dqinfo) {
 				tp->t_dqinfo = dqinfo;
-				XFS_TRANS_FREE_DQINFO(tp->t_mountp, tp);
+				xfs_trans_free_dqinfo(tp);
 			}
 			*tpp = ntp;
 			*ipp = NULL;
Index: xfs/fs/xfs/xfs_bmap.c
===================================================================
--- xfs.orig/fs/xfs/xfs_bmap.c	2009-02-24 15:32:16.102370140 +0100
+++ xfs/fs/xfs/xfs_bmap.c	2009-02-24 15:32:35.853494922 +0100
@@ -2691,7 +2691,7 @@ xfs_bmap_rtalloc(
 		 * Adjust the disk quota also. This was reserved
 		 * earlier.
 		 */
-		XFS_TRANS_MOD_DQUOT_BYINO(mp, ap->tp, ap->ip,
+		xfs_trans_mod_dquot_byino(ap->tp, ap->ip,
 			ap->wasdel ? XFS_TRANS_DQ_DELRTBCOUNT :
 					XFS_TRANS_DQ_RTBCOUNT, (long) ralen);
 	} else {
@@ -2995,7 +2995,7 @@ xfs_bmap_btalloc(
 		 * Adjust the disk quota also. This was reserved
 		 * earlier.
 		 */
-		XFS_TRANS_MOD_DQUOT_BYINO(mp, ap->tp, ap->ip,
+		xfs_trans_mod_dquot_byino(ap->tp, ap->ip,
 			ap->wasdel ? XFS_TRANS_DQ_DELBCOUNT :
 					XFS_TRANS_DQ_BCOUNT,
 			(long) args.len);
@@ -3066,7 +3066,7 @@ xfs_bmap_btree_to_extents(
 		return error;
 	xfs_bmap_add_free(cbno, 1, cur->bc_private.b.flist, mp);
 	ip->i_d.di_nblocks--;
-	XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, XFS_TRANS_DQ_BCOUNT, -1L);
+	xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L);
 	xfs_trans_binval(tp, cbp);
 	if (cur->bc_bufs[0] == cbp)
 		cur->bc_bufs[0] = NULL;
@@ -3386,7 +3386,7 @@ xfs_bmap_del_extent(
 	 * Adjust quota data.
 	 */
 	if (qfield)
-		XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, qfield, (long)-nblks);
+		xfs_trans_mod_dquot_byino(tp, ip, qfield, (long)-nblks);
 
 	/*
 	 * Account for change in delayed indirect blocks.
@@ -3523,7 +3523,7 @@ xfs_bmap_extents_to_btree(
 	*firstblock = cur->bc_private.b.firstblock = args.fsbno;
 	cur->bc_private.b.allocated++;
 	ip->i_d.di_nblocks++;
-	XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, XFS_TRANS_DQ_BCOUNT, 1L);
+	xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, 1L);
 	abp = xfs_btree_get_bufl(mp, tp, args.fsbno, 0);
 	/*
 	 * Fill in the child block.
@@ -3666,7 +3666,7 @@ xfs_bmap_local_to_extents(
 		XFS_BMAP_TRACE_POST_UPDATE("new", ip, 0, whichfork);
 		XFS_IFORK_NEXT_SET(ip, whichfork, 1);
 		ip->i_d.di_nblocks = 1;
-		XFS_TRANS_MOD_DQUOT_BYINO(args.mp, tp, ip,
+		xfs_trans_mod_dquot_byino(tp, ip,
 			XFS_TRANS_DQ_BCOUNT, 1L);
 		flags |= xfs_ilog_fext(whichfork);
 	} else {
@@ -4024,7 +4024,7 @@ xfs_bmap_add_attrfork(
 			XFS_TRANS_PERM_LOG_RES, XFS_ADDAFORK_LOG_COUNT)))
 		goto error0;
 	xfs_ilock(ip, XFS_ILOCK_EXCL);
-	error = XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip, blks, 0, rsvd ?
+	error = xfs_trans_reserve_quota_nblks(tp, ip, blks, 0, rsvd ?
 			XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_FORCE_RES :
 			XFS_QMOPT_RES_REGBLKS);
 	if (error) {
@@ -4959,10 +4959,11 @@ xfs_bmapi(
 				 * adjusted later.  We return if we haven't
 				 * allocated blocks already inside this loop.
 				 */
-				if ((error = XFS_TRANS_RESERVE_QUOTA_NBLKS(
-						mp, NULL, ip, (long)alen, 0,
+				error = xfs_trans_reserve_quota_nblks(
+						NULL, ip, (long)alen, 0,
 						rt ? XFS_QMOPT_RES_RTBLKS :
-						     XFS_QMOPT_RES_REGBLKS))) {
+						     XFS_QMOPT_RES_REGBLKS);
+				if (error) {
 					if (n == 0) {
 						*nmap = 0;
 						ASSERT(cur == NULL);
@@ -5011,8 +5012,8 @@ xfs_bmapi(
 					if (XFS_IS_QUOTA_ON(mp))
 						/* unreserve the blocks now */
 						(void)
-						XFS_TRANS_UNRESERVE_QUOTA_NBLKS(
-							mp, NULL, ip,
+						xfs_trans_unreserve_quota_nblks(
+							NULL, ip,
 							(long)alen, 0, rt ?
 							XFS_QMOPT_RES_RTBLKS :
 							XFS_QMOPT_RES_REGBLKS);
@@ -5667,14 +5668,14 @@ xfs_bunmapi(
 				do_div(rtexts, mp->m_sb.sb_rextsize);
 				xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS,
 						(int64_t)rtexts, rsvd);
-				(void)XFS_TRANS_RESERVE_QUOTA_NBLKS(mp,
-					NULL, ip, -((long)del.br_blockcount), 0,
+				(void)xfs_trans_reserve_quota_nblks(NULL,
+					ip, -((long)del.br_blockcount), 0,
 					XFS_QMOPT_RES_RTBLKS);
 			} else {
 				xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS,
 						(int64_t)del.br_blockcount, rsvd);
-				(void)XFS_TRANS_RESERVE_QUOTA_NBLKS(mp,
-					NULL, ip, -((long)del.br_blockcount), 0,
+				(void)xfs_trans_reserve_quota_nblks(NULL,
+					ip, -((long)del.br_blockcount), 0,
 					XFS_QMOPT_RES_REGBLKS);
 			}
 			ip->i_delayed_blks -= del.br_blockcount;
Index: xfs/fs/xfs/xfs_bmap_btree.c
===================================================================
--- xfs.orig/fs/xfs/xfs_bmap_btree.c	2009-02-24 15:32:16.106369811 +0100
+++ xfs/fs/xfs/xfs_bmap_btree.c	2009-02-24 15:32:35.854494491 +0100
@@ -590,7 +590,7 @@ xfs_bmbt_alloc_block(
 	cur->bc_private.b.allocated++;
 	cur->bc_private.b.ip->i_d.di_nblocks++;
 	xfs_trans_log_inode(args.tp, cur->bc_private.b.ip, XFS_ILOG_CORE);
-	XFS_TRANS_MOD_DQUOT_BYINO(args.mp, args.tp, cur->bc_private.b.ip,
+	xfs_trans_mod_dquot_byino(args.tp, cur->bc_private.b.ip,
 			XFS_TRANS_DQ_BCOUNT, 1L);
 
 	new->l = cpu_to_be64(args.fsbno);
@@ -618,7 +618,7 @@ xfs_bmbt_free_block(
 	ip->i_d.di_nblocks--;
 
 	xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
-	XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, XFS_TRANS_DQ_BCOUNT, -1L);
+	xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L);
 	xfs_trans_binval(tp, bp);
 	return 0;
 }
Index: xfs/fs/xfs/xfs_vnodeops.c
===================================================================
--- xfs.orig/fs/xfs/xfs_vnodeops.c	2009-02-24 15:32:16.111370238 +0100
+++ xfs/fs/xfs/xfs_vnodeops.c	2009-02-24 15:32:35.855495805 +0100
@@ -118,7 +118,7 @@ xfs_setattr(
 		 */
 		ASSERT(udqp == NULL);
 		ASSERT(gdqp == NULL);
-		code = XFS_QM_DQVOPALLOC(mp, ip, uid, gid, ip->i_d.di_projid,
+		code = xfs_qm_vop_dqalloc(ip, uid, gid, ip->i_d.di_projid,
 					 qflags, &udqp, &gdqp);
 		if (code)
 			return code;
@@ -183,7 +183,7 @@ xfs_setattr(
 		if ((XFS_IS_UQUOTA_ON(mp) && iuid != uid) ||
 		    (XFS_IS_GQUOTA_ON(mp) && igid != gid)) {
 			ASSERT(tp);
-			code = XFS_QM_DQVOPCHOWNRESV(mp, tp, ip, udqp, gdqp,
+			code = xfs_qm_vop_chown_reserve(tp, ip, udqp, gdqp,
 						capable(CAP_FOWNER) ?
 						XFS_QMOPT_FORCE_RES : 0);
 			if (code)	/* out of quota */
@@ -217,7 +217,7 @@ xfs_setattr(
 		/*
 		 * Make sure that the dquots are attached to the inode.
 		 */
-		code = XFS_QM_DQATTACH(mp, ip, XFS_QMOPT_ILOCKED);
+		code = xfs_qm_dqattach_locked(ip, 0);
 		if (code)
 			goto error_return;
 
@@ -354,7 +354,7 @@ xfs_setattr(
 			if (XFS_IS_UQUOTA_ON(mp)) {
 				ASSERT(mask & ATTR_UID);
 				ASSERT(udqp);
-				olddquot1 = XFS_QM_DQVOPCHOWN(mp, tp, ip,
+				olddquot1 = xfs_qm_vop_chown(tp, ip,
 							&ip->i_udquot, udqp);
 			}
 			ip->i_d.di_uid = uid;
@@ -365,7 +365,7 @@ xfs_setattr(
 				ASSERT(!XFS_IS_PQUOTA_ON(mp));
 				ASSERT(mask & ATTR_GID);
 				ASSERT(gdqp);
-				olddquot2 = XFS_QM_DQVOPCHOWN(mp, tp, ip,
+				olddquot2 = xfs_qm_vop_chown(tp, ip,
 							&ip->i_gdquot, gdqp);
 			}
 			ip->i_d.di_gid = gid;
@@ -461,10 +461,10 @@ xfs_setattr(
 	/*
 	 * Release any dquot(s) the inode had kept before chown.
 	 */
-	XFS_QM_DQRELE(mp, olddquot1);
-	XFS_QM_DQRELE(mp, olddquot2);
-	XFS_QM_DQRELE(mp, udqp);
-	XFS_QM_DQRELE(mp, gdqp);
+	xfs_qm_dqrele(olddquot1);
+	xfs_qm_dqrele(olddquot2);
+	xfs_qm_dqrele(udqp);
+	xfs_qm_dqrele(gdqp);
 
 	if (code) {
 		return code;
@@ -482,8 +482,8 @@ xfs_setattr(
 	commit_flags |= XFS_TRANS_ABORT;
 	/* FALLTHROUGH */
  error_return:
-	XFS_QM_DQRELE(mp, udqp);
-	XFS_QM_DQRELE(mp, gdqp);
+	xfs_qm_dqrele(udqp);
+	xfs_qm_dqrele(gdqp);
 	if (tp) {
 		xfs_trans_cancel(tp, commit_flags);
 	}
@@ -739,7 +739,8 @@ xfs_free_eofblocks(
 		/*
 		 * Attach the dquots to the inode up front.
 		 */
-		if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
+		error = xfs_qm_dqattach(ip, 0);
+		if (error)
 			return error;
 
 		/*
@@ -1181,7 +1182,8 @@ xfs_inactive(
 
 	ASSERT(ip->i_d.di_nlink == 0);
 
-	if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
+	error = xfs_qm_dqattach(ip, 0);
+	if (error)
 		return VN_INACTIVE_CACHE;
 
 	tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE);
@@ -1307,7 +1309,7 @@ xfs_inactive(
 		/*
 		 * Credit the quota account(s). The inode is gone.
 		 */
-		XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, XFS_TRANS_DQ_ICOUNT, -1);
+		xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_ICOUNT, -1);
 
 		/*
 		 * Just ignore errors at this point.  There is nothing we can
@@ -1323,11 +1325,11 @@ xfs_inactive(
 			xfs_fs_cmn_err(CE_NOTE, mp, "xfs_inactive: "
 				"xfs_trans_commit() returned error %d", error);
 	}
+
 	/*
 	 * Release the dquots held by inode, if any.
 	 */
-	XFS_QM_DQDETACH(mp, ip);
-
+	xfs_qm_dqdetach(ip);
 	xfs_iunlock(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
 
  out:
@@ -1398,14 +1400,16 @@ xfs_create(
 	uint			cancel_flags;
 	int			committed;
 	xfs_prid_t		prid;
-	struct xfs_dquot	*udqp = NULL;
-	struct xfs_dquot	*gdqp = NULL;
+	struct xfs_dquot	*udqp, *gdqp;
 	uint			resblks;
 	uint			log_res;
 	uint			log_count;
 
 	xfs_itrace_entry(dp);
 
+	udqp = NULL;
+	gdqp = NULL;
+
 	if (XFS_FORCED_SHUTDOWN(mp))
 		return XFS_ERROR(EIO);
 
@@ -1427,8 +1431,7 @@ xfs_create(
 	/*
 	 * Make sure that we have allocated dquot(s) on disk.
 	 */
-	error = XFS_QM_DQVOPALLOC(mp, dp,
-			current_fsuid(), current_fsgid(), prid,
+	error = xfs_qm_vop_dqalloc(dp, current_fsuid(), current_fsgid(), prid,
 			XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, &udqp, &gdqp);
 	if (error)
 		goto std_return;
@@ -1482,7 +1485,7 @@ xfs_create(
 	/*
 	 * Reserve disk quota and the inode.
 	 */
-	error = XFS_TRANS_RESERVE_QUOTA(mp, tp, udqp, gdqp, resblks, 1, 0);
+	error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp, resblks, 1, 0);
 	if (error)
 		goto out_trans_cancel;
 
@@ -1554,7 +1557,7 @@ xfs_create(
 	 * These ids of the inode couldn't have changed since the new
 	 * inode has been locked ever since it was created.
 	 */
-	XFS_QM_DQVOPCREATE(mp, tp, ip, udqp, gdqp);
+	xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp);
 
 	/*
 	 * xfs_trans_commit normally decrements the vnode ref count
@@ -1573,8 +1576,8 @@ xfs_create(
 		goto out_dqrele;
 	}
 
-	XFS_QM_DQRELE(mp, udqp);
-	XFS_QM_DQRELE(mp, gdqp);
+	xfs_qm_dqrele(udqp);
+	xfs_qm_dqrele(gdqp);
 
 	*ipp = ip;
 
@@ -1595,8 +1598,8 @@ xfs_create(
  out_trans_cancel:
 	xfs_trans_cancel(tp, cancel_flags);
  out_dqrele:
-	XFS_QM_DQRELE(mp, udqp);
-	XFS_QM_DQRELE(mp, gdqp);
+	xfs_qm_dqrele(udqp);
+	xfs_qm_dqrele(gdqp);
 
 	if (unlock_dp_on_error)
 		xfs_iunlock(dp, XFS_ILOCK_EXCL);
@@ -1830,11 +1833,11 @@ xfs_remove(
 			return error;
 	}
 
-	error = XFS_QM_DQATTACH(mp, dp, 0);
+	error = xfs_qm_dqattach(dp, 0);
 	if (error)
 		goto std_return;
 
-	error = XFS_QM_DQATTACH(mp, ip, 0);
+	error = xfs_qm_dqattach(ip, 0);
 	if (error)
 		goto std_return;
 
@@ -2021,11 +2024,11 @@ xfs_link(
 
 	/* Return through std_return after this point. */
 
-	error = XFS_QM_DQATTACH(mp, sip, 0);
+	error = xfs_qm_dqattach(sip, 0);
 	if (error)
 		goto std_return;
 
-	error = XFS_QM_DQATTACH(mp, tdp, 0);
+	error = xfs_qm_dqattach(tdp, 0);
 	if (error)
 		goto std_return;
 
@@ -2198,8 +2201,7 @@ xfs_symlink(
 	/*
 	 * Make sure that we have allocated dquot(s) on disk.
 	 */
-	error = XFS_QM_DQVOPALLOC(mp, dp,
-			current_fsuid(), current_fsgid(), prid,
+	error = xfs_qm_vop_dqalloc(dp, current_fsuid(), current_fsgid(), prid,
 			XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, &udqp, &gdqp);
 	if (error)
 		goto std_return;
@@ -2241,7 +2243,7 @@ xfs_symlink(
 	/*
 	 * Reserve disk quota : blocks and inode.
 	 */
-	error = XFS_TRANS_RESERVE_QUOTA(mp, tp, udqp, gdqp, resblks, 1, 0);
+	error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp, resblks, 1, 0);
 	if (error)
 		goto error_return;
 
@@ -2281,7 +2283,7 @@ xfs_symlink(
 	/*
 	 * Also attach the dquot(s) to it, if applicable.
 	 */
-	XFS_QM_DQVOPCREATE(mp, tp, ip, udqp, gdqp);
+	xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp);
 
 	if (resblks)
 		resblks -= XFS_IALLOC_SPACE_RES(mp);
@@ -2369,8 +2371,8 @@ xfs_symlink(
 		goto error2;
 	}
 	error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES);
-	XFS_QM_DQRELE(mp, udqp);
-	XFS_QM_DQRELE(mp, gdqp);
+	xfs_qm_dqrele(udqp);
+	xfs_qm_dqrele(gdqp);
 
 	/* Fall through to std_return with error = 0 or errno from
 	 * xfs_trans_commit	*/
@@ -2394,8 +2396,8 @@ std_return:
 	cancel_flags |= XFS_TRANS_ABORT;
  error_return:
 	xfs_trans_cancel(tp, cancel_flags);
-	XFS_QM_DQRELE(mp, udqp);
-	XFS_QM_DQRELE(mp, gdqp);
+	xfs_qm_dqrele(udqp);
+	xfs_qm_dqrele(gdqp);
 
 	if (unlock_dp_on_error)
 		xfs_iunlock(dp, XFS_ILOCK_EXCL);
@@ -2534,7 +2536,8 @@ xfs_alloc_file_space(
 	if (XFS_FORCED_SHUTDOWN(mp))
 		return XFS_ERROR(EIO);
 
-	if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
+	error = xfs_qm_dqattach(ip, 0);
+	if (error)
 		return error;
 
 	if (len <= 0)
@@ -2621,8 +2624,8 @@ retry:
 			break;
 		}
 		xfs_ilock(ip, XFS_ILOCK_EXCL);
-		error = XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip,
-						      qblocks, 0, quota_flag);
+		error = xfs_trans_reserve_quota_nblks(tp, ip, qblocks,
+						      0, quota_flag);
 		if (error)
 			goto error1;
 
@@ -2681,7 +2684,7 @@ dmapi_enospc_check:
 
 error0:	/* Cancel bmap, unlock inode, unreserve quota blocks, cancel trans */
 	xfs_bmap_cancel(&free_list);
-	XFS_TRANS_UNRESERVE_QUOTA_NBLKS(mp, tp, ip, qblocks, 0, quota_flag);
+	xfs_trans_unreserve_quota_nblks(tp, ip, qblocks, 0, quota_flag);
 
 error1:	/* Just cancel transaction */
 	xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT);
@@ -2820,7 +2823,8 @@ xfs_free_file_space(
 
 	xfs_itrace_entry(ip);
 
-	if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
+	error = xfs_qm_dqattach(ip, 0);
+	if (error)
 		return error;
 
 	error = 0;
@@ -2946,9 +2950,9 @@ xfs_free_file_space(
 			break;
 		}
 		xfs_ilock(ip, XFS_ILOCK_EXCL);
-		error = XFS_TRANS_RESERVE_QUOTA(mp, tp,
-				ip->i_udquot, ip->i_gdquot, resblks, 0,
-				XFS_QMOPT_RES_REGBLKS);
+		error = xfs_trans_reserve_quota(tp, mp,
+				ip->i_udquot, ip->i_gdquot,
+				resblks, 0, XFS_QMOPT_RES_REGBLKS);
 		if (error)
 			goto error1;
 
Index: xfs/fs/xfs/quota/xfs_qm.h
===================================================================
--- xfs.orig/fs/xfs/quota/xfs_qm.h	2009-02-24 15:32:16.067369944 +0100
+++ xfs/fs/xfs/quota/xfs_qm.h	2009-02-24 15:32:35.856495653 +0100
@@ -127,8 +127,6 @@ typedef struct xfs_quotainfo {
 } xfs_quotainfo_t;
 
 
-extern xfs_dqtrxops_t	xfs_trans_dquot_ops;
-
 extern void	xfs_trans_mod_dquot(xfs_trans_t *, xfs_dquot_t *, uint, long);
 extern int	xfs_trans_reserve_quota_bydquots(xfs_trans_t *, xfs_mount_t *,
 			xfs_dquot_t *, xfs_dquot_t *, long, long, uint);
@@ -159,17 +157,11 @@ typedef struct xfs_dquot_acct {
 #define XFS_QM_RTBWARNLIMIT	5
 
 extern void		xfs_qm_destroy_quotainfo(xfs_mount_t *);
-extern void		xfs_qm_mount_quotas(xfs_mount_t *);
 extern int		xfs_qm_quotacheck(xfs_mount_t *);
-extern void		xfs_qm_unmount_quotadestroy(xfs_mount_t *);
-extern void		xfs_qm_unmount_quotas(xfs_mount_t *);
 extern int		xfs_qm_write_sb_changes(xfs_mount_t *, __int64_t);
-extern int		xfs_qm_sync(xfs_mount_t *, int);
 
 /* dquot stuff */
 extern boolean_t	xfs_qm_dqalloc_incore(xfs_dquot_t **);
-extern int		xfs_qm_dqattach(xfs_inode_t *, uint);
-extern void		xfs_qm_dqdetach(xfs_inode_t *);
 extern int		xfs_qm_dqpurge_all(xfs_mount_t *, uint);
 extern void		xfs_qm_dqrele_all_inodes(xfs_mount_t *, uint);
 
@@ -183,19 +175,6 @@ extern int		xfs_qm_scall_getqstat(xfs_mo
 extern int		xfs_qm_scall_quotaon(xfs_mount_t *, uint);
 extern int		xfs_qm_scall_quotaoff(xfs_mount_t *, uint);
 
-/* vop stuff */
-extern int		xfs_qm_vop_dqalloc(xfs_mount_t *, xfs_inode_t *,
-					uid_t, gid_t, prid_t, uint,
-					xfs_dquot_t **, xfs_dquot_t **);
-extern void		xfs_qm_vop_dqattach_and_dqmod_newinode(
-					xfs_trans_t *, xfs_inode_t *,
-					xfs_dquot_t *, xfs_dquot_t *);
-extern int		xfs_qm_vop_rename_dqattach(xfs_inode_t **);
-extern xfs_dquot_t *	xfs_qm_vop_chown(xfs_trans_t *, xfs_inode_t *,
-					xfs_dquot_t **, xfs_dquot_t *);
-extern int		xfs_qm_vop_chown_reserve(xfs_trans_t *, xfs_inode_t *,
-					xfs_dquot_t *, xfs_dquot_t *, uint);
-
 /* list stuff */
 extern void		xfs_qm_freelist_append(xfs_frlist_t *, xfs_dquot_t *);
 extern void		xfs_qm_freelist_unlink(xfs_dquot_t *);
Index: xfs/fs/xfs/quota/xfs_qm_bhv.c
===================================================================
--- xfs.orig/fs/xfs/quota/xfs_qm_bhv.c	2009-02-24 15:32:16.071370174 +0100
+++ xfs/fs/xfs/quota/xfs_qm_bhv.c	2009-02-24 15:32:35.856495653 +0100
@@ -84,7 +84,7 @@ xfs_fill_statvfs_from_dquot(
  * return a statvfs of the project, not the entire filesystem.
  * This makes such trees appear as if they are filesystems in themselves.
  */
-STATIC void
+void
 xfs_qm_statvfs(
 	xfs_inode_t		*ip,
 	struct kstatfs		*statp)
@@ -92,20 +92,13 @@ xfs_qm_statvfs(
 	xfs_mount_t		*mp = ip->i_mount;
 	xfs_dquot_t		*dqp;
 
-	if (!(ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) ||
-	    !((mp->m_qflags & (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))) ==
-	    		      (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))
-		return;
-
 	if (!xfs_qm_dqget(mp, NULL, ip->i_d.di_projid, XFS_DQ_PROJ, 0, &dqp)) {
-		xfs_disk_dquot_t	*dp = &dqp->q_core;
-
-		xfs_fill_statvfs_from_dquot(statp, dp);
+		xfs_fill_statvfs_from_dquot(statp, &dqp->q_core);
 		xfs_qm_dqput(dqp);
 	}
 }
 
-STATIC int
+int
 xfs_qm_newmount(
 	xfs_mount_t	*mp,
 	uint		*needquotamount,
@@ -114,9 +107,6 @@ xfs_qm_newmount(
 	uint		quotaondisk;
 	uint		uquotaondisk = 0, gquotaondisk = 0, pquotaondisk = 0;
 
-	*quotaflags = 0;
-	*needquotamount = B_FALSE;
-
 	quotaondisk = xfs_sb_version_hasquota(&mp->m_sb) &&
 				(mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT);
 
@@ -179,66 +169,6 @@ xfs_qm_newmount(
 	return 0;
 }
 
-STATIC int
-xfs_qm_endmount(
-	xfs_mount_t	*mp,
-	uint		needquotamount,
-	uint		quotaflags)
-{
-	if (needquotamount) {
-		ASSERT(mp->m_qflags == 0);
-		mp->m_qflags = quotaflags;
-		xfs_qm_mount_quotas(mp);
-	}
-
-#if defined(DEBUG) && defined(XFS_LOUD_RECOVERY)
-	if (! (XFS_IS_QUOTA_ON(mp)))
-		xfs_fs_cmn_err(CE_NOTE, mp, "Disk quotas not turned on");
-	else
-		xfs_fs_cmn_err(CE_NOTE, mp, "Disk quotas turned on");
-#endif
-
-#ifdef QUOTADEBUG
-	if (XFS_IS_QUOTA_ON(mp) && xfs_qm_internalqcheck(mp))
-		cmn_err(CE_WARN, "XFS: mount internalqcheck failed");
-#endif
-
-	return 0;
-}
-
-STATIC void
-xfs_qm_dqrele_null(
-	xfs_dquot_t	*dq)
-{
-	/*
-	 * Called from XFS, where we always check first for a NULL dquot.
-	 */
-	if (!dq)
-		return;
-	xfs_qm_dqrele(dq);
-}
-
-
-struct xfs_qmops xfs_qmcore_xfs = {
-	.xfs_qminit		= xfs_qm_newmount,
-	.xfs_qmdone		= xfs_qm_unmount_quotadestroy,
-	.xfs_qmmount		= xfs_qm_endmount,
-	.xfs_qmunmount		= xfs_qm_unmount_quotas,
-	.xfs_dqrele		= xfs_qm_dqrele_null,
-	.xfs_dqattach		= xfs_qm_dqattach,
-	.xfs_dqdetach		= xfs_qm_dqdetach,
-	.xfs_dqpurgeall		= xfs_qm_dqpurge_all,
-	.xfs_dqvopalloc		= xfs_qm_vop_dqalloc,
-	.xfs_dqvopcreate	= xfs_qm_vop_dqattach_and_dqmod_newinode,
-	.xfs_dqvoprename	= xfs_qm_vop_rename_dqattach,
-	.xfs_dqvopchown		= xfs_qm_vop_chown,
-	.xfs_dqvopchownresv	= xfs_qm_vop_chown_reserve,
-	.xfs_dqstatvfs		= xfs_qm_statvfs,
-	.xfs_dqsync		= xfs_qm_sync,
-	.xfs_dqtrxops		= &xfs_trans_dquot_ops,
-};
-EXPORT_SYMBOL(xfs_qmcore_xfs);
-
 void __init
 xfs_qm_init(void)
 {
Index: xfs/fs/xfs/xfs_attr.c
===================================================================
--- xfs.orig/fs/xfs/xfs_attr.c	2009-02-24 15:32:16.115370119 +0100
+++ xfs/fs/xfs/xfs_attr.c	2009-02-24 15:32:35.857495152 +0100
@@ -249,8 +249,9 @@ xfs_attr_set_int(xfs_inode_t *dp, struct
 	/*
 	 * Attach the dquots to the inode.
 	 */
-	if ((error = XFS_QM_DQATTACH(mp, dp, 0)))
-		return (error);
+	error = xfs_qm_dqattach(dp, 0);
+	if (error)
+		return error;
 
 	/*
 	 * If the inode doesn't have an attribute fork, add one.
@@ -311,7 +312,7 @@ xfs_attr_set_int(xfs_inode_t *dp, struct
 	}
 	xfs_ilock(dp, XFS_ILOCK_EXCL);
 
-	error = XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, args.trans, dp, args.total, 0,
+	error = xfs_trans_reserve_quota_nblks(args.trans, dp, args.total, 0,
 				rsvd ? XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_FORCE_RES :
 				       XFS_QMOPT_RES_REGBLKS);
 	if (error) {
@@ -501,8 +502,9 @@ xfs_attr_remove_int(xfs_inode_t *dp, str
 	/*
 	 * Attach the dquots to the inode.
 	 */
-	if ((error = XFS_QM_DQATTACH(mp, dp, 0)))
-		return (error);
+	error = xfs_qm_dqattach(dp, 0);
+	if (error)
+		return error;
 
 	/*
 	 * Start our first transaction of the day.
Index: xfs/fs/xfs/xfs_iomap.c
===================================================================
--- xfs.orig/fs/xfs/xfs_iomap.c	2009-02-24 15:32:16.119370349 +0100
+++ xfs/fs/xfs/xfs_iomap.c	2009-02-24 15:32:35.858495489 +0100
@@ -417,7 +417,7 @@ xfs_iomap_write_direct(
 	 * Make sure that the dquots are there. This doesn't hold
 	 * the ilock across a disk read.
 	 */
-	error = XFS_QM_DQATTACH(ip->i_mount, ip, XFS_QMOPT_ILOCKED);
+	error = xfs_qm_dqattach_locked(ip, 0);
 	if (error)
 		return XFS_ERROR(error);
 
@@ -476,8 +476,7 @@ xfs_iomap_write_direct(
 	if (error)
 		goto error_out;
 
-	error = XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip,
-					      qblocks, 0, quota_flag);
+	error = xfs_trans_reserve_quota_nblks(tp, ip, qblocks, 0, quota_flag);
 	if (error)
 		goto error1;
 
@@ -527,7 +526,7 @@ xfs_iomap_write_direct(
 
 error0:	/* Cancel bmap, unlock inode, unreserve quota blocks, cancel trans */
 	xfs_bmap_cancel(&free_list);
-	XFS_TRANS_UNRESERVE_QUOTA_NBLKS(mp, tp, ip, qblocks, 0, quota_flag);
+	xfs_trans_unreserve_quota_nblks(tp, ip, qblocks, 0, quota_flag);
 
 error1:	/* Just cancel transaction */
 	xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT);
@@ -620,7 +619,7 @@ xfs_iomap_write_delay(
 	 * Make sure that the dquots are there. This doesn't hold
 	 * the ilock across a disk read.
 	 */
-	error = XFS_QM_DQATTACH(mp, ip, XFS_QMOPT_ILOCKED);
+	error = xfs_qm_dqattach_locked(ip, 0);
 	if (error)
 		return XFS_ERROR(error);
 
@@ -715,7 +714,8 @@ xfs_iomap_write_allocate(
 	/*
 	 * Make sure that the dquots are there.
 	 */
-	if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
+	error = xfs_qm_dqattach(ip, 0);
+	if (error)
 		return XFS_ERROR(error);
 
 	offset_fsb = XFS_B_TO_FSBT(mp, offset);
Index: xfs/fs/xfs/xfs_mount.h
===================================================================
--- xfs.orig/fs/xfs/xfs_mount.h	2009-02-24 15:32:16.124369938 +0100
+++ xfs/fs/xfs/xfs_mount.h	2009-02-24 15:32:35.859495267 +0100
@@ -18,6 +18,7 @@
 #ifndef __XFS_MOUNT_H__
 #define	__XFS_MOUNT_H__
 
+
 typedef struct xfs_trans_reservations {
 	uint	tr_write;	/* extent alloc trans */
 	uint	tr_itruncate;	/* truncate trans */
@@ -64,6 +65,8 @@ struct xfs_swapext;
 struct xfs_mru_cache;
 struct xfs_nameops;
 struct xfs_ail;
+struct xfs_quotainfo;
+
 
 /*
  * Prototypes and functions for the Data Migration subsystem.
@@ -107,86 +110,6 @@ typedef struct xfs_dmops {
 	(*(mp)->m_dm_ops->xfs_send_unmount)(mp,ip,right,mode,rval,fl)
 
 
-/*
- * Prototypes and functions for the Quota Management subsystem.
- */
-
-struct xfs_dquot;
-struct xfs_dqtrxops;
-struct xfs_quotainfo;
-
-typedef int	(*xfs_qminit_t)(struct xfs_mount *, uint *, uint *);
-typedef int	(*xfs_qmmount_t)(struct xfs_mount *, uint, uint);
-typedef void	(*xfs_qmunmount_t)(struct xfs_mount *);
-typedef void	(*xfs_qmdone_t)(struct xfs_mount *);
-typedef void	(*xfs_dqrele_t)(struct xfs_dquot *);
-typedef int	(*xfs_dqattach_t)(struct xfs_inode *, uint);
-typedef void	(*xfs_dqdetach_t)(struct xfs_inode *);
-typedef int	(*xfs_dqpurgeall_t)(struct xfs_mount *, uint);
-typedef int	(*xfs_dqvopalloc_t)(struct xfs_mount *,
-			struct xfs_inode *, uid_t, gid_t, prid_t, uint,
-			struct xfs_dquot **, struct xfs_dquot **);
-typedef void	(*xfs_dqvopcreate_t)(struct xfs_trans *, struct xfs_inode *,
-			struct xfs_dquot *, struct xfs_dquot *);
-typedef int	(*xfs_dqvoprename_t)(struct xfs_inode **);
-typedef struct xfs_dquot * (*xfs_dqvopchown_t)(
-			struct xfs_trans *, struct xfs_inode *,
-			struct xfs_dquot **, struct xfs_dquot *);
-typedef int	(*xfs_dqvopchownresv_t)(struct xfs_trans *, struct xfs_inode *,
-			struct xfs_dquot *, struct xfs_dquot *, uint);
-typedef void	(*xfs_dqstatvfs_t)(struct xfs_inode *, struct kstatfs *);
-typedef int	(*xfs_dqsync_t)(struct xfs_mount *, int flags);
-
-typedef struct xfs_qmops {
-	xfs_qminit_t		xfs_qminit;
-	xfs_qmdone_t		xfs_qmdone;
-	xfs_qmmount_t		xfs_qmmount;
-	xfs_qmunmount_t		xfs_qmunmount;
-	xfs_dqrele_t		xfs_dqrele;
-	xfs_dqattach_t		xfs_dqattach;
-	xfs_dqdetach_t		xfs_dqdetach;
-	xfs_dqpurgeall_t	xfs_dqpurgeall;
-	xfs_dqvopalloc_t	xfs_dqvopalloc;
-	xfs_dqvopcreate_t	xfs_dqvopcreate;
-	xfs_dqvoprename_t	xfs_dqvoprename;
-	xfs_dqvopchown_t	xfs_dqvopchown;
-	xfs_dqvopchownresv_t	xfs_dqvopchownresv;
-	xfs_dqstatvfs_t		xfs_dqstatvfs;
-	xfs_dqsync_t		xfs_dqsync;
-	struct xfs_dqtrxops	*xfs_dqtrxops;
-} xfs_qmops_t;
-
-#define XFS_QM_INIT(mp, mnt, fl) \
-	(*(mp)->m_qm_ops->xfs_qminit)(mp, mnt, fl)
-#define XFS_QM_MOUNT(mp, mnt, fl) \
-	(*(mp)->m_qm_ops->xfs_qmmount)(mp, mnt, fl)
-#define XFS_QM_UNMOUNT(mp) \
-	(*(mp)->m_qm_ops->xfs_qmunmount)(mp)
-#define XFS_QM_DONE(mp) \
-	(*(mp)->m_qm_ops->xfs_qmdone)(mp)
-#define XFS_QM_DQRELE(mp, dq) \
-	(*(mp)->m_qm_ops->xfs_dqrele)(dq)
-#define XFS_QM_DQATTACH(mp, ip, fl) \
-	(*(mp)->m_qm_ops->xfs_dqattach)(ip, fl)
-#define XFS_QM_DQDETACH(mp, ip) \
-	(*(mp)->m_qm_ops->xfs_dqdetach)(ip)
-#define XFS_QM_DQPURGEALL(mp, fl) \
-	(*(mp)->m_qm_ops->xfs_dqpurgeall)(mp, fl)
-#define XFS_QM_DQVOPALLOC(mp, ip, uid, gid, prid, fl, dq1, dq2) \
-	(*(mp)->m_qm_ops->xfs_dqvopalloc)(mp, ip, uid, gid, prid, fl, dq1, dq2)
-#define XFS_QM_DQVOPCREATE(mp, tp, ip, dq1, dq2) \
-	(*(mp)->m_qm_ops->xfs_dqvopcreate)(tp, ip, dq1, dq2)
-#define XFS_QM_DQVOPRENAME(mp, ip) \
-	(*(mp)->m_qm_ops->xfs_dqvoprename)(ip)
-#define XFS_QM_DQVOPCHOWN(mp, tp, ip, dqp, dq) \
-	(*(mp)->m_qm_ops->xfs_dqvopchown)(tp, ip, dqp, dq)
-#define XFS_QM_DQVOPCHOWNRESV(mp, tp, ip, dq1, dq2, fl) \
-	(*(mp)->m_qm_ops->xfs_dqvopchownresv)(tp, ip, dq1, dq2, fl)
-#define XFS_QM_DQSTATVFS(ip, statp) \
-	(*(ip)->i_mount->m_qm_ops->xfs_dqstatvfs)(ip, statp)
-#define XFS_QM_DQSYNC(mp, flags) \
-	(*(mp)->m_qm_ops->xfs_dqsync)(mp, flags)
-
 #ifdef HAVE_PERCPU_SB
 
 /*
@@ -516,8 +439,6 @@ extern int	xfs_sb_validate_fsb_count(str
 
 extern int	xfs_dmops_get(struct xfs_mount *);
 extern void	xfs_dmops_put(struct xfs_mount *);
-extern int	xfs_qmops_get(struct xfs_mount *);
-extern void	xfs_qmops_put(struct xfs_mount *);
 
 extern struct xfs_dmops xfs_dmcore_xfs;
 
Index: xfs/fs/xfs/Makefile
===================================================================
--- xfs.orig/fs/xfs/Makefile	2009-02-24 15:32:16.158369937 +0100
+++ xfs/fs/xfs/Makefile	2009-02-24 15:32:35.859495267 +0100
@@ -88,8 +88,7 @@ xfs-y				+= xfs_alloc.o \
 				   xfs_utils.o \
 				   xfs_vnodeops.o \
 				   xfs_rw.o \
-				   xfs_dmops.o \
-				   xfs_qmops.o
+				   xfs_dmops.o
 
 xfs-$(CONFIG_XFS_TRACE)		+= xfs_btree_trace.o \
 				   xfs_dir2_trace.o
Index: xfs/fs/xfs/linux-2.6/xfs_ioctl.c
===================================================================
--- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl.c	2009-02-24 15:32:16.137370546 +0100
+++ xfs/fs/xfs/linux-2.6/xfs_ioctl.c	2009-02-24 15:32:35.865370666 +0100
@@ -907,7 +907,7 @@ xfs_ioctl_setattr(
 	struct xfs_mount	*mp = ip->i_mount;
 	struct xfs_trans	*tp;
 	unsigned int		lock_flags = 0;
-	struct xfs_dquot	*udqp = NULL, *gdqp = NULL;
+	struct xfs_dquot	*udqp, *gdqp;
 	struct xfs_dquot	*olddquot = NULL;
 	int			code;
 
@@ -918,6 +918,9 @@ xfs_ioctl_setattr(
 	if (XFS_FORCED_SHUTDOWN(mp))
 		return XFS_ERROR(EIO);
 
+	udqp = NULL;
+	gdqp = NULL;
+
 	/*
 	 * If disk quotas is on, we make sure that the dquots do exist on disk,
 	 * before we start any other transactions. Trying to do this later
@@ -927,7 +930,7 @@ xfs_ioctl_setattr(
 	 * because the i_*dquot fields will get updated anyway.
 	 */
 	if (XFS_IS_QUOTA_ON(mp) && (mask & FSX_PROJID)) {
-		code = XFS_QM_DQVOPALLOC(mp, ip, ip->i_d.di_uid,
+		code = xfs_qm_vop_dqalloc(ip, ip->i_d.di_uid,
 					 ip->i_d.di_gid, fa->fsx_projid,
 					 XFS_QMOPT_PQUOTA, &udqp, &gdqp);
 		if (code)
@@ -965,7 +968,7 @@ xfs_ioctl_setattr(
 		if (XFS_IS_PQUOTA_ON(mp) &&
 		    ip->i_d.di_projid != fa->fsx_projid) {
 			ASSERT(tp);
-			code = XFS_QM_DQVOPCHOWNRESV(mp, tp, ip, udqp, gdqp,
+			code = xfs_qm_vop_chown_reserve(tp, ip, udqp, gdqp,
 						capable(CAP_FOWNER) ?
 						XFS_QMOPT_FORCE_RES : 0);
 			if (code)	/* out of quota */
@@ -1068,7 +1071,7 @@ xfs_ioctl_setattr(
 		 */
 		if (ip->i_d.di_projid != fa->fsx_projid) {
 			if (XFS_IS_PQUOTA_ON(mp)) {
-				olddquot = XFS_QM_DQVOPCHOWN(mp, tp, ip,
+				olddquot = xfs_qm_vop_chown(tp, ip,
 							&ip->i_gdquot, gdqp);
 			}
 			ip->i_d.di_projid = fa->fsx_projid;
@@ -1114,9 +1117,9 @@ xfs_ioctl_setattr(
 	/*
 	 * Release any dquot(s) the inode had kept before chown.
 	 */
-	XFS_QM_DQRELE(mp, olddquot);
-	XFS_QM_DQRELE(mp, udqp);
-	XFS_QM_DQRELE(mp, gdqp);
+	xfs_qm_dqrele(olddquot);
+	xfs_qm_dqrele(udqp);
+	xfs_qm_dqrele(gdqp);
 
 	if (code)
 		return code;
@@ -1130,8 +1133,8 @@ xfs_ioctl_setattr(
 	return 0;
 
  error_return:
-	XFS_QM_DQRELE(mp, udqp);
-	XFS_QM_DQRELE(mp, gdqp);
+	xfs_qm_dqrele(udqp);
+	xfs_qm_dqrele(gdqp);
 	xfs_trans_cancel(tp, 0);
 	if (lock_flags)
 		xfs_iunlock(ip, lock_flags);
Index: xfs/fs/xfs/linux-2.6/xfs_super.c
===================================================================
--- xfs.orig/fs/xfs/linux-2.6/xfs_super.c	2009-02-24 15:32:16.141370566 +0100
+++ xfs/fs/xfs/linux-2.6/xfs_super.c	2009-02-24 15:32:35.866394539 +0100
@@ -416,6 +416,14 @@ xfs_parseargs(
 		return EINVAL;
 	}
 
+#ifndef CONFIG_XFS_QUOTA
+	if (XFS_IS_QUOTA_RUNNING(mp)) {
+		cmn_err(CE_WARN,
+			"XFS: quota support not available in this kernel.");
+		return EINVAL;
+	}
+#endif
+
 	if ((mp->m_qflags & (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE)) &&
 	    (mp->m_qflags & (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE))) {
 		cmn_err(CE_WARN,
@@ -1110,7 +1118,6 @@ xfs_fs_put_super(
 	xfs_freesb(mp);
 	xfs_icsb_destroy_counters(mp);
 	xfs_close_devices(mp);
-	xfs_qmops_put(mp);
 	xfs_dmops_put(mp);
 	xfs_free_fsname(mp);
 	kfree(mp);
@@ -1180,6 +1187,7 @@ xfs_fs_statfs(
 {
 	struct xfs_mount	*mp = XFS_M(dentry->d_sb);
 	xfs_sb_t		*sbp = &mp->m_sb;
+	struct xfs_inode	*ip = XFS_I(dentry->d_inode);
 	__uint64_t		fakeinos, id;
 	xfs_extlen_t		lsize;
 
@@ -1214,7 +1222,10 @@ xfs_fs_statfs(
 	statp->f_ffree = statp->f_files - (sbp->sb_icount - sbp->sb_ifree);
 	spin_unlock(&mp->m_sb_lock);
 
-	XFS_QM_DQSTATVFS(XFS_I(dentry->d_inode), statp);
+	if ((ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) ||
+	    ((mp->m_qflags & (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))) ==
+			      (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))
+		xfs_qm_statvfs(ip, statp);
 	return 0;
 }
 
@@ -1422,16 +1433,13 @@ xfs_fs_fill_super(
 	error = xfs_dmops_get(mp);
 	if (error)
 		goto out_free_fsname;
-	error = xfs_qmops_get(mp);
-	if (error)
-		goto out_put_dmops;
 
 	if (silent)
 		flags |= XFS_MFSI_QUIET;
 
 	error = xfs_open_devices(mp);
 	if (error)
-		goto out_put_qmops;
+		goto out_put_dmops;
 
 	if (xfs_icsb_init_counters(mp))
 		mp->m_flags |= XFS_MOUNT_NO_PERCPU_SB;
@@ -1500,8 +1508,6 @@ xfs_fs_fill_super(
  out_destroy_counters:
 	xfs_icsb_destroy_counters(mp);
 	xfs_close_devices(mp);
- out_put_qmops:
-	xfs_qmops_put(mp);
  out_put_dmops:
 	xfs_dmops_put(mp);
  out_free_fsname:
Index: xfs/fs/xfs/linux-2.6/xfs_sync.c
===================================================================
--- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c	2009-02-24 15:32:16.149399312 +0100
+++ xfs/fs/xfs/linux-2.6/xfs_sync.c	2009-02-24 15:32:35.867425537 +0100
@@ -43,6 +43,7 @@
 #include "xfs_buf_item.h"
 #include "xfs_inode_item.h"
 #include "xfs_rw.h"
+#include "xfs_quota.h"
 
 #include <linux/kthread.h>
 #include <linux/freezer.h>
@@ -311,12 +312,12 @@ xfs_quiesce_data(
 
 	/* push non-blocking */
 	xfs_sync_inodes(mp, SYNC_DELWRI|SYNC_BDFLUSH);
-	XFS_QM_DQSYNC(mp, SYNC_BDFLUSH);
+	xfs_qm_sync(mp, SYNC_BDFLUSH);
 	xfs_filestream_flush(mp);
 
 	/* push and block */
 	xfs_sync_inodes(mp, SYNC_DELWRI|SYNC_WAIT|SYNC_IOWAIT);
-	XFS_QM_DQSYNC(mp, SYNC_WAIT);
+	xfs_qm_sync(mp, SYNC_WAIT);
 
 	/* write superblock and hoover up shutdown errors */
 	error = xfs_sync_fsdata(mp, 0);
@@ -482,7 +483,7 @@ xfs_sync_worker(
 		xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE);
 		xfs_reclaim_inodes(mp, 0, XFS_IFLUSH_DELWRI_ELSE_ASYNC);
 		/* dgc: errors ignored here */
-		error = XFS_QM_DQSYNC(mp, SYNC_BDFLUSH);
+		error = xfs_qm_sync(mp, SYNC_BDFLUSH);
 		error = xfs_sync_fsdata(mp, SYNC_BDFLUSH);
 		if (xfs_log_need_covered(mp))
 			error = xfs_commit_dummy_trans(mp, XFS_LOG_FORCE);
Index: xfs/fs/xfs/quota/xfs_dquot.c
===================================================================
--- xfs.orig/fs/xfs/quota/xfs_dquot.c	2009-02-24 15:32:16.080370342 +0100
+++ xfs/fs/xfs/quota/xfs_dquot.c	2009-02-24 15:32:35.867425537 +0100
@@ -1194,7 +1194,9 @@ void
 xfs_qm_dqrele(
 	xfs_dquot_t	*dqp)
 {
-	ASSERT(dqp);
+	if (!dqp)
+		return;
+
 	xfs_dqtrace_entry(dqp, "DQRELE");
 
 	xfs_dqlock(dqp);
Index: xfs/fs/xfs/quota/xfs_dquot.h
===================================================================
--- xfs.orig/fs/xfs/quota/xfs_dquot.h	2009-02-24 15:32:16.085370350 +0100
+++ xfs/fs/xfs/quota/xfs_dquot.h	2009-02-24 15:32:35.868518762 +0100
@@ -181,7 +181,6 @@ extern void		xfs_qm_adjust_dqlimits(xfs_
 extern int		xfs_qm_dqget(xfs_mount_t *, xfs_inode_t *,
 					xfs_dqid_t, uint, uint, xfs_dquot_t **);
 extern void		xfs_qm_dqput(xfs_dquot_t *);
-extern void		xfs_qm_dqrele(xfs_dquot_t *);
 extern void		xfs_dqlock(xfs_dquot_t *);
 extern void		xfs_dqlock2(xfs_dquot_t *, xfs_dquot_t *);
 extern void		xfs_dqunlock(xfs_dquot_t *);
Index: xfs/fs/xfs/quota/xfs_qm.c
===================================================================
--- xfs.orig/fs/xfs/quota/xfs_qm.c	2009-02-24 15:32:16.076370112 +0100
+++ xfs/fs/xfs/quota/xfs_qm.c	2009-02-24 15:32:35.869518471 +0100
@@ -287,11 +287,13 @@ xfs_qm_rele_quotafs_ref(
  * Just destroy the quotainfo structure.
  */
 void
-xfs_qm_unmount_quotadestroy(
-	xfs_mount_t	*mp)
+xfs_qm_unmount(
+	struct xfs_mount	*mp)
 {
-	if (mp->m_quotainfo)
+	if (mp->m_quotainfo) {
+		xfs_qm_dqpurge_all(mp, XFS_QMOPT_QUOTALL | XFS_QMOPT_UMOUNTING);
 		xfs_qm_destroy_quotainfo(mp);
+	}
 }
 
 
@@ -311,6 +313,9 @@ xfs_qm_mount_quotas(
 	int		error = 0;
 	uint		sbf;
 
+	if (!XFS_IS_QUOTA_RUNNING(mp))
+		return;
+
 	/*
 	 * If quotas on realtime volumes is not supported, we disable
 	 * quotas immediately.
@@ -323,8 +328,6 @@ xfs_qm_mount_quotas(
 		goto write_changes;
 	}
 
-	ASSERT(XFS_IS_QUOTA_RUNNING(mp));
-
 	/*
 	 * Allocate the quotainfo structure inside the mount struct, and
 	 * create quotainode(s), and change/rev superblock if necessary.
@@ -385,8 +388,13 @@ xfs_qm_mount_quotas(
 	if (error) {
 		xfs_fs_cmn_err(CE_WARN, mp,
 			"Failed to initialize disk quotas.");
+		return;
 	}
-	return;
+
+#ifdef QUOTADEBUG
+	if (XFS_IS_QUOTA_ON(mp))
+		xfs_qm_internalqcheck(mp);
+#endif
 }
 
 /*
@@ -774,12 +782,11 @@ xfs_qm_dqattach_grouphint(
  * Given a locked inode, attach dquot(s) to it, taking U/G/P-QUOTAON
  * into account.
  * If XFS_QMOPT_DQALLOC, the dquot(s) will be allocated if needed.
- * If XFS_QMOPT_ILOCKED, then inode sent is already locked EXCL.
  * Inode may get unlocked and relocked in here, and the caller must deal with
  * the consequences.
  */
 int
-xfs_qm_dqattach(
+xfs_qm_dqattach_locked(
 	xfs_inode_t	*ip,
 	uint		flags)
 {
@@ -787,17 +794,14 @@ xfs_qm_dqattach(
 	uint		nquotas = 0;
 	int		error = 0;
 
-	if ((! XFS_IS_QUOTA_ON(mp)) ||
-	    (! XFS_NOT_DQATTACHED(mp, ip)) ||
-	    (ip->i_ino == mp->m_sb.sb_uquotino) ||
-	    (ip->i_ino == mp->m_sb.sb_gquotino))
+	if (!XFS_IS_QUOTA_RUNNING(mp) ||
+	    !XFS_IS_QUOTA_ON(mp) ||
+	    !XFS_NOT_DQATTACHED(mp, ip) ||
+	    ip->i_ino == mp->m_sb.sb_uquotino ||
+	    ip->i_ino == mp->m_sb.sb_gquotino)
 		return 0;
 
-	ASSERT((flags & XFS_QMOPT_ILOCKED) == 0 ||
-	       xfs_isilocked(ip, XFS_ILOCK_EXCL));
-
-	if (! (flags & XFS_QMOPT_ILOCKED))
-		xfs_ilock(ip, XFS_ILOCK_EXCL);
+	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
 
 	if (XFS_IS_UQUOTA_ON(mp)) {
 		error = xfs_qm_dqattach_one(ip, ip->i_d.di_uid, XFS_DQ_USER,
@@ -849,8 +853,7 @@ xfs_qm_dqattach(
 		xfs_qm_dqattach_grouphint(ip->i_udquot, ip->i_gdquot);
 	}
 
-      done:
-
+ done:
 #ifdef QUOTADEBUG
 	if (! error) {
 		if (XFS_IS_UQUOTA_ON(mp))
@@ -858,15 +861,22 @@ xfs_qm_dqattach(
 		if (XFS_IS_OQUOTA_ON(mp))
 			ASSERT(ip->i_gdquot);
 	}
+	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
 #endif
+	return error;
+}
+
+int
+xfs_qm_dqattach(
+	struct xfs_inode	*ip,
+	uint			flags)
+{
+	int			error;
 
-	if (! (flags & XFS_QMOPT_ILOCKED))
-		xfs_iunlock(ip, XFS_ILOCK_EXCL);
+	xfs_ilock(ip, XFS_ILOCK_EXCL);
+	error = xfs_qm_dqattach_locked(ip, flags);
+	xfs_iunlock(ip, XFS_ILOCK_EXCL);
 
-#ifdef QUOTADEBUG
-	else
-		ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
-#endif
 	return error;
 }
 
@@ -912,7 +922,7 @@ xfs_qm_sync(
 	boolean_t	nowait;
 	int		error;
 
-	if (! XFS_IS_QUOTA_ON(mp))
+	if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
 		return 0;
 
 	restarts = 0;
@@ -2319,20 +2329,20 @@ xfs_qm_write_sb_changes(
  */
 int
 xfs_qm_vop_dqalloc(
-	xfs_mount_t	*mp,
-	xfs_inode_t	*ip,
-	uid_t		uid,
-	gid_t		gid,
-	prid_t		prid,
-	uint		flags,
-	xfs_dquot_t	**O_udqpp,
-	xfs_dquot_t	**O_gdqpp)
-{
-	int		error;
-	xfs_dquot_t	*uq, *gq;
-	uint		lockflags;
+	struct xfs_inode	*ip,
+	uid_t			uid,
+	gid_t			gid,
+	prid_t			prid,
+	uint			flags,
+	struct xfs_dquot	**O_udqpp,
+	struct xfs_dquot	**O_gdqpp)
+{
+	struct xfs_mount	*mp = ip->i_mount;
+	struct xfs_dquot	*uq, *gq;
+	int			error;
+	uint			lockflags;
 
-	if (!XFS_IS_QUOTA_ON(mp))
+	if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
 		return 0;
 
 	lockflags = XFS_ILOCK_EXCL;
@@ -2346,8 +2356,8 @@ xfs_qm_vop_dqalloc(
 	 * if necessary. The dquot(s) will not be locked.
 	 */
 	if (XFS_NOT_DQATTACHED(mp, ip)) {
-		if ((error = xfs_qm_dqattach(ip, XFS_QMOPT_DQALLOC |
-					    XFS_QMOPT_ILOCKED))) {
+		error = xfs_qm_dqattach_locked(ip, XFS_QMOPT_DQALLOC);
+		if (error) {
 			xfs_iunlock(ip, lockflags);
 			return error;
 		}
@@ -2469,8 +2479,10 @@ xfs_qm_vop_chown(
 	uint		bfield = XFS_IS_REALTIME_INODE(ip) ?
 				 XFS_TRANS_DQ_RTBCOUNT : XFS_TRANS_DQ_BCOUNT;
 
+	if (!XFS_IS_QUOTA_RUNNING(ip->i_mount))
+		return NULL;
+
 	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
-	ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount));
 
 	/* old dquot */
 	prevdq = *IO_olddq;
@@ -2508,14 +2520,15 @@ xfs_qm_vop_chown_reserve(
 	xfs_dquot_t	*gdqp,
 	uint		flags)
 {
-	int		error;
-	xfs_mount_t	*mp;
+	xfs_mount_t	*mp = ip->i_mount;
 	uint		delblks, blkflags, prjflags = 0;
 	xfs_dquot_t	*unresudq, *unresgdq, *delblksudq, *delblksgdq;
+	int		error;
+
+	if (!XFS_IS_QUOTA_RUNNING(mp))
+		return 0;
 
 	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
-	mp = ip->i_mount;
-	ASSERT(XFS_IS_QUOTA_RUNNING(mp));
 
 	delblks = ip->i_delayed_blks;
 	delblksudq = delblksgdq = unresudq = unresgdq = NULL;
@@ -2582,28 +2595,23 @@ xfs_qm_vop_chown_reserve(
 
 int
 xfs_qm_vop_rename_dqattach(
-	xfs_inode_t	**i_tab)
+	struct xfs_inode	**i_tab)
 {
-	xfs_inode_t	*ip;
-	int		i;
-	int		error;
-
-	ip = i_tab[0];
+	struct xfs_mount	*mp = i_tab[0]->i_mount;
+	int			i;
 
-	if (! XFS_IS_QUOTA_ON(ip->i_mount))
+	if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
 		return 0;
 
-	if (XFS_NOT_DQATTACHED(ip->i_mount, ip)) {
-		error = xfs_qm_dqattach(ip, 0);
-		if (error)
-			return error;
-	}
 	for (i = 1; (i < 4 && i_tab[i]); i++) {
+		struct xfs_inode	*ip = i_tab[i];
+		int			error;
+
 		/*
 		 * Watch out for duplicate entries in the table.
 		 */
-		if ((ip = i_tab[i]) != i_tab[i-1]) {
-			if (XFS_NOT_DQATTACHED(ip->i_mount, ip)) {
+		if (i == 0 || ip != i_tab[i-1]) {
+			if (XFS_NOT_DQATTACHED(mp, ip)) {
 				error = xfs_qm_dqattach(ip, 0);
 				if (error)
 					return error;
@@ -2614,17 +2622,19 @@ xfs_qm_vop_rename_dqattach(
 }
 
 void
-xfs_qm_vop_dqattach_and_dqmod_newinode(
-	xfs_trans_t	*tp,
-	xfs_inode_t	*ip,
-	xfs_dquot_t	*udqp,
-	xfs_dquot_t	*gdqp)
+xfs_qm_vop_create_dqattach(
+	struct xfs_trans	*tp,
+	struct xfs_inode	*ip,
+	struct xfs_dquot	*udqp,
+	struct xfs_dquot	*gdqp)
 {
-	if (!XFS_IS_QUOTA_ON(tp->t_mountp))
+	struct xfs_mount	*mp = tp->t_mountp;
+
+	if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
 		return;
 
 	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
-	ASSERT(XFS_IS_QUOTA_RUNNING(tp->t_mountp));
+	ASSERT(XFS_IS_QUOTA_RUNNING(mp));
 
 	if (udqp) {
 		xfs_dqlock(udqp);
@@ -2632,7 +2642,7 @@ xfs_qm_vop_dqattach_and_dqmod_newinode(
 		xfs_dqunlock(udqp);
 		ASSERT(ip->i_udquot == NULL);
 		ip->i_udquot = udqp;
-		ASSERT(XFS_IS_UQUOTA_ON(tp->t_mountp));
+		ASSERT(XFS_IS_UQUOTA_ON(mp));
 		ASSERT(ip->i_d.di_uid == be32_to_cpu(udqp->q_core.d_id));
 		xfs_trans_mod_dquot(tp, udqp, XFS_TRANS_DQ_ICOUNT, 1);
 	}
@@ -2642,8 +2652,8 @@ xfs_qm_vop_dqattach_and_dqmod_newinode(
 		xfs_dqunlock(gdqp);
 		ASSERT(ip->i_gdquot == NULL);
 		ip->i_gdquot = gdqp;
-		ASSERT(XFS_IS_OQUOTA_ON(tp->t_mountp));
-		ASSERT((XFS_IS_GQUOTA_ON(tp->t_mountp) ?
+		ASSERT(XFS_IS_OQUOTA_ON(mp));
+		ASSERT((XFS_IS_GQUOTA_ON(mp) ?
 			ip->i_d.di_gid : ip->i_d.di_projid) ==
 				be32_to_cpu(gdqp->q_core.d_id));
 		xfs_trans_mod_dquot(tp, gdqp, XFS_TRANS_DQ_ICOUNT, 1);
Index: xfs/fs/xfs/xfs_iget.c
===================================================================
--- xfs.orig/fs/xfs/xfs_iget.c	2009-02-24 15:32:16.153369650 +0100
+++ xfs/fs/xfs/xfs_iget.c	2009-02-24 15:32:35.870518109 +0100
@@ -490,10 +490,7 @@ xfs_ireclaim(
 	 * ilock one but will still hold the iolock.
 	 */
 	xfs_ilock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
-	/*
-	 * Release dquots (and their references) if any.
-	 */
-	XFS_QM_DQDETACH(ip->i_mount, ip);
+	xfs_qm_dqdetach(ip);
 	xfs_iunlock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
 
 	switch (ip->i_d.di_mode & S_IFMT) {
Index: xfs/fs/xfs/xfs_mount.c
===================================================================
--- xfs.orig/fs/xfs/xfs_mount.c	2009-02-24 15:32:16.164399755 +0100
+++ xfs/fs/xfs/xfs_mount.c	2009-02-24 15:32:35.871518446 +0100
@@ -886,6 +886,53 @@ xfs_check_sizes(xfs_mount_t *mp)
 }
 
 /*
+ * Clear the quotaflags in memory and in the superblock.
+ */
+int
+xfs_mount_reset_sbqflags(
+	struct xfs_mount	*mp)
+{
+	int			error;
+	struct xfs_trans	*tp;
+
+	mp->m_qflags = 0;
+
+	/*
+	 * It is OK to look at sb_qflags here in mount path,
+	 * without m_sb_lock.
+	 */
+	if (mp->m_sb.sb_qflags == 0)
+		return 0;
+	spin_lock(&mp->m_sb_lock);
+	mp->m_sb.sb_qflags = 0;
+	spin_unlock(&mp->m_sb_lock);
+
+	/*
+	 * If the fs is readonly, let the incore superblock run
+	 * with quotas off but don't flush the update out to disk
+	 */
+	if (mp->m_flags & XFS_MOUNT_RDONLY)
+		return 0;
+
+#ifdef QUOTADEBUG
+	xfs_fs_cmn_err(CE_NOTE, mp, "Writing superblock quota changes");
+#endif
+
+	tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE);
+	error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0,
+				      XFS_DEFAULT_LOG_COUNT);
+	if (error) {
+		xfs_trans_cancel(tp, 0);
+		xfs_fs_cmn_err(CE_ALERT, mp,
+			"xfs_mount_reset_sbqflags: Superblock update failed!");
+		return error;
+	}
+
+	xfs_mod_sb(tp, XFS_SB_QFLAGS);
+	return xfs_trans_commit(tp, 0);
+}
+
+/*
  * This function does the following on an initial mount of a file system:
  *	- reads the superblock from disk and init the mount struct
  *	- if we're a 32-bit kernel, do a size check on the superblock
@@ -902,7 +949,8 @@ xfs_mountfs(
 	xfs_sb_t	*sbp = &(mp->m_sb);
 	xfs_inode_t	*rip;
 	__uint64_t	resblks;
-	uint		quotamount, quotaflags;
+	uint		quotamount = 0;
+	uint		quotaflags = 0;
 	int		error = 0;
 
 	xfs_mount_common(mp, sbp);
@@ -1145,9 +1193,28 @@ xfs_mountfs(
 	/*
 	 * Initialise the XFS quota management subsystem for this mount
 	 */
-	error = XFS_QM_INIT(mp, &quotamount, &quotaflags);
-	if (error)
-		goto out_rtunmount;
+	if (XFS_IS_QUOTA_RUNNING(mp)) {
+		error = xfs_qm_newmount(mp, &quotamount, &quotaflags);
+		if (error)
+			goto out_rtunmount;
+	} else {
+		ASSERT(!XFS_IS_QUOTA_ON(mp));
+
+		/*
+		 * If a file system had quotas running earlier, but decided to
+		 * mount without -o uquota/pquota/gquota options, revoke the
+		 * quotachecked license.
+		 */
+		if (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT) {
+			cmn_err(CE_NOTE,
+                	        "XFS: resetting qflags for filesystem %s",
+                	        mp->m_fsname);
+
+			error = xfs_mount_reset_sbqflags(mp);
+			if (error)
+				return error;
+		}
+	}
 
 	/*
 	 * Finish recovering the file system.  This part needed to be
@@ -1163,9 +1230,19 @@ xfs_mountfs(
 	/*
 	 * Complete the quota initialisation, post-log-replay component.
 	 */
-	error = XFS_QM_MOUNT(mp, quotamount, quotaflags);
-	if (error)
-		goto out_rtunmount;
+	if (quotamount) {
+		ASSERT(mp->m_qflags == 0);
+		mp->m_qflags = quotaflags;
+
+		xfs_qm_mount_quotas(mp);
+	}
+
+#if defined(DEBUG) && defined(XFS_LOUD_RECOVERY)
+	if (XFS_IS_QUOTA_ON(mp))
+		xfs_fs_cmn_err(CE_NOTE, mp, "Disk quotas turned on");
+	else
+		xfs_fs_cmn_err(CE_NOTE, mp, "Disk quotas not turned on");
+#endif
 
 	/*
 	 * Now we are mounted, reserve a small amount of unused space for
@@ -1215,12 +1292,7 @@ xfs_unmountfs(
 	__uint64_t		resblks;
 	int			error;
 
-	/*
-	 * Release dquot that rootinode, rbmino and rsumino might be holding,
-	 * and release the quota inodes.
-	 */
-	XFS_QM_UNMOUNT(mp);
-
+	xfs_qm_unmount_quotas(mp);
 	xfs_rtunmount_inodes(mp);
 	IRELE(mp->m_rootip);
 
@@ -1237,10 +1309,7 @@ xfs_unmountfs(
 	xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE | XFS_LOG_SYNC);
 	xfs_reclaim_inodes(mp, 0, XFS_IFLUSH_ASYNC);
 
-	XFS_QM_DQPURGEALL(mp, XFS_QMOPT_QUOTALL | XFS_QMOPT_UMOUNTING);
-
-	if (mp->m_quotainfo)
-		XFS_QM_DONE(mp);
+	xfs_qm_unmount(mp);
 
 	/*
 	 * Flush out the log synchronously so that we know for sure
Index: xfs/fs/xfs/xfs_qmops.c
===================================================================
--- xfs.orig/fs/xfs/xfs_qmops.c	2009-02-24 15:32:16.128369539 +0100
+++ /dev/null	1970-01-01 00:00:00.000000000 +0000
@@ -1,152 +0,0 @@
-/*
- * Copyright (c) 2000-2005 Silicon Graphics, Inc.
- * All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write the Free Software Foundation,
- * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-#include "xfs.h"
-#include "xfs_fs.h"
-#include "xfs_types.h"
-#include "xfs_log.h"
-#include "xfs_inum.h"
-#include "xfs_trans.h"
-#include "xfs_sb.h"
-#include "xfs_ag.h"
-#include "xfs_dir2.h"
-#include "xfs_dmapi.h"
-#include "xfs_mount.h"
-#include "xfs_quota.h"
-#include "xfs_error.h"
-
-
-STATIC struct xfs_dquot *
-xfs_dqvopchown_default(
-	struct xfs_trans	*tp,
-	struct xfs_inode	*ip,
-	struct xfs_dquot	**dqp,
-	struct xfs_dquot	*dq)
-{
-	return NULL;
-}
-
-/*
- * Clear the quotaflags in memory and in the superblock.
- */
-int
-xfs_mount_reset_sbqflags(xfs_mount_t *mp)
-{
-	int			error;
-	xfs_trans_t		*tp;
-
-	mp->m_qflags = 0;
-	/*
-	 * It is OK to look at sb_qflags here in mount path,
-	 * without m_sb_lock.
-	 */
-	if (mp->m_sb.sb_qflags == 0)
-		return 0;
-	spin_lock(&mp->m_sb_lock);
-	mp->m_sb.sb_qflags = 0;
-	spin_unlock(&mp->m_sb_lock);
-
-	/*
-	 * if the fs is readonly, let the incore superblock run
-	 * with quotas off but don't flush the update out to disk
-	 */
-	if (mp->m_flags & XFS_MOUNT_RDONLY)
-		return 0;
-#ifdef QUOTADEBUG
-	xfs_fs_cmn_err(CE_NOTE, mp, "Writing superblock quota changes");
-#endif
-	tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE);
-	if ((error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0,
-				      XFS_DEFAULT_LOG_COUNT))) {
-		xfs_trans_cancel(tp, 0);
-		xfs_fs_cmn_err(CE_ALERT, mp,
-			"xfs_mount_reset_sbqflags: Superblock update failed!");
-		return error;
-	}
-	xfs_mod_sb(tp, XFS_SB_QFLAGS);
-	error = xfs_trans_commit(tp, 0);
-	return error;
-}
-
-STATIC int
-xfs_noquota_init(
-	xfs_mount_t	*mp,
-	uint		*needquotamount,
-	uint		*quotaflags)
-{
-	int		error = 0;
-
-	*quotaflags = 0;
-	*needquotamount = B_FALSE;
-
-	ASSERT(!XFS_IS_QUOTA_ON(mp));
-
-	/*
-	 * If a file system had quotas running earlier, but decided to
-	 * mount without -o uquota/pquota/gquota options, revoke the
-	 * quotachecked license.
-	 */
-	if (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT) {
-		cmn_err(CE_NOTE,
-                        "XFS resetting qflags for filesystem %s",
-                        mp->m_fsname);
-
-		error = xfs_mount_reset_sbqflags(mp);
-	}
-	return error;
-}
-
-static struct xfs_qmops xfs_qmcore_stub = {
-	.xfs_qminit		= (xfs_qminit_t) xfs_noquota_init,
-	.xfs_qmdone		= (xfs_qmdone_t) fs_noerr,
-	.xfs_qmmount		= (xfs_qmmount_t) fs_noerr,
-	.xfs_qmunmount		= (xfs_qmunmount_t) fs_noerr,
-	.xfs_dqrele		= (xfs_dqrele_t) fs_noerr,
-	.xfs_dqattach		= (xfs_dqattach_t) fs_noerr,
-	.xfs_dqdetach		= (xfs_dqdetach_t) fs_noerr,
-	.xfs_dqpurgeall		= (xfs_dqpurgeall_t) fs_noerr,
-	.xfs_dqvopalloc		= (xfs_dqvopalloc_t) fs_noerr,
-	.xfs_dqvopcreate	= (xfs_dqvopcreate_t) fs_noerr,
-	.xfs_dqvoprename	= (xfs_dqvoprename_t) fs_noerr,
-	.xfs_dqvopchown		= xfs_dqvopchown_default,
-	.xfs_dqvopchownresv	= (xfs_dqvopchownresv_t) fs_noerr,
-	.xfs_dqstatvfs		= (xfs_dqstatvfs_t) fs_noval,
-	.xfs_dqsync		= (xfs_dqsync_t) fs_noerr,
-};
-
-int
-xfs_qmops_get(struct xfs_mount *mp)
-{
-	if (XFS_IS_QUOTA_RUNNING(mp)) {
-#ifdef CONFIG_XFS_QUOTA
-		mp->m_qm_ops = &xfs_qmcore_xfs;
-#else
-		cmn_err(CE_WARN,
-			"XFS: qouta support not available in this kernel.");
-		return EINVAL;
-#endif
-	} else {
-		mp->m_qm_ops = &xfs_qmcore_stub;
-	}
-
-	return 0;
-}
-
-void
-xfs_qmops_put(struct xfs_mount *mp)
-{
-}
Index: xfs/fs/xfs/xfs_rename.c
===================================================================
--- xfs.orig/fs/xfs/xfs_rename.c	2009-02-24 15:32:16.132369560 +0100
+++ xfs/fs/xfs/xfs_rename.c	2009-02-24 15:32:35.872519970 +0100
@@ -166,7 +166,8 @@ xfs_rename(
 	/*
 	 * Attach the dquots to the inodes
 	 */
-	if ((error = XFS_QM_DQVOPRENAME(mp, inodes))) {
+	error = xfs_qm_vop_rename_dqattach(inodes);
+	if (error) {
 		xfs_trans_cancel(tp, cancel_flags);
 		goto std_return;
 	}

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] xfs: kill xfs_qmops
  2009-02-24 14:37 [PATCH] xfs: kill xfs_qmops Christoph Hellwig
@ 2009-03-16  7:55 ` Christoph Hellwig
  2009-03-29  7:44   ` Christoph Hellwig
  2009-05-26 17:34 ` Eric Sandeen
  1 sibling, 1 reply; 6+ messages in thread
From: Christoph Hellwig @ 2009-03-16  7:55 UTC (permalink / raw)
  To: xfs

ping?

On Tue, Feb 24, 2009 at 09:37:36AM -0500, Christoph Hellwig wrote:
> 
> Kill the quota ops function vector and replace it with direct calls or
> stubs in the CONFIG_XFS_QUOTA=n case.
> 
> Make sure we check XFS_IS_QUOTA_RUNNING in the right spots.  We can remove
> the number of those checks because the XFS_TRANS_DQ_DIRTY flag can't be set
> otherwise.
> 
> This brings us back closer to the way this code worked in IRIX and earlier
> Linux versions, but we keep a lot of the more useful factoring of common
> code.
> 
> Eventually we should also kill xfs_qm_bhv.c, but that's left for a later
> patch.
> 
> Reduces the size of the source code by about 250 lines and the size of
> XFS module by about 1.5 kilobytes with quotas enabled:
> 
>    text	   data	    bss	    dec	    hex	filename
>  615957	   2960	   3848	 622765	  980ad	fs/xfs/xfs.o
>  617231	   3152	   3848	 624231	  98667	fs/xfs/xfs.o.old
> 
> 
> Fallout:
> 
>  - xfs_qm_dqattach is split into xfs_qm_dqattach_locked which expects
>    the inode locked and xfs_qm_dqattach which does the locking around it,
>    thus removing XFS_QMOPT_ILOCKED.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> 
> Index: xfs/fs/xfs/quota/xfs_trans_dquot.c
> ===================================================================
> --- xfs.orig/fs/xfs/quota/xfs_trans_dquot.c	2009-02-24 15:32:16.063369993 +0100
> +++ xfs/fs/xfs/quota/xfs_trans_dquot.c	2009-02-24 15:32:35.845494182 +0100
> @@ -111,7 +111,7 @@ xfs_trans_log_dquot(
>   * Carry forward whatever is left of the quota blk reservation to
>   * the spanky new transaction
>   */
> -STATIC void
> +void
>  xfs_trans_dup_dqinfo(
>  	xfs_trans_t	*otp,
>  	xfs_trans_t	*ntp)
> @@ -167,19 +167,17 @@ xfs_trans_dup_dqinfo(
>  /*
>   * Wrap around mod_dquot to account for both user and group quotas.
>   */
> -STATIC void
> +void
>  xfs_trans_mod_dquot_byino(
>  	xfs_trans_t	*tp,
>  	xfs_inode_t	*ip,
>  	uint		field,
>  	long		delta)
>  {
> -	xfs_mount_t	*mp;
> +	xfs_mount_t	*mp = tp->t_mountp;
>  
> -	ASSERT(tp);
> -	mp = tp->t_mountp;
> -
> -	if (!XFS_IS_QUOTA_ON(mp) ||
> +	if (!XFS_IS_QUOTA_RUNNING(mp) ||
> +	    !XFS_IS_QUOTA_ON(mp) ||
>  	    ip->i_ino == mp->m_sb.sb_uquotino ||
>  	    ip->i_ino == mp->m_sb.sb_gquotino)
>  		return;
> @@ -229,6 +227,7 @@ xfs_trans_mod_dquot(
>  	xfs_dqtrx_t	*qtrx;
>  
>  	ASSERT(tp);
> +	ASSERT(XFS_IS_QUOTA_RUNNING(tp->t_mountp));
>  	qtrx = NULL;
>  
>  	if (tp->t_dqinfo == NULL)
> @@ -346,7 +345,7 @@ xfs_trans_dqlockedjoin(
>   * Unreserve just the reservations done by this transaction.
>   * dquot is still left locked at exit.
>   */
> -STATIC void
> +void
>  xfs_trans_apply_dquot_deltas(
>  	xfs_trans_t		*tp)
>  {
> @@ -357,7 +356,7 @@ xfs_trans_apply_dquot_deltas(
>  	long			totalbdelta;
>  	long			totalrtbdelta;
>  
> -	if (! (tp->t_flags & XFS_TRANS_DQ_DIRTY))
> +	if (!(tp->t_flags & XFS_TRANS_DQ_DIRTY))
>  		return;
>  
>  	ASSERT(tp->t_dqinfo);
> @@ -531,7 +530,7 @@ xfs_trans_apply_dquot_deltas(
>   * we simply throw those away, since that's the expected behavior
>   * when a transaction is curtailed without a commit.
>   */
> -STATIC void
> +void
>  xfs_trans_unreserve_and_mod_dquots(
>  	xfs_trans_t		*tp)
>  {
> @@ -768,6 +767,8 @@ xfs_trans_reserve_quota_bydquots(
>  {
>  	int		resvd = 0, error;
>  
> +	if (!XFS_IS_QUOTA_RUNNING(mp))
> +		return 0;
>  	if (!XFS_IS_QUOTA_ON(mp))
>  		return 0;
>  
> @@ -811,17 +812,18 @@ xfs_trans_reserve_quota_bydquots(
>   * This doesn't change the actual usage, just the reservation.
>   * The inode sent in is locked.
>   */
> -STATIC int
> +int
>  xfs_trans_reserve_quota_nblks(
> -	xfs_trans_t	*tp,
> -	xfs_mount_t	*mp,
> -	xfs_inode_t	*ip,
> -	long		nblks,
> -	long		ninos,
> -	uint		flags)
> +	struct xfs_trans	*tp,
> +	struct xfs_inode	*ip,
> +	long			nblks,
> +	long			ninos,
> +	uint			flags)
>  {
> -	int		error;
> +	struct xfs_mount	*mp = ip->i_mount;
>  
> +	if (!XFS_IS_QUOTA_RUNNING(mp))
> +		return 0;
>  	if (!XFS_IS_QUOTA_ON(mp))
>  		return 0;
>  	if (XFS_IS_PQUOTA_ON(mp))
> @@ -831,7 +833,6 @@ xfs_trans_reserve_quota_nblks(
>  	ASSERT(ip->i_ino != mp->m_sb.sb_gquotino);
>  
>  	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
> -	ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount));
>  	ASSERT((flags & ~(XFS_QMOPT_FORCE_RES | XFS_QMOPT_ENOSPC)) ==
>  				XFS_TRANS_DQ_RES_RTBLKS ||
>  	       (flags & ~(XFS_QMOPT_FORCE_RES | XFS_QMOPT_ENOSPC)) ==
> @@ -840,11 +841,9 @@ xfs_trans_reserve_quota_nblks(
>  	/*
>  	 * Reserve nblks against these dquots, with trans as the mediator.
>  	 */
> -	error = xfs_trans_reserve_quota_bydquots(tp, mp,
> -						 ip->i_udquot, ip->i_gdquot,
> -						 nblks, ninos,
> -						 flags);
> -	return error;
> +	return xfs_trans_reserve_quota_bydquots(tp, mp,
> +						ip->i_udquot, ip->i_gdquot,
> +						nblks, ninos, flags);
>  }
>  
>  /*
> @@ -895,25 +894,15 @@ STATIC void
>  xfs_trans_alloc_dqinfo(
>  	xfs_trans_t	*tp)
>  {
> -	(tp)->t_dqinfo = kmem_zone_zalloc(xfs_Gqm->qm_dqtrxzone, KM_SLEEP);
> +	tp->t_dqinfo = kmem_zone_zalloc(xfs_Gqm->qm_dqtrxzone, KM_SLEEP);
>  }
>  
> -STATIC void
> +void
>  xfs_trans_free_dqinfo(
>  	xfs_trans_t	*tp)
>  {
>  	if (!tp->t_dqinfo)
>  		return;
> -	kmem_zone_free(xfs_Gqm->qm_dqtrxzone, (tp)->t_dqinfo);
> -	(tp)->t_dqinfo = NULL;
> +	kmem_zone_free(xfs_Gqm->qm_dqtrxzone, tp->t_dqinfo);
> +	tp->t_dqinfo = NULL;
>  }
> -
> -xfs_dqtrxops_t	xfs_trans_dquot_ops = {
> -	.qo_dup_dqinfo			= xfs_trans_dup_dqinfo,
> -	.qo_free_dqinfo			= xfs_trans_free_dqinfo,
> -	.qo_mod_dquot_byino		= xfs_trans_mod_dquot_byino,
> -	.qo_apply_dquot_deltas		= xfs_trans_apply_dquot_deltas,
> -	.qo_reserve_quota_nblks		= xfs_trans_reserve_quota_nblks,
> -	.qo_reserve_quota_bydquots	= xfs_trans_reserve_quota_bydquots,
> -	.qo_unreserve_and_mod_dquots	= xfs_trans_unreserve_and_mod_dquots,
> -};
> Index: xfs/fs/xfs/xfs_quota.h
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_quota.h	2009-02-24 15:32:16.089369812 +0100
> +++ xfs/fs/xfs/xfs_quota.h	2009-02-24 15:32:35.846494310 +0100
> @@ -197,7 +197,6 @@ typedef struct xfs_qoff_logformat {
>  #define XFS_QMOPT_UMOUNTING	0x0000100 /* filesys is being unmounted */
>  #define XFS_QMOPT_DOLOG		0x0000200 /* log buf changes (in quotacheck) */
>  #define XFS_QMOPT_DOWARN        0x0000400 /* increase warning cnt if needed */
> -#define XFS_QMOPT_ILOCKED	0x0000800 /* inode is already locked (excl) */
>  #define XFS_QMOPT_DQREPAIR	0x0001000 /* repair dquot if damaged */
>  #define XFS_QMOPT_GQUOTA	0x0002000 /* group dquot requested */
>  #define XFS_QMOPT_ENOSPC	0x0004000 /* enospc instead of edquot (prj) */
> @@ -302,69 +301,72 @@ typedef struct xfs_dqtrx {
>  	long		qt_delrtb_delta;  /* delayed RT blk count changes */
>  } xfs_dqtrx_t;
>  
> -/*
> - * Dquot transaction functions, used if quota is enabled.
> - */
> -typedef void	(*qo_dup_dqinfo_t)(struct xfs_trans *, struct xfs_trans *);
> -typedef void	(*qo_mod_dquot_byino_t)(struct xfs_trans *,
> -				struct xfs_inode *, uint, long);
> -typedef void	(*qo_free_dqinfo_t)(struct xfs_trans *);
> -typedef void	(*qo_apply_dquot_deltas_t)(struct xfs_trans *);
> -typedef void	(*qo_unreserve_and_mod_dquots_t)(struct xfs_trans *);
> -typedef int	(*qo_reserve_quota_nblks_t)(
> -				struct xfs_trans *, struct xfs_mount *,
> -				struct xfs_inode *, long, long, uint);
> -typedef int	(*qo_reserve_quota_bydquots_t)(
> -				struct xfs_trans *, struct xfs_mount *,
> -				struct xfs_dquot *, struct xfs_dquot *,
> -				long, long, uint);
> -typedef struct xfs_dqtrxops {
> -	qo_dup_dqinfo_t			qo_dup_dqinfo;
> -	qo_free_dqinfo_t		qo_free_dqinfo;
> -	qo_mod_dquot_byino_t		qo_mod_dquot_byino;
> -	qo_apply_dquot_deltas_t		qo_apply_dquot_deltas;
> -	qo_reserve_quota_nblks_t	qo_reserve_quota_nblks;
> -	qo_reserve_quota_bydquots_t	qo_reserve_quota_bydquots;
> -	qo_unreserve_and_mod_dquots_t	qo_unreserve_and_mod_dquots;
> -} xfs_dqtrxops_t;
> -
> -#define XFS_DQTRXOP(mp, tp, op, args...) \
> -		((mp)->m_qm_ops->xfs_dqtrxops ? \
> -		((mp)->m_qm_ops->xfs_dqtrxops->op)(tp, ## args) : 0)
> -
> -#define XFS_DQTRXOP_VOID(mp, tp, op, args...) \
> -		((mp)->m_qm_ops->xfs_dqtrxops ? \
> -		((mp)->m_qm_ops->xfs_dqtrxops->op)(tp, ## args) : (void)0)
> -
> -#define XFS_TRANS_DUP_DQINFO(mp, otp, ntp) \
> -	XFS_DQTRXOP_VOID(mp, otp, qo_dup_dqinfo, ntp)
> -#define XFS_TRANS_FREE_DQINFO(mp, tp) \
> -	XFS_DQTRXOP_VOID(mp, tp, qo_free_dqinfo)
> -#define XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, field, delta) \
> -	XFS_DQTRXOP_VOID(mp, tp, qo_mod_dquot_byino, ip, field, delta)
> -#define XFS_TRANS_APPLY_DQUOT_DELTAS(mp, tp) \
> -	XFS_DQTRXOP_VOID(mp, tp, qo_apply_dquot_deltas)
> -#define XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip, nblks, ninos, fl) \
> -	XFS_DQTRXOP(mp, tp, qo_reserve_quota_nblks, mp, ip, nblks, ninos, fl)
> -#define XFS_TRANS_RESERVE_QUOTA_BYDQUOTS(mp, tp, ud, gd, nb, ni, fl) \
> -	XFS_DQTRXOP(mp, tp, qo_reserve_quota_bydquots, mp, ud, gd, nb, ni, fl)
> -#define XFS_TRANS_UNRESERVE_AND_MOD_DQUOTS(mp, tp) \
> -	XFS_DQTRXOP_VOID(mp, tp, qo_unreserve_and_mod_dquots)
> -
> -#define XFS_TRANS_UNRESERVE_QUOTA_NBLKS(mp, tp, ip, nblks, ninos, flags) \
> -	XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip, -(nblks), -(ninos), flags)
> -#define XFS_TRANS_RESERVE_QUOTA(mp, tp, ud, gd, nb, ni, f) \
> -	XFS_TRANS_RESERVE_QUOTA_BYDQUOTS(mp, tp, ud, gd, nb, ni, \
> -				f | XFS_QMOPT_RES_REGBLKS)
> -#define XFS_TRANS_UNRESERVE_QUOTA(mp, tp, ud, gd, nb, ni, f) \
> -	XFS_TRANS_RESERVE_QUOTA_BYDQUOTS(mp, tp, ud, gd, -(nb), -(ni), \
> +#ifdef CONFIG_XFS_QUOTA
> +extern void xfs_trans_dup_dqinfo(struct xfs_trans *, struct xfs_trans *);
> +extern void xfs_trans_free_dqinfo(struct xfs_trans *);
> +extern void xfs_trans_mod_dquot_byino(struct xfs_trans *, struct xfs_inode *,
> +		uint, long);
> +extern void xfs_trans_apply_dquot_deltas(struct xfs_trans *);
> +extern void xfs_trans_unreserve_and_mod_dquots(struct xfs_trans *);
> +extern int xfs_trans_reserve_quota_nblks(struct xfs_trans *,
> +		struct xfs_inode *, long, long, uint);
> +extern int xfs_trans_reserve_quota_bydquots(struct xfs_trans *,
> +		struct xfs_mount *, struct xfs_dquot *,
> +		struct xfs_dquot *, long, long, uint);
> +
> +extern int xfs_qm_vop_dqalloc(struct xfs_inode *, uid_t, gid_t, prid_t, uint,
> +		struct xfs_dquot **, struct xfs_dquot **);
> +extern void xfs_qm_vop_create_dqattach(struct xfs_trans *, struct xfs_inode *,
> +		struct xfs_dquot *, struct xfs_dquot *);
> +extern int xfs_qm_vop_rename_dqattach(struct xfs_inode **);
> +extern struct xfs_dquot *xfs_qm_vop_chown(struct xfs_trans *,
> +		struct xfs_inode *, struct xfs_dquot **, struct xfs_dquot *);
> +extern int xfs_qm_vop_chown_reserve(struct xfs_trans *, struct xfs_inode *,
> +		struct xfs_dquot *, struct xfs_dquot *, uint);
> +extern int xfs_qm_dqattach(struct xfs_inode *, uint);
> +extern int xfs_qm_dqattach_locked(struct xfs_inode *, uint);
> +extern void xfs_qm_dqdetach(struct xfs_inode *);
> +extern void xfs_qm_dqrele(struct xfs_dquot *);
> +extern void xfs_qm_statvfs(struct xfs_inode *, struct kstatfs *);
> +extern int xfs_qm_sync(struct xfs_mount *, int);
> +extern int xfs_qm_newmount(struct xfs_mount *, uint *, uint *);
> +extern void xfs_qm_mount_quotas(struct xfs_mount *);
> +extern void xfs_qm_unmount(struct xfs_mount *);
> +extern void xfs_qm_unmount_quotas(struct xfs_mount *);
> +
> +#else
> +#define xfs_trans_dup_dqinfo(tp, tp2)
> +#define xfs_trans_free_dqinfo(tp)
> +#define xfs_trans_mod_dquot_byino(tp, ip, fields, delta)
> +#define xfs_trans_apply_dquot_deltas(tp)
> +#define xfs_trans_unreserve_and_mod_dquots(tp)
> +#define xfs_trans_reserve_quota_nblks(tp, ip, nblks, ninos, flags)	(0)
> +#define xfs_trans_reserve_quota_bydquots(tp, mp, u, g, nb, ni, fl)	(0)
> +#define xfs_qm_vop_dqalloc(ip, uid, gid, prid, fl, ou, og)		(0)
> +#define xfs_qm_vop_create_dqattach(tp, ip, u, g)
> +#define xfs_qm_vop_rename_dqattach(it)					(0)
> +#define xfs_qm_vop_chown(tp, ip, old, new)				(NULL)
> +#define xfs_qm_vop_chown_reserve(tp, ip, u, g, fl)			(0)
> +#define xfs_qm_dqattach(ip, fl)						(0)
> +#define xfs_qm_dqattach_locked(ip, fl)					(0)
> +#define xfs_qm_dqdetach(ip)
> +#define xfs_qm_dqrele(d)
> +#define xfs_qm_statvfs(ip, s)
> +#define xfs_qm_sync(mp, fl)						(0)
> +#define xfs_qm_newmount(mp, a, b)					(0)
> +#define xfs_qm_mount_quotas(mp)
> +#define xfs_qm_unmount(mp)
> +#define xfs_qm_unmount_quotas(mp)					(0)
> +#endif /* CONFIG_XFS_QUOTA */
> +
> +#define xfs_trans_unreserve_quota_nblks(tp, ip, nblks, ninos, flags) \
> +	xfs_trans_reserve_quota_nblks(tp, ip, -(nblks), -(ninos), flags)
> +#define xfs_trans_reserve_quota(tp, mp, ud, gd, nb, ni, f) \
> +	xfs_trans_reserve_quota_bydquots(tp, mp, ud, gd, nb, ni, \
>  				f | XFS_QMOPT_RES_REGBLKS)
>  
>  extern int xfs_qm_dqcheck(xfs_disk_dquot_t *, xfs_dqid_t, uint, uint, char *);
>  extern int xfs_mount_reset_sbqflags(struct xfs_mount *);
>  
> -extern struct xfs_qmops xfs_qmcore_xfs;
> -
>  #endif	/* __KERNEL__ */
> -
>  #endif	/* __XFS_QUOTA_H__ */
> Index: xfs/fs/xfs/xfs_trans.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_trans.c	2009-02-24 15:32:16.093370321 +0100
> +++ xfs/fs/xfs/xfs_trans.c	2009-02-24 15:32:35.847494368 +0100
> @@ -297,7 +297,7 @@ xfs_trans_dup(
>  	tp->t_rtx_res = tp->t_rtx_res_used;
>  	ntp->t_pflags = tp->t_pflags;
>  
> -	XFS_TRANS_DUP_DQINFO(tp->t_mountp, tp, ntp);
> +	xfs_trans_dup_dqinfo(tp, ntp);
>  
>  	atomic_inc(&tp->t_mountp->m_active_trans);
>  	return ntp;
> @@ -831,7 +831,7 @@ shut_us_down:
>  		 * means is that we have some (non-persistent) quota
>  		 * reservations that need to be unreserved.
>  		 */
> -		XFS_TRANS_UNRESERVE_AND_MOD_DQUOTS(mp, tp);
> +		xfs_trans_unreserve_and_mod_dquots(tp);
>  		if (tp->t_ticket) {
>  			commit_lsn = xfs_log_done(mp, tp->t_ticket,
>  							NULL, log_flags);
> @@ -850,10 +850,9 @@ shut_us_down:
>  	/*
>  	 * If we need to update the superblock, then do it now.
>  	 */
> -	if (tp->t_flags & XFS_TRANS_SB_DIRTY) {
> +	if (tp->t_flags & XFS_TRANS_SB_DIRTY)
>  		xfs_trans_apply_sb_deltas(tp);
> -	}
> -	XFS_TRANS_APPLY_DQUOT_DELTAS(mp, tp);
> +	xfs_trans_apply_dquot_deltas(tp);
>  
>  	/*
>  	 * Ask each log item how many log_vector entries it will
> @@ -1058,7 +1057,7 @@ xfs_trans_uncommit(
>  	}
>  
>  	xfs_trans_unreserve_and_mod_sb(tp);
> -	XFS_TRANS_UNRESERVE_AND_MOD_DQUOTS(tp->t_mountp, tp);
> +	xfs_trans_unreserve_and_mod_dquots(tp);
>  
>  	xfs_trans_free_items(tp, flags);
>  	xfs_trans_free_busy(tp);
> @@ -1183,7 +1182,7 @@ xfs_trans_cancel(
>  	}
>  #endif
>  	xfs_trans_unreserve_and_mod_sb(tp);
> -	XFS_TRANS_UNRESERVE_AND_MOD_DQUOTS(mp, tp);
> +	xfs_trans_unreserve_and_mod_dquots(tp);
>  
>  	if (tp->t_ticket) {
>  		if (flags & XFS_TRANS_RELEASE_LOG_RES) {
> @@ -1213,7 +1212,7 @@ xfs_trans_free(
>  	xfs_trans_t	*tp)
>  {
>  	atomic_dec(&tp->t_mountp->m_active_trans);
> -	XFS_TRANS_FREE_DQINFO(tp->t_mountp, tp);
> +	xfs_trans_free_dqinfo(tp);
>  	kmem_zone_free(xfs_trans_zone, tp);
>  }
>  
> Index: xfs/fs/xfs/xfs_utils.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_utils.c	2009-02-24 15:32:16.098369701 +0100
> +++ xfs/fs/xfs/xfs_utils.c	2009-02-24 15:32:35.848494914 +0100
> @@ -166,7 +166,7 @@ xfs_dir_ialloc(
>  			xfs_buf_relse(ialloc_context);
>  			if (dqinfo) {
>  				tp->t_dqinfo = dqinfo;
> -				XFS_TRANS_FREE_DQINFO(tp->t_mountp, tp);
> +				xfs_trans_free_dqinfo(tp);
>  			}
>  			*tpp = ntp;
>  			*ipp = NULL;
> Index: xfs/fs/xfs/xfs_bmap.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_bmap.c	2009-02-24 15:32:16.102370140 +0100
> +++ xfs/fs/xfs/xfs_bmap.c	2009-02-24 15:32:35.853494922 +0100
> @@ -2691,7 +2691,7 @@ xfs_bmap_rtalloc(
>  		 * Adjust the disk quota also. This was reserved
>  		 * earlier.
>  		 */
> -		XFS_TRANS_MOD_DQUOT_BYINO(mp, ap->tp, ap->ip,
> +		xfs_trans_mod_dquot_byino(ap->tp, ap->ip,
>  			ap->wasdel ? XFS_TRANS_DQ_DELRTBCOUNT :
>  					XFS_TRANS_DQ_RTBCOUNT, (long) ralen);
>  	} else {
> @@ -2995,7 +2995,7 @@ xfs_bmap_btalloc(
>  		 * Adjust the disk quota also. This was reserved
>  		 * earlier.
>  		 */
> -		XFS_TRANS_MOD_DQUOT_BYINO(mp, ap->tp, ap->ip,
> +		xfs_trans_mod_dquot_byino(ap->tp, ap->ip,
>  			ap->wasdel ? XFS_TRANS_DQ_DELBCOUNT :
>  					XFS_TRANS_DQ_BCOUNT,
>  			(long) args.len);
> @@ -3066,7 +3066,7 @@ xfs_bmap_btree_to_extents(
>  		return error;
>  	xfs_bmap_add_free(cbno, 1, cur->bc_private.b.flist, mp);
>  	ip->i_d.di_nblocks--;
> -	XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, XFS_TRANS_DQ_BCOUNT, -1L);
> +	xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L);
>  	xfs_trans_binval(tp, cbp);
>  	if (cur->bc_bufs[0] == cbp)
>  		cur->bc_bufs[0] = NULL;
> @@ -3386,7 +3386,7 @@ xfs_bmap_del_extent(
>  	 * Adjust quota data.
>  	 */
>  	if (qfield)
> -		XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, qfield, (long)-nblks);
> +		xfs_trans_mod_dquot_byino(tp, ip, qfield, (long)-nblks);
>  
>  	/*
>  	 * Account for change in delayed indirect blocks.
> @@ -3523,7 +3523,7 @@ xfs_bmap_extents_to_btree(
>  	*firstblock = cur->bc_private.b.firstblock = args.fsbno;
>  	cur->bc_private.b.allocated++;
>  	ip->i_d.di_nblocks++;
> -	XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, XFS_TRANS_DQ_BCOUNT, 1L);
> +	xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, 1L);
>  	abp = xfs_btree_get_bufl(mp, tp, args.fsbno, 0);
>  	/*
>  	 * Fill in the child block.
> @@ -3666,7 +3666,7 @@ xfs_bmap_local_to_extents(
>  		XFS_BMAP_TRACE_POST_UPDATE("new", ip, 0, whichfork);
>  		XFS_IFORK_NEXT_SET(ip, whichfork, 1);
>  		ip->i_d.di_nblocks = 1;
> -		XFS_TRANS_MOD_DQUOT_BYINO(args.mp, tp, ip,
> +		xfs_trans_mod_dquot_byino(tp, ip,
>  			XFS_TRANS_DQ_BCOUNT, 1L);
>  		flags |= xfs_ilog_fext(whichfork);
>  	} else {
> @@ -4024,7 +4024,7 @@ xfs_bmap_add_attrfork(
>  			XFS_TRANS_PERM_LOG_RES, XFS_ADDAFORK_LOG_COUNT)))
>  		goto error0;
>  	xfs_ilock(ip, XFS_ILOCK_EXCL);
> -	error = XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip, blks, 0, rsvd ?
> +	error = xfs_trans_reserve_quota_nblks(tp, ip, blks, 0, rsvd ?
>  			XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_FORCE_RES :
>  			XFS_QMOPT_RES_REGBLKS);
>  	if (error) {
> @@ -4959,10 +4959,11 @@ xfs_bmapi(
>  				 * adjusted later.  We return if we haven't
>  				 * allocated blocks already inside this loop.
>  				 */
> -				if ((error = XFS_TRANS_RESERVE_QUOTA_NBLKS(
> -						mp, NULL, ip, (long)alen, 0,
> +				error = xfs_trans_reserve_quota_nblks(
> +						NULL, ip, (long)alen, 0,
>  						rt ? XFS_QMOPT_RES_RTBLKS :
> -						     XFS_QMOPT_RES_REGBLKS))) {
> +						     XFS_QMOPT_RES_REGBLKS);
> +				if (error) {
>  					if (n == 0) {
>  						*nmap = 0;
>  						ASSERT(cur == NULL);
> @@ -5011,8 +5012,8 @@ xfs_bmapi(
>  					if (XFS_IS_QUOTA_ON(mp))
>  						/* unreserve the blocks now */
>  						(void)
> -						XFS_TRANS_UNRESERVE_QUOTA_NBLKS(
> -							mp, NULL, ip,
> +						xfs_trans_unreserve_quota_nblks(
> +							NULL, ip,
>  							(long)alen, 0, rt ?
>  							XFS_QMOPT_RES_RTBLKS :
>  							XFS_QMOPT_RES_REGBLKS);
> @@ -5667,14 +5668,14 @@ xfs_bunmapi(
>  				do_div(rtexts, mp->m_sb.sb_rextsize);
>  				xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS,
>  						(int64_t)rtexts, rsvd);
> -				(void)XFS_TRANS_RESERVE_QUOTA_NBLKS(mp,
> -					NULL, ip, -((long)del.br_blockcount), 0,
> +				(void)xfs_trans_reserve_quota_nblks(NULL,
> +					ip, -((long)del.br_blockcount), 0,
>  					XFS_QMOPT_RES_RTBLKS);
>  			} else {
>  				xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS,
>  						(int64_t)del.br_blockcount, rsvd);
> -				(void)XFS_TRANS_RESERVE_QUOTA_NBLKS(mp,
> -					NULL, ip, -((long)del.br_blockcount), 0,
> +				(void)xfs_trans_reserve_quota_nblks(NULL,
> +					ip, -((long)del.br_blockcount), 0,
>  					XFS_QMOPT_RES_REGBLKS);
>  			}
>  			ip->i_delayed_blks -= del.br_blockcount;
> Index: xfs/fs/xfs/xfs_bmap_btree.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_bmap_btree.c	2009-02-24 15:32:16.106369811 +0100
> +++ xfs/fs/xfs/xfs_bmap_btree.c	2009-02-24 15:32:35.854494491 +0100
> @@ -590,7 +590,7 @@ xfs_bmbt_alloc_block(
>  	cur->bc_private.b.allocated++;
>  	cur->bc_private.b.ip->i_d.di_nblocks++;
>  	xfs_trans_log_inode(args.tp, cur->bc_private.b.ip, XFS_ILOG_CORE);
> -	XFS_TRANS_MOD_DQUOT_BYINO(args.mp, args.tp, cur->bc_private.b.ip,
> +	xfs_trans_mod_dquot_byino(args.tp, cur->bc_private.b.ip,
>  			XFS_TRANS_DQ_BCOUNT, 1L);
>  
>  	new->l = cpu_to_be64(args.fsbno);
> @@ -618,7 +618,7 @@ xfs_bmbt_free_block(
>  	ip->i_d.di_nblocks--;
>  
>  	xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
> -	XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, XFS_TRANS_DQ_BCOUNT, -1L);
> +	xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L);
>  	xfs_trans_binval(tp, bp);
>  	return 0;
>  }
> Index: xfs/fs/xfs/xfs_vnodeops.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_vnodeops.c	2009-02-24 15:32:16.111370238 +0100
> +++ xfs/fs/xfs/xfs_vnodeops.c	2009-02-24 15:32:35.855495805 +0100
> @@ -118,7 +118,7 @@ xfs_setattr(
>  		 */
>  		ASSERT(udqp == NULL);
>  		ASSERT(gdqp == NULL);
> -		code = XFS_QM_DQVOPALLOC(mp, ip, uid, gid, ip->i_d.di_projid,
> +		code = xfs_qm_vop_dqalloc(ip, uid, gid, ip->i_d.di_projid,
>  					 qflags, &udqp, &gdqp);
>  		if (code)
>  			return code;
> @@ -183,7 +183,7 @@ xfs_setattr(
>  		if ((XFS_IS_UQUOTA_ON(mp) && iuid != uid) ||
>  		    (XFS_IS_GQUOTA_ON(mp) && igid != gid)) {
>  			ASSERT(tp);
> -			code = XFS_QM_DQVOPCHOWNRESV(mp, tp, ip, udqp, gdqp,
> +			code = xfs_qm_vop_chown_reserve(tp, ip, udqp, gdqp,
>  						capable(CAP_FOWNER) ?
>  						XFS_QMOPT_FORCE_RES : 0);
>  			if (code)	/* out of quota */
> @@ -217,7 +217,7 @@ xfs_setattr(
>  		/*
>  		 * Make sure that the dquots are attached to the inode.
>  		 */
> -		code = XFS_QM_DQATTACH(mp, ip, XFS_QMOPT_ILOCKED);
> +		code = xfs_qm_dqattach_locked(ip, 0);
>  		if (code)
>  			goto error_return;
>  
> @@ -354,7 +354,7 @@ xfs_setattr(
>  			if (XFS_IS_UQUOTA_ON(mp)) {
>  				ASSERT(mask & ATTR_UID);
>  				ASSERT(udqp);
> -				olddquot1 = XFS_QM_DQVOPCHOWN(mp, tp, ip,
> +				olddquot1 = xfs_qm_vop_chown(tp, ip,
>  							&ip->i_udquot, udqp);
>  			}
>  			ip->i_d.di_uid = uid;
> @@ -365,7 +365,7 @@ xfs_setattr(
>  				ASSERT(!XFS_IS_PQUOTA_ON(mp));
>  				ASSERT(mask & ATTR_GID);
>  				ASSERT(gdqp);
> -				olddquot2 = XFS_QM_DQVOPCHOWN(mp, tp, ip,
> +				olddquot2 = xfs_qm_vop_chown(tp, ip,
>  							&ip->i_gdquot, gdqp);
>  			}
>  			ip->i_d.di_gid = gid;
> @@ -461,10 +461,10 @@ xfs_setattr(
>  	/*
>  	 * Release any dquot(s) the inode had kept before chown.
>  	 */
> -	XFS_QM_DQRELE(mp, olddquot1);
> -	XFS_QM_DQRELE(mp, olddquot2);
> -	XFS_QM_DQRELE(mp, udqp);
> -	XFS_QM_DQRELE(mp, gdqp);
> +	xfs_qm_dqrele(olddquot1);
> +	xfs_qm_dqrele(olddquot2);
> +	xfs_qm_dqrele(udqp);
> +	xfs_qm_dqrele(gdqp);
>  
>  	if (code) {
>  		return code;
> @@ -482,8 +482,8 @@ xfs_setattr(
>  	commit_flags |= XFS_TRANS_ABORT;
>  	/* FALLTHROUGH */
>   error_return:
> -	XFS_QM_DQRELE(mp, udqp);
> -	XFS_QM_DQRELE(mp, gdqp);
> +	xfs_qm_dqrele(udqp);
> +	xfs_qm_dqrele(gdqp);
>  	if (tp) {
>  		xfs_trans_cancel(tp, commit_flags);
>  	}
> @@ -739,7 +739,8 @@ xfs_free_eofblocks(
>  		/*
>  		 * Attach the dquots to the inode up front.
>  		 */
> -		if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
> +		error = xfs_qm_dqattach(ip, 0);
> +		if (error)
>  			return error;
>  
>  		/*
> @@ -1181,7 +1182,8 @@ xfs_inactive(
>  
>  	ASSERT(ip->i_d.di_nlink == 0);
>  
> -	if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
> +	error = xfs_qm_dqattach(ip, 0);
> +	if (error)
>  		return VN_INACTIVE_CACHE;
>  
>  	tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE);
> @@ -1307,7 +1309,7 @@ xfs_inactive(
>  		/*
>  		 * Credit the quota account(s). The inode is gone.
>  		 */
> -		XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, XFS_TRANS_DQ_ICOUNT, -1);
> +		xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_ICOUNT, -1);
>  
>  		/*
>  		 * Just ignore errors at this point.  There is nothing we can
> @@ -1323,11 +1325,11 @@ xfs_inactive(
>  			xfs_fs_cmn_err(CE_NOTE, mp, "xfs_inactive: "
>  				"xfs_trans_commit() returned error %d", error);
>  	}
> +
>  	/*
>  	 * Release the dquots held by inode, if any.
>  	 */
> -	XFS_QM_DQDETACH(mp, ip);
> -
> +	xfs_qm_dqdetach(ip);
>  	xfs_iunlock(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
>  
>   out:
> @@ -1398,14 +1400,16 @@ xfs_create(
>  	uint			cancel_flags;
>  	int			committed;
>  	xfs_prid_t		prid;
> -	struct xfs_dquot	*udqp = NULL;
> -	struct xfs_dquot	*gdqp = NULL;
> +	struct xfs_dquot	*udqp, *gdqp;
>  	uint			resblks;
>  	uint			log_res;
>  	uint			log_count;
>  
>  	xfs_itrace_entry(dp);
>  
> +	udqp = NULL;
> +	gdqp = NULL;
> +
>  	if (XFS_FORCED_SHUTDOWN(mp))
>  		return XFS_ERROR(EIO);
>  
> @@ -1427,8 +1431,7 @@ xfs_create(
>  	/*
>  	 * Make sure that we have allocated dquot(s) on disk.
>  	 */
> -	error = XFS_QM_DQVOPALLOC(mp, dp,
> -			current_fsuid(), current_fsgid(), prid,
> +	error = xfs_qm_vop_dqalloc(dp, current_fsuid(), current_fsgid(), prid,
>  			XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, &udqp, &gdqp);
>  	if (error)
>  		goto std_return;
> @@ -1482,7 +1485,7 @@ xfs_create(
>  	/*
>  	 * Reserve disk quota and the inode.
>  	 */
> -	error = XFS_TRANS_RESERVE_QUOTA(mp, tp, udqp, gdqp, resblks, 1, 0);
> +	error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp, resblks, 1, 0);
>  	if (error)
>  		goto out_trans_cancel;
>  
> @@ -1554,7 +1557,7 @@ xfs_create(
>  	 * These ids of the inode couldn't have changed since the new
>  	 * inode has been locked ever since it was created.
>  	 */
> -	XFS_QM_DQVOPCREATE(mp, tp, ip, udqp, gdqp);
> +	xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp);
>  
>  	/*
>  	 * xfs_trans_commit normally decrements the vnode ref count
> @@ -1573,8 +1576,8 @@ xfs_create(
>  		goto out_dqrele;
>  	}
>  
> -	XFS_QM_DQRELE(mp, udqp);
> -	XFS_QM_DQRELE(mp, gdqp);
> +	xfs_qm_dqrele(udqp);
> +	xfs_qm_dqrele(gdqp);
>  
>  	*ipp = ip;
>  
> @@ -1595,8 +1598,8 @@ xfs_create(
>   out_trans_cancel:
>  	xfs_trans_cancel(tp, cancel_flags);
>   out_dqrele:
> -	XFS_QM_DQRELE(mp, udqp);
> -	XFS_QM_DQRELE(mp, gdqp);
> +	xfs_qm_dqrele(udqp);
> +	xfs_qm_dqrele(gdqp);
>  
>  	if (unlock_dp_on_error)
>  		xfs_iunlock(dp, XFS_ILOCK_EXCL);
> @@ -1830,11 +1833,11 @@ xfs_remove(
>  			return error;
>  	}
>  
> -	error = XFS_QM_DQATTACH(mp, dp, 0);
> +	error = xfs_qm_dqattach(dp, 0);
>  	if (error)
>  		goto std_return;
>  
> -	error = XFS_QM_DQATTACH(mp, ip, 0);
> +	error = xfs_qm_dqattach(ip, 0);
>  	if (error)
>  		goto std_return;
>  
> @@ -2021,11 +2024,11 @@ xfs_link(
>  
>  	/* Return through std_return after this point. */
>  
> -	error = XFS_QM_DQATTACH(mp, sip, 0);
> +	error = xfs_qm_dqattach(sip, 0);
>  	if (error)
>  		goto std_return;
>  
> -	error = XFS_QM_DQATTACH(mp, tdp, 0);
> +	error = xfs_qm_dqattach(tdp, 0);
>  	if (error)
>  		goto std_return;
>  
> @@ -2198,8 +2201,7 @@ xfs_symlink(
>  	/*
>  	 * Make sure that we have allocated dquot(s) on disk.
>  	 */
> -	error = XFS_QM_DQVOPALLOC(mp, dp,
> -			current_fsuid(), current_fsgid(), prid,
> +	error = xfs_qm_vop_dqalloc(dp, current_fsuid(), current_fsgid(), prid,
>  			XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, &udqp, &gdqp);
>  	if (error)
>  		goto std_return;
> @@ -2241,7 +2243,7 @@ xfs_symlink(
>  	/*
>  	 * Reserve disk quota : blocks and inode.
>  	 */
> -	error = XFS_TRANS_RESERVE_QUOTA(mp, tp, udqp, gdqp, resblks, 1, 0);
> +	error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp, resblks, 1, 0);
>  	if (error)
>  		goto error_return;
>  
> @@ -2281,7 +2283,7 @@ xfs_symlink(
>  	/*
>  	 * Also attach the dquot(s) to it, if applicable.
>  	 */
> -	XFS_QM_DQVOPCREATE(mp, tp, ip, udqp, gdqp);
> +	xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp);
>  
>  	if (resblks)
>  		resblks -= XFS_IALLOC_SPACE_RES(mp);
> @@ -2369,8 +2371,8 @@ xfs_symlink(
>  		goto error2;
>  	}
>  	error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES);
> -	XFS_QM_DQRELE(mp, udqp);
> -	XFS_QM_DQRELE(mp, gdqp);
> +	xfs_qm_dqrele(udqp);
> +	xfs_qm_dqrele(gdqp);
>  
>  	/* Fall through to std_return with error = 0 or errno from
>  	 * xfs_trans_commit	*/
> @@ -2394,8 +2396,8 @@ std_return:
>  	cancel_flags |= XFS_TRANS_ABORT;
>   error_return:
>  	xfs_trans_cancel(tp, cancel_flags);
> -	XFS_QM_DQRELE(mp, udqp);
> -	XFS_QM_DQRELE(mp, gdqp);
> +	xfs_qm_dqrele(udqp);
> +	xfs_qm_dqrele(gdqp);
>  
>  	if (unlock_dp_on_error)
>  		xfs_iunlock(dp, XFS_ILOCK_EXCL);
> @@ -2534,7 +2536,8 @@ xfs_alloc_file_space(
>  	if (XFS_FORCED_SHUTDOWN(mp))
>  		return XFS_ERROR(EIO);
>  
> -	if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
> +	error = xfs_qm_dqattach(ip, 0);
> +	if (error)
>  		return error;
>  
>  	if (len <= 0)
> @@ -2621,8 +2624,8 @@ retry:
>  			break;
>  		}
>  		xfs_ilock(ip, XFS_ILOCK_EXCL);
> -		error = XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip,
> -						      qblocks, 0, quota_flag);
> +		error = xfs_trans_reserve_quota_nblks(tp, ip, qblocks,
> +						      0, quota_flag);
>  		if (error)
>  			goto error1;
>  
> @@ -2681,7 +2684,7 @@ dmapi_enospc_check:
>  
>  error0:	/* Cancel bmap, unlock inode, unreserve quota blocks, cancel trans */
>  	xfs_bmap_cancel(&free_list);
> -	XFS_TRANS_UNRESERVE_QUOTA_NBLKS(mp, tp, ip, qblocks, 0, quota_flag);
> +	xfs_trans_unreserve_quota_nblks(tp, ip, qblocks, 0, quota_flag);
>  
>  error1:	/* Just cancel transaction */
>  	xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT);
> @@ -2820,7 +2823,8 @@ xfs_free_file_space(
>  
>  	xfs_itrace_entry(ip);
>  
> -	if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
> +	error = xfs_qm_dqattach(ip, 0);
> +	if (error)
>  		return error;
>  
>  	error = 0;
> @@ -2946,9 +2950,9 @@ xfs_free_file_space(
>  			break;
>  		}
>  		xfs_ilock(ip, XFS_ILOCK_EXCL);
> -		error = XFS_TRANS_RESERVE_QUOTA(mp, tp,
> -				ip->i_udquot, ip->i_gdquot, resblks, 0,
> -				XFS_QMOPT_RES_REGBLKS);
> +		error = xfs_trans_reserve_quota(tp, mp,
> +				ip->i_udquot, ip->i_gdquot,
> +				resblks, 0, XFS_QMOPT_RES_REGBLKS);
>  		if (error)
>  			goto error1;
>  
> Index: xfs/fs/xfs/quota/xfs_qm.h
> ===================================================================
> --- xfs.orig/fs/xfs/quota/xfs_qm.h	2009-02-24 15:32:16.067369944 +0100
> +++ xfs/fs/xfs/quota/xfs_qm.h	2009-02-24 15:32:35.856495653 +0100
> @@ -127,8 +127,6 @@ typedef struct xfs_quotainfo {
>  } xfs_quotainfo_t;
>  
>  
> -extern xfs_dqtrxops_t	xfs_trans_dquot_ops;
> -
>  extern void	xfs_trans_mod_dquot(xfs_trans_t *, xfs_dquot_t *, uint, long);
>  extern int	xfs_trans_reserve_quota_bydquots(xfs_trans_t *, xfs_mount_t *,
>  			xfs_dquot_t *, xfs_dquot_t *, long, long, uint);
> @@ -159,17 +157,11 @@ typedef struct xfs_dquot_acct {
>  #define XFS_QM_RTBWARNLIMIT	5
>  
>  extern void		xfs_qm_destroy_quotainfo(xfs_mount_t *);
> -extern void		xfs_qm_mount_quotas(xfs_mount_t *);
>  extern int		xfs_qm_quotacheck(xfs_mount_t *);
> -extern void		xfs_qm_unmount_quotadestroy(xfs_mount_t *);
> -extern void		xfs_qm_unmount_quotas(xfs_mount_t *);
>  extern int		xfs_qm_write_sb_changes(xfs_mount_t *, __int64_t);
> -extern int		xfs_qm_sync(xfs_mount_t *, int);
>  
>  /* dquot stuff */
>  extern boolean_t	xfs_qm_dqalloc_incore(xfs_dquot_t **);
> -extern int		xfs_qm_dqattach(xfs_inode_t *, uint);
> -extern void		xfs_qm_dqdetach(xfs_inode_t *);
>  extern int		xfs_qm_dqpurge_all(xfs_mount_t *, uint);
>  extern void		xfs_qm_dqrele_all_inodes(xfs_mount_t *, uint);
>  
> @@ -183,19 +175,6 @@ extern int		xfs_qm_scall_getqstat(xfs_mo
>  extern int		xfs_qm_scall_quotaon(xfs_mount_t *, uint);
>  extern int		xfs_qm_scall_quotaoff(xfs_mount_t *, uint);
>  
> -/* vop stuff */
> -extern int		xfs_qm_vop_dqalloc(xfs_mount_t *, xfs_inode_t *,
> -					uid_t, gid_t, prid_t, uint,
> -					xfs_dquot_t **, xfs_dquot_t **);
> -extern void		xfs_qm_vop_dqattach_and_dqmod_newinode(
> -					xfs_trans_t *, xfs_inode_t *,
> -					xfs_dquot_t *, xfs_dquot_t *);
> -extern int		xfs_qm_vop_rename_dqattach(xfs_inode_t **);
> -extern xfs_dquot_t *	xfs_qm_vop_chown(xfs_trans_t *, xfs_inode_t *,
> -					xfs_dquot_t **, xfs_dquot_t *);
> -extern int		xfs_qm_vop_chown_reserve(xfs_trans_t *, xfs_inode_t *,
> -					xfs_dquot_t *, xfs_dquot_t *, uint);
> -
>  /* list stuff */
>  extern void		xfs_qm_freelist_append(xfs_frlist_t *, xfs_dquot_t *);
>  extern void		xfs_qm_freelist_unlink(xfs_dquot_t *);
> Index: xfs/fs/xfs/quota/xfs_qm_bhv.c
> ===================================================================
> --- xfs.orig/fs/xfs/quota/xfs_qm_bhv.c	2009-02-24 15:32:16.071370174 +0100
> +++ xfs/fs/xfs/quota/xfs_qm_bhv.c	2009-02-24 15:32:35.856495653 +0100
> @@ -84,7 +84,7 @@ xfs_fill_statvfs_from_dquot(
>   * return a statvfs of the project, not the entire filesystem.
>   * This makes such trees appear as if they are filesystems in themselves.
>   */
> -STATIC void
> +void
>  xfs_qm_statvfs(
>  	xfs_inode_t		*ip,
>  	struct kstatfs		*statp)
> @@ -92,20 +92,13 @@ xfs_qm_statvfs(
>  	xfs_mount_t		*mp = ip->i_mount;
>  	xfs_dquot_t		*dqp;
>  
> -	if (!(ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) ||
> -	    !((mp->m_qflags & (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))) ==
> -	    		      (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))
> -		return;
> -
>  	if (!xfs_qm_dqget(mp, NULL, ip->i_d.di_projid, XFS_DQ_PROJ, 0, &dqp)) {
> -		xfs_disk_dquot_t	*dp = &dqp->q_core;
> -
> -		xfs_fill_statvfs_from_dquot(statp, dp);
> +		xfs_fill_statvfs_from_dquot(statp, &dqp->q_core);
>  		xfs_qm_dqput(dqp);
>  	}
>  }
>  
> -STATIC int
> +int
>  xfs_qm_newmount(
>  	xfs_mount_t	*mp,
>  	uint		*needquotamount,
> @@ -114,9 +107,6 @@ xfs_qm_newmount(
>  	uint		quotaondisk;
>  	uint		uquotaondisk = 0, gquotaondisk = 0, pquotaondisk = 0;
>  
> -	*quotaflags = 0;
> -	*needquotamount = B_FALSE;
> -
>  	quotaondisk = xfs_sb_version_hasquota(&mp->m_sb) &&
>  				(mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT);
>  
> @@ -179,66 +169,6 @@ xfs_qm_newmount(
>  	return 0;
>  }
>  
> -STATIC int
> -xfs_qm_endmount(
> -	xfs_mount_t	*mp,
> -	uint		needquotamount,
> -	uint		quotaflags)
> -{
> -	if (needquotamount) {
> -		ASSERT(mp->m_qflags == 0);
> -		mp->m_qflags = quotaflags;
> -		xfs_qm_mount_quotas(mp);
> -	}
> -
> -#if defined(DEBUG) && defined(XFS_LOUD_RECOVERY)
> -	if (! (XFS_IS_QUOTA_ON(mp)))
> -		xfs_fs_cmn_err(CE_NOTE, mp, "Disk quotas not turned on");
> -	else
> -		xfs_fs_cmn_err(CE_NOTE, mp, "Disk quotas turned on");
> -#endif
> -
> -#ifdef QUOTADEBUG
> -	if (XFS_IS_QUOTA_ON(mp) && xfs_qm_internalqcheck(mp))
> -		cmn_err(CE_WARN, "XFS: mount internalqcheck failed");
> -#endif
> -
> -	return 0;
> -}
> -
> -STATIC void
> -xfs_qm_dqrele_null(
> -	xfs_dquot_t	*dq)
> -{
> -	/*
> -	 * Called from XFS, where we always check first for a NULL dquot.
> -	 */
> -	if (!dq)
> -		return;
> -	xfs_qm_dqrele(dq);
> -}
> -
> -
> -struct xfs_qmops xfs_qmcore_xfs = {
> -	.xfs_qminit		= xfs_qm_newmount,
> -	.xfs_qmdone		= xfs_qm_unmount_quotadestroy,
> -	.xfs_qmmount		= xfs_qm_endmount,
> -	.xfs_qmunmount		= xfs_qm_unmount_quotas,
> -	.xfs_dqrele		= xfs_qm_dqrele_null,
> -	.xfs_dqattach		= xfs_qm_dqattach,
> -	.xfs_dqdetach		= xfs_qm_dqdetach,
> -	.xfs_dqpurgeall		= xfs_qm_dqpurge_all,
> -	.xfs_dqvopalloc		= xfs_qm_vop_dqalloc,
> -	.xfs_dqvopcreate	= xfs_qm_vop_dqattach_and_dqmod_newinode,
> -	.xfs_dqvoprename	= xfs_qm_vop_rename_dqattach,
> -	.xfs_dqvopchown		= xfs_qm_vop_chown,
> -	.xfs_dqvopchownresv	= xfs_qm_vop_chown_reserve,
> -	.xfs_dqstatvfs		= xfs_qm_statvfs,
> -	.xfs_dqsync		= xfs_qm_sync,
> -	.xfs_dqtrxops		= &xfs_trans_dquot_ops,
> -};
> -EXPORT_SYMBOL(xfs_qmcore_xfs);
> -
>  void __init
>  xfs_qm_init(void)
>  {
> Index: xfs/fs/xfs/xfs_attr.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_attr.c	2009-02-24 15:32:16.115370119 +0100
> +++ xfs/fs/xfs/xfs_attr.c	2009-02-24 15:32:35.857495152 +0100
> @@ -249,8 +249,9 @@ xfs_attr_set_int(xfs_inode_t *dp, struct
>  	/*
>  	 * Attach the dquots to the inode.
>  	 */
> -	if ((error = XFS_QM_DQATTACH(mp, dp, 0)))
> -		return (error);
> +	error = xfs_qm_dqattach(dp, 0);
> +	if (error)
> +		return error;
>  
>  	/*
>  	 * If the inode doesn't have an attribute fork, add one.
> @@ -311,7 +312,7 @@ xfs_attr_set_int(xfs_inode_t *dp, struct
>  	}
>  	xfs_ilock(dp, XFS_ILOCK_EXCL);
>  
> -	error = XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, args.trans, dp, args.total, 0,
> +	error = xfs_trans_reserve_quota_nblks(args.trans, dp, args.total, 0,
>  				rsvd ? XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_FORCE_RES :
>  				       XFS_QMOPT_RES_REGBLKS);
>  	if (error) {
> @@ -501,8 +502,9 @@ xfs_attr_remove_int(xfs_inode_t *dp, str
>  	/*
>  	 * Attach the dquots to the inode.
>  	 */
> -	if ((error = XFS_QM_DQATTACH(mp, dp, 0)))
> -		return (error);
> +	error = xfs_qm_dqattach(dp, 0);
> +	if (error)
> +		return error;
>  
>  	/*
>  	 * Start our first transaction of the day.
> Index: xfs/fs/xfs/xfs_iomap.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_iomap.c	2009-02-24 15:32:16.119370349 +0100
> +++ xfs/fs/xfs/xfs_iomap.c	2009-02-24 15:32:35.858495489 +0100
> @@ -417,7 +417,7 @@ xfs_iomap_write_direct(
>  	 * Make sure that the dquots are there. This doesn't hold
>  	 * the ilock across a disk read.
>  	 */
> -	error = XFS_QM_DQATTACH(ip->i_mount, ip, XFS_QMOPT_ILOCKED);
> +	error = xfs_qm_dqattach_locked(ip, 0);
>  	if (error)
>  		return XFS_ERROR(error);
>  
> @@ -476,8 +476,7 @@ xfs_iomap_write_direct(
>  	if (error)
>  		goto error_out;
>  
> -	error = XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip,
> -					      qblocks, 0, quota_flag);
> +	error = xfs_trans_reserve_quota_nblks(tp, ip, qblocks, 0, quota_flag);
>  	if (error)
>  		goto error1;
>  
> @@ -527,7 +526,7 @@ xfs_iomap_write_direct(
>  
>  error0:	/* Cancel bmap, unlock inode, unreserve quota blocks, cancel trans */
>  	xfs_bmap_cancel(&free_list);
> -	XFS_TRANS_UNRESERVE_QUOTA_NBLKS(mp, tp, ip, qblocks, 0, quota_flag);
> +	xfs_trans_unreserve_quota_nblks(tp, ip, qblocks, 0, quota_flag);
>  
>  error1:	/* Just cancel transaction */
>  	xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT);
> @@ -620,7 +619,7 @@ xfs_iomap_write_delay(
>  	 * Make sure that the dquots are there. This doesn't hold
>  	 * the ilock across a disk read.
>  	 */
> -	error = XFS_QM_DQATTACH(mp, ip, XFS_QMOPT_ILOCKED);
> +	error = xfs_qm_dqattach_locked(ip, 0);
>  	if (error)
>  		return XFS_ERROR(error);
>  
> @@ -715,7 +714,8 @@ xfs_iomap_write_allocate(
>  	/*
>  	 * Make sure that the dquots are there.
>  	 */
> -	if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
> +	error = xfs_qm_dqattach(ip, 0);
> +	if (error)
>  		return XFS_ERROR(error);
>  
>  	offset_fsb = XFS_B_TO_FSBT(mp, offset);
> Index: xfs/fs/xfs/xfs_mount.h
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_mount.h	2009-02-24 15:32:16.124369938 +0100
> +++ xfs/fs/xfs/xfs_mount.h	2009-02-24 15:32:35.859495267 +0100
> @@ -18,6 +18,7 @@
>  #ifndef __XFS_MOUNT_H__
>  #define	__XFS_MOUNT_H__
>  
> +
>  typedef struct xfs_trans_reservations {
>  	uint	tr_write;	/* extent alloc trans */
>  	uint	tr_itruncate;	/* truncate trans */
> @@ -64,6 +65,8 @@ struct xfs_swapext;
>  struct xfs_mru_cache;
>  struct xfs_nameops;
>  struct xfs_ail;
> +struct xfs_quotainfo;
> +
>  
>  /*
>   * Prototypes and functions for the Data Migration subsystem.
> @@ -107,86 +110,6 @@ typedef struct xfs_dmops {
>  	(*(mp)->m_dm_ops->xfs_send_unmount)(mp,ip,right,mode,rval,fl)
>  
>  
> -/*
> - * Prototypes and functions for the Quota Management subsystem.
> - */
> -
> -struct xfs_dquot;
> -struct xfs_dqtrxops;
> -struct xfs_quotainfo;
> -
> -typedef int	(*xfs_qminit_t)(struct xfs_mount *, uint *, uint *);
> -typedef int	(*xfs_qmmount_t)(struct xfs_mount *, uint, uint);
> -typedef void	(*xfs_qmunmount_t)(struct xfs_mount *);
> -typedef void	(*xfs_qmdone_t)(struct xfs_mount *);
> -typedef void	(*xfs_dqrele_t)(struct xfs_dquot *);
> -typedef int	(*xfs_dqattach_t)(struct xfs_inode *, uint);
> -typedef void	(*xfs_dqdetach_t)(struct xfs_inode *);
> -typedef int	(*xfs_dqpurgeall_t)(struct xfs_mount *, uint);
> -typedef int	(*xfs_dqvopalloc_t)(struct xfs_mount *,
> -			struct xfs_inode *, uid_t, gid_t, prid_t, uint,
> -			struct xfs_dquot **, struct xfs_dquot **);
> -typedef void	(*xfs_dqvopcreate_t)(struct xfs_trans *, struct xfs_inode *,
> -			struct xfs_dquot *, struct xfs_dquot *);
> -typedef int	(*xfs_dqvoprename_t)(struct xfs_inode **);
> -typedef struct xfs_dquot * (*xfs_dqvopchown_t)(
> -			struct xfs_trans *, struct xfs_inode *,
> -			struct xfs_dquot **, struct xfs_dquot *);
> -typedef int	(*xfs_dqvopchownresv_t)(struct xfs_trans *, struct xfs_inode *,
> -			struct xfs_dquot *, struct xfs_dquot *, uint);
> -typedef void	(*xfs_dqstatvfs_t)(struct xfs_inode *, struct kstatfs *);
> -typedef int	(*xfs_dqsync_t)(struct xfs_mount *, int flags);
> -
> -typedef struct xfs_qmops {
> -	xfs_qminit_t		xfs_qminit;
> -	xfs_qmdone_t		xfs_qmdone;
> -	xfs_qmmount_t		xfs_qmmount;
> -	xfs_qmunmount_t		xfs_qmunmount;
> -	xfs_dqrele_t		xfs_dqrele;
> -	xfs_dqattach_t		xfs_dqattach;
> -	xfs_dqdetach_t		xfs_dqdetach;
> -	xfs_dqpurgeall_t	xfs_dqpurgeall;
> -	xfs_dqvopalloc_t	xfs_dqvopalloc;
> -	xfs_dqvopcreate_t	xfs_dqvopcreate;
> -	xfs_dqvoprename_t	xfs_dqvoprename;
> -	xfs_dqvopchown_t	xfs_dqvopchown;
> -	xfs_dqvopchownresv_t	xfs_dqvopchownresv;
> -	xfs_dqstatvfs_t		xfs_dqstatvfs;
> -	xfs_dqsync_t		xfs_dqsync;
> -	struct xfs_dqtrxops	*xfs_dqtrxops;
> -} xfs_qmops_t;
> -
> -#define XFS_QM_INIT(mp, mnt, fl) \
> -	(*(mp)->m_qm_ops->xfs_qminit)(mp, mnt, fl)
> -#define XFS_QM_MOUNT(mp, mnt, fl) \
> -	(*(mp)->m_qm_ops->xfs_qmmount)(mp, mnt, fl)
> -#define XFS_QM_UNMOUNT(mp) \
> -	(*(mp)->m_qm_ops->xfs_qmunmount)(mp)
> -#define XFS_QM_DONE(mp) \
> -	(*(mp)->m_qm_ops->xfs_qmdone)(mp)
> -#define XFS_QM_DQRELE(mp, dq) \
> -	(*(mp)->m_qm_ops->xfs_dqrele)(dq)
> -#define XFS_QM_DQATTACH(mp, ip, fl) \
> -	(*(mp)->m_qm_ops->xfs_dqattach)(ip, fl)
> -#define XFS_QM_DQDETACH(mp, ip) \
> -	(*(mp)->m_qm_ops->xfs_dqdetach)(ip)
> -#define XFS_QM_DQPURGEALL(mp, fl) \
> -	(*(mp)->m_qm_ops->xfs_dqpurgeall)(mp, fl)
> -#define XFS_QM_DQVOPALLOC(mp, ip, uid, gid, prid, fl, dq1, dq2) \
> -	(*(mp)->m_qm_ops->xfs_dqvopalloc)(mp, ip, uid, gid, prid, fl, dq1, dq2)
> -#define XFS_QM_DQVOPCREATE(mp, tp, ip, dq1, dq2) \
> -	(*(mp)->m_qm_ops->xfs_dqvopcreate)(tp, ip, dq1, dq2)
> -#define XFS_QM_DQVOPRENAME(mp, ip) \
> -	(*(mp)->m_qm_ops->xfs_dqvoprename)(ip)
> -#define XFS_QM_DQVOPCHOWN(mp, tp, ip, dqp, dq) \
> -	(*(mp)->m_qm_ops->xfs_dqvopchown)(tp, ip, dqp, dq)
> -#define XFS_QM_DQVOPCHOWNRESV(mp, tp, ip, dq1, dq2, fl) \
> -	(*(mp)->m_qm_ops->xfs_dqvopchownresv)(tp, ip, dq1, dq2, fl)
> -#define XFS_QM_DQSTATVFS(ip, statp) \
> -	(*(ip)->i_mount->m_qm_ops->xfs_dqstatvfs)(ip, statp)
> -#define XFS_QM_DQSYNC(mp, flags) \
> -	(*(mp)->m_qm_ops->xfs_dqsync)(mp, flags)
> -
>  #ifdef HAVE_PERCPU_SB
>  
>  /*
> @@ -516,8 +439,6 @@ extern int	xfs_sb_validate_fsb_count(str
>  
>  extern int	xfs_dmops_get(struct xfs_mount *);
>  extern void	xfs_dmops_put(struct xfs_mount *);
> -extern int	xfs_qmops_get(struct xfs_mount *);
> -extern void	xfs_qmops_put(struct xfs_mount *);
>  
>  extern struct xfs_dmops xfs_dmcore_xfs;
>  
> Index: xfs/fs/xfs/Makefile
> ===================================================================
> --- xfs.orig/fs/xfs/Makefile	2009-02-24 15:32:16.158369937 +0100
> +++ xfs/fs/xfs/Makefile	2009-02-24 15:32:35.859495267 +0100
> @@ -88,8 +88,7 @@ xfs-y				+= xfs_alloc.o \
>  				   xfs_utils.o \
>  				   xfs_vnodeops.o \
>  				   xfs_rw.o \
> -				   xfs_dmops.o \
> -				   xfs_qmops.o
> +				   xfs_dmops.o
>  
>  xfs-$(CONFIG_XFS_TRACE)		+= xfs_btree_trace.o \
>  				   xfs_dir2_trace.o
> Index: xfs/fs/xfs/linux-2.6/xfs_ioctl.c
> ===================================================================
> --- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl.c	2009-02-24 15:32:16.137370546 +0100
> +++ xfs/fs/xfs/linux-2.6/xfs_ioctl.c	2009-02-24 15:32:35.865370666 +0100
> @@ -907,7 +907,7 @@ xfs_ioctl_setattr(
>  	struct xfs_mount	*mp = ip->i_mount;
>  	struct xfs_trans	*tp;
>  	unsigned int		lock_flags = 0;
> -	struct xfs_dquot	*udqp = NULL, *gdqp = NULL;
> +	struct xfs_dquot	*udqp, *gdqp;
>  	struct xfs_dquot	*olddquot = NULL;
>  	int			code;
>  
> @@ -918,6 +918,9 @@ xfs_ioctl_setattr(
>  	if (XFS_FORCED_SHUTDOWN(mp))
>  		return XFS_ERROR(EIO);
>  
> +	udqp = NULL;
> +	gdqp = NULL;
> +
>  	/*
>  	 * If disk quotas is on, we make sure that the dquots do exist on disk,
>  	 * before we start any other transactions. Trying to do this later
> @@ -927,7 +930,7 @@ xfs_ioctl_setattr(
>  	 * because the i_*dquot fields will get updated anyway.
>  	 */
>  	if (XFS_IS_QUOTA_ON(mp) && (mask & FSX_PROJID)) {
> -		code = XFS_QM_DQVOPALLOC(mp, ip, ip->i_d.di_uid,
> +		code = xfs_qm_vop_dqalloc(ip, ip->i_d.di_uid,
>  					 ip->i_d.di_gid, fa->fsx_projid,
>  					 XFS_QMOPT_PQUOTA, &udqp, &gdqp);
>  		if (code)
> @@ -965,7 +968,7 @@ xfs_ioctl_setattr(
>  		if (XFS_IS_PQUOTA_ON(mp) &&
>  		    ip->i_d.di_projid != fa->fsx_projid) {
>  			ASSERT(tp);
> -			code = XFS_QM_DQVOPCHOWNRESV(mp, tp, ip, udqp, gdqp,
> +			code = xfs_qm_vop_chown_reserve(tp, ip, udqp, gdqp,
>  						capable(CAP_FOWNER) ?
>  						XFS_QMOPT_FORCE_RES : 0);
>  			if (code)	/* out of quota */
> @@ -1068,7 +1071,7 @@ xfs_ioctl_setattr(
>  		 */
>  		if (ip->i_d.di_projid != fa->fsx_projid) {
>  			if (XFS_IS_PQUOTA_ON(mp)) {
> -				olddquot = XFS_QM_DQVOPCHOWN(mp, tp, ip,
> +				olddquot = xfs_qm_vop_chown(tp, ip,
>  							&ip->i_gdquot, gdqp);
>  			}
>  			ip->i_d.di_projid = fa->fsx_projid;
> @@ -1114,9 +1117,9 @@ xfs_ioctl_setattr(
>  	/*
>  	 * Release any dquot(s) the inode had kept before chown.
>  	 */
> -	XFS_QM_DQRELE(mp, olddquot);
> -	XFS_QM_DQRELE(mp, udqp);
> -	XFS_QM_DQRELE(mp, gdqp);
> +	xfs_qm_dqrele(olddquot);
> +	xfs_qm_dqrele(udqp);
> +	xfs_qm_dqrele(gdqp);
>  
>  	if (code)
>  		return code;
> @@ -1130,8 +1133,8 @@ xfs_ioctl_setattr(
>  	return 0;
>  
>   error_return:
> -	XFS_QM_DQRELE(mp, udqp);
> -	XFS_QM_DQRELE(mp, gdqp);
> +	xfs_qm_dqrele(udqp);
> +	xfs_qm_dqrele(gdqp);
>  	xfs_trans_cancel(tp, 0);
>  	if (lock_flags)
>  		xfs_iunlock(ip, lock_flags);
> Index: xfs/fs/xfs/linux-2.6/xfs_super.c
> ===================================================================
> --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c	2009-02-24 15:32:16.141370566 +0100
> +++ xfs/fs/xfs/linux-2.6/xfs_super.c	2009-02-24 15:32:35.866394539 +0100
> @@ -416,6 +416,14 @@ xfs_parseargs(
>  		return EINVAL;
>  	}
>  
> +#ifndef CONFIG_XFS_QUOTA
> +	if (XFS_IS_QUOTA_RUNNING(mp)) {
> +		cmn_err(CE_WARN,
> +			"XFS: quota support not available in this kernel.");
> +		return EINVAL;
> +	}
> +#endif
> +
>  	if ((mp->m_qflags & (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE)) &&
>  	    (mp->m_qflags & (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE))) {
>  		cmn_err(CE_WARN,
> @@ -1110,7 +1118,6 @@ xfs_fs_put_super(
>  	xfs_freesb(mp);
>  	xfs_icsb_destroy_counters(mp);
>  	xfs_close_devices(mp);
> -	xfs_qmops_put(mp);
>  	xfs_dmops_put(mp);
>  	xfs_free_fsname(mp);
>  	kfree(mp);
> @@ -1180,6 +1187,7 @@ xfs_fs_statfs(
>  {
>  	struct xfs_mount	*mp = XFS_M(dentry->d_sb);
>  	xfs_sb_t		*sbp = &mp->m_sb;
> +	struct xfs_inode	*ip = XFS_I(dentry->d_inode);
>  	__uint64_t		fakeinos, id;
>  	xfs_extlen_t		lsize;
>  
> @@ -1214,7 +1222,10 @@ xfs_fs_statfs(
>  	statp->f_ffree = statp->f_files - (sbp->sb_icount - sbp->sb_ifree);
>  	spin_unlock(&mp->m_sb_lock);
>  
> -	XFS_QM_DQSTATVFS(XFS_I(dentry->d_inode), statp);
> +	if ((ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) ||
> +	    ((mp->m_qflags & (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))) ==
> +			      (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))
> +		xfs_qm_statvfs(ip, statp);
>  	return 0;
>  }
>  
> @@ -1422,16 +1433,13 @@ xfs_fs_fill_super(
>  	error = xfs_dmops_get(mp);
>  	if (error)
>  		goto out_free_fsname;
> -	error = xfs_qmops_get(mp);
> -	if (error)
> -		goto out_put_dmops;
>  
>  	if (silent)
>  		flags |= XFS_MFSI_QUIET;
>  
>  	error = xfs_open_devices(mp);
>  	if (error)
> -		goto out_put_qmops;
> +		goto out_put_dmops;
>  
>  	if (xfs_icsb_init_counters(mp))
>  		mp->m_flags |= XFS_MOUNT_NO_PERCPU_SB;
> @@ -1500,8 +1508,6 @@ xfs_fs_fill_super(
>   out_destroy_counters:
>  	xfs_icsb_destroy_counters(mp);
>  	xfs_close_devices(mp);
> - out_put_qmops:
> -	xfs_qmops_put(mp);
>   out_put_dmops:
>  	xfs_dmops_put(mp);
>   out_free_fsname:
> Index: xfs/fs/xfs/linux-2.6/xfs_sync.c
> ===================================================================
> --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c	2009-02-24 15:32:16.149399312 +0100
> +++ xfs/fs/xfs/linux-2.6/xfs_sync.c	2009-02-24 15:32:35.867425537 +0100
> @@ -43,6 +43,7 @@
>  #include "xfs_buf_item.h"
>  #include "xfs_inode_item.h"
>  #include "xfs_rw.h"
> +#include "xfs_quota.h"
>  
>  #include <linux/kthread.h>
>  #include <linux/freezer.h>
> @@ -311,12 +312,12 @@ xfs_quiesce_data(
>  
>  	/* push non-blocking */
>  	xfs_sync_inodes(mp, SYNC_DELWRI|SYNC_BDFLUSH);
> -	XFS_QM_DQSYNC(mp, SYNC_BDFLUSH);
> +	xfs_qm_sync(mp, SYNC_BDFLUSH);
>  	xfs_filestream_flush(mp);
>  
>  	/* push and block */
>  	xfs_sync_inodes(mp, SYNC_DELWRI|SYNC_WAIT|SYNC_IOWAIT);
> -	XFS_QM_DQSYNC(mp, SYNC_WAIT);
> +	xfs_qm_sync(mp, SYNC_WAIT);
>  
>  	/* write superblock and hoover up shutdown errors */
>  	error = xfs_sync_fsdata(mp, 0);
> @@ -482,7 +483,7 @@ xfs_sync_worker(
>  		xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE);
>  		xfs_reclaim_inodes(mp, 0, XFS_IFLUSH_DELWRI_ELSE_ASYNC);
>  		/* dgc: errors ignored here */
> -		error = XFS_QM_DQSYNC(mp, SYNC_BDFLUSH);
> +		error = xfs_qm_sync(mp, SYNC_BDFLUSH);
>  		error = xfs_sync_fsdata(mp, SYNC_BDFLUSH);
>  		if (xfs_log_need_covered(mp))
>  			error = xfs_commit_dummy_trans(mp, XFS_LOG_FORCE);
> Index: xfs/fs/xfs/quota/xfs_dquot.c
> ===================================================================
> --- xfs.orig/fs/xfs/quota/xfs_dquot.c	2009-02-24 15:32:16.080370342 +0100
> +++ xfs/fs/xfs/quota/xfs_dquot.c	2009-02-24 15:32:35.867425537 +0100
> @@ -1194,7 +1194,9 @@ void
>  xfs_qm_dqrele(
>  	xfs_dquot_t	*dqp)
>  {
> -	ASSERT(dqp);
> +	if (!dqp)
> +		return;
> +
>  	xfs_dqtrace_entry(dqp, "DQRELE");
>  
>  	xfs_dqlock(dqp);
> Index: xfs/fs/xfs/quota/xfs_dquot.h
> ===================================================================
> --- xfs.orig/fs/xfs/quota/xfs_dquot.h	2009-02-24 15:32:16.085370350 +0100
> +++ xfs/fs/xfs/quota/xfs_dquot.h	2009-02-24 15:32:35.868518762 +0100
> @@ -181,7 +181,6 @@ extern void		xfs_qm_adjust_dqlimits(xfs_
>  extern int		xfs_qm_dqget(xfs_mount_t *, xfs_inode_t *,
>  					xfs_dqid_t, uint, uint, xfs_dquot_t **);
>  extern void		xfs_qm_dqput(xfs_dquot_t *);
> -extern void		xfs_qm_dqrele(xfs_dquot_t *);
>  extern void		xfs_dqlock(xfs_dquot_t *);
>  extern void		xfs_dqlock2(xfs_dquot_t *, xfs_dquot_t *);
>  extern void		xfs_dqunlock(xfs_dquot_t *);
> Index: xfs/fs/xfs/quota/xfs_qm.c
> ===================================================================
> --- xfs.orig/fs/xfs/quota/xfs_qm.c	2009-02-24 15:32:16.076370112 +0100
> +++ xfs/fs/xfs/quota/xfs_qm.c	2009-02-24 15:32:35.869518471 +0100
> @@ -287,11 +287,13 @@ xfs_qm_rele_quotafs_ref(
>   * Just destroy the quotainfo structure.
>   */
>  void
> -xfs_qm_unmount_quotadestroy(
> -	xfs_mount_t	*mp)
> +xfs_qm_unmount(
> +	struct xfs_mount	*mp)
>  {
> -	if (mp->m_quotainfo)
> +	if (mp->m_quotainfo) {
> +		xfs_qm_dqpurge_all(mp, XFS_QMOPT_QUOTALL | XFS_QMOPT_UMOUNTING);
>  		xfs_qm_destroy_quotainfo(mp);
> +	}
>  }
>  
>  
> @@ -311,6 +313,9 @@ xfs_qm_mount_quotas(
>  	int		error = 0;
>  	uint		sbf;
>  
> +	if (!XFS_IS_QUOTA_RUNNING(mp))
> +		return;
> +
>  	/*
>  	 * If quotas on realtime volumes is not supported, we disable
>  	 * quotas immediately.
> @@ -323,8 +328,6 @@ xfs_qm_mount_quotas(
>  		goto write_changes;
>  	}
>  
> -	ASSERT(XFS_IS_QUOTA_RUNNING(mp));
> -
>  	/*
>  	 * Allocate the quotainfo structure inside the mount struct, and
>  	 * create quotainode(s), and change/rev superblock if necessary.
> @@ -385,8 +388,13 @@ xfs_qm_mount_quotas(
>  	if (error) {
>  		xfs_fs_cmn_err(CE_WARN, mp,
>  			"Failed to initialize disk quotas.");
> +		return;
>  	}
> -	return;
> +
> +#ifdef QUOTADEBUG
> +	if (XFS_IS_QUOTA_ON(mp))
> +		xfs_qm_internalqcheck(mp);
> +#endif
>  }
>  
>  /*
> @@ -774,12 +782,11 @@ xfs_qm_dqattach_grouphint(
>   * Given a locked inode, attach dquot(s) to it, taking U/G/P-QUOTAON
>   * into account.
>   * If XFS_QMOPT_DQALLOC, the dquot(s) will be allocated if needed.
> - * If XFS_QMOPT_ILOCKED, then inode sent is already locked EXCL.
>   * Inode may get unlocked and relocked in here, and the caller must deal with
>   * the consequences.
>   */
>  int
> -xfs_qm_dqattach(
> +xfs_qm_dqattach_locked(
>  	xfs_inode_t	*ip,
>  	uint		flags)
>  {
> @@ -787,17 +794,14 @@ xfs_qm_dqattach(
>  	uint		nquotas = 0;
>  	int		error = 0;
>  
> -	if ((! XFS_IS_QUOTA_ON(mp)) ||
> -	    (! XFS_NOT_DQATTACHED(mp, ip)) ||
> -	    (ip->i_ino == mp->m_sb.sb_uquotino) ||
> -	    (ip->i_ino == mp->m_sb.sb_gquotino))
> +	if (!XFS_IS_QUOTA_RUNNING(mp) ||
> +	    !XFS_IS_QUOTA_ON(mp) ||
> +	    !XFS_NOT_DQATTACHED(mp, ip) ||
> +	    ip->i_ino == mp->m_sb.sb_uquotino ||
> +	    ip->i_ino == mp->m_sb.sb_gquotino)
>  		return 0;
>  
> -	ASSERT((flags & XFS_QMOPT_ILOCKED) == 0 ||
> -	       xfs_isilocked(ip, XFS_ILOCK_EXCL));
> -
> -	if (! (flags & XFS_QMOPT_ILOCKED))
> -		xfs_ilock(ip, XFS_ILOCK_EXCL);
> +	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
>  
>  	if (XFS_IS_UQUOTA_ON(mp)) {
>  		error = xfs_qm_dqattach_one(ip, ip->i_d.di_uid, XFS_DQ_USER,
> @@ -849,8 +853,7 @@ xfs_qm_dqattach(
>  		xfs_qm_dqattach_grouphint(ip->i_udquot, ip->i_gdquot);
>  	}
>  
> -      done:
> -
> + done:
>  #ifdef QUOTADEBUG
>  	if (! error) {
>  		if (XFS_IS_UQUOTA_ON(mp))
> @@ -858,15 +861,22 @@ xfs_qm_dqattach(
>  		if (XFS_IS_OQUOTA_ON(mp))
>  			ASSERT(ip->i_gdquot);
>  	}
> +	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
>  #endif
> +	return error;
> +}
> +
> +int
> +xfs_qm_dqattach(
> +	struct xfs_inode	*ip,
> +	uint			flags)
> +{
> +	int			error;
>  
> -	if (! (flags & XFS_QMOPT_ILOCKED))
> -		xfs_iunlock(ip, XFS_ILOCK_EXCL);
> +	xfs_ilock(ip, XFS_ILOCK_EXCL);
> +	error = xfs_qm_dqattach_locked(ip, flags);
> +	xfs_iunlock(ip, XFS_ILOCK_EXCL);
>  
> -#ifdef QUOTADEBUG
> -	else
> -		ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
> -#endif
>  	return error;
>  }
>  
> @@ -912,7 +922,7 @@ xfs_qm_sync(
>  	boolean_t	nowait;
>  	int		error;
>  
> -	if (! XFS_IS_QUOTA_ON(mp))
> +	if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
>  		return 0;
>  
>  	restarts = 0;
> @@ -2319,20 +2329,20 @@ xfs_qm_write_sb_changes(
>   */
>  int
>  xfs_qm_vop_dqalloc(
> -	xfs_mount_t	*mp,
> -	xfs_inode_t	*ip,
> -	uid_t		uid,
> -	gid_t		gid,
> -	prid_t		prid,
> -	uint		flags,
> -	xfs_dquot_t	**O_udqpp,
> -	xfs_dquot_t	**O_gdqpp)
> -{
> -	int		error;
> -	xfs_dquot_t	*uq, *gq;
> -	uint		lockflags;
> +	struct xfs_inode	*ip,
> +	uid_t			uid,
> +	gid_t			gid,
> +	prid_t			prid,
> +	uint			flags,
> +	struct xfs_dquot	**O_udqpp,
> +	struct xfs_dquot	**O_gdqpp)
> +{
> +	struct xfs_mount	*mp = ip->i_mount;
> +	struct xfs_dquot	*uq, *gq;
> +	int			error;
> +	uint			lockflags;
>  
> -	if (!XFS_IS_QUOTA_ON(mp))
> +	if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
>  		return 0;
>  
>  	lockflags = XFS_ILOCK_EXCL;
> @@ -2346,8 +2356,8 @@ xfs_qm_vop_dqalloc(
>  	 * if necessary. The dquot(s) will not be locked.
>  	 */
>  	if (XFS_NOT_DQATTACHED(mp, ip)) {
> -		if ((error = xfs_qm_dqattach(ip, XFS_QMOPT_DQALLOC |
> -					    XFS_QMOPT_ILOCKED))) {
> +		error = xfs_qm_dqattach_locked(ip, XFS_QMOPT_DQALLOC);
> +		if (error) {
>  			xfs_iunlock(ip, lockflags);
>  			return error;
>  		}
> @@ -2469,8 +2479,10 @@ xfs_qm_vop_chown(
>  	uint		bfield = XFS_IS_REALTIME_INODE(ip) ?
>  				 XFS_TRANS_DQ_RTBCOUNT : XFS_TRANS_DQ_BCOUNT;
>  
> +	if (!XFS_IS_QUOTA_RUNNING(ip->i_mount))
> +		return NULL;
> +
>  	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
> -	ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount));
>  
>  	/* old dquot */
>  	prevdq = *IO_olddq;
> @@ -2508,14 +2520,15 @@ xfs_qm_vop_chown_reserve(
>  	xfs_dquot_t	*gdqp,
>  	uint		flags)
>  {
> -	int		error;
> -	xfs_mount_t	*mp;
> +	xfs_mount_t	*mp = ip->i_mount;
>  	uint		delblks, blkflags, prjflags = 0;
>  	xfs_dquot_t	*unresudq, *unresgdq, *delblksudq, *delblksgdq;
> +	int		error;
> +
> +	if (!XFS_IS_QUOTA_RUNNING(mp))
> +		return 0;
>  
>  	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
> -	mp = ip->i_mount;
> -	ASSERT(XFS_IS_QUOTA_RUNNING(mp));
>  
>  	delblks = ip->i_delayed_blks;
>  	delblksudq = delblksgdq = unresudq = unresgdq = NULL;
> @@ -2582,28 +2595,23 @@ xfs_qm_vop_chown_reserve(
>  
>  int
>  xfs_qm_vop_rename_dqattach(
> -	xfs_inode_t	**i_tab)
> +	struct xfs_inode	**i_tab)
>  {
> -	xfs_inode_t	*ip;
> -	int		i;
> -	int		error;
> -
> -	ip = i_tab[0];
> +	struct xfs_mount	*mp = i_tab[0]->i_mount;
> +	int			i;
>  
> -	if (! XFS_IS_QUOTA_ON(ip->i_mount))
> +	if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
>  		return 0;
>  
> -	if (XFS_NOT_DQATTACHED(ip->i_mount, ip)) {
> -		error = xfs_qm_dqattach(ip, 0);
> -		if (error)
> -			return error;
> -	}
>  	for (i = 1; (i < 4 && i_tab[i]); i++) {
> +		struct xfs_inode	*ip = i_tab[i];
> +		int			error;
> +
>  		/*
>  		 * Watch out for duplicate entries in the table.
>  		 */
> -		if ((ip = i_tab[i]) != i_tab[i-1]) {
> -			if (XFS_NOT_DQATTACHED(ip->i_mount, ip)) {
> +		if (i == 0 || ip != i_tab[i-1]) {
> +			if (XFS_NOT_DQATTACHED(mp, ip)) {
>  				error = xfs_qm_dqattach(ip, 0);
>  				if (error)
>  					return error;
> @@ -2614,17 +2622,19 @@ xfs_qm_vop_rename_dqattach(
>  }
>  
>  void
> -xfs_qm_vop_dqattach_and_dqmod_newinode(
> -	xfs_trans_t	*tp,
> -	xfs_inode_t	*ip,
> -	xfs_dquot_t	*udqp,
> -	xfs_dquot_t	*gdqp)
> +xfs_qm_vop_create_dqattach(
> +	struct xfs_trans	*tp,
> +	struct xfs_inode	*ip,
> +	struct xfs_dquot	*udqp,
> +	struct xfs_dquot	*gdqp)
>  {
> -	if (!XFS_IS_QUOTA_ON(tp->t_mountp))
> +	struct xfs_mount	*mp = tp->t_mountp;
> +
> +	if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
>  		return;
>  
>  	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
> -	ASSERT(XFS_IS_QUOTA_RUNNING(tp->t_mountp));
> +	ASSERT(XFS_IS_QUOTA_RUNNING(mp));
>  
>  	if (udqp) {
>  		xfs_dqlock(udqp);
> @@ -2632,7 +2642,7 @@ xfs_qm_vop_dqattach_and_dqmod_newinode(
>  		xfs_dqunlock(udqp);
>  		ASSERT(ip->i_udquot == NULL);
>  		ip->i_udquot = udqp;
> -		ASSERT(XFS_IS_UQUOTA_ON(tp->t_mountp));
> +		ASSERT(XFS_IS_UQUOTA_ON(mp));
>  		ASSERT(ip->i_d.di_uid == be32_to_cpu(udqp->q_core.d_id));
>  		xfs_trans_mod_dquot(tp, udqp, XFS_TRANS_DQ_ICOUNT, 1);
>  	}
> @@ -2642,8 +2652,8 @@ xfs_qm_vop_dqattach_and_dqmod_newinode(
>  		xfs_dqunlock(gdqp);
>  		ASSERT(ip->i_gdquot == NULL);
>  		ip->i_gdquot = gdqp;
> -		ASSERT(XFS_IS_OQUOTA_ON(tp->t_mountp));
> -		ASSERT((XFS_IS_GQUOTA_ON(tp->t_mountp) ?
> +		ASSERT(XFS_IS_OQUOTA_ON(mp));
> +		ASSERT((XFS_IS_GQUOTA_ON(mp) ?
>  			ip->i_d.di_gid : ip->i_d.di_projid) ==
>  				be32_to_cpu(gdqp->q_core.d_id));
>  		xfs_trans_mod_dquot(tp, gdqp, XFS_TRANS_DQ_ICOUNT, 1);
> Index: xfs/fs/xfs/xfs_iget.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_iget.c	2009-02-24 15:32:16.153369650 +0100
> +++ xfs/fs/xfs/xfs_iget.c	2009-02-24 15:32:35.870518109 +0100
> @@ -490,10 +490,7 @@ xfs_ireclaim(
>  	 * ilock one but will still hold the iolock.
>  	 */
>  	xfs_ilock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
> -	/*
> -	 * Release dquots (and their references) if any.
> -	 */
> -	XFS_QM_DQDETACH(ip->i_mount, ip);
> +	xfs_qm_dqdetach(ip);
>  	xfs_iunlock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
>  
>  	switch (ip->i_d.di_mode & S_IFMT) {
> Index: xfs/fs/xfs/xfs_mount.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_mount.c	2009-02-24 15:32:16.164399755 +0100
> +++ xfs/fs/xfs/xfs_mount.c	2009-02-24 15:32:35.871518446 +0100
> @@ -886,6 +886,53 @@ xfs_check_sizes(xfs_mount_t *mp)
>  }
>  
>  /*
> + * Clear the quotaflags in memory and in the superblock.
> + */
> +int
> +xfs_mount_reset_sbqflags(
> +	struct xfs_mount	*mp)
> +{
> +	int			error;
> +	struct xfs_trans	*tp;
> +
> +	mp->m_qflags = 0;
> +
> +	/*
> +	 * It is OK to look at sb_qflags here in mount path,
> +	 * without m_sb_lock.
> +	 */
> +	if (mp->m_sb.sb_qflags == 0)
> +		return 0;
> +	spin_lock(&mp->m_sb_lock);
> +	mp->m_sb.sb_qflags = 0;
> +	spin_unlock(&mp->m_sb_lock);
> +
> +	/*
> +	 * If the fs is readonly, let the incore superblock run
> +	 * with quotas off but don't flush the update out to disk
> +	 */
> +	if (mp->m_flags & XFS_MOUNT_RDONLY)
> +		return 0;
> +
> +#ifdef QUOTADEBUG
> +	xfs_fs_cmn_err(CE_NOTE, mp, "Writing superblock quota changes");
> +#endif
> +
> +	tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE);
> +	error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0,
> +				      XFS_DEFAULT_LOG_COUNT);
> +	if (error) {
> +		xfs_trans_cancel(tp, 0);
> +		xfs_fs_cmn_err(CE_ALERT, mp,
> +			"xfs_mount_reset_sbqflags: Superblock update failed!");
> +		return error;
> +	}
> +
> +	xfs_mod_sb(tp, XFS_SB_QFLAGS);
> +	return xfs_trans_commit(tp, 0);
> +}
> +
> +/*
>   * This function does the following on an initial mount of a file system:
>   *	- reads the superblock from disk and init the mount struct
>   *	- if we're a 32-bit kernel, do a size check on the superblock
> @@ -902,7 +949,8 @@ xfs_mountfs(
>  	xfs_sb_t	*sbp = &(mp->m_sb);
>  	xfs_inode_t	*rip;
>  	__uint64_t	resblks;
> -	uint		quotamount, quotaflags;
> +	uint		quotamount = 0;
> +	uint		quotaflags = 0;
>  	int		error = 0;
>  
>  	xfs_mount_common(mp, sbp);
> @@ -1145,9 +1193,28 @@ xfs_mountfs(
>  	/*
>  	 * Initialise the XFS quota management subsystem for this mount
>  	 */
> -	error = XFS_QM_INIT(mp, &quotamount, &quotaflags);
> -	if (error)
> -		goto out_rtunmount;
> +	if (XFS_IS_QUOTA_RUNNING(mp)) {
> +		error = xfs_qm_newmount(mp, &quotamount, &quotaflags);
> +		if (error)
> +			goto out_rtunmount;
> +	} else {
> +		ASSERT(!XFS_IS_QUOTA_ON(mp));
> +
> +		/*
> +		 * If a file system had quotas running earlier, but decided to
> +		 * mount without -o uquota/pquota/gquota options, revoke the
> +		 * quotachecked license.
> +		 */
> +		if (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT) {
> +			cmn_err(CE_NOTE,
> +                	        "XFS: resetting qflags for filesystem %s",
> +                	        mp->m_fsname);
> +
> +			error = xfs_mount_reset_sbqflags(mp);
> +			if (error)
> +				return error;
> +		}
> +	}
>  
>  	/*
>  	 * Finish recovering the file system.  This part needed to be
> @@ -1163,9 +1230,19 @@ xfs_mountfs(
>  	/*
>  	 * Complete the quota initialisation, post-log-replay component.
>  	 */
> -	error = XFS_QM_MOUNT(mp, quotamount, quotaflags);
> -	if (error)
> -		goto out_rtunmount;
> +	if (quotamount) {
> +		ASSERT(mp->m_qflags == 0);
> +		mp->m_qflags = quotaflags;
> +
> +		xfs_qm_mount_quotas(mp);
> +	}
> +
> +#if defined(DEBUG) && defined(XFS_LOUD_RECOVERY)
> +	if (XFS_IS_QUOTA_ON(mp))
> +		xfs_fs_cmn_err(CE_NOTE, mp, "Disk quotas turned on");
> +	else
> +		xfs_fs_cmn_err(CE_NOTE, mp, "Disk quotas not turned on");
> +#endif
>  
>  	/*
>  	 * Now we are mounted, reserve a small amount of unused space for
> @@ -1215,12 +1292,7 @@ xfs_unmountfs(
>  	__uint64_t		resblks;
>  	int			error;
>  
> -	/*
> -	 * Release dquot that rootinode, rbmino and rsumino might be holding,
> -	 * and release the quota inodes.
> -	 */
> -	XFS_QM_UNMOUNT(mp);
> -
> +	xfs_qm_unmount_quotas(mp);
>  	xfs_rtunmount_inodes(mp);
>  	IRELE(mp->m_rootip);
>  
> @@ -1237,10 +1309,7 @@ xfs_unmountfs(
>  	xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE | XFS_LOG_SYNC);
>  	xfs_reclaim_inodes(mp, 0, XFS_IFLUSH_ASYNC);
>  
> -	XFS_QM_DQPURGEALL(mp, XFS_QMOPT_QUOTALL | XFS_QMOPT_UMOUNTING);
> -
> -	if (mp->m_quotainfo)
> -		XFS_QM_DONE(mp);
> +	xfs_qm_unmount(mp);
>  
>  	/*
>  	 * Flush out the log synchronously so that we know for sure
> Index: xfs/fs/xfs/xfs_qmops.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_qmops.c	2009-02-24 15:32:16.128369539 +0100
> +++ /dev/null	1970-01-01 00:00:00.000000000 +0000
> @@ -1,152 +0,0 @@
> -/*
> - * Copyright (c) 2000-2005 Silicon Graphics, Inc.
> - * All Rights Reserved.
> - *
> - * This program is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU General Public License as
> - * published by the Free Software Foundation.
> - *
> - * This program is distributed in the hope that it would be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU General Public License for more details.
> - *
> - * You should have received a copy of the GNU General Public License
> - * along with this program; if not, write the Free Software Foundation,
> - * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
> - */
> -#include "xfs.h"
> -#include "xfs_fs.h"
> -#include "xfs_types.h"
> -#include "xfs_log.h"
> -#include "xfs_inum.h"
> -#include "xfs_trans.h"
> -#include "xfs_sb.h"
> -#include "xfs_ag.h"
> -#include "xfs_dir2.h"
> -#include "xfs_dmapi.h"
> -#include "xfs_mount.h"
> -#include "xfs_quota.h"
> -#include "xfs_error.h"
> -
> -
> -STATIC struct xfs_dquot *
> -xfs_dqvopchown_default(
> -	struct xfs_trans	*tp,
> -	struct xfs_inode	*ip,
> -	struct xfs_dquot	**dqp,
> -	struct xfs_dquot	*dq)
> -{
> -	return NULL;
> -}
> -
> -/*
> - * Clear the quotaflags in memory and in the superblock.
> - */
> -int
> -xfs_mount_reset_sbqflags(xfs_mount_t *mp)
> -{
> -	int			error;
> -	xfs_trans_t		*tp;
> -
> -	mp->m_qflags = 0;
> -	/*
> -	 * It is OK to look at sb_qflags here in mount path,
> -	 * without m_sb_lock.
> -	 */
> -	if (mp->m_sb.sb_qflags == 0)
> -		return 0;
> -	spin_lock(&mp->m_sb_lock);
> -	mp->m_sb.sb_qflags = 0;
> -	spin_unlock(&mp->m_sb_lock);
> -
> -	/*
> -	 * if the fs is readonly, let the incore superblock run
> -	 * with quotas off but don't flush the update out to disk
> -	 */
> -	if (mp->m_flags & XFS_MOUNT_RDONLY)
> -		return 0;
> -#ifdef QUOTADEBUG
> -	xfs_fs_cmn_err(CE_NOTE, mp, "Writing superblock quota changes");
> -#endif
> -	tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE);
> -	if ((error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0,
> -				      XFS_DEFAULT_LOG_COUNT))) {
> -		xfs_trans_cancel(tp, 0);
> -		xfs_fs_cmn_err(CE_ALERT, mp,
> -			"xfs_mount_reset_sbqflags: Superblock update failed!");
> -		return error;
> -	}
> -	xfs_mod_sb(tp, XFS_SB_QFLAGS);
> -	error = xfs_trans_commit(tp, 0);
> -	return error;
> -}
> -
> -STATIC int
> -xfs_noquota_init(
> -	xfs_mount_t	*mp,
> -	uint		*needquotamount,
> -	uint		*quotaflags)
> -{
> -	int		error = 0;
> -
> -	*quotaflags = 0;
> -	*needquotamount = B_FALSE;
> -
> -	ASSERT(!XFS_IS_QUOTA_ON(mp));
> -
> -	/*
> -	 * If a file system had quotas running earlier, but decided to
> -	 * mount without -o uquota/pquota/gquota options, revoke the
> -	 * quotachecked license.
> -	 */
> -	if (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT) {
> -		cmn_err(CE_NOTE,
> -                        "XFS resetting qflags for filesystem %s",
> -                        mp->m_fsname);
> -
> -		error = xfs_mount_reset_sbqflags(mp);
> -	}
> -	return error;
> -}
> -
> -static struct xfs_qmops xfs_qmcore_stub = {
> -	.xfs_qminit		= (xfs_qminit_t) xfs_noquota_init,
> -	.xfs_qmdone		= (xfs_qmdone_t) fs_noerr,
> -	.xfs_qmmount		= (xfs_qmmount_t) fs_noerr,
> -	.xfs_qmunmount		= (xfs_qmunmount_t) fs_noerr,
> -	.xfs_dqrele		= (xfs_dqrele_t) fs_noerr,
> -	.xfs_dqattach		= (xfs_dqattach_t) fs_noerr,
> -	.xfs_dqdetach		= (xfs_dqdetach_t) fs_noerr,
> -	.xfs_dqpurgeall		= (xfs_dqpurgeall_t) fs_noerr,
> -	.xfs_dqvopalloc		= (xfs_dqvopalloc_t) fs_noerr,
> -	.xfs_dqvopcreate	= (xfs_dqvopcreate_t) fs_noerr,
> -	.xfs_dqvoprename	= (xfs_dqvoprename_t) fs_noerr,
> -	.xfs_dqvopchown		= xfs_dqvopchown_default,
> -	.xfs_dqvopchownresv	= (xfs_dqvopchownresv_t) fs_noerr,
> -	.xfs_dqstatvfs		= (xfs_dqstatvfs_t) fs_noval,
> -	.xfs_dqsync		= (xfs_dqsync_t) fs_noerr,
> -};
> -
> -int
> -xfs_qmops_get(struct xfs_mount *mp)
> -{
> -	if (XFS_IS_QUOTA_RUNNING(mp)) {
> -#ifdef CONFIG_XFS_QUOTA
> -		mp->m_qm_ops = &xfs_qmcore_xfs;
> -#else
> -		cmn_err(CE_WARN,
> -			"XFS: qouta support not available in this kernel.");
> -		return EINVAL;
> -#endif
> -	} else {
> -		mp->m_qm_ops = &xfs_qmcore_stub;
> -	}
> -
> -	return 0;
> -}
> -
> -void
> -xfs_qmops_put(struct xfs_mount *mp)
> -{
> -}
> Index: xfs/fs/xfs/xfs_rename.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_rename.c	2009-02-24 15:32:16.132369560 +0100
> +++ xfs/fs/xfs/xfs_rename.c	2009-02-24 15:32:35.872519970 +0100
> @@ -166,7 +166,8 @@ xfs_rename(
>  	/*
>  	 * Attach the dquots to the inodes
>  	 */
> -	if ((error = XFS_QM_DQVOPRENAME(mp, inodes))) {
> +	error = xfs_qm_vop_rename_dqattach(inodes);
> +	if (error) {
>  		xfs_trans_cancel(tp, cancel_flags);
>  		goto std_return;
>  	}
> 
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs
---end quoted text---

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] xfs: kill xfs_qmops
  2009-03-16  7:55 ` Christoph Hellwig
@ 2009-03-29  7:44   ` Christoph Hellwig
  0 siblings, 0 replies; 6+ messages in thread
From: Christoph Hellwig @ 2009-03-29  7:44 UTC (permalink / raw)
  To: xfs

ping^2?

On Mon, Mar 16, 2009 at 03:55:29AM -0400, Christoph Hellwig wrote:
> ping?
> 
> On Tue, Feb 24, 2009 at 09:37:36AM -0500, Christoph Hellwig wrote:
> > 
> > Kill the quota ops function vector and replace it with direct calls or
> > stubs in the CONFIG_XFS_QUOTA=n case.
> > 
> > Make sure we check XFS_IS_QUOTA_RUNNING in the right spots.  We can remove
> > the number of those checks because the XFS_TRANS_DQ_DIRTY flag can't be set
> > otherwise.
> > 
> > This brings us back closer to the way this code worked in IRIX and earlier
> > Linux versions, but we keep a lot of the more useful factoring of common
> > code.
> > 
> > Eventually we should also kill xfs_qm_bhv.c, but that's left for a later
> > patch.
> > 
> > Reduces the size of the source code by about 250 lines and the size of
> > XFS module by about 1.5 kilobytes with quotas enabled:
> > 
> >    text	   data	    bss	    dec	    hex	filename
> >  615957	   2960	   3848	 622765	  980ad	fs/xfs/xfs.o
> >  617231	   3152	   3848	 624231	  98667	fs/xfs/xfs.o.old
> > 
> > 
> > Fallout:
> > 
> >  - xfs_qm_dqattach is split into xfs_qm_dqattach_locked which expects
> >    the inode locked and xfs_qm_dqattach which does the locking around it,
> >    thus removing XFS_QMOPT_ILOCKED.
> > 
> > Signed-off-by: Christoph Hellwig <hch@lst.de>
> > 
> > Index: xfs/fs/xfs/quota/xfs_trans_dquot.c
> > ===================================================================
> > --- xfs.orig/fs/xfs/quota/xfs_trans_dquot.c	2009-02-24 15:32:16.063369993 +0100
> > +++ xfs/fs/xfs/quota/xfs_trans_dquot.c	2009-02-24 15:32:35.845494182 +0100
> > @@ -111,7 +111,7 @@ xfs_trans_log_dquot(
> >   * Carry forward whatever is left of the quota blk reservation to
> >   * the spanky new transaction
> >   */
> > -STATIC void
> > +void
> >  xfs_trans_dup_dqinfo(
> >  	xfs_trans_t	*otp,
> >  	xfs_trans_t	*ntp)
> > @@ -167,19 +167,17 @@ xfs_trans_dup_dqinfo(
> >  /*
> >   * Wrap around mod_dquot to account for both user and group quotas.
> >   */
> > -STATIC void
> > +void
> >  xfs_trans_mod_dquot_byino(
> >  	xfs_trans_t	*tp,
> >  	xfs_inode_t	*ip,
> >  	uint		field,
> >  	long		delta)
> >  {
> > -	xfs_mount_t	*mp;
> > +	xfs_mount_t	*mp = tp->t_mountp;
> >  
> > -	ASSERT(tp);
> > -	mp = tp->t_mountp;
> > -
> > -	if (!XFS_IS_QUOTA_ON(mp) ||
> > +	if (!XFS_IS_QUOTA_RUNNING(mp) ||
> > +	    !XFS_IS_QUOTA_ON(mp) ||
> >  	    ip->i_ino == mp->m_sb.sb_uquotino ||
> >  	    ip->i_ino == mp->m_sb.sb_gquotino)
> >  		return;
> > @@ -229,6 +227,7 @@ xfs_trans_mod_dquot(
> >  	xfs_dqtrx_t	*qtrx;
> >  
> >  	ASSERT(tp);
> > +	ASSERT(XFS_IS_QUOTA_RUNNING(tp->t_mountp));
> >  	qtrx = NULL;
> >  
> >  	if (tp->t_dqinfo == NULL)
> > @@ -346,7 +345,7 @@ xfs_trans_dqlockedjoin(
> >   * Unreserve just the reservations done by this transaction.
> >   * dquot is still left locked at exit.
> >   */
> > -STATIC void
> > +void
> >  xfs_trans_apply_dquot_deltas(
> >  	xfs_trans_t		*tp)
> >  {
> > @@ -357,7 +356,7 @@ xfs_trans_apply_dquot_deltas(
> >  	long			totalbdelta;
> >  	long			totalrtbdelta;
> >  
> > -	if (! (tp->t_flags & XFS_TRANS_DQ_DIRTY))
> > +	if (!(tp->t_flags & XFS_TRANS_DQ_DIRTY))
> >  		return;
> >  
> >  	ASSERT(tp->t_dqinfo);
> > @@ -531,7 +530,7 @@ xfs_trans_apply_dquot_deltas(
> >   * we simply throw those away, since that's the expected behavior
> >   * when a transaction is curtailed without a commit.
> >   */
> > -STATIC void
> > +void
> >  xfs_trans_unreserve_and_mod_dquots(
> >  	xfs_trans_t		*tp)
> >  {
> > @@ -768,6 +767,8 @@ xfs_trans_reserve_quota_bydquots(
> >  {
> >  	int		resvd = 0, error;
> >  
> > +	if (!XFS_IS_QUOTA_RUNNING(mp))
> > +		return 0;
> >  	if (!XFS_IS_QUOTA_ON(mp))
> >  		return 0;
> >  
> > @@ -811,17 +812,18 @@ xfs_trans_reserve_quota_bydquots(
> >   * This doesn't change the actual usage, just the reservation.
> >   * The inode sent in is locked.
> >   */
> > -STATIC int
> > +int
> >  xfs_trans_reserve_quota_nblks(
> > -	xfs_trans_t	*tp,
> > -	xfs_mount_t	*mp,
> > -	xfs_inode_t	*ip,
> > -	long		nblks,
> > -	long		ninos,
> > -	uint		flags)
> > +	struct xfs_trans	*tp,
> > +	struct xfs_inode	*ip,
> > +	long			nblks,
> > +	long			ninos,
> > +	uint			flags)
> >  {
> > -	int		error;
> > +	struct xfs_mount	*mp = ip->i_mount;
> >  
> > +	if (!XFS_IS_QUOTA_RUNNING(mp))
> > +		return 0;
> >  	if (!XFS_IS_QUOTA_ON(mp))
> >  		return 0;
> >  	if (XFS_IS_PQUOTA_ON(mp))
> > @@ -831,7 +833,6 @@ xfs_trans_reserve_quota_nblks(
> >  	ASSERT(ip->i_ino != mp->m_sb.sb_gquotino);
> >  
> >  	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
> > -	ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount));
> >  	ASSERT((flags & ~(XFS_QMOPT_FORCE_RES | XFS_QMOPT_ENOSPC)) ==
> >  				XFS_TRANS_DQ_RES_RTBLKS ||
> >  	       (flags & ~(XFS_QMOPT_FORCE_RES | XFS_QMOPT_ENOSPC)) ==
> > @@ -840,11 +841,9 @@ xfs_trans_reserve_quota_nblks(
> >  	/*
> >  	 * Reserve nblks against these dquots, with trans as the mediator.
> >  	 */
> > -	error = xfs_trans_reserve_quota_bydquots(tp, mp,
> > -						 ip->i_udquot, ip->i_gdquot,
> > -						 nblks, ninos,
> > -						 flags);
> > -	return error;
> > +	return xfs_trans_reserve_quota_bydquots(tp, mp,
> > +						ip->i_udquot, ip->i_gdquot,
> > +						nblks, ninos, flags);
> >  }
> >  
> >  /*
> > @@ -895,25 +894,15 @@ STATIC void
> >  xfs_trans_alloc_dqinfo(
> >  	xfs_trans_t	*tp)
> >  {
> > -	(tp)->t_dqinfo = kmem_zone_zalloc(xfs_Gqm->qm_dqtrxzone, KM_SLEEP);
> > +	tp->t_dqinfo = kmem_zone_zalloc(xfs_Gqm->qm_dqtrxzone, KM_SLEEP);
> >  }
> >  
> > -STATIC void
> > +void
> >  xfs_trans_free_dqinfo(
> >  	xfs_trans_t	*tp)
> >  {
> >  	if (!tp->t_dqinfo)
> >  		return;
> > -	kmem_zone_free(xfs_Gqm->qm_dqtrxzone, (tp)->t_dqinfo);
> > -	(tp)->t_dqinfo = NULL;
> > +	kmem_zone_free(xfs_Gqm->qm_dqtrxzone, tp->t_dqinfo);
> > +	tp->t_dqinfo = NULL;
> >  }
> > -
> > -xfs_dqtrxops_t	xfs_trans_dquot_ops = {
> > -	.qo_dup_dqinfo			= xfs_trans_dup_dqinfo,
> > -	.qo_free_dqinfo			= xfs_trans_free_dqinfo,
> > -	.qo_mod_dquot_byino		= xfs_trans_mod_dquot_byino,
> > -	.qo_apply_dquot_deltas		= xfs_trans_apply_dquot_deltas,
> > -	.qo_reserve_quota_nblks		= xfs_trans_reserve_quota_nblks,
> > -	.qo_reserve_quota_bydquots	= xfs_trans_reserve_quota_bydquots,
> > -	.qo_unreserve_and_mod_dquots	= xfs_trans_unreserve_and_mod_dquots,
> > -};
> > Index: xfs/fs/xfs/xfs_quota.h
> > ===================================================================
> > --- xfs.orig/fs/xfs/xfs_quota.h	2009-02-24 15:32:16.089369812 +0100
> > +++ xfs/fs/xfs/xfs_quota.h	2009-02-24 15:32:35.846494310 +0100
> > @@ -197,7 +197,6 @@ typedef struct xfs_qoff_logformat {
> >  #define XFS_QMOPT_UMOUNTING	0x0000100 /* filesys is being unmounted */
> >  #define XFS_QMOPT_DOLOG		0x0000200 /* log buf changes (in quotacheck) */
> >  #define XFS_QMOPT_DOWARN        0x0000400 /* increase warning cnt if needed */
> > -#define XFS_QMOPT_ILOCKED	0x0000800 /* inode is already locked (excl) */
> >  #define XFS_QMOPT_DQREPAIR	0x0001000 /* repair dquot if damaged */
> >  #define XFS_QMOPT_GQUOTA	0x0002000 /* group dquot requested */
> >  #define XFS_QMOPT_ENOSPC	0x0004000 /* enospc instead of edquot (prj) */
> > @@ -302,69 +301,72 @@ typedef struct xfs_dqtrx {
> >  	long		qt_delrtb_delta;  /* delayed RT blk count changes */
> >  } xfs_dqtrx_t;
> >  
> > -/*
> > - * Dquot transaction functions, used if quota is enabled.
> > - */
> > -typedef void	(*qo_dup_dqinfo_t)(struct xfs_trans *, struct xfs_trans *);
> > -typedef void	(*qo_mod_dquot_byino_t)(struct xfs_trans *,
> > -				struct xfs_inode *, uint, long);
> > -typedef void	(*qo_free_dqinfo_t)(struct xfs_trans *);
> > -typedef void	(*qo_apply_dquot_deltas_t)(struct xfs_trans *);
> > -typedef void	(*qo_unreserve_and_mod_dquots_t)(struct xfs_trans *);
> > -typedef int	(*qo_reserve_quota_nblks_t)(
> > -				struct xfs_trans *, struct xfs_mount *,
> > -				struct xfs_inode *, long, long, uint);
> > -typedef int	(*qo_reserve_quota_bydquots_t)(
> > -				struct xfs_trans *, struct xfs_mount *,
> > -				struct xfs_dquot *, struct xfs_dquot *,
> > -				long, long, uint);
> > -typedef struct xfs_dqtrxops {
> > -	qo_dup_dqinfo_t			qo_dup_dqinfo;
> > -	qo_free_dqinfo_t		qo_free_dqinfo;
> > -	qo_mod_dquot_byino_t		qo_mod_dquot_byino;
> > -	qo_apply_dquot_deltas_t		qo_apply_dquot_deltas;
> > -	qo_reserve_quota_nblks_t	qo_reserve_quota_nblks;
> > -	qo_reserve_quota_bydquots_t	qo_reserve_quota_bydquots;
> > -	qo_unreserve_and_mod_dquots_t	qo_unreserve_and_mod_dquots;
> > -} xfs_dqtrxops_t;
> > -
> > -#define XFS_DQTRXOP(mp, tp, op, args...) \
> > -		((mp)->m_qm_ops->xfs_dqtrxops ? \
> > -		((mp)->m_qm_ops->xfs_dqtrxops->op)(tp, ## args) : 0)
> > -
> > -#define XFS_DQTRXOP_VOID(mp, tp, op, args...) \
> > -		((mp)->m_qm_ops->xfs_dqtrxops ? \
> > -		((mp)->m_qm_ops->xfs_dqtrxops->op)(tp, ## args) : (void)0)
> > -
> > -#define XFS_TRANS_DUP_DQINFO(mp, otp, ntp) \
> > -	XFS_DQTRXOP_VOID(mp, otp, qo_dup_dqinfo, ntp)
> > -#define XFS_TRANS_FREE_DQINFO(mp, tp) \
> > -	XFS_DQTRXOP_VOID(mp, tp, qo_free_dqinfo)
> > -#define XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, field, delta) \
> > -	XFS_DQTRXOP_VOID(mp, tp, qo_mod_dquot_byino, ip, field, delta)
> > -#define XFS_TRANS_APPLY_DQUOT_DELTAS(mp, tp) \
> > -	XFS_DQTRXOP_VOID(mp, tp, qo_apply_dquot_deltas)
> > -#define XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip, nblks, ninos, fl) \
> > -	XFS_DQTRXOP(mp, tp, qo_reserve_quota_nblks, mp, ip, nblks, ninos, fl)
> > -#define XFS_TRANS_RESERVE_QUOTA_BYDQUOTS(mp, tp, ud, gd, nb, ni, fl) \
> > -	XFS_DQTRXOP(mp, tp, qo_reserve_quota_bydquots, mp, ud, gd, nb, ni, fl)
> > -#define XFS_TRANS_UNRESERVE_AND_MOD_DQUOTS(mp, tp) \
> > -	XFS_DQTRXOP_VOID(mp, tp, qo_unreserve_and_mod_dquots)
> > -
> > -#define XFS_TRANS_UNRESERVE_QUOTA_NBLKS(mp, tp, ip, nblks, ninos, flags) \
> > -	XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip, -(nblks), -(ninos), flags)
> > -#define XFS_TRANS_RESERVE_QUOTA(mp, tp, ud, gd, nb, ni, f) \
> > -	XFS_TRANS_RESERVE_QUOTA_BYDQUOTS(mp, tp, ud, gd, nb, ni, \
> > -				f | XFS_QMOPT_RES_REGBLKS)
> > -#define XFS_TRANS_UNRESERVE_QUOTA(mp, tp, ud, gd, nb, ni, f) \
> > -	XFS_TRANS_RESERVE_QUOTA_BYDQUOTS(mp, tp, ud, gd, -(nb), -(ni), \
> > +#ifdef CONFIG_XFS_QUOTA
> > +extern void xfs_trans_dup_dqinfo(struct xfs_trans *, struct xfs_trans *);
> > +extern void xfs_trans_free_dqinfo(struct xfs_trans *);
> > +extern void xfs_trans_mod_dquot_byino(struct xfs_trans *, struct xfs_inode *,
> > +		uint, long);
> > +extern void xfs_trans_apply_dquot_deltas(struct xfs_trans *);
> > +extern void xfs_trans_unreserve_and_mod_dquots(struct xfs_trans *);
> > +extern int xfs_trans_reserve_quota_nblks(struct xfs_trans *,
> > +		struct xfs_inode *, long, long, uint);
> > +extern int xfs_trans_reserve_quota_bydquots(struct xfs_trans *,
> > +		struct xfs_mount *, struct xfs_dquot *,
> > +		struct xfs_dquot *, long, long, uint);
> > +
> > +extern int xfs_qm_vop_dqalloc(struct xfs_inode *, uid_t, gid_t, prid_t, uint,
> > +		struct xfs_dquot **, struct xfs_dquot **);
> > +extern void xfs_qm_vop_create_dqattach(struct xfs_trans *, struct xfs_inode *,
> > +		struct xfs_dquot *, struct xfs_dquot *);
> > +extern int xfs_qm_vop_rename_dqattach(struct xfs_inode **);
> > +extern struct xfs_dquot *xfs_qm_vop_chown(struct xfs_trans *,
> > +		struct xfs_inode *, struct xfs_dquot **, struct xfs_dquot *);
> > +extern int xfs_qm_vop_chown_reserve(struct xfs_trans *, struct xfs_inode *,
> > +		struct xfs_dquot *, struct xfs_dquot *, uint);
> > +extern int xfs_qm_dqattach(struct xfs_inode *, uint);
> > +extern int xfs_qm_dqattach_locked(struct xfs_inode *, uint);
> > +extern void xfs_qm_dqdetach(struct xfs_inode *);
> > +extern void xfs_qm_dqrele(struct xfs_dquot *);
> > +extern void xfs_qm_statvfs(struct xfs_inode *, struct kstatfs *);
> > +extern int xfs_qm_sync(struct xfs_mount *, int);
> > +extern int xfs_qm_newmount(struct xfs_mount *, uint *, uint *);
> > +extern void xfs_qm_mount_quotas(struct xfs_mount *);
> > +extern void xfs_qm_unmount(struct xfs_mount *);
> > +extern void xfs_qm_unmount_quotas(struct xfs_mount *);
> > +
> > +#else
> > +#define xfs_trans_dup_dqinfo(tp, tp2)
> > +#define xfs_trans_free_dqinfo(tp)
> > +#define xfs_trans_mod_dquot_byino(tp, ip, fields, delta)
> > +#define xfs_trans_apply_dquot_deltas(tp)
> > +#define xfs_trans_unreserve_and_mod_dquots(tp)
> > +#define xfs_trans_reserve_quota_nblks(tp, ip, nblks, ninos, flags)	(0)
> > +#define xfs_trans_reserve_quota_bydquots(tp, mp, u, g, nb, ni, fl)	(0)
> > +#define xfs_qm_vop_dqalloc(ip, uid, gid, prid, fl, ou, og)		(0)
> > +#define xfs_qm_vop_create_dqattach(tp, ip, u, g)
> > +#define xfs_qm_vop_rename_dqattach(it)					(0)
> > +#define xfs_qm_vop_chown(tp, ip, old, new)				(NULL)
> > +#define xfs_qm_vop_chown_reserve(tp, ip, u, g, fl)			(0)
> > +#define xfs_qm_dqattach(ip, fl)						(0)
> > +#define xfs_qm_dqattach_locked(ip, fl)					(0)
> > +#define xfs_qm_dqdetach(ip)
> > +#define xfs_qm_dqrele(d)
> > +#define xfs_qm_statvfs(ip, s)
> > +#define xfs_qm_sync(mp, fl)						(0)
> > +#define xfs_qm_newmount(mp, a, b)					(0)
> > +#define xfs_qm_mount_quotas(mp)
> > +#define xfs_qm_unmount(mp)
> > +#define xfs_qm_unmount_quotas(mp)					(0)
> > +#endif /* CONFIG_XFS_QUOTA */
> > +
> > +#define xfs_trans_unreserve_quota_nblks(tp, ip, nblks, ninos, flags) \
> > +	xfs_trans_reserve_quota_nblks(tp, ip, -(nblks), -(ninos), flags)
> > +#define xfs_trans_reserve_quota(tp, mp, ud, gd, nb, ni, f) \
> > +	xfs_trans_reserve_quota_bydquots(tp, mp, ud, gd, nb, ni, \
> >  				f | XFS_QMOPT_RES_REGBLKS)
> >  
> >  extern int xfs_qm_dqcheck(xfs_disk_dquot_t *, xfs_dqid_t, uint, uint, char *);
> >  extern int xfs_mount_reset_sbqflags(struct xfs_mount *);
> >  
> > -extern struct xfs_qmops xfs_qmcore_xfs;
> > -
> >  #endif	/* __KERNEL__ */
> > -
> >  #endif	/* __XFS_QUOTA_H__ */
> > Index: xfs/fs/xfs/xfs_trans.c
> > ===================================================================
> > --- xfs.orig/fs/xfs/xfs_trans.c	2009-02-24 15:32:16.093370321 +0100
> > +++ xfs/fs/xfs/xfs_trans.c	2009-02-24 15:32:35.847494368 +0100
> > @@ -297,7 +297,7 @@ xfs_trans_dup(
> >  	tp->t_rtx_res = tp->t_rtx_res_used;
> >  	ntp->t_pflags = tp->t_pflags;
> >  
> > -	XFS_TRANS_DUP_DQINFO(tp->t_mountp, tp, ntp);
> > +	xfs_trans_dup_dqinfo(tp, ntp);
> >  
> >  	atomic_inc(&tp->t_mountp->m_active_trans);
> >  	return ntp;
> > @@ -831,7 +831,7 @@ shut_us_down:
> >  		 * means is that we have some (non-persistent) quota
> >  		 * reservations that need to be unreserved.
> >  		 */
> > -		XFS_TRANS_UNRESERVE_AND_MOD_DQUOTS(mp, tp);
> > +		xfs_trans_unreserve_and_mod_dquots(tp);
> >  		if (tp->t_ticket) {
> >  			commit_lsn = xfs_log_done(mp, tp->t_ticket,
> >  							NULL, log_flags);
> > @@ -850,10 +850,9 @@ shut_us_down:
> >  	/*
> >  	 * If we need to update the superblock, then do it now.
> >  	 */
> > -	if (tp->t_flags & XFS_TRANS_SB_DIRTY) {
> > +	if (tp->t_flags & XFS_TRANS_SB_DIRTY)
> >  		xfs_trans_apply_sb_deltas(tp);
> > -	}
> > -	XFS_TRANS_APPLY_DQUOT_DELTAS(mp, tp);
> > +	xfs_trans_apply_dquot_deltas(tp);
> >  
> >  	/*
> >  	 * Ask each log item how many log_vector entries it will
> > @@ -1058,7 +1057,7 @@ xfs_trans_uncommit(
> >  	}
> >  
> >  	xfs_trans_unreserve_and_mod_sb(tp);
> > -	XFS_TRANS_UNRESERVE_AND_MOD_DQUOTS(tp->t_mountp, tp);
> > +	xfs_trans_unreserve_and_mod_dquots(tp);
> >  
> >  	xfs_trans_free_items(tp, flags);
> >  	xfs_trans_free_busy(tp);
> > @@ -1183,7 +1182,7 @@ xfs_trans_cancel(
> >  	}
> >  #endif
> >  	xfs_trans_unreserve_and_mod_sb(tp);
> > -	XFS_TRANS_UNRESERVE_AND_MOD_DQUOTS(mp, tp);
> > +	xfs_trans_unreserve_and_mod_dquots(tp);
> >  
> >  	if (tp->t_ticket) {
> >  		if (flags & XFS_TRANS_RELEASE_LOG_RES) {
> > @@ -1213,7 +1212,7 @@ xfs_trans_free(
> >  	xfs_trans_t	*tp)
> >  {
> >  	atomic_dec(&tp->t_mountp->m_active_trans);
> > -	XFS_TRANS_FREE_DQINFO(tp->t_mountp, tp);
> > +	xfs_trans_free_dqinfo(tp);
> >  	kmem_zone_free(xfs_trans_zone, tp);
> >  }
> >  
> > Index: xfs/fs/xfs/xfs_utils.c
> > ===================================================================
> > --- xfs.orig/fs/xfs/xfs_utils.c	2009-02-24 15:32:16.098369701 +0100
> > +++ xfs/fs/xfs/xfs_utils.c	2009-02-24 15:32:35.848494914 +0100
> > @@ -166,7 +166,7 @@ xfs_dir_ialloc(
> >  			xfs_buf_relse(ialloc_context);
> >  			if (dqinfo) {
> >  				tp->t_dqinfo = dqinfo;
> > -				XFS_TRANS_FREE_DQINFO(tp->t_mountp, tp);
> > +				xfs_trans_free_dqinfo(tp);
> >  			}
> >  			*tpp = ntp;
> >  			*ipp = NULL;
> > Index: xfs/fs/xfs/xfs_bmap.c
> > ===================================================================
> > --- xfs.orig/fs/xfs/xfs_bmap.c	2009-02-24 15:32:16.102370140 +0100
> > +++ xfs/fs/xfs/xfs_bmap.c	2009-02-24 15:32:35.853494922 +0100
> > @@ -2691,7 +2691,7 @@ xfs_bmap_rtalloc(
> >  		 * Adjust the disk quota also. This was reserved
> >  		 * earlier.
> >  		 */
> > -		XFS_TRANS_MOD_DQUOT_BYINO(mp, ap->tp, ap->ip,
> > +		xfs_trans_mod_dquot_byino(ap->tp, ap->ip,
> >  			ap->wasdel ? XFS_TRANS_DQ_DELRTBCOUNT :
> >  					XFS_TRANS_DQ_RTBCOUNT, (long) ralen);
> >  	} else {
> > @@ -2995,7 +2995,7 @@ xfs_bmap_btalloc(
> >  		 * Adjust the disk quota also. This was reserved
> >  		 * earlier.
> >  		 */
> > -		XFS_TRANS_MOD_DQUOT_BYINO(mp, ap->tp, ap->ip,
> > +		xfs_trans_mod_dquot_byino(ap->tp, ap->ip,
> >  			ap->wasdel ? XFS_TRANS_DQ_DELBCOUNT :
> >  					XFS_TRANS_DQ_BCOUNT,
> >  			(long) args.len);
> > @@ -3066,7 +3066,7 @@ xfs_bmap_btree_to_extents(
> >  		return error;
> >  	xfs_bmap_add_free(cbno, 1, cur->bc_private.b.flist, mp);
> >  	ip->i_d.di_nblocks--;
> > -	XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, XFS_TRANS_DQ_BCOUNT, -1L);
> > +	xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L);
> >  	xfs_trans_binval(tp, cbp);
> >  	if (cur->bc_bufs[0] == cbp)
> >  		cur->bc_bufs[0] = NULL;
> > @@ -3386,7 +3386,7 @@ xfs_bmap_del_extent(
> >  	 * Adjust quota data.
> >  	 */
> >  	if (qfield)
> > -		XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, qfield, (long)-nblks);
> > +		xfs_trans_mod_dquot_byino(tp, ip, qfield, (long)-nblks);
> >  
> >  	/*
> >  	 * Account for change in delayed indirect blocks.
> > @@ -3523,7 +3523,7 @@ xfs_bmap_extents_to_btree(
> >  	*firstblock = cur->bc_private.b.firstblock = args.fsbno;
> >  	cur->bc_private.b.allocated++;
> >  	ip->i_d.di_nblocks++;
> > -	XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, XFS_TRANS_DQ_BCOUNT, 1L);
> > +	xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, 1L);
> >  	abp = xfs_btree_get_bufl(mp, tp, args.fsbno, 0);
> >  	/*
> >  	 * Fill in the child block.
> > @@ -3666,7 +3666,7 @@ xfs_bmap_local_to_extents(
> >  		XFS_BMAP_TRACE_POST_UPDATE("new", ip, 0, whichfork);
> >  		XFS_IFORK_NEXT_SET(ip, whichfork, 1);
> >  		ip->i_d.di_nblocks = 1;
> > -		XFS_TRANS_MOD_DQUOT_BYINO(args.mp, tp, ip,
> > +		xfs_trans_mod_dquot_byino(tp, ip,
> >  			XFS_TRANS_DQ_BCOUNT, 1L);
> >  		flags |= xfs_ilog_fext(whichfork);
> >  	} else {
> > @@ -4024,7 +4024,7 @@ xfs_bmap_add_attrfork(
> >  			XFS_TRANS_PERM_LOG_RES, XFS_ADDAFORK_LOG_COUNT)))
> >  		goto error0;
> >  	xfs_ilock(ip, XFS_ILOCK_EXCL);
> > -	error = XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip, blks, 0, rsvd ?
> > +	error = xfs_trans_reserve_quota_nblks(tp, ip, blks, 0, rsvd ?
> >  			XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_FORCE_RES :
> >  			XFS_QMOPT_RES_REGBLKS);
> >  	if (error) {
> > @@ -4959,10 +4959,11 @@ xfs_bmapi(
> >  				 * adjusted later.  We return if we haven't
> >  				 * allocated blocks already inside this loop.
> >  				 */
> > -				if ((error = XFS_TRANS_RESERVE_QUOTA_NBLKS(
> > -						mp, NULL, ip, (long)alen, 0,
> > +				error = xfs_trans_reserve_quota_nblks(
> > +						NULL, ip, (long)alen, 0,
> >  						rt ? XFS_QMOPT_RES_RTBLKS :
> > -						     XFS_QMOPT_RES_REGBLKS))) {
> > +						     XFS_QMOPT_RES_REGBLKS);
> > +				if (error) {
> >  					if (n == 0) {
> >  						*nmap = 0;
> >  						ASSERT(cur == NULL);
> > @@ -5011,8 +5012,8 @@ xfs_bmapi(
> >  					if (XFS_IS_QUOTA_ON(mp))
> >  						/* unreserve the blocks now */
> >  						(void)
> > -						XFS_TRANS_UNRESERVE_QUOTA_NBLKS(
> > -							mp, NULL, ip,
> > +						xfs_trans_unreserve_quota_nblks(
> > +							NULL, ip,
> >  							(long)alen, 0, rt ?
> >  							XFS_QMOPT_RES_RTBLKS :
> >  							XFS_QMOPT_RES_REGBLKS);
> > @@ -5667,14 +5668,14 @@ xfs_bunmapi(
> >  				do_div(rtexts, mp->m_sb.sb_rextsize);
> >  				xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS,
> >  						(int64_t)rtexts, rsvd);
> > -				(void)XFS_TRANS_RESERVE_QUOTA_NBLKS(mp,
> > -					NULL, ip, -((long)del.br_blockcount), 0,
> > +				(void)xfs_trans_reserve_quota_nblks(NULL,
> > +					ip, -((long)del.br_blockcount), 0,
> >  					XFS_QMOPT_RES_RTBLKS);
> >  			} else {
> >  				xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS,
> >  						(int64_t)del.br_blockcount, rsvd);
> > -				(void)XFS_TRANS_RESERVE_QUOTA_NBLKS(mp,
> > -					NULL, ip, -((long)del.br_blockcount), 0,
> > +				(void)xfs_trans_reserve_quota_nblks(NULL,
> > +					ip, -((long)del.br_blockcount), 0,
> >  					XFS_QMOPT_RES_REGBLKS);
> >  			}
> >  			ip->i_delayed_blks -= del.br_blockcount;
> > Index: xfs/fs/xfs/xfs_bmap_btree.c
> > ===================================================================
> > --- xfs.orig/fs/xfs/xfs_bmap_btree.c	2009-02-24 15:32:16.106369811 +0100
> > +++ xfs/fs/xfs/xfs_bmap_btree.c	2009-02-24 15:32:35.854494491 +0100
> > @@ -590,7 +590,7 @@ xfs_bmbt_alloc_block(
> >  	cur->bc_private.b.allocated++;
> >  	cur->bc_private.b.ip->i_d.di_nblocks++;
> >  	xfs_trans_log_inode(args.tp, cur->bc_private.b.ip, XFS_ILOG_CORE);
> > -	XFS_TRANS_MOD_DQUOT_BYINO(args.mp, args.tp, cur->bc_private.b.ip,
> > +	xfs_trans_mod_dquot_byino(args.tp, cur->bc_private.b.ip,
> >  			XFS_TRANS_DQ_BCOUNT, 1L);
> >  
> >  	new->l = cpu_to_be64(args.fsbno);
> > @@ -618,7 +618,7 @@ xfs_bmbt_free_block(
> >  	ip->i_d.di_nblocks--;
> >  
> >  	xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
> > -	XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, XFS_TRANS_DQ_BCOUNT, -1L);
> > +	xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L);
> >  	xfs_trans_binval(tp, bp);
> >  	return 0;
> >  }
> > Index: xfs/fs/xfs/xfs_vnodeops.c
> > ===================================================================
> > --- xfs.orig/fs/xfs/xfs_vnodeops.c	2009-02-24 15:32:16.111370238 +0100
> > +++ xfs/fs/xfs/xfs_vnodeops.c	2009-02-24 15:32:35.855495805 +0100
> > @@ -118,7 +118,7 @@ xfs_setattr(
> >  		 */
> >  		ASSERT(udqp == NULL);
> >  		ASSERT(gdqp == NULL);
> > -		code = XFS_QM_DQVOPALLOC(mp, ip, uid, gid, ip->i_d.di_projid,
> > +		code = xfs_qm_vop_dqalloc(ip, uid, gid, ip->i_d.di_projid,
> >  					 qflags, &udqp, &gdqp);
> >  		if (code)
> >  			return code;
> > @@ -183,7 +183,7 @@ xfs_setattr(
> >  		if ((XFS_IS_UQUOTA_ON(mp) && iuid != uid) ||
> >  		    (XFS_IS_GQUOTA_ON(mp) && igid != gid)) {
> >  			ASSERT(tp);
> > -			code = XFS_QM_DQVOPCHOWNRESV(mp, tp, ip, udqp, gdqp,
> > +			code = xfs_qm_vop_chown_reserve(tp, ip, udqp, gdqp,
> >  						capable(CAP_FOWNER) ?
> >  						XFS_QMOPT_FORCE_RES : 0);
> >  			if (code)	/* out of quota */
> > @@ -217,7 +217,7 @@ xfs_setattr(
> >  		/*
> >  		 * Make sure that the dquots are attached to the inode.
> >  		 */
> > -		code = XFS_QM_DQATTACH(mp, ip, XFS_QMOPT_ILOCKED);
> > +		code = xfs_qm_dqattach_locked(ip, 0);
> >  		if (code)
> >  			goto error_return;
> >  
> > @@ -354,7 +354,7 @@ xfs_setattr(
> >  			if (XFS_IS_UQUOTA_ON(mp)) {
> >  				ASSERT(mask & ATTR_UID);
> >  				ASSERT(udqp);
> > -				olddquot1 = XFS_QM_DQVOPCHOWN(mp, tp, ip,
> > +				olddquot1 = xfs_qm_vop_chown(tp, ip,
> >  							&ip->i_udquot, udqp);
> >  			}
> >  			ip->i_d.di_uid = uid;
> > @@ -365,7 +365,7 @@ xfs_setattr(
> >  				ASSERT(!XFS_IS_PQUOTA_ON(mp));
> >  				ASSERT(mask & ATTR_GID);
> >  				ASSERT(gdqp);
> > -				olddquot2 = XFS_QM_DQVOPCHOWN(mp, tp, ip,
> > +				olddquot2 = xfs_qm_vop_chown(tp, ip,
> >  							&ip->i_gdquot, gdqp);
> >  			}
> >  			ip->i_d.di_gid = gid;
> > @@ -461,10 +461,10 @@ xfs_setattr(
> >  	/*
> >  	 * Release any dquot(s) the inode had kept before chown.
> >  	 */
> > -	XFS_QM_DQRELE(mp, olddquot1);
> > -	XFS_QM_DQRELE(mp, olddquot2);
> > -	XFS_QM_DQRELE(mp, udqp);
> > -	XFS_QM_DQRELE(mp, gdqp);
> > +	xfs_qm_dqrele(olddquot1);
> > +	xfs_qm_dqrele(olddquot2);
> > +	xfs_qm_dqrele(udqp);
> > +	xfs_qm_dqrele(gdqp);
> >  
> >  	if (code) {
> >  		return code;
> > @@ -482,8 +482,8 @@ xfs_setattr(
> >  	commit_flags |= XFS_TRANS_ABORT;
> >  	/* FALLTHROUGH */
> >   error_return:
> > -	XFS_QM_DQRELE(mp, udqp);
> > -	XFS_QM_DQRELE(mp, gdqp);
> > +	xfs_qm_dqrele(udqp);
> > +	xfs_qm_dqrele(gdqp);
> >  	if (tp) {
> >  		xfs_trans_cancel(tp, commit_flags);
> >  	}
> > @@ -739,7 +739,8 @@ xfs_free_eofblocks(
> >  		/*
> >  		 * Attach the dquots to the inode up front.
> >  		 */
> > -		if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
> > +		error = xfs_qm_dqattach(ip, 0);
> > +		if (error)
> >  			return error;
> >  
> >  		/*
> > @@ -1181,7 +1182,8 @@ xfs_inactive(
> >  
> >  	ASSERT(ip->i_d.di_nlink == 0);
> >  
> > -	if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
> > +	error = xfs_qm_dqattach(ip, 0);
> > +	if (error)
> >  		return VN_INACTIVE_CACHE;
> >  
> >  	tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE);
> > @@ -1307,7 +1309,7 @@ xfs_inactive(
> >  		/*
> >  		 * Credit the quota account(s). The inode is gone.
> >  		 */
> > -		XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, XFS_TRANS_DQ_ICOUNT, -1);
> > +		xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_ICOUNT, -1);
> >  
> >  		/*
> >  		 * Just ignore errors at this point.  There is nothing we can
> > @@ -1323,11 +1325,11 @@ xfs_inactive(
> >  			xfs_fs_cmn_err(CE_NOTE, mp, "xfs_inactive: "
> >  				"xfs_trans_commit() returned error %d", error);
> >  	}
> > +
> >  	/*
> >  	 * Release the dquots held by inode, if any.
> >  	 */
> > -	XFS_QM_DQDETACH(mp, ip);
> > -
> > +	xfs_qm_dqdetach(ip);
> >  	xfs_iunlock(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
> >  
> >   out:
> > @@ -1398,14 +1400,16 @@ xfs_create(
> >  	uint			cancel_flags;
> >  	int			committed;
> >  	xfs_prid_t		prid;
> > -	struct xfs_dquot	*udqp = NULL;
> > -	struct xfs_dquot	*gdqp = NULL;
> > +	struct xfs_dquot	*udqp, *gdqp;
> >  	uint			resblks;
> >  	uint			log_res;
> >  	uint			log_count;
> >  
> >  	xfs_itrace_entry(dp);
> >  
> > +	udqp = NULL;
> > +	gdqp = NULL;
> > +
> >  	if (XFS_FORCED_SHUTDOWN(mp))
> >  		return XFS_ERROR(EIO);
> >  
> > @@ -1427,8 +1431,7 @@ xfs_create(
> >  	/*
> >  	 * Make sure that we have allocated dquot(s) on disk.
> >  	 */
> > -	error = XFS_QM_DQVOPALLOC(mp, dp,
> > -			current_fsuid(), current_fsgid(), prid,
> > +	error = xfs_qm_vop_dqalloc(dp, current_fsuid(), current_fsgid(), prid,
> >  			XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, &udqp, &gdqp);
> >  	if (error)
> >  		goto std_return;
> > @@ -1482,7 +1485,7 @@ xfs_create(
> >  	/*
> >  	 * Reserve disk quota and the inode.
> >  	 */
> > -	error = XFS_TRANS_RESERVE_QUOTA(mp, tp, udqp, gdqp, resblks, 1, 0);
> > +	error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp, resblks, 1, 0);
> >  	if (error)
> >  		goto out_trans_cancel;
> >  
> > @@ -1554,7 +1557,7 @@ xfs_create(
> >  	 * These ids of the inode couldn't have changed since the new
> >  	 * inode has been locked ever since it was created.
> >  	 */
> > -	XFS_QM_DQVOPCREATE(mp, tp, ip, udqp, gdqp);
> > +	xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp);
> >  
> >  	/*
> >  	 * xfs_trans_commit normally decrements the vnode ref count
> > @@ -1573,8 +1576,8 @@ xfs_create(
> >  		goto out_dqrele;
> >  	}
> >  
> > -	XFS_QM_DQRELE(mp, udqp);
> > -	XFS_QM_DQRELE(mp, gdqp);
> > +	xfs_qm_dqrele(udqp);
> > +	xfs_qm_dqrele(gdqp);
> >  
> >  	*ipp = ip;
> >  
> > @@ -1595,8 +1598,8 @@ xfs_create(
> >   out_trans_cancel:
> >  	xfs_trans_cancel(tp, cancel_flags);
> >   out_dqrele:
> > -	XFS_QM_DQRELE(mp, udqp);
> > -	XFS_QM_DQRELE(mp, gdqp);
> > +	xfs_qm_dqrele(udqp);
> > +	xfs_qm_dqrele(gdqp);
> >  
> >  	if (unlock_dp_on_error)
> >  		xfs_iunlock(dp, XFS_ILOCK_EXCL);
> > @@ -1830,11 +1833,11 @@ xfs_remove(
> >  			return error;
> >  	}
> >  
> > -	error = XFS_QM_DQATTACH(mp, dp, 0);
> > +	error = xfs_qm_dqattach(dp, 0);
> >  	if (error)
> >  		goto std_return;
> >  
> > -	error = XFS_QM_DQATTACH(mp, ip, 0);
> > +	error = xfs_qm_dqattach(ip, 0);
> >  	if (error)
> >  		goto std_return;
> >  
> > @@ -2021,11 +2024,11 @@ xfs_link(
> >  
> >  	/* Return through std_return after this point. */
> >  
> > -	error = XFS_QM_DQATTACH(mp, sip, 0);
> > +	error = xfs_qm_dqattach(sip, 0);
> >  	if (error)
> >  		goto std_return;
> >  
> > -	error = XFS_QM_DQATTACH(mp, tdp, 0);
> > +	error = xfs_qm_dqattach(tdp, 0);
> >  	if (error)
> >  		goto std_return;
> >  
> > @@ -2198,8 +2201,7 @@ xfs_symlink(
> >  	/*
> >  	 * Make sure that we have allocated dquot(s) on disk.
> >  	 */
> > -	error = XFS_QM_DQVOPALLOC(mp, dp,
> > -			current_fsuid(), current_fsgid(), prid,
> > +	error = xfs_qm_vop_dqalloc(dp, current_fsuid(), current_fsgid(), prid,
> >  			XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, &udqp, &gdqp);
> >  	if (error)
> >  		goto std_return;
> > @@ -2241,7 +2243,7 @@ xfs_symlink(
> >  	/*
> >  	 * Reserve disk quota : blocks and inode.
> >  	 */
> > -	error = XFS_TRANS_RESERVE_QUOTA(mp, tp, udqp, gdqp, resblks, 1, 0);
> > +	error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp, resblks, 1, 0);
> >  	if (error)
> >  		goto error_return;
> >  
> > @@ -2281,7 +2283,7 @@ xfs_symlink(
> >  	/*
> >  	 * Also attach the dquot(s) to it, if applicable.
> >  	 */
> > -	XFS_QM_DQVOPCREATE(mp, tp, ip, udqp, gdqp);
> > +	xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp);
> >  
> >  	if (resblks)
> >  		resblks -= XFS_IALLOC_SPACE_RES(mp);
> > @@ -2369,8 +2371,8 @@ xfs_symlink(
> >  		goto error2;
> >  	}
> >  	error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES);
> > -	XFS_QM_DQRELE(mp, udqp);
> > -	XFS_QM_DQRELE(mp, gdqp);
> > +	xfs_qm_dqrele(udqp);
> > +	xfs_qm_dqrele(gdqp);
> >  
> >  	/* Fall through to std_return with error = 0 or errno from
> >  	 * xfs_trans_commit	*/
> > @@ -2394,8 +2396,8 @@ std_return:
> >  	cancel_flags |= XFS_TRANS_ABORT;
> >   error_return:
> >  	xfs_trans_cancel(tp, cancel_flags);
> > -	XFS_QM_DQRELE(mp, udqp);
> > -	XFS_QM_DQRELE(mp, gdqp);
> > +	xfs_qm_dqrele(udqp);
> > +	xfs_qm_dqrele(gdqp);
> >  
> >  	if (unlock_dp_on_error)
> >  		xfs_iunlock(dp, XFS_ILOCK_EXCL);
> > @@ -2534,7 +2536,8 @@ xfs_alloc_file_space(
> >  	if (XFS_FORCED_SHUTDOWN(mp))
> >  		return XFS_ERROR(EIO);
> >  
> > -	if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
> > +	error = xfs_qm_dqattach(ip, 0);
> > +	if (error)
> >  		return error;
> >  
> >  	if (len <= 0)
> > @@ -2621,8 +2624,8 @@ retry:
> >  			break;
> >  		}
> >  		xfs_ilock(ip, XFS_ILOCK_EXCL);
> > -		error = XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip,
> > -						      qblocks, 0, quota_flag);
> > +		error = xfs_trans_reserve_quota_nblks(tp, ip, qblocks,
> > +						      0, quota_flag);
> >  		if (error)
> >  			goto error1;
> >  
> > @@ -2681,7 +2684,7 @@ dmapi_enospc_check:
> >  
> >  error0:	/* Cancel bmap, unlock inode, unreserve quota blocks, cancel trans */
> >  	xfs_bmap_cancel(&free_list);
> > -	XFS_TRANS_UNRESERVE_QUOTA_NBLKS(mp, tp, ip, qblocks, 0, quota_flag);
> > +	xfs_trans_unreserve_quota_nblks(tp, ip, qblocks, 0, quota_flag);
> >  
> >  error1:	/* Just cancel transaction */
> >  	xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT);
> > @@ -2820,7 +2823,8 @@ xfs_free_file_space(
> >  
> >  	xfs_itrace_entry(ip);
> >  
> > -	if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
> > +	error = xfs_qm_dqattach(ip, 0);
> > +	if (error)
> >  		return error;
> >  
> >  	error = 0;
> > @@ -2946,9 +2950,9 @@ xfs_free_file_space(
> >  			break;
> >  		}
> >  		xfs_ilock(ip, XFS_ILOCK_EXCL);
> > -		error = XFS_TRANS_RESERVE_QUOTA(mp, tp,
> > -				ip->i_udquot, ip->i_gdquot, resblks, 0,
> > -				XFS_QMOPT_RES_REGBLKS);
> > +		error = xfs_trans_reserve_quota(tp, mp,
> > +				ip->i_udquot, ip->i_gdquot,
> > +				resblks, 0, XFS_QMOPT_RES_REGBLKS);
> >  		if (error)
> >  			goto error1;
> >  
> > Index: xfs/fs/xfs/quota/xfs_qm.h
> > ===================================================================
> > --- xfs.orig/fs/xfs/quota/xfs_qm.h	2009-02-24 15:32:16.067369944 +0100
> > +++ xfs/fs/xfs/quota/xfs_qm.h	2009-02-24 15:32:35.856495653 +0100
> > @@ -127,8 +127,6 @@ typedef struct xfs_quotainfo {
> >  } xfs_quotainfo_t;
> >  
> >  
> > -extern xfs_dqtrxops_t	xfs_trans_dquot_ops;
> > -
> >  extern void	xfs_trans_mod_dquot(xfs_trans_t *, xfs_dquot_t *, uint, long);
> >  extern int	xfs_trans_reserve_quota_bydquots(xfs_trans_t *, xfs_mount_t *,
> >  			xfs_dquot_t *, xfs_dquot_t *, long, long, uint);
> > @@ -159,17 +157,11 @@ typedef struct xfs_dquot_acct {
> >  #define XFS_QM_RTBWARNLIMIT	5
> >  
> >  extern void		xfs_qm_destroy_quotainfo(xfs_mount_t *);
> > -extern void		xfs_qm_mount_quotas(xfs_mount_t *);
> >  extern int		xfs_qm_quotacheck(xfs_mount_t *);
> > -extern void		xfs_qm_unmount_quotadestroy(xfs_mount_t *);
> > -extern void		xfs_qm_unmount_quotas(xfs_mount_t *);
> >  extern int		xfs_qm_write_sb_changes(xfs_mount_t *, __int64_t);
> > -extern int		xfs_qm_sync(xfs_mount_t *, int);
> >  
> >  /* dquot stuff */
> >  extern boolean_t	xfs_qm_dqalloc_incore(xfs_dquot_t **);
> > -extern int		xfs_qm_dqattach(xfs_inode_t *, uint);
> > -extern void		xfs_qm_dqdetach(xfs_inode_t *);
> >  extern int		xfs_qm_dqpurge_all(xfs_mount_t *, uint);
> >  extern void		xfs_qm_dqrele_all_inodes(xfs_mount_t *, uint);
> >  
> > @@ -183,19 +175,6 @@ extern int		xfs_qm_scall_getqstat(xfs_mo
> >  extern int		xfs_qm_scall_quotaon(xfs_mount_t *, uint);
> >  extern int		xfs_qm_scall_quotaoff(xfs_mount_t *, uint);
> >  
> > -/* vop stuff */
> > -extern int		xfs_qm_vop_dqalloc(xfs_mount_t *, xfs_inode_t *,
> > -					uid_t, gid_t, prid_t, uint,
> > -					xfs_dquot_t **, xfs_dquot_t **);
> > -extern void		xfs_qm_vop_dqattach_and_dqmod_newinode(
> > -					xfs_trans_t *, xfs_inode_t *,
> > -					xfs_dquot_t *, xfs_dquot_t *);
> > -extern int		xfs_qm_vop_rename_dqattach(xfs_inode_t **);
> > -extern xfs_dquot_t *	xfs_qm_vop_chown(xfs_trans_t *, xfs_inode_t *,
> > -					xfs_dquot_t **, xfs_dquot_t *);
> > -extern int		xfs_qm_vop_chown_reserve(xfs_trans_t *, xfs_inode_t *,
> > -					xfs_dquot_t *, xfs_dquot_t *, uint);
> > -
> >  /* list stuff */
> >  extern void		xfs_qm_freelist_append(xfs_frlist_t *, xfs_dquot_t *);
> >  extern void		xfs_qm_freelist_unlink(xfs_dquot_t *);
> > Index: xfs/fs/xfs/quota/xfs_qm_bhv.c
> > ===================================================================
> > --- xfs.orig/fs/xfs/quota/xfs_qm_bhv.c	2009-02-24 15:32:16.071370174 +0100
> > +++ xfs/fs/xfs/quota/xfs_qm_bhv.c	2009-02-24 15:32:35.856495653 +0100
> > @@ -84,7 +84,7 @@ xfs_fill_statvfs_from_dquot(
> >   * return a statvfs of the project, not the entire filesystem.
> >   * This makes such trees appear as if they are filesystems in themselves.
> >   */
> > -STATIC void
> > +void
> >  xfs_qm_statvfs(
> >  	xfs_inode_t		*ip,
> >  	struct kstatfs		*statp)
> > @@ -92,20 +92,13 @@ xfs_qm_statvfs(
> >  	xfs_mount_t		*mp = ip->i_mount;
> >  	xfs_dquot_t		*dqp;
> >  
> > -	if (!(ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) ||
> > -	    !((mp->m_qflags & (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))) ==
> > -	    		      (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))
> > -		return;
> > -
> >  	if (!xfs_qm_dqget(mp, NULL, ip->i_d.di_projid, XFS_DQ_PROJ, 0, &dqp)) {
> > -		xfs_disk_dquot_t	*dp = &dqp->q_core;
> > -
> > -		xfs_fill_statvfs_from_dquot(statp, dp);
> > +		xfs_fill_statvfs_from_dquot(statp, &dqp->q_core);
> >  		xfs_qm_dqput(dqp);
> >  	}
> >  }
> >  
> > -STATIC int
> > +int
> >  xfs_qm_newmount(
> >  	xfs_mount_t	*mp,
> >  	uint		*needquotamount,
> > @@ -114,9 +107,6 @@ xfs_qm_newmount(
> >  	uint		quotaondisk;
> >  	uint		uquotaondisk = 0, gquotaondisk = 0, pquotaondisk = 0;
> >  
> > -	*quotaflags = 0;
> > -	*needquotamount = B_FALSE;
> > -
> >  	quotaondisk = xfs_sb_version_hasquota(&mp->m_sb) &&
> >  				(mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT);
> >  
> > @@ -179,66 +169,6 @@ xfs_qm_newmount(
> >  	return 0;
> >  }
> >  
> > -STATIC int
> > -xfs_qm_endmount(
> > -	xfs_mount_t	*mp,
> > -	uint		needquotamount,
> > -	uint		quotaflags)
> > -{
> > -	if (needquotamount) {
> > -		ASSERT(mp->m_qflags == 0);
> > -		mp->m_qflags = quotaflags;
> > -		xfs_qm_mount_quotas(mp);
> > -	}
> > -
> > -#if defined(DEBUG) && defined(XFS_LOUD_RECOVERY)
> > -	if (! (XFS_IS_QUOTA_ON(mp)))
> > -		xfs_fs_cmn_err(CE_NOTE, mp, "Disk quotas not turned on");
> > -	else
> > -		xfs_fs_cmn_err(CE_NOTE, mp, "Disk quotas turned on");
> > -#endif
> > -
> > -#ifdef QUOTADEBUG
> > -	if (XFS_IS_QUOTA_ON(mp) && xfs_qm_internalqcheck(mp))
> > -		cmn_err(CE_WARN, "XFS: mount internalqcheck failed");
> > -#endif
> > -
> > -	return 0;
> > -}
> > -
> > -STATIC void
> > -xfs_qm_dqrele_null(
> > -	xfs_dquot_t	*dq)
> > -{
> > -	/*
> > -	 * Called from XFS, where we always check first for a NULL dquot.
> > -	 */
> > -	if (!dq)
> > -		return;
> > -	xfs_qm_dqrele(dq);
> > -}
> > -
> > -
> > -struct xfs_qmops xfs_qmcore_xfs = {
> > -	.xfs_qminit		= xfs_qm_newmount,
> > -	.xfs_qmdone		= xfs_qm_unmount_quotadestroy,
> > -	.xfs_qmmount		= xfs_qm_endmount,
> > -	.xfs_qmunmount		= xfs_qm_unmount_quotas,
> > -	.xfs_dqrele		= xfs_qm_dqrele_null,
> > -	.xfs_dqattach		= xfs_qm_dqattach,
> > -	.xfs_dqdetach		= xfs_qm_dqdetach,
> > -	.xfs_dqpurgeall		= xfs_qm_dqpurge_all,
> > -	.xfs_dqvopalloc		= xfs_qm_vop_dqalloc,
> > -	.xfs_dqvopcreate	= xfs_qm_vop_dqattach_and_dqmod_newinode,
> > -	.xfs_dqvoprename	= xfs_qm_vop_rename_dqattach,
> > -	.xfs_dqvopchown		= xfs_qm_vop_chown,
> > -	.xfs_dqvopchownresv	= xfs_qm_vop_chown_reserve,
> > -	.xfs_dqstatvfs		= xfs_qm_statvfs,
> > -	.xfs_dqsync		= xfs_qm_sync,
> > -	.xfs_dqtrxops		= &xfs_trans_dquot_ops,
> > -};
> > -EXPORT_SYMBOL(xfs_qmcore_xfs);
> > -
> >  void __init
> >  xfs_qm_init(void)
> >  {
> > Index: xfs/fs/xfs/xfs_attr.c
> > ===================================================================
> > --- xfs.orig/fs/xfs/xfs_attr.c	2009-02-24 15:32:16.115370119 +0100
> > +++ xfs/fs/xfs/xfs_attr.c	2009-02-24 15:32:35.857495152 +0100
> > @@ -249,8 +249,9 @@ xfs_attr_set_int(xfs_inode_t *dp, struct
> >  	/*
> >  	 * Attach the dquots to the inode.
> >  	 */
> > -	if ((error = XFS_QM_DQATTACH(mp, dp, 0)))
> > -		return (error);
> > +	error = xfs_qm_dqattach(dp, 0);
> > +	if (error)
> > +		return error;
> >  
> >  	/*
> >  	 * If the inode doesn't have an attribute fork, add one.
> > @@ -311,7 +312,7 @@ xfs_attr_set_int(xfs_inode_t *dp, struct
> >  	}
> >  	xfs_ilock(dp, XFS_ILOCK_EXCL);
> >  
> > -	error = XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, args.trans, dp, args.total, 0,
> > +	error = xfs_trans_reserve_quota_nblks(args.trans, dp, args.total, 0,
> >  				rsvd ? XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_FORCE_RES :
> >  				       XFS_QMOPT_RES_REGBLKS);
> >  	if (error) {
> > @@ -501,8 +502,9 @@ xfs_attr_remove_int(xfs_inode_t *dp, str
> >  	/*
> >  	 * Attach the dquots to the inode.
> >  	 */
> > -	if ((error = XFS_QM_DQATTACH(mp, dp, 0)))
> > -		return (error);
> > +	error = xfs_qm_dqattach(dp, 0);
> > +	if (error)
> > +		return error;
> >  
> >  	/*
> >  	 * Start our first transaction of the day.
> > Index: xfs/fs/xfs/xfs_iomap.c
> > ===================================================================
> > --- xfs.orig/fs/xfs/xfs_iomap.c	2009-02-24 15:32:16.119370349 +0100
> > +++ xfs/fs/xfs/xfs_iomap.c	2009-02-24 15:32:35.858495489 +0100
> > @@ -417,7 +417,7 @@ xfs_iomap_write_direct(
> >  	 * Make sure that the dquots are there. This doesn't hold
> >  	 * the ilock across a disk read.
> >  	 */
> > -	error = XFS_QM_DQATTACH(ip->i_mount, ip, XFS_QMOPT_ILOCKED);
> > +	error = xfs_qm_dqattach_locked(ip, 0);
> >  	if (error)
> >  		return XFS_ERROR(error);
> >  
> > @@ -476,8 +476,7 @@ xfs_iomap_write_direct(
> >  	if (error)
> >  		goto error_out;
> >  
> > -	error = XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip,
> > -					      qblocks, 0, quota_flag);
> > +	error = xfs_trans_reserve_quota_nblks(tp, ip, qblocks, 0, quota_flag);
> >  	if (error)
> >  		goto error1;
> >  
> > @@ -527,7 +526,7 @@ xfs_iomap_write_direct(
> >  
> >  error0:	/* Cancel bmap, unlock inode, unreserve quota blocks, cancel trans */
> >  	xfs_bmap_cancel(&free_list);
> > -	XFS_TRANS_UNRESERVE_QUOTA_NBLKS(mp, tp, ip, qblocks, 0, quota_flag);
> > +	xfs_trans_unreserve_quota_nblks(tp, ip, qblocks, 0, quota_flag);
> >  
> >  error1:	/* Just cancel transaction */
> >  	xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT);
> > @@ -620,7 +619,7 @@ xfs_iomap_write_delay(
> >  	 * Make sure that the dquots are there. This doesn't hold
> >  	 * the ilock across a disk read.
> >  	 */
> > -	error = XFS_QM_DQATTACH(mp, ip, XFS_QMOPT_ILOCKED);
> > +	error = xfs_qm_dqattach_locked(ip, 0);
> >  	if (error)
> >  		return XFS_ERROR(error);
> >  
> > @@ -715,7 +714,8 @@ xfs_iomap_write_allocate(
> >  	/*
> >  	 * Make sure that the dquots are there.
> >  	 */
> > -	if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
> > +	error = xfs_qm_dqattach(ip, 0);
> > +	if (error)
> >  		return XFS_ERROR(error);
> >  
> >  	offset_fsb = XFS_B_TO_FSBT(mp, offset);
> > Index: xfs/fs/xfs/xfs_mount.h
> > ===================================================================
> > --- xfs.orig/fs/xfs/xfs_mount.h	2009-02-24 15:32:16.124369938 +0100
> > +++ xfs/fs/xfs/xfs_mount.h	2009-02-24 15:32:35.859495267 +0100
> > @@ -18,6 +18,7 @@
> >  #ifndef __XFS_MOUNT_H__
> >  #define	__XFS_MOUNT_H__
> >  
> > +
> >  typedef struct xfs_trans_reservations {
> >  	uint	tr_write;	/* extent alloc trans */
> >  	uint	tr_itruncate;	/* truncate trans */
> > @@ -64,6 +65,8 @@ struct xfs_swapext;
> >  struct xfs_mru_cache;
> >  struct xfs_nameops;
> >  struct xfs_ail;
> > +struct xfs_quotainfo;
> > +
> >  
> >  /*
> >   * Prototypes and functions for the Data Migration subsystem.
> > @@ -107,86 +110,6 @@ typedef struct xfs_dmops {
> >  	(*(mp)->m_dm_ops->xfs_send_unmount)(mp,ip,right,mode,rval,fl)
> >  
> >  
> > -/*
> > - * Prototypes and functions for the Quota Management subsystem.
> > - */
> > -
> > -struct xfs_dquot;
> > -struct xfs_dqtrxops;
> > -struct xfs_quotainfo;
> > -
> > -typedef int	(*xfs_qminit_t)(struct xfs_mount *, uint *, uint *);
> > -typedef int	(*xfs_qmmount_t)(struct xfs_mount *, uint, uint);
> > -typedef void	(*xfs_qmunmount_t)(struct xfs_mount *);
> > -typedef void	(*xfs_qmdone_t)(struct xfs_mount *);
> > -typedef void	(*xfs_dqrele_t)(struct xfs_dquot *);
> > -typedef int	(*xfs_dqattach_t)(struct xfs_inode *, uint);
> > -typedef void	(*xfs_dqdetach_t)(struct xfs_inode *);
> > -typedef int	(*xfs_dqpurgeall_t)(struct xfs_mount *, uint);
> > -typedef int	(*xfs_dqvopalloc_t)(struct xfs_mount *,
> > -			struct xfs_inode *, uid_t, gid_t, prid_t, uint,
> > -			struct xfs_dquot **, struct xfs_dquot **);
> > -typedef void	(*xfs_dqvopcreate_t)(struct xfs_trans *, struct xfs_inode *,
> > -			struct xfs_dquot *, struct xfs_dquot *);
> > -typedef int	(*xfs_dqvoprename_t)(struct xfs_inode **);
> > -typedef struct xfs_dquot * (*xfs_dqvopchown_t)(
> > -			struct xfs_trans *, struct xfs_inode *,
> > -			struct xfs_dquot **, struct xfs_dquot *);
> > -typedef int	(*xfs_dqvopchownresv_t)(struct xfs_trans *, struct xfs_inode *,
> > -			struct xfs_dquot *, struct xfs_dquot *, uint);
> > -typedef void	(*xfs_dqstatvfs_t)(struct xfs_inode *, struct kstatfs *);
> > -typedef int	(*xfs_dqsync_t)(struct xfs_mount *, int flags);
> > -
> > -typedef struct xfs_qmops {
> > -	xfs_qminit_t		xfs_qminit;
> > -	xfs_qmdone_t		xfs_qmdone;
> > -	xfs_qmmount_t		xfs_qmmount;
> > -	xfs_qmunmount_t		xfs_qmunmount;
> > -	xfs_dqrele_t		xfs_dqrele;
> > -	xfs_dqattach_t		xfs_dqattach;
> > -	xfs_dqdetach_t		xfs_dqdetach;
> > -	xfs_dqpurgeall_t	xfs_dqpurgeall;
> > -	xfs_dqvopalloc_t	xfs_dqvopalloc;
> > -	xfs_dqvopcreate_t	xfs_dqvopcreate;
> > -	xfs_dqvoprename_t	xfs_dqvoprename;
> > -	xfs_dqvopchown_t	xfs_dqvopchown;
> > -	xfs_dqvopchownresv_t	xfs_dqvopchownresv;
> > -	xfs_dqstatvfs_t		xfs_dqstatvfs;
> > -	xfs_dqsync_t		xfs_dqsync;
> > -	struct xfs_dqtrxops	*xfs_dqtrxops;
> > -} xfs_qmops_t;
> > -
> > -#define XFS_QM_INIT(mp, mnt, fl) \
> > -	(*(mp)->m_qm_ops->xfs_qminit)(mp, mnt, fl)
> > -#define XFS_QM_MOUNT(mp, mnt, fl) \
> > -	(*(mp)->m_qm_ops->xfs_qmmount)(mp, mnt, fl)
> > -#define XFS_QM_UNMOUNT(mp) \
> > -	(*(mp)->m_qm_ops->xfs_qmunmount)(mp)
> > -#define XFS_QM_DONE(mp) \
> > -	(*(mp)->m_qm_ops->xfs_qmdone)(mp)
> > -#define XFS_QM_DQRELE(mp, dq) \
> > -	(*(mp)->m_qm_ops->xfs_dqrele)(dq)
> > -#define XFS_QM_DQATTACH(mp, ip, fl) \
> > -	(*(mp)->m_qm_ops->xfs_dqattach)(ip, fl)
> > -#define XFS_QM_DQDETACH(mp, ip) \
> > -	(*(mp)->m_qm_ops->xfs_dqdetach)(ip)
> > -#define XFS_QM_DQPURGEALL(mp, fl) \
> > -	(*(mp)->m_qm_ops->xfs_dqpurgeall)(mp, fl)
> > -#define XFS_QM_DQVOPALLOC(mp, ip, uid, gid, prid, fl, dq1, dq2) \
> > -	(*(mp)->m_qm_ops->xfs_dqvopalloc)(mp, ip, uid, gid, prid, fl, dq1, dq2)
> > -#define XFS_QM_DQVOPCREATE(mp, tp, ip, dq1, dq2) \
> > -	(*(mp)->m_qm_ops->xfs_dqvopcreate)(tp, ip, dq1, dq2)
> > -#define XFS_QM_DQVOPRENAME(mp, ip) \
> > -	(*(mp)->m_qm_ops->xfs_dqvoprename)(ip)
> > -#define XFS_QM_DQVOPCHOWN(mp, tp, ip, dqp, dq) \
> > -	(*(mp)->m_qm_ops->xfs_dqvopchown)(tp, ip, dqp, dq)
> > -#define XFS_QM_DQVOPCHOWNRESV(mp, tp, ip, dq1, dq2, fl) \
> > -	(*(mp)->m_qm_ops->xfs_dqvopchownresv)(tp, ip, dq1, dq2, fl)
> > -#define XFS_QM_DQSTATVFS(ip, statp) \
> > -	(*(ip)->i_mount->m_qm_ops->xfs_dqstatvfs)(ip, statp)
> > -#define XFS_QM_DQSYNC(mp, flags) \
> > -	(*(mp)->m_qm_ops->xfs_dqsync)(mp, flags)
> > -
> >  #ifdef HAVE_PERCPU_SB
> >  
> >  /*
> > @@ -516,8 +439,6 @@ extern int	xfs_sb_validate_fsb_count(str
> >  
> >  extern int	xfs_dmops_get(struct xfs_mount *);
> >  extern void	xfs_dmops_put(struct xfs_mount *);
> > -extern int	xfs_qmops_get(struct xfs_mount *);
> > -extern void	xfs_qmops_put(struct xfs_mount *);
> >  
> >  extern struct xfs_dmops xfs_dmcore_xfs;
> >  
> > Index: xfs/fs/xfs/Makefile
> > ===================================================================
> > --- xfs.orig/fs/xfs/Makefile	2009-02-24 15:32:16.158369937 +0100
> > +++ xfs/fs/xfs/Makefile	2009-02-24 15:32:35.859495267 +0100
> > @@ -88,8 +88,7 @@ xfs-y				+= xfs_alloc.o \
> >  				   xfs_utils.o \
> >  				   xfs_vnodeops.o \
> >  				   xfs_rw.o \
> > -				   xfs_dmops.o \
> > -				   xfs_qmops.o
> > +				   xfs_dmops.o
> >  
> >  xfs-$(CONFIG_XFS_TRACE)		+= xfs_btree_trace.o \
> >  				   xfs_dir2_trace.o
> > Index: xfs/fs/xfs/linux-2.6/xfs_ioctl.c
> > ===================================================================
> > --- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl.c	2009-02-24 15:32:16.137370546 +0100
> > +++ xfs/fs/xfs/linux-2.6/xfs_ioctl.c	2009-02-24 15:32:35.865370666 +0100
> > @@ -907,7 +907,7 @@ xfs_ioctl_setattr(
> >  	struct xfs_mount	*mp = ip->i_mount;
> >  	struct xfs_trans	*tp;
> >  	unsigned int		lock_flags = 0;
> > -	struct xfs_dquot	*udqp = NULL, *gdqp = NULL;
> > +	struct xfs_dquot	*udqp, *gdqp;
> >  	struct xfs_dquot	*olddquot = NULL;
> >  	int			code;
> >  
> > @@ -918,6 +918,9 @@ xfs_ioctl_setattr(
> >  	if (XFS_FORCED_SHUTDOWN(mp))
> >  		return XFS_ERROR(EIO);
> >  
> > +	udqp = NULL;
> > +	gdqp = NULL;
> > +
> >  	/*
> >  	 * If disk quotas is on, we make sure that the dquots do exist on disk,
> >  	 * before we start any other transactions. Trying to do this later
> > @@ -927,7 +930,7 @@ xfs_ioctl_setattr(
> >  	 * because the i_*dquot fields will get updated anyway.
> >  	 */
> >  	if (XFS_IS_QUOTA_ON(mp) && (mask & FSX_PROJID)) {
> > -		code = XFS_QM_DQVOPALLOC(mp, ip, ip->i_d.di_uid,
> > +		code = xfs_qm_vop_dqalloc(ip, ip->i_d.di_uid,
> >  					 ip->i_d.di_gid, fa->fsx_projid,
> >  					 XFS_QMOPT_PQUOTA, &udqp, &gdqp);
> >  		if (code)
> > @@ -965,7 +968,7 @@ xfs_ioctl_setattr(
> >  		if (XFS_IS_PQUOTA_ON(mp) &&
> >  		    ip->i_d.di_projid != fa->fsx_projid) {
> >  			ASSERT(tp);
> > -			code = XFS_QM_DQVOPCHOWNRESV(mp, tp, ip, udqp, gdqp,
> > +			code = xfs_qm_vop_chown_reserve(tp, ip, udqp, gdqp,
> >  						capable(CAP_FOWNER) ?
> >  						XFS_QMOPT_FORCE_RES : 0);
> >  			if (code)	/* out of quota */
> > @@ -1068,7 +1071,7 @@ xfs_ioctl_setattr(
> >  		 */
> >  		if (ip->i_d.di_projid != fa->fsx_projid) {
> >  			if (XFS_IS_PQUOTA_ON(mp)) {
> > -				olddquot = XFS_QM_DQVOPCHOWN(mp, tp, ip,
> > +				olddquot = xfs_qm_vop_chown(tp, ip,
> >  							&ip->i_gdquot, gdqp);
> >  			}
> >  			ip->i_d.di_projid = fa->fsx_projid;
> > @@ -1114,9 +1117,9 @@ xfs_ioctl_setattr(
> >  	/*
> >  	 * Release any dquot(s) the inode had kept before chown.
> >  	 */
> > -	XFS_QM_DQRELE(mp, olddquot);
> > -	XFS_QM_DQRELE(mp, udqp);
> > -	XFS_QM_DQRELE(mp, gdqp);
> > +	xfs_qm_dqrele(olddquot);
> > +	xfs_qm_dqrele(udqp);
> > +	xfs_qm_dqrele(gdqp);
> >  
> >  	if (code)
> >  		return code;
> > @@ -1130,8 +1133,8 @@ xfs_ioctl_setattr(
> >  	return 0;
> >  
> >   error_return:
> > -	XFS_QM_DQRELE(mp, udqp);
> > -	XFS_QM_DQRELE(mp, gdqp);
> > +	xfs_qm_dqrele(udqp);
> > +	xfs_qm_dqrele(gdqp);
> >  	xfs_trans_cancel(tp, 0);
> >  	if (lock_flags)
> >  		xfs_iunlock(ip, lock_flags);
> > Index: xfs/fs/xfs/linux-2.6/xfs_super.c
> > ===================================================================
> > --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c	2009-02-24 15:32:16.141370566 +0100
> > +++ xfs/fs/xfs/linux-2.6/xfs_super.c	2009-02-24 15:32:35.866394539 +0100
> > @@ -416,6 +416,14 @@ xfs_parseargs(
> >  		return EINVAL;
> >  	}
> >  
> > +#ifndef CONFIG_XFS_QUOTA
> > +	if (XFS_IS_QUOTA_RUNNING(mp)) {
> > +		cmn_err(CE_WARN,
> > +			"XFS: quota support not available in this kernel.");
> > +		return EINVAL;
> > +	}
> > +#endif
> > +
> >  	if ((mp->m_qflags & (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE)) &&
> >  	    (mp->m_qflags & (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE))) {
> >  		cmn_err(CE_WARN,
> > @@ -1110,7 +1118,6 @@ xfs_fs_put_super(
> >  	xfs_freesb(mp);
> >  	xfs_icsb_destroy_counters(mp);
> >  	xfs_close_devices(mp);
> > -	xfs_qmops_put(mp);
> >  	xfs_dmops_put(mp);
> >  	xfs_free_fsname(mp);
> >  	kfree(mp);
> > @@ -1180,6 +1187,7 @@ xfs_fs_statfs(
> >  {
> >  	struct xfs_mount	*mp = XFS_M(dentry->d_sb);
> >  	xfs_sb_t		*sbp = &mp->m_sb;
> > +	struct xfs_inode	*ip = XFS_I(dentry->d_inode);
> >  	__uint64_t		fakeinos, id;
> >  	xfs_extlen_t		lsize;
> >  
> > @@ -1214,7 +1222,10 @@ xfs_fs_statfs(
> >  	statp->f_ffree = statp->f_files - (sbp->sb_icount - sbp->sb_ifree);
> >  	spin_unlock(&mp->m_sb_lock);
> >  
> > -	XFS_QM_DQSTATVFS(XFS_I(dentry->d_inode), statp);
> > +	if ((ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) ||
> > +	    ((mp->m_qflags & (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))) ==
> > +			      (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))
> > +		xfs_qm_statvfs(ip, statp);
> >  	return 0;
> >  }
> >  
> > @@ -1422,16 +1433,13 @@ xfs_fs_fill_super(
> >  	error = xfs_dmops_get(mp);
> >  	if (error)
> >  		goto out_free_fsname;
> > -	error = xfs_qmops_get(mp);
> > -	if (error)
> > -		goto out_put_dmops;
> >  
> >  	if (silent)
> >  		flags |= XFS_MFSI_QUIET;
> >  
> >  	error = xfs_open_devices(mp);
> >  	if (error)
> > -		goto out_put_qmops;
> > +		goto out_put_dmops;
> >  
> >  	if (xfs_icsb_init_counters(mp))
> >  		mp->m_flags |= XFS_MOUNT_NO_PERCPU_SB;
> > @@ -1500,8 +1508,6 @@ xfs_fs_fill_super(
> >   out_destroy_counters:
> >  	xfs_icsb_destroy_counters(mp);
> >  	xfs_close_devices(mp);
> > - out_put_qmops:
> > -	xfs_qmops_put(mp);
> >   out_put_dmops:
> >  	xfs_dmops_put(mp);
> >   out_free_fsname:
> > Index: xfs/fs/xfs/linux-2.6/xfs_sync.c
> > ===================================================================
> > --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c	2009-02-24 15:32:16.149399312 +0100
> > +++ xfs/fs/xfs/linux-2.6/xfs_sync.c	2009-02-24 15:32:35.867425537 +0100
> > @@ -43,6 +43,7 @@
> >  #include "xfs_buf_item.h"
> >  #include "xfs_inode_item.h"
> >  #include "xfs_rw.h"
> > +#include "xfs_quota.h"
> >  
> >  #include <linux/kthread.h>
> >  #include <linux/freezer.h>
> > @@ -311,12 +312,12 @@ xfs_quiesce_data(
> >  
> >  	/* push non-blocking */
> >  	xfs_sync_inodes(mp, SYNC_DELWRI|SYNC_BDFLUSH);
> > -	XFS_QM_DQSYNC(mp, SYNC_BDFLUSH);
> > +	xfs_qm_sync(mp, SYNC_BDFLUSH);
> >  	xfs_filestream_flush(mp);
> >  
> >  	/* push and block */
> >  	xfs_sync_inodes(mp, SYNC_DELWRI|SYNC_WAIT|SYNC_IOWAIT);
> > -	XFS_QM_DQSYNC(mp, SYNC_WAIT);
> > +	xfs_qm_sync(mp, SYNC_WAIT);
> >  
> >  	/* write superblock and hoover up shutdown errors */
> >  	error = xfs_sync_fsdata(mp, 0);
> > @@ -482,7 +483,7 @@ xfs_sync_worker(
> >  		xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE);
> >  		xfs_reclaim_inodes(mp, 0, XFS_IFLUSH_DELWRI_ELSE_ASYNC);
> >  		/* dgc: errors ignored here */
> > -		error = XFS_QM_DQSYNC(mp, SYNC_BDFLUSH);
> > +		error = xfs_qm_sync(mp, SYNC_BDFLUSH);
> >  		error = xfs_sync_fsdata(mp, SYNC_BDFLUSH);
> >  		if (xfs_log_need_covered(mp))
> >  			error = xfs_commit_dummy_trans(mp, XFS_LOG_FORCE);
> > Index: xfs/fs/xfs/quota/xfs_dquot.c
> > ===================================================================
> > --- xfs.orig/fs/xfs/quota/xfs_dquot.c	2009-02-24 15:32:16.080370342 +0100
> > +++ xfs/fs/xfs/quota/xfs_dquot.c	2009-02-24 15:32:35.867425537 +0100
> > @@ -1194,7 +1194,9 @@ void
> >  xfs_qm_dqrele(
> >  	xfs_dquot_t	*dqp)
> >  {
> > -	ASSERT(dqp);
> > +	if (!dqp)
> > +		return;
> > +
> >  	xfs_dqtrace_entry(dqp, "DQRELE");
> >  
> >  	xfs_dqlock(dqp);
> > Index: xfs/fs/xfs/quota/xfs_dquot.h
> > ===================================================================
> > --- xfs.orig/fs/xfs/quota/xfs_dquot.h	2009-02-24 15:32:16.085370350 +0100
> > +++ xfs/fs/xfs/quota/xfs_dquot.h	2009-02-24 15:32:35.868518762 +0100
> > @@ -181,7 +181,6 @@ extern void		xfs_qm_adjust_dqlimits(xfs_
> >  extern int		xfs_qm_dqget(xfs_mount_t *, xfs_inode_t *,
> >  					xfs_dqid_t, uint, uint, xfs_dquot_t **);
> >  extern void		xfs_qm_dqput(xfs_dquot_t *);
> > -extern void		xfs_qm_dqrele(xfs_dquot_t *);
> >  extern void		xfs_dqlock(xfs_dquot_t *);
> >  extern void		xfs_dqlock2(xfs_dquot_t *, xfs_dquot_t *);
> >  extern void		xfs_dqunlock(xfs_dquot_t *);
> > Index: xfs/fs/xfs/quota/xfs_qm.c
> > ===================================================================
> > --- xfs.orig/fs/xfs/quota/xfs_qm.c	2009-02-24 15:32:16.076370112 +0100
> > +++ xfs/fs/xfs/quota/xfs_qm.c	2009-02-24 15:32:35.869518471 +0100
> > @@ -287,11 +287,13 @@ xfs_qm_rele_quotafs_ref(
> >   * Just destroy the quotainfo structure.
> >   */
> >  void
> > -xfs_qm_unmount_quotadestroy(
> > -	xfs_mount_t	*mp)
> > +xfs_qm_unmount(
> > +	struct xfs_mount	*mp)
> >  {
> > -	if (mp->m_quotainfo)
> > +	if (mp->m_quotainfo) {
> > +		xfs_qm_dqpurge_all(mp, XFS_QMOPT_QUOTALL | XFS_QMOPT_UMOUNTING);
> >  		xfs_qm_destroy_quotainfo(mp);
> > +	}
> >  }
> >  
> >  
> > @@ -311,6 +313,9 @@ xfs_qm_mount_quotas(
> >  	int		error = 0;
> >  	uint		sbf;
> >  
> > +	if (!XFS_IS_QUOTA_RUNNING(mp))
> > +		return;
> > +
> >  	/*
> >  	 * If quotas on realtime volumes is not supported, we disable
> >  	 * quotas immediately.
> > @@ -323,8 +328,6 @@ xfs_qm_mount_quotas(
> >  		goto write_changes;
> >  	}
> >  
> > -	ASSERT(XFS_IS_QUOTA_RUNNING(mp));
> > -
> >  	/*
> >  	 * Allocate the quotainfo structure inside the mount struct, and
> >  	 * create quotainode(s), and change/rev superblock if necessary.
> > @@ -385,8 +388,13 @@ xfs_qm_mount_quotas(
> >  	if (error) {
> >  		xfs_fs_cmn_err(CE_WARN, mp,
> >  			"Failed to initialize disk quotas.");
> > +		return;
> >  	}
> > -	return;
> > +
> > +#ifdef QUOTADEBUG
> > +	if (XFS_IS_QUOTA_ON(mp))
> > +		xfs_qm_internalqcheck(mp);
> > +#endif
> >  }
> >  
> >  /*
> > @@ -774,12 +782,11 @@ xfs_qm_dqattach_grouphint(
> >   * Given a locked inode, attach dquot(s) to it, taking U/G/P-QUOTAON
> >   * into account.
> >   * If XFS_QMOPT_DQALLOC, the dquot(s) will be allocated if needed.
> > - * If XFS_QMOPT_ILOCKED, then inode sent is already locked EXCL.
> >   * Inode may get unlocked and relocked in here, and the caller must deal with
> >   * the consequences.
> >   */
> >  int
> > -xfs_qm_dqattach(
> > +xfs_qm_dqattach_locked(
> >  	xfs_inode_t	*ip,
> >  	uint		flags)
> >  {
> > @@ -787,17 +794,14 @@ xfs_qm_dqattach(
> >  	uint		nquotas = 0;
> >  	int		error = 0;
> >  
> > -	if ((! XFS_IS_QUOTA_ON(mp)) ||
> > -	    (! XFS_NOT_DQATTACHED(mp, ip)) ||
> > -	    (ip->i_ino == mp->m_sb.sb_uquotino) ||
> > -	    (ip->i_ino == mp->m_sb.sb_gquotino))
> > +	if (!XFS_IS_QUOTA_RUNNING(mp) ||
> > +	    !XFS_IS_QUOTA_ON(mp) ||
> > +	    !XFS_NOT_DQATTACHED(mp, ip) ||
> > +	    ip->i_ino == mp->m_sb.sb_uquotino ||
> > +	    ip->i_ino == mp->m_sb.sb_gquotino)
> >  		return 0;
> >  
> > -	ASSERT((flags & XFS_QMOPT_ILOCKED) == 0 ||
> > -	       xfs_isilocked(ip, XFS_ILOCK_EXCL));
> > -
> > -	if (! (flags & XFS_QMOPT_ILOCKED))
> > -		xfs_ilock(ip, XFS_ILOCK_EXCL);
> > +	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
> >  
> >  	if (XFS_IS_UQUOTA_ON(mp)) {
> >  		error = xfs_qm_dqattach_one(ip, ip->i_d.di_uid, XFS_DQ_USER,
> > @@ -849,8 +853,7 @@ xfs_qm_dqattach(
> >  		xfs_qm_dqattach_grouphint(ip->i_udquot, ip->i_gdquot);
> >  	}
> >  
> > -      done:
> > -
> > + done:
> >  #ifdef QUOTADEBUG
> >  	if (! error) {
> >  		if (XFS_IS_UQUOTA_ON(mp))
> > @@ -858,15 +861,22 @@ xfs_qm_dqattach(
> >  		if (XFS_IS_OQUOTA_ON(mp))
> >  			ASSERT(ip->i_gdquot);
> >  	}
> > +	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
> >  #endif
> > +	return error;
> > +}
> > +
> > +int
> > +xfs_qm_dqattach(
> > +	struct xfs_inode	*ip,
> > +	uint			flags)
> > +{
> > +	int			error;
> >  
> > -	if (! (flags & XFS_QMOPT_ILOCKED))
> > -		xfs_iunlock(ip, XFS_ILOCK_EXCL);
> > +	xfs_ilock(ip, XFS_ILOCK_EXCL);
> > +	error = xfs_qm_dqattach_locked(ip, flags);
> > +	xfs_iunlock(ip, XFS_ILOCK_EXCL);
> >  
> > -#ifdef QUOTADEBUG
> > -	else
> > -		ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
> > -#endif
> >  	return error;
> >  }
> >  
> > @@ -912,7 +922,7 @@ xfs_qm_sync(
> >  	boolean_t	nowait;
> >  	int		error;
> >  
> > -	if (! XFS_IS_QUOTA_ON(mp))
> > +	if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
> >  		return 0;
> >  
> >  	restarts = 0;
> > @@ -2319,20 +2329,20 @@ xfs_qm_write_sb_changes(
> >   */
> >  int
> >  xfs_qm_vop_dqalloc(
> > -	xfs_mount_t	*mp,
> > -	xfs_inode_t	*ip,
> > -	uid_t		uid,
> > -	gid_t		gid,
> > -	prid_t		prid,
> > -	uint		flags,
> > -	xfs_dquot_t	**O_udqpp,
> > -	xfs_dquot_t	**O_gdqpp)
> > -{
> > -	int		error;
> > -	xfs_dquot_t	*uq, *gq;
> > -	uint		lockflags;
> > +	struct xfs_inode	*ip,
> > +	uid_t			uid,
> > +	gid_t			gid,
> > +	prid_t			prid,
> > +	uint			flags,
> > +	struct xfs_dquot	**O_udqpp,
> > +	struct xfs_dquot	**O_gdqpp)
> > +{
> > +	struct xfs_mount	*mp = ip->i_mount;
> > +	struct xfs_dquot	*uq, *gq;
> > +	int			error;
> > +	uint			lockflags;
> >  
> > -	if (!XFS_IS_QUOTA_ON(mp))
> > +	if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
> >  		return 0;
> >  
> >  	lockflags = XFS_ILOCK_EXCL;
> > @@ -2346,8 +2356,8 @@ xfs_qm_vop_dqalloc(
> >  	 * if necessary. The dquot(s) will not be locked.
> >  	 */
> >  	if (XFS_NOT_DQATTACHED(mp, ip)) {
> > -		if ((error = xfs_qm_dqattach(ip, XFS_QMOPT_DQALLOC |
> > -					    XFS_QMOPT_ILOCKED))) {
> > +		error = xfs_qm_dqattach_locked(ip, XFS_QMOPT_DQALLOC);
> > +		if (error) {
> >  			xfs_iunlock(ip, lockflags);
> >  			return error;
> >  		}
> > @@ -2469,8 +2479,10 @@ xfs_qm_vop_chown(
> >  	uint		bfield = XFS_IS_REALTIME_INODE(ip) ?
> >  				 XFS_TRANS_DQ_RTBCOUNT : XFS_TRANS_DQ_BCOUNT;
> >  
> > +	if (!XFS_IS_QUOTA_RUNNING(ip->i_mount))
> > +		return NULL;
> > +
> >  	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
> > -	ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount));
> >  
> >  	/* old dquot */
> >  	prevdq = *IO_olddq;
> > @@ -2508,14 +2520,15 @@ xfs_qm_vop_chown_reserve(
> >  	xfs_dquot_t	*gdqp,
> >  	uint		flags)
> >  {
> > -	int		error;
> > -	xfs_mount_t	*mp;
> > +	xfs_mount_t	*mp = ip->i_mount;
> >  	uint		delblks, blkflags, prjflags = 0;
> >  	xfs_dquot_t	*unresudq, *unresgdq, *delblksudq, *delblksgdq;
> > +	int		error;
> > +
> > +	if (!XFS_IS_QUOTA_RUNNING(mp))
> > +		return 0;
> >  
> >  	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
> > -	mp = ip->i_mount;
> > -	ASSERT(XFS_IS_QUOTA_RUNNING(mp));
> >  
> >  	delblks = ip->i_delayed_blks;
> >  	delblksudq = delblksgdq = unresudq = unresgdq = NULL;
> > @@ -2582,28 +2595,23 @@ xfs_qm_vop_chown_reserve(
> >  
> >  int
> >  xfs_qm_vop_rename_dqattach(
> > -	xfs_inode_t	**i_tab)
> > +	struct xfs_inode	**i_tab)
> >  {
> > -	xfs_inode_t	*ip;
> > -	int		i;
> > -	int		error;
> > -
> > -	ip = i_tab[0];
> > +	struct xfs_mount	*mp = i_tab[0]->i_mount;
> > +	int			i;
> >  
> > -	if (! XFS_IS_QUOTA_ON(ip->i_mount))
> > +	if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
> >  		return 0;
> >  
> > -	if (XFS_NOT_DQATTACHED(ip->i_mount, ip)) {
> > -		error = xfs_qm_dqattach(ip, 0);
> > -		if (error)
> > -			return error;
> > -	}
> >  	for (i = 1; (i < 4 && i_tab[i]); i++) {
> > +		struct xfs_inode	*ip = i_tab[i];
> > +		int			error;
> > +
> >  		/*
> >  		 * Watch out for duplicate entries in the table.
> >  		 */
> > -		if ((ip = i_tab[i]) != i_tab[i-1]) {
> > -			if (XFS_NOT_DQATTACHED(ip->i_mount, ip)) {
> > +		if (i == 0 || ip != i_tab[i-1]) {
> > +			if (XFS_NOT_DQATTACHED(mp, ip)) {
> >  				error = xfs_qm_dqattach(ip, 0);
> >  				if (error)
> >  					return error;
> > @@ -2614,17 +2622,19 @@ xfs_qm_vop_rename_dqattach(
> >  }
> >  
> >  void
> > -xfs_qm_vop_dqattach_and_dqmod_newinode(
> > -	xfs_trans_t	*tp,
> > -	xfs_inode_t	*ip,
> > -	xfs_dquot_t	*udqp,
> > -	xfs_dquot_t	*gdqp)
> > +xfs_qm_vop_create_dqattach(
> > +	struct xfs_trans	*tp,
> > +	struct xfs_inode	*ip,
> > +	struct xfs_dquot	*udqp,
> > +	struct xfs_dquot	*gdqp)
> >  {
> > -	if (!XFS_IS_QUOTA_ON(tp->t_mountp))
> > +	struct xfs_mount	*mp = tp->t_mountp;
> > +
> > +	if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
> >  		return;
> >  
> >  	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
> > -	ASSERT(XFS_IS_QUOTA_RUNNING(tp->t_mountp));
> > +	ASSERT(XFS_IS_QUOTA_RUNNING(mp));
> >  
> >  	if (udqp) {
> >  		xfs_dqlock(udqp);
> > @@ -2632,7 +2642,7 @@ xfs_qm_vop_dqattach_and_dqmod_newinode(
> >  		xfs_dqunlock(udqp);
> >  		ASSERT(ip->i_udquot == NULL);
> >  		ip->i_udquot = udqp;
> > -		ASSERT(XFS_IS_UQUOTA_ON(tp->t_mountp));
> > +		ASSERT(XFS_IS_UQUOTA_ON(mp));
> >  		ASSERT(ip->i_d.di_uid == be32_to_cpu(udqp->q_core.d_id));
> >  		xfs_trans_mod_dquot(tp, udqp, XFS_TRANS_DQ_ICOUNT, 1);
> >  	}
> > @@ -2642,8 +2652,8 @@ xfs_qm_vop_dqattach_and_dqmod_newinode(
> >  		xfs_dqunlock(gdqp);
> >  		ASSERT(ip->i_gdquot == NULL);
> >  		ip->i_gdquot = gdqp;
> > -		ASSERT(XFS_IS_OQUOTA_ON(tp->t_mountp));
> > -		ASSERT((XFS_IS_GQUOTA_ON(tp->t_mountp) ?
> > +		ASSERT(XFS_IS_OQUOTA_ON(mp));
> > +		ASSERT((XFS_IS_GQUOTA_ON(mp) ?
> >  			ip->i_d.di_gid : ip->i_d.di_projid) ==
> >  				be32_to_cpu(gdqp->q_core.d_id));
> >  		xfs_trans_mod_dquot(tp, gdqp, XFS_TRANS_DQ_ICOUNT, 1);
> > Index: xfs/fs/xfs/xfs_iget.c
> > ===================================================================
> > --- xfs.orig/fs/xfs/xfs_iget.c	2009-02-24 15:32:16.153369650 +0100
> > +++ xfs/fs/xfs/xfs_iget.c	2009-02-24 15:32:35.870518109 +0100
> > @@ -490,10 +490,7 @@ xfs_ireclaim(
> >  	 * ilock one but will still hold the iolock.
> >  	 */
> >  	xfs_ilock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
> > -	/*
> > -	 * Release dquots (and their references) if any.
> > -	 */
> > -	XFS_QM_DQDETACH(ip->i_mount, ip);
> > +	xfs_qm_dqdetach(ip);
> >  	xfs_iunlock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
> >  
> >  	switch (ip->i_d.di_mode & S_IFMT) {
> > Index: xfs/fs/xfs/xfs_mount.c
> > ===================================================================
> > --- xfs.orig/fs/xfs/xfs_mount.c	2009-02-24 15:32:16.164399755 +0100
> > +++ xfs/fs/xfs/xfs_mount.c	2009-02-24 15:32:35.871518446 +0100
> > @@ -886,6 +886,53 @@ xfs_check_sizes(xfs_mount_t *mp)
> >  }
> >  
> >  /*
> > + * Clear the quotaflags in memory and in the superblock.
> > + */
> > +int
> > +xfs_mount_reset_sbqflags(
> > +	struct xfs_mount	*mp)
> > +{
> > +	int			error;
> > +	struct xfs_trans	*tp;
> > +
> > +	mp->m_qflags = 0;
> > +
> > +	/*
> > +	 * It is OK to look at sb_qflags here in mount path,
> > +	 * without m_sb_lock.
> > +	 */
> > +	if (mp->m_sb.sb_qflags == 0)
> > +		return 0;
> > +	spin_lock(&mp->m_sb_lock);
> > +	mp->m_sb.sb_qflags = 0;
> > +	spin_unlock(&mp->m_sb_lock);
> > +
> > +	/*
> > +	 * If the fs is readonly, let the incore superblock run
> > +	 * with quotas off but don't flush the update out to disk
> > +	 */
> > +	if (mp->m_flags & XFS_MOUNT_RDONLY)
> > +		return 0;
> > +
> > +#ifdef QUOTADEBUG
> > +	xfs_fs_cmn_err(CE_NOTE, mp, "Writing superblock quota changes");
> > +#endif
> > +
> > +	tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE);
> > +	error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0,
> > +				      XFS_DEFAULT_LOG_COUNT);
> > +	if (error) {
> > +		xfs_trans_cancel(tp, 0);
> > +		xfs_fs_cmn_err(CE_ALERT, mp,
> > +			"xfs_mount_reset_sbqflags: Superblock update failed!");
> > +		return error;
> > +	}
> > +
> > +	xfs_mod_sb(tp, XFS_SB_QFLAGS);
> > +	return xfs_trans_commit(tp, 0);
> > +}
> > +
> > +/*
> >   * This function does the following on an initial mount of a file system:
> >   *	- reads the superblock from disk and init the mount struct
> >   *	- if we're a 32-bit kernel, do a size check on the superblock
> > @@ -902,7 +949,8 @@ xfs_mountfs(
> >  	xfs_sb_t	*sbp = &(mp->m_sb);
> >  	xfs_inode_t	*rip;
> >  	__uint64_t	resblks;
> > -	uint		quotamount, quotaflags;
> > +	uint		quotamount = 0;
> > +	uint		quotaflags = 0;
> >  	int		error = 0;
> >  
> >  	xfs_mount_common(mp, sbp);
> > @@ -1145,9 +1193,28 @@ xfs_mountfs(
> >  	/*
> >  	 * Initialise the XFS quota management subsystem for this mount
> >  	 */
> > -	error = XFS_QM_INIT(mp, &quotamount, &quotaflags);
> > -	if (error)
> > -		goto out_rtunmount;
> > +	if (XFS_IS_QUOTA_RUNNING(mp)) {
> > +		error = xfs_qm_newmount(mp, &quotamount, &quotaflags);
> > +		if (error)
> > +			goto out_rtunmount;
> > +	} else {
> > +		ASSERT(!XFS_IS_QUOTA_ON(mp));
> > +
> > +		/*
> > +		 * If a file system had quotas running earlier, but decided to
> > +		 * mount without -o uquota/pquota/gquota options, revoke the
> > +		 * quotachecked license.
> > +		 */
> > +		if (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT) {
> > +			cmn_err(CE_NOTE,
> > +                	        "XFS: resetting qflags for filesystem %s",
> > +                	        mp->m_fsname);
> > +
> > +			error = xfs_mount_reset_sbqflags(mp);
> > +			if (error)
> > +				return error;
> > +		}
> > +	}
> >  
> >  	/*
> >  	 * Finish recovering the file system.  This part needed to be
> > @@ -1163,9 +1230,19 @@ xfs_mountfs(
> >  	/*
> >  	 * Complete the quota initialisation, post-log-replay component.
> >  	 */
> > -	error = XFS_QM_MOUNT(mp, quotamount, quotaflags);
> > -	if (error)
> > -		goto out_rtunmount;
> > +	if (quotamount) {
> > +		ASSERT(mp->m_qflags == 0);
> > +		mp->m_qflags = quotaflags;
> > +
> > +		xfs_qm_mount_quotas(mp);
> > +	}
> > +
> > +#if defined(DEBUG) && defined(XFS_LOUD_RECOVERY)
> > +	if (XFS_IS_QUOTA_ON(mp))
> > +		xfs_fs_cmn_err(CE_NOTE, mp, "Disk quotas turned on");
> > +	else
> > +		xfs_fs_cmn_err(CE_NOTE, mp, "Disk quotas not turned on");
> > +#endif
> >  
> >  	/*
> >  	 * Now we are mounted, reserve a small amount of unused space for
> > @@ -1215,12 +1292,7 @@ xfs_unmountfs(
> >  	__uint64_t		resblks;
> >  	int			error;
> >  
> > -	/*
> > -	 * Release dquot that rootinode, rbmino and rsumino might be holding,
> > -	 * and release the quota inodes.
> > -	 */
> > -	XFS_QM_UNMOUNT(mp);
> > -
> > +	xfs_qm_unmount_quotas(mp);
> >  	xfs_rtunmount_inodes(mp);
> >  	IRELE(mp->m_rootip);
> >  
> > @@ -1237,10 +1309,7 @@ xfs_unmountfs(
> >  	xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE | XFS_LOG_SYNC);
> >  	xfs_reclaim_inodes(mp, 0, XFS_IFLUSH_ASYNC);
> >  
> > -	XFS_QM_DQPURGEALL(mp, XFS_QMOPT_QUOTALL | XFS_QMOPT_UMOUNTING);
> > -
> > -	if (mp->m_quotainfo)
> > -		XFS_QM_DONE(mp);
> > +	xfs_qm_unmount(mp);
> >  
> >  	/*
> >  	 * Flush out the log synchronously so that we know for sure
> > Index: xfs/fs/xfs/xfs_qmops.c
> > ===================================================================
> > --- xfs.orig/fs/xfs/xfs_qmops.c	2009-02-24 15:32:16.128369539 +0100
> > +++ /dev/null	1970-01-01 00:00:00.000000000 +0000
> > @@ -1,152 +0,0 @@
> > -/*
> > - * Copyright (c) 2000-2005 Silicon Graphics, Inc.
> > - * All Rights Reserved.
> > - *
> > - * This program is free software; you can redistribute it and/or
> > - * modify it under the terms of the GNU General Public License as
> > - * published by the Free Software Foundation.
> > - *
> > - * This program is distributed in the hope that it would be useful,
> > - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> > - * GNU General Public License for more details.
> > - *
> > - * You should have received a copy of the GNU General Public License
> > - * along with this program; if not, write the Free Software Foundation,
> > - * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
> > - */
> > -#include "xfs.h"
> > -#include "xfs_fs.h"
> > -#include "xfs_types.h"
> > -#include "xfs_log.h"
> > -#include "xfs_inum.h"
> > -#include "xfs_trans.h"
> > -#include "xfs_sb.h"
> > -#include "xfs_ag.h"
> > -#include "xfs_dir2.h"
> > -#include "xfs_dmapi.h"
> > -#include "xfs_mount.h"
> > -#include "xfs_quota.h"
> > -#include "xfs_error.h"
> > -
> > -
> > -STATIC struct xfs_dquot *
> > -xfs_dqvopchown_default(
> > -	struct xfs_trans	*tp,
> > -	struct xfs_inode	*ip,
> > -	struct xfs_dquot	**dqp,
> > -	struct xfs_dquot	*dq)
> > -{
> > -	return NULL;
> > -}
> > -
> > -/*
> > - * Clear the quotaflags in memory and in the superblock.
> > - */
> > -int
> > -xfs_mount_reset_sbqflags(xfs_mount_t *mp)
> > -{
> > -	int			error;
> > -	xfs_trans_t		*tp;
> > -
> > -	mp->m_qflags = 0;
> > -	/*
> > -	 * It is OK to look at sb_qflags here in mount path,
> > -	 * without m_sb_lock.
> > -	 */
> > -	if (mp->m_sb.sb_qflags == 0)
> > -		return 0;
> > -	spin_lock(&mp->m_sb_lock);
> > -	mp->m_sb.sb_qflags = 0;
> > -	spin_unlock(&mp->m_sb_lock);
> > -
> > -	/*
> > -	 * if the fs is readonly, let the incore superblock run
> > -	 * with quotas off but don't flush the update out to disk
> > -	 */
> > -	if (mp->m_flags & XFS_MOUNT_RDONLY)
> > -		return 0;
> > -#ifdef QUOTADEBUG
> > -	xfs_fs_cmn_err(CE_NOTE, mp, "Writing superblock quota changes");
> > -#endif
> > -	tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE);
> > -	if ((error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0,
> > -				      XFS_DEFAULT_LOG_COUNT))) {
> > -		xfs_trans_cancel(tp, 0);
> > -		xfs_fs_cmn_err(CE_ALERT, mp,
> > -			"xfs_mount_reset_sbqflags: Superblock update failed!");
> > -		return error;
> > -	}
> > -	xfs_mod_sb(tp, XFS_SB_QFLAGS);
> > -	error = xfs_trans_commit(tp, 0);
> > -	return error;
> > -}
> > -
> > -STATIC int
> > -xfs_noquota_init(
> > -	xfs_mount_t	*mp,
> > -	uint		*needquotamount,
> > -	uint		*quotaflags)
> > -{
> > -	int		error = 0;
> > -
> > -	*quotaflags = 0;
> > -	*needquotamount = B_FALSE;
> > -
> > -	ASSERT(!XFS_IS_QUOTA_ON(mp));
> > -
> > -	/*
> > -	 * If a file system had quotas running earlier, but decided to
> > -	 * mount without -o uquota/pquota/gquota options, revoke the
> > -	 * quotachecked license.
> > -	 */
> > -	if (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT) {
> > -		cmn_err(CE_NOTE,
> > -                        "XFS resetting qflags for filesystem %s",
> > -                        mp->m_fsname);
> > -
> > -		error = xfs_mount_reset_sbqflags(mp);
> > -	}
> > -	return error;
> > -}
> > -
> > -static struct xfs_qmops xfs_qmcore_stub = {
> > -	.xfs_qminit		= (xfs_qminit_t) xfs_noquota_init,
> > -	.xfs_qmdone		= (xfs_qmdone_t) fs_noerr,
> > -	.xfs_qmmount		= (xfs_qmmount_t) fs_noerr,
> > -	.xfs_qmunmount		= (xfs_qmunmount_t) fs_noerr,
> > -	.xfs_dqrele		= (xfs_dqrele_t) fs_noerr,
> > -	.xfs_dqattach		= (xfs_dqattach_t) fs_noerr,
> > -	.xfs_dqdetach		= (xfs_dqdetach_t) fs_noerr,
> > -	.xfs_dqpurgeall		= (xfs_dqpurgeall_t) fs_noerr,
> > -	.xfs_dqvopalloc		= (xfs_dqvopalloc_t) fs_noerr,
> > -	.xfs_dqvopcreate	= (xfs_dqvopcreate_t) fs_noerr,
> > -	.xfs_dqvoprename	= (xfs_dqvoprename_t) fs_noerr,
> > -	.xfs_dqvopchown		= xfs_dqvopchown_default,
> > -	.xfs_dqvopchownresv	= (xfs_dqvopchownresv_t) fs_noerr,
> > -	.xfs_dqstatvfs		= (xfs_dqstatvfs_t) fs_noval,
> > -	.xfs_dqsync		= (xfs_dqsync_t) fs_noerr,
> > -};
> > -
> > -int
> > -xfs_qmops_get(struct xfs_mount *mp)
> > -{
> > -	if (XFS_IS_QUOTA_RUNNING(mp)) {
> > -#ifdef CONFIG_XFS_QUOTA
> > -		mp->m_qm_ops = &xfs_qmcore_xfs;
> > -#else
> > -		cmn_err(CE_WARN,
> > -			"XFS: qouta support not available in this kernel.");
> > -		return EINVAL;
> > -#endif
> > -	} else {
> > -		mp->m_qm_ops = &xfs_qmcore_stub;
> > -	}
> > -
> > -	return 0;
> > -}
> > -
> > -void
> > -xfs_qmops_put(struct xfs_mount *mp)
> > -{
> > -}
> > Index: xfs/fs/xfs/xfs_rename.c
> > ===================================================================
> > --- xfs.orig/fs/xfs/xfs_rename.c	2009-02-24 15:32:16.132369560 +0100
> > +++ xfs/fs/xfs/xfs_rename.c	2009-02-24 15:32:35.872519970 +0100
> > @@ -166,7 +166,8 @@ xfs_rename(
> >  	/*
> >  	 * Attach the dquots to the inodes
> >  	 */
> > -	if ((error = XFS_QM_DQVOPRENAME(mp, inodes))) {
> > +	error = xfs_qm_vop_rename_dqattach(inodes);
> > +	if (error) {
> >  		xfs_trans_cancel(tp, cancel_flags);
> >  		goto std_return;
> >  	}
> > 
> > _______________________________________________
> > xfs mailing list
> > xfs@oss.sgi.com
> > http://oss.sgi.com/mailman/listinfo/xfs
> ---end quoted text---
> 
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs
---end quoted text---

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] xfs: kill xfs_qmops
  2009-02-24 14:37 [PATCH] xfs: kill xfs_qmops Christoph Hellwig
  2009-03-16  7:55 ` Christoph Hellwig
@ 2009-05-26 17:34 ` Eric Sandeen
  2009-05-27  9:56   ` Christoph Hellwig
  1 sibling, 1 reply; 6+ messages in thread
From: Eric Sandeen @ 2009-05-26 17:34 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: xfs

Christoph Hellwig wrote:
> Kill the quota ops function vector and replace it with direct calls or
> stubs in the CONFIG_XFS_QUOTA=n case.
> 
> Make sure we check XFS_IS_QUOTA_RUNNING in the right spots.  We can remove
> the number of those checks because the XFS_TRANS_DQ_DIRTY flag can't be set
> otherwise.
> 
> This brings us back closer to the way this code worked in IRIX and earlier
> Linux versions, but we keep a lot of the more useful factoring of common
> code.
> 
> Eventually we should also kill xfs_qm_bhv.c, but that's left for a later
> patch.
> 
> Reduces the size of the source code by about 250 lines and the size of
> XFS module by about 1.5 kilobytes with quotas enabled:
> 
>    text	   data	    bss	    dec	    hex	filename
>  615957	   2960	   3848	 622765	  980ad	fs/xfs/xfs.o
>  617231	   3152	   3848	 624231	  98667	fs/xfs/xfs.o.old
> 
> 
> Fallout:
> 
>  - xfs_qm_dqattach is split into xfs_qm_dqattach_locked which expects
>    the inode locked and xfs_qm_dqattach which does the locking around it,
>    thus removing XFS_QMOPT_ILOCKED.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> 

a few nitpicks & questions below

> @@ -1398,14 +1400,16 @@ xfs_create(
>  	uint			cancel_flags;
>  	int			committed;
>  	xfs_prid_t		prid;
> -	struct xfs_dquot	*udqp = NULL;
> -	struct xfs_dquot	*gdqp = NULL;
> +	struct xfs_dquot	*udqp, *gdqp;
>  	uint			resblks;
>  	uint			log_res;
>  	uint			log_count;
>  
>  	xfs_itrace_entry(dp);
>  
> +	udqp = NULL;
> +	gdqp = NULL;

Just wondering about the reason for this change?  in xfs_ioctl_setattr()
it's a little weird because you gave udqp & gdqp the same treatment, but
not olddquot (which is initialized to NULL in the declaration too)

...

> Index: xfs/fs/xfs/linux-2.6/xfs_super.c
> ===================================================================
> --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c	2009-02-24 15:32:16.141370566 +0100
> +++ xfs/fs/xfs/linux-2.6/xfs_super.c	2009-02-24 15:32:35.866394539 +0100
> @@ -416,6 +416,14 @@ xfs_parseargs(
>  		return EINVAL;
>  	}
>  
> +#ifndef CONFIG_XFS_QUOTA
> +	if (XFS_IS_QUOTA_RUNNING(mp)) {
> +		cmn_err(CE_WARN,
> +			"XFS: quota support not available in this kernel.");
> +		return EINVAL;
> +	}
> +#endif

The wording of the macro seems a little confusing in this location, how
can quota be "running" if we are just starting the mount and there is no
quota built in, but oh well, not really the fault of this patch I guess.

Would it make any more sense to just say "if (mp->m_qflags)" instead,
because  we just got done setting that bit of the structure in parseargs...?

...

> @@ -1214,7 +1222,10 @@ xfs_fs_statfs(
>  	statp->f_ffree = statp->f_files - (sbp->sb_icount - sbp->sb_ifree);
>  	spin_unlock(&mp->m_sb_lock);
>  
> -	XFS_QM_DQSTATVFS(XFS_I(dentry->d_inode), statp);
> +	if ((ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) ||
> +	    ((mp->m_qflags & (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))) ==
> +			      (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))
> +		xfs_qm_statvfs(ip, statp);
>  	return 0;
>  }

Ok, so the tests for the ip & mp flags were removed from
xfs_qm_statvfs() because they are always set here in the only caller...
but would an ASSERT() of those be worth keeping in xfs_qm_statvfs?

> @@ -1422,16 +1433,13 @@ xfs_fs_fill_super(
>  	error = xfs_dmops_get(mp);
>  	if (error)
>  		goto out_free_fsname;
> -	error = xfs_qmops_get(mp);
> -	if (error)
> -		goto out_put_dmops;
>  
>  	if (silent)
>  		flags |= XFS_MFSI_QUIET;
>  
>  	error = xfs_open_devices(mp);
>  	if (error)
> -		goto out_put_qmops;
> +		goto out_put_dmops;
>  
>  	if (xfs_icsb_init_counters(mp))
>  		mp->m_flags |= XFS_MOUNT_NO_PERCPU_SB;
> @@ -1500,8 +1508,6 @@ xfs_fs_fill_super(
>   out_destroy_counters:
>  	xfs_icsb_destroy_counters(mp);
>  	xfs_close_devices(mp);
> - out_put_qmops:
> -	xfs_qmops_put(mp);
>   out_put_dmops:
>  	xfs_dmops_put(mp);
>   out_free_fsname:
> Index: xfs/fs/xfs/linux-2.6/xfs_sync.c
> ===================================================================
> --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c	2009-02-24 15:32:16.149399312 +0100
> +++ xfs/fs/xfs/linux-2.6/xfs_sync.c	2009-02-24 15:32:35.867425537 +0100
> @@ -43,6 +43,7 @@
>  #include "xfs_buf_item.h"
>  #include "xfs_inode_item.h"
>  #include "xfs_rw.h"
> +#include "xfs_quota.h"
>  
>  #include <linux/kthread.h>
>  #include <linux/freezer.h>
> @@ -311,12 +312,12 @@ xfs_quiesce_data(
>  
>  	/* push non-blocking */
>  	xfs_sync_inodes(mp, SYNC_DELWRI|SYNC_BDFLUSH);
> -	XFS_QM_DQSYNC(mp, SYNC_BDFLUSH);
> +	xfs_qm_sync(mp, SYNC_BDFLUSH);
>  	xfs_filestream_flush(mp);
>  
>  	/* push and block */
>  	xfs_sync_inodes(mp, SYNC_DELWRI|SYNC_WAIT|SYNC_IOWAIT);
> -	XFS_QM_DQSYNC(mp, SYNC_WAIT);
> +	xfs_qm_sync(mp, SYNC_WAIT);
>  
>  	/* write superblock and hoover up shutdown errors */> Index: xfs/fs/xfs/quota/xfs_dquot.c
> ===================================================================
> --- xfs.orig/fs/xfs/quota/xfs_dquot.c	2009-02-24 15:32:16.080370342 +0100
> +++ xfs/fs/xfs/quota/xfs_dquot.c	2009-02-24 15:32:35.867425537 +0100
> @@ -1194,7 +1194,9 @@ void
>  xfs_qm_dqrele(
>  	xfs_dquot_t	*dqp)
>  {
> -	ASSERT(dqp);
> +	if (!dqp)
> +		return;
> +
>  	xfs_dqtrace_entry(dqp, "DQRELE");
>  
>  	xfs_dqlock(dqp);

dumb question, maybe - how do we get here w/ dqp == NULL when before it
was an ASSERT?

...

> @@ -2469,8 +2479,10 @@ xfs_qm_vop_chown(
>  	uint		bfield = XFS_IS_REALTIME_INODE(ip) ?
>  				 XFS_TRANS_DQ_RTBCOUNT : XFS_TRANS_DQ_BCOUNT;
>  
> +	if (!XFS_IS_QUOTA_RUNNING(ip->i_mount))
> +		return NULL;
> +
>  	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
> -	ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount));
>  
>  	/* old dquot */
>  	prevdq = *IO_olddq;

seems a little weird to call this & return, should the (3) callers just
check first?  I guess similar questions on other tests...

> @@ -2508,14 +2520,15 @@ xfs_qm_vop_chown_reserve(
>  	xfs_dquot_t	*gdqp,
>  	uint		flags)
>  {
> -	int		error;
> -	xfs_mount_t	*mp;
> +	xfs_mount_t	*mp = ip->i_mount;
>  	uint		delblks, blkflags, prjflags = 0;
>  	xfs_dquot_t	*unresudq, *unresgdq, *delblksudq, *delblksgdq;
> +	int		error;
> +
> +	if (!XFS_IS_QUOTA_RUNNING(mp))
> +		return 0;

same question here

>  	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
> -	mp = ip->i_mount;
> -	ASSERT(XFS_IS_QUOTA_RUNNING(mp));
>  
>  	delblks = ip->i_delayed_blks;
>  	delblksudq = delblksgdq = unresudq = unresgdq = NULL;
> @@ -2582,28 +2595,23 @@ xfs_qm_vop_chown_reserve(
>  
>  int
>  xfs_qm_vop_rename_dqattach(
> -	xfs_inode_t	**i_tab)
> +	struct xfs_inode	**i_tab)
>  {
> -	xfs_inode_t	*ip;
> -	int		i;
> -	int		error;
> -
> -	ip = i_tab[0];
> +	struct xfs_mount	*mp = i_tab[0]->i_mount;
> +	int			i;
>  
> -	if (! XFS_IS_QUOTA_ON(ip->i_mount))
> +	if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
>  		return 0;
>  
> -	if (XFS_NOT_DQATTACHED(ip->i_mount, ip)) {
> -		error = xfs_qm_dqattach(ip, 0);
> -		if (error)
> -			return error;
> -	}
>  	for (i = 1; (i < 4 && i_tab[i]); i++) {
> +		struct xfs_inode	*ip = i_tab[i];
> +		int			error;
> +
>  		/*
>  		 * Watch out for duplicate entries in the table.
>  		 */
> -		if ((ip = i_tab[i]) != i_tab[i-1]) {
> -			if (XFS_NOT_DQATTACHED(ip->i_mount, ip)) {
> +		if (i == 0 || ip != i_tab[i-1]) {


                    ^^^^^^ how is that ever true?


> +			if (XFS_NOT_DQATTACHED(mp, ip)) {
>  				error = xfs_qm_dqattach(ip, 0);
>  				if (error)
>  					return error;

> Index: xfs/fs/xfs/xfs_mount.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_mount.c	2009-02-24 15:32:16.164399755 +0100
> +++ xfs/fs/xfs/xfs_mount.c	2009-02-24 15:32:35.871518446 +0100

...

> @@ -1163,9 +1230,19 @@ xfs_mountfs(
>  	/*
>  	 * Complete the quota initialisation, post-log-replay component.
>  	 */
> -	error = XFS_QM_MOUNT(mp, quotamount, quotaflags);
> -	if (error)
> -		goto out_rtunmount;
> +	if (quotamount) {
> +		ASSERT(mp->m_qflags == 0);
> +		mp->m_qflags = quotaflags;
> +
> +		xfs_qm_mount_quotas(mp);

Seems odd to me that this is a void, and quota mount failure doesn't
stop the mount, but oh well, I guess it's always been that way.


Aside from those nitpicks seems ok, though TBH I'm a bit confused about
when we check XFS_IS_QUOTA_RUNNING vs XFS_IS_QUOTA_ON in this new world ....

-Eric

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] xfs: kill xfs_qmops
  2009-05-26 17:34 ` Eric Sandeen
@ 2009-05-27  9:56   ` Christoph Hellwig
  2009-05-27 20:06     ` Eric Sandeen
  0 siblings, 1 reply; 6+ messages in thread
From: Christoph Hellwig @ 2009-05-27  9:56 UTC (permalink / raw)
  To: Eric Sandeen; +Cc: Christoph Hellwig, xfs

On Tue, May 26, 2009 at 12:34:49PM -0500, Eric Sandeen wrote:
> > +	udqp = NULL;
> > +	gdqp = NULL;
> 
> Just wondering about the reason for this change?  in xfs_ioctl_setattr()
> it's a little weird because you gave udqp & gdqp the same treatment, but
> not olddquot (which is initialized to NULL in the declaration too)

Seemd like a merge error to me.  I've reverted these bits and now leave
them as they were before.

> > Index: xfs/fs/xfs/linux-2.6/xfs_super.c
> > ===================================================================
> > --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c	2009-02-24 15:32:16.141370566 +0100
> > +++ xfs/fs/xfs/linux-2.6/xfs_super.c	2009-02-24 15:32:35.866394539 +0100
> > @@ -416,6 +416,14 @@ xfs_parseargs(
> >  		return EINVAL;
> >  	}
> >  
> > +#ifndef CONFIG_XFS_QUOTA
> > +	if (XFS_IS_QUOTA_RUNNING(mp)) {
> > +		cmn_err(CE_WARN,
> > +			"XFS: quota support not available in this kernel.");
> > +		return EINVAL;
> > +	}
> > +#endif
> 
> The wording of the macro seems a little confusing in this location, how
> can quota be "running" if we are just starting the mount and there is no
> quota built in, but oh well, not really the fault of this patch I guess.
> 
> Would it make any more sense to just say "if (mp->m_qflags)" instead,
> because  we just got done setting that bit of the structure in parseargs...?

> Aside from those nitpicks seems ok, though TBH I'm a bit confused about
> when we check XFS_IS_QUOTA_RUNNING vs XFS_IS_QUOTA_ON in this new world ....

XFS_IS_QUOTA_RUNNING/XFS_IS_QUOTA_ON is indeed extremly confusing.
For now I'd like to keep is as-is as the patch is already big enough.
But I'll put an item to introduce some better naming/macro in this area
on my todo list so we'll eventually sort this out.

> > @@ -1214,7 +1222,10 @@ xfs_fs_statfs(
> >  	statp->f_ffree = statp->f_files - (sbp->sb_icount - sbp->sb_ifree);
> >  	spin_unlock(&mp->m_sb_lock);
> >  
> > -	XFS_QM_DQSTATVFS(XFS_I(dentry->d_inode), statp);
> > +	if ((ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) ||
> > +	    ((mp->m_qflags & (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))) ==
> > +			      (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))
> > +		xfs_qm_statvfs(ip, statp);
> >  	return 0;
> >  }
> 
> Ok, so the tests for the ip & mp flags were removed from
> xfs_qm_statvfs() because they are always set here in the only caller...
> but would an ASSERT() of those be worth keeping in xfs_qm_statvfs?

No.  statfs always gets a positive dentry passed, and that means the
inode and mount pointer are always valid.  If they weren't we're in
deep enough trouble that the NULL pointer dereference panic is more
than warranted.

> > +++ xfs/fs/xfs/quota/xfs_dquot.c	2009-02-24 15:32:35.867425537 +0100
> > @@ -1194,7 +1194,9 @@ void
> >  xfs_qm_dqrele(
> >  	xfs_dquot_t	*dqp)
> >  {
> > -	ASSERT(dqp);
> > +	if (!dqp)
> > +		return;
> > +
> >  	xfs_dqtrace_entry(dqp, "DQRELE");
> >  
> >  	xfs_dqlock(dqp);
> 
> dumb question, maybe - how do we get here w/ dqp == NULL when before it
> was an ASSERT?

previously XFS_QM_DQRELE expanded to xfs_qm_dqrele_null if quotas
were enabled which had the NULL check.  With just a few direct callers
of the old xfs_qm_dqrele it seems more logial to me to just have the
NULL check in the main xfs_qm_dqrele instead of keeping a wrapper.

> > @@ -2469,8 +2479,10 @@ xfs_qm_vop_chown(
> >  	uint		bfield = XFS_IS_REALTIME_INODE(ip) ?
> >  				 XFS_TRANS_DQ_RTBCOUNT : XFS_TRANS_DQ_BCOUNT;
> >  
> > +	if (!XFS_IS_QUOTA_RUNNING(ip->i_mount))
> > +		return NULL;
> > +
> >  	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
> > -	ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount));
> >  
> >  	/* old dquot */
> >  	prevdq = *IO_olddq;
> 
> seems a little weird to call this & return, should the (3) callers just
> check first?  I guess similar questions on other tests...

I tried to avoid too many changes to the callers, but given that we
already have XFS_IS_UQUOTA_ON checks in the callers we might aswell add
the XFS_IS_QUOTA_RUNNING, too.

I've changed all places that have checks like XFS_IS_*QUOTA_ON in the
caller to also do the XFS_IS_QUOTA_RUNNING in the caller, but leave
it in the callee when we also perform the other checks there, e.g.
for all thexfs_trans_dquot.c functions.

> >  int
> >  xfs_qm_vop_rename_dqattach(
> > -	xfs_inode_t	**i_tab)
> > +	struct xfs_inode	**i_tab)
> >  {
> > -	xfs_inode_t	*ip;
> > -	int		i;
> > -	int		error;
> > -
> > -	ip = i_tab[0];
> > +	struct xfs_mount	*mp = i_tab[0]->i_mount;
> > +	int			i;
> >  
> > -	if (! XFS_IS_QUOTA_ON(ip->i_mount))
> > +	if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
> >  		return 0;
> >  
> > -	if (XFS_NOT_DQATTACHED(ip->i_mount, ip)) {
> > -		error = xfs_qm_dqattach(ip, 0);
> > -		if (error)
> > -			return error;
> > -	}
> >  	for (i = 1; (i < 4 && i_tab[i]); i++) {
> > +		struct xfs_inode	*ip = i_tab[i];
> > +		int			error;
> > +
> >  		/*
> >  		 * Watch out for duplicate entries in the table.
> >  		 */
> > -		if ((ip = i_tab[i]) != i_tab[i-1]) {
> > -			if (XFS_NOT_DQATTACHED(ip->i_mount, ip)) {
> > +		if (i == 0 || ip != i_tab[i-1]) {
> 
> 
>                     ^^^^^^ how is that ever true?

never, but that's a bug because the loop should now start at 0.  Looks
like out quota testing in xfsqa still isn't that good or the first
inode is always already attached in normal operation (probably the latter).

Updated patch below:


Subject: xfs: kill xfs_qmops
From: Christoph Hellwig <hch@lst.de>

Kill the quota ops function vector and replace it with direct calls or
stubs in the CONFIG_XFS_QUOTA=n case.

Make sure we check XFS_IS_QUOTA_RUNNING in the right spots.  We can remove
the number of those checks because the XFS_TRANS_DQ_DIRTY flag can't be set
otherwise.

This brings us back closer to the way this code worked in IRIX and earlier
Linux versions, but we keep a lot of the more useful factoring of common
code.

Eventually we should also kill xfs_qm_bhv.c, but that's left for a later
patch.

Reduces the size of the source code by about 250 lines and the size of
XFS module by about 1.5 kilobytes with quotas enabled:

   text	   data	    bss	    dec	    hex	filename
 615957	   2960	   3848	 622765	  980ad	fs/xfs/xfs.o
 617231	   3152	   3848	 624231	  98667	fs/xfs/xfs.o.old


Fallout:

 - xfs_qm_dqattach is split into xfs_qm_dqattach_locked which expects
   the inode locked and xfs_qm_dqattach which does the locking around it,
   thus removing XFS_QMOPT_ILOCKED.

Signed-off-by: Christoph Hellwig <hch@lst.de>

Index: xfs/fs/xfs/quota/xfs_trans_dquot.c
===================================================================
--- xfs.orig/fs/xfs/quota/xfs_trans_dquot.c	2009-05-27 11:14:50.004939778 +0200
+++ xfs/fs/xfs/quota/xfs_trans_dquot.c	2009-05-27 11:35:36.483814276 +0200
@@ -111,7 +111,7 @@ xfs_trans_log_dquot(
  * Carry forward whatever is left of the quota blk reservation to
  * the spanky new transaction
  */
-STATIC void
+void
 xfs_trans_dup_dqinfo(
 	xfs_trans_t	*otp,
 	xfs_trans_t	*ntp)
@@ -167,19 +167,17 @@ xfs_trans_dup_dqinfo(
 /*
  * Wrap around mod_dquot to account for both user and group quotas.
  */
-STATIC void
+void
 xfs_trans_mod_dquot_byino(
 	xfs_trans_t	*tp,
 	xfs_inode_t	*ip,
 	uint		field,
 	long		delta)
 {
-	xfs_mount_t	*mp;
-
-	ASSERT(tp);
-	mp = tp->t_mountp;
+	xfs_mount_t	*mp = tp->t_mountp;
 
-	if (!XFS_IS_QUOTA_ON(mp) ||
+	if (!XFS_IS_QUOTA_RUNNING(mp) ||
+	    !XFS_IS_QUOTA_ON(mp) ||
 	    ip->i_ino == mp->m_sb.sb_uquotino ||
 	    ip->i_ino == mp->m_sb.sb_gquotino)
 		return;
@@ -229,6 +227,7 @@ xfs_trans_mod_dquot(
 	xfs_dqtrx_t	*qtrx;
 
 	ASSERT(tp);
+	ASSERT(XFS_IS_QUOTA_RUNNING(tp->t_mountp));
 	qtrx = NULL;
 
 	if (tp->t_dqinfo == NULL)
@@ -346,7 +345,7 @@ xfs_trans_dqlockedjoin(
  * Unreserve just the reservations done by this transaction.
  * dquot is still left locked at exit.
  */
-STATIC void
+void
 xfs_trans_apply_dquot_deltas(
 	xfs_trans_t		*tp)
 {
@@ -357,7 +356,7 @@ xfs_trans_apply_dquot_deltas(
 	long			totalbdelta;
 	long			totalrtbdelta;
 
-	if (! (tp->t_flags & XFS_TRANS_DQ_DIRTY))
+	if (!(tp->t_flags & XFS_TRANS_DQ_DIRTY))
 		return;
 
 	ASSERT(tp->t_dqinfo);
@@ -531,7 +530,7 @@ xfs_trans_apply_dquot_deltas(
  * we simply throw those away, since that's the expected behavior
  * when a transaction is curtailed without a commit.
  */
-STATIC void
+void
 xfs_trans_unreserve_and_mod_dquots(
 	xfs_trans_t		*tp)
 {
@@ -768,7 +767,7 @@ xfs_trans_reserve_quota_bydquots(
 {
 	int		resvd = 0, error;
 
-	if (!XFS_IS_QUOTA_ON(mp))
+	if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
 		return 0;
 
 	if (tp && tp->t_dqinfo == NULL)
@@ -811,18 +810,17 @@ xfs_trans_reserve_quota_bydquots(
  * This doesn't change the actual usage, just the reservation.
  * The inode sent in is locked.
  */
-STATIC int
+int
 xfs_trans_reserve_quota_nblks(
-	xfs_trans_t	*tp,
-	xfs_mount_t	*mp,
-	xfs_inode_t	*ip,
-	long		nblks,
-	long		ninos,
-	uint		flags)
+	struct xfs_trans	*tp,
+	struct xfs_inode	*ip,
+	long			nblks,
+	long			ninos,
+	uint			flags)
 {
-	int		error;
+	struct xfs_mount	*mp = ip->i_mount;
 
-	if (!XFS_IS_QUOTA_ON(mp))
+	if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
 		return 0;
 	if (XFS_IS_PQUOTA_ON(mp))
 		flags |= XFS_QMOPT_ENOSPC;
@@ -831,7 +829,6 @@ xfs_trans_reserve_quota_nblks(
 	ASSERT(ip->i_ino != mp->m_sb.sb_gquotino);
 
 	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
-	ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount));
 	ASSERT((flags & ~(XFS_QMOPT_FORCE_RES | XFS_QMOPT_ENOSPC)) ==
 				XFS_TRANS_DQ_RES_RTBLKS ||
 	       (flags & ~(XFS_QMOPT_FORCE_RES | XFS_QMOPT_ENOSPC)) ==
@@ -840,11 +837,9 @@ xfs_trans_reserve_quota_nblks(
 	/*
 	 * Reserve nblks against these dquots, with trans as the mediator.
 	 */
-	error = xfs_trans_reserve_quota_bydquots(tp, mp,
-						 ip->i_udquot, ip->i_gdquot,
-						 nblks, ninos,
-						 flags);
-	return error;
+	return xfs_trans_reserve_quota_bydquots(tp, mp,
+						ip->i_udquot, ip->i_gdquot,
+						nblks, ninos, flags);
 }
 
 /*
@@ -895,25 +890,15 @@ STATIC void
 xfs_trans_alloc_dqinfo(
 	xfs_trans_t	*tp)
 {
-	(tp)->t_dqinfo = kmem_zone_zalloc(xfs_Gqm->qm_dqtrxzone, KM_SLEEP);
+	tp->t_dqinfo = kmem_zone_zalloc(xfs_Gqm->qm_dqtrxzone, KM_SLEEP);
 }
 
-STATIC void
+void
 xfs_trans_free_dqinfo(
 	xfs_trans_t	*tp)
 {
 	if (!tp->t_dqinfo)
 		return;
-	kmem_zone_free(xfs_Gqm->qm_dqtrxzone, (tp)->t_dqinfo);
-	(tp)->t_dqinfo = NULL;
+	kmem_zone_free(xfs_Gqm->qm_dqtrxzone, tp->t_dqinfo);
+	tp->t_dqinfo = NULL;
 }
-
-xfs_dqtrxops_t	xfs_trans_dquot_ops = {
-	.qo_dup_dqinfo			= xfs_trans_dup_dqinfo,
-	.qo_free_dqinfo			= xfs_trans_free_dqinfo,
-	.qo_mod_dquot_byino		= xfs_trans_mod_dquot_byino,
-	.qo_apply_dquot_deltas		= xfs_trans_apply_dquot_deltas,
-	.qo_reserve_quota_nblks		= xfs_trans_reserve_quota_nblks,
-	.qo_reserve_quota_bydquots	= xfs_trans_reserve_quota_bydquots,
-	.qo_unreserve_and_mod_dquots	= xfs_trans_unreserve_and_mod_dquots,
-};
Index: xfs/fs/xfs/xfs_quota.h
===================================================================
--- xfs.orig/fs/xfs/xfs_quota.h	2009-05-27 11:14:50.053939517 +0200
+++ xfs/fs/xfs/xfs_quota.h	2009-05-27 11:17:27.976843156 +0200
@@ -197,7 +197,6 @@ typedef struct xfs_qoff_logformat {
 #define XFS_QMOPT_UMOUNTING	0x0000100 /* filesys is being unmounted */
 #define XFS_QMOPT_DOLOG		0x0000200 /* log buf changes (in quotacheck) */
 #define XFS_QMOPT_DOWARN        0x0000400 /* increase warning cnt if needed */
-#define XFS_QMOPT_ILOCKED	0x0000800 /* inode is already locked (excl) */
 #define XFS_QMOPT_DQREPAIR	0x0001000 /* repair dquot if damaged */
 #define XFS_QMOPT_GQUOTA	0x0002000 /* group dquot requested */
 #define XFS_QMOPT_ENOSPC	0x0004000 /* enospc instead of edquot (prj) */
@@ -302,69 +301,72 @@ typedef struct xfs_dqtrx {
 	long		qt_delrtb_delta;  /* delayed RT blk count changes */
 } xfs_dqtrx_t;
 
-/*
- * Dquot transaction functions, used if quota is enabled.
- */
-typedef void	(*qo_dup_dqinfo_t)(struct xfs_trans *, struct xfs_trans *);
-typedef void	(*qo_mod_dquot_byino_t)(struct xfs_trans *,
-				struct xfs_inode *, uint, long);
-typedef void	(*qo_free_dqinfo_t)(struct xfs_trans *);
-typedef void	(*qo_apply_dquot_deltas_t)(struct xfs_trans *);
-typedef void	(*qo_unreserve_and_mod_dquots_t)(struct xfs_trans *);
-typedef int	(*qo_reserve_quota_nblks_t)(
-				struct xfs_trans *, struct xfs_mount *,
-				struct xfs_inode *, long, long, uint);
-typedef int	(*qo_reserve_quota_bydquots_t)(
-				struct xfs_trans *, struct xfs_mount *,
-				struct xfs_dquot *, struct xfs_dquot *,
-				long, long, uint);
-typedef struct xfs_dqtrxops {
-	qo_dup_dqinfo_t			qo_dup_dqinfo;
-	qo_free_dqinfo_t		qo_free_dqinfo;
-	qo_mod_dquot_byino_t		qo_mod_dquot_byino;
-	qo_apply_dquot_deltas_t		qo_apply_dquot_deltas;
-	qo_reserve_quota_nblks_t	qo_reserve_quota_nblks;
-	qo_reserve_quota_bydquots_t	qo_reserve_quota_bydquots;
-	qo_unreserve_and_mod_dquots_t	qo_unreserve_and_mod_dquots;
-} xfs_dqtrxops_t;
-
-#define XFS_DQTRXOP(mp, tp, op, args...) \
-		((mp)->m_qm_ops->xfs_dqtrxops ? \
-		((mp)->m_qm_ops->xfs_dqtrxops->op)(tp, ## args) : 0)
-
-#define XFS_DQTRXOP_VOID(mp, tp, op, args...) \
-		((mp)->m_qm_ops->xfs_dqtrxops ? \
-		((mp)->m_qm_ops->xfs_dqtrxops->op)(tp, ## args) : (void)0)
-
-#define XFS_TRANS_DUP_DQINFO(mp, otp, ntp) \
-	XFS_DQTRXOP_VOID(mp, otp, qo_dup_dqinfo, ntp)
-#define XFS_TRANS_FREE_DQINFO(mp, tp) \
-	XFS_DQTRXOP_VOID(mp, tp, qo_free_dqinfo)
-#define XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, field, delta) \
-	XFS_DQTRXOP_VOID(mp, tp, qo_mod_dquot_byino, ip, field, delta)
-#define XFS_TRANS_APPLY_DQUOT_DELTAS(mp, tp) \
-	XFS_DQTRXOP_VOID(mp, tp, qo_apply_dquot_deltas)
-#define XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip, nblks, ninos, fl) \
-	XFS_DQTRXOP(mp, tp, qo_reserve_quota_nblks, mp, ip, nblks, ninos, fl)
-#define XFS_TRANS_RESERVE_QUOTA_BYDQUOTS(mp, tp, ud, gd, nb, ni, fl) \
-	XFS_DQTRXOP(mp, tp, qo_reserve_quota_bydquots, mp, ud, gd, nb, ni, fl)
-#define XFS_TRANS_UNRESERVE_AND_MOD_DQUOTS(mp, tp) \
-	XFS_DQTRXOP_VOID(mp, tp, qo_unreserve_and_mod_dquots)
-
-#define XFS_TRANS_UNRESERVE_QUOTA_NBLKS(mp, tp, ip, nblks, ninos, flags) \
-	XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip, -(nblks), -(ninos), flags)
-#define XFS_TRANS_RESERVE_QUOTA(mp, tp, ud, gd, nb, ni, f) \
-	XFS_TRANS_RESERVE_QUOTA_BYDQUOTS(mp, tp, ud, gd, nb, ni, \
-				f | XFS_QMOPT_RES_REGBLKS)
-#define XFS_TRANS_UNRESERVE_QUOTA(mp, tp, ud, gd, nb, ni, f) \
-	XFS_TRANS_RESERVE_QUOTA_BYDQUOTS(mp, tp, ud, gd, -(nb), -(ni), \
+#ifdef CONFIG_XFS_QUOTA
+extern void xfs_trans_dup_dqinfo(struct xfs_trans *, struct xfs_trans *);
+extern void xfs_trans_free_dqinfo(struct xfs_trans *);
+extern void xfs_trans_mod_dquot_byino(struct xfs_trans *, struct xfs_inode *,
+		uint, long);
+extern void xfs_trans_apply_dquot_deltas(struct xfs_trans *);
+extern void xfs_trans_unreserve_and_mod_dquots(struct xfs_trans *);
+extern int xfs_trans_reserve_quota_nblks(struct xfs_trans *,
+		struct xfs_inode *, long, long, uint);
+extern int xfs_trans_reserve_quota_bydquots(struct xfs_trans *,
+		struct xfs_mount *, struct xfs_dquot *,
+		struct xfs_dquot *, long, long, uint);
+
+extern int xfs_qm_vop_dqalloc(struct xfs_inode *, uid_t, gid_t, prid_t, uint,
+		struct xfs_dquot **, struct xfs_dquot **);
+extern void xfs_qm_vop_create_dqattach(struct xfs_trans *, struct xfs_inode *,
+		struct xfs_dquot *, struct xfs_dquot *);
+extern int xfs_qm_vop_rename_dqattach(struct xfs_inode **);
+extern struct xfs_dquot *xfs_qm_vop_chown(struct xfs_trans *,
+		struct xfs_inode *, struct xfs_dquot **, struct xfs_dquot *);
+extern int xfs_qm_vop_chown_reserve(struct xfs_trans *, struct xfs_inode *,
+		struct xfs_dquot *, struct xfs_dquot *, uint);
+extern int xfs_qm_dqattach(struct xfs_inode *, uint);
+extern int xfs_qm_dqattach_locked(struct xfs_inode *, uint);
+extern void xfs_qm_dqdetach(struct xfs_inode *);
+extern void xfs_qm_dqrele(struct xfs_dquot *);
+extern void xfs_qm_statvfs(struct xfs_inode *, struct kstatfs *);
+extern int xfs_qm_sync(struct xfs_mount *, int);
+extern int xfs_qm_newmount(struct xfs_mount *, uint *, uint *);
+extern void xfs_qm_mount_quotas(struct xfs_mount *);
+extern void xfs_qm_unmount(struct xfs_mount *);
+extern void xfs_qm_unmount_quotas(struct xfs_mount *);
+
+#else
+#define xfs_trans_dup_dqinfo(tp, tp2)
+#define xfs_trans_free_dqinfo(tp)
+#define xfs_trans_mod_dquot_byino(tp, ip, fields, delta)
+#define xfs_trans_apply_dquot_deltas(tp)
+#define xfs_trans_unreserve_and_mod_dquots(tp)
+#define xfs_trans_reserve_quota_nblks(tp, ip, nblks, ninos, flags)	(0)
+#define xfs_trans_reserve_quota_bydquots(tp, mp, u, g, nb, ni, fl)	(0)
+#define xfs_qm_vop_dqalloc(ip, uid, gid, prid, fl, ou, og)		(0)
+#define xfs_qm_vop_create_dqattach(tp, ip, u, g)
+#define xfs_qm_vop_rename_dqattach(it)					(0)
+#define xfs_qm_vop_chown(tp, ip, old, new)				(NULL)
+#define xfs_qm_vop_chown_reserve(tp, ip, u, g, fl)			(0)
+#define xfs_qm_dqattach(ip, fl)						(0)
+#define xfs_qm_dqattach_locked(ip, fl)					(0)
+#define xfs_qm_dqdetach(ip)
+#define xfs_qm_dqrele(d)
+#define xfs_qm_statvfs(ip, s)
+#define xfs_qm_sync(mp, fl)						(0)
+#define xfs_qm_newmount(mp, a, b)					(0)
+#define xfs_qm_mount_quotas(mp)
+#define xfs_qm_unmount(mp)
+#define xfs_qm_unmount_quotas(mp)					(0)
+#endif /* CONFIG_XFS_QUOTA */
+
+#define xfs_trans_unreserve_quota_nblks(tp, ip, nblks, ninos, flags) \
+	xfs_trans_reserve_quota_nblks(tp, ip, -(nblks), -(ninos), flags)
+#define xfs_trans_reserve_quota(tp, mp, ud, gd, nb, ni, f) \
+	xfs_trans_reserve_quota_bydquots(tp, mp, ud, gd, nb, ni, \
 				f | XFS_QMOPT_RES_REGBLKS)
 
 extern int xfs_qm_dqcheck(xfs_disk_dquot_t *, xfs_dqid_t, uint, uint, char *);
 extern int xfs_mount_reset_sbqflags(struct xfs_mount *);
 
-extern struct xfs_qmops xfs_qmcore_xfs;
-
 #endif	/* __KERNEL__ */
-
 #endif	/* __XFS_QUOTA_H__ */
Index: xfs/fs/xfs/xfs_trans.c
===================================================================
--- xfs.orig/fs/xfs/xfs_trans.c	2009-05-27 11:14:50.058939944 +0200
+++ xfs/fs/xfs/xfs_trans.c	2009-05-27 11:17:27.980865945 +0200
@@ -297,7 +297,7 @@ xfs_trans_dup(
 	tp->t_rtx_res = tp->t_rtx_res_used;
 	ntp->t_pflags = tp->t_pflags;
 
-	XFS_TRANS_DUP_DQINFO(tp->t_mountp, tp, ntp);
+	xfs_trans_dup_dqinfo(tp, ntp);
 
 	atomic_inc(&tp->t_mountp->m_active_trans);
 	return ntp;
@@ -831,7 +831,7 @@ shut_us_down:
 		 * means is that we have some (non-persistent) quota
 		 * reservations that need to be unreserved.
 		 */
-		XFS_TRANS_UNRESERVE_AND_MOD_DQUOTS(mp, tp);
+		xfs_trans_unreserve_and_mod_dquots(tp);
 		if (tp->t_ticket) {
 			commit_lsn = xfs_log_done(mp, tp->t_ticket,
 							NULL, log_flags);
@@ -850,10 +850,9 @@ shut_us_down:
 	/*
 	 * If we need to update the superblock, then do it now.
 	 */
-	if (tp->t_flags & XFS_TRANS_SB_DIRTY) {
+	if (tp->t_flags & XFS_TRANS_SB_DIRTY)
 		xfs_trans_apply_sb_deltas(tp);
-	}
-	XFS_TRANS_APPLY_DQUOT_DELTAS(mp, tp);
+	xfs_trans_apply_dquot_deltas(tp);
 
 	/*
 	 * Ask each log item how many log_vector entries it will
@@ -1058,7 +1057,7 @@ xfs_trans_uncommit(
 	}
 
 	xfs_trans_unreserve_and_mod_sb(tp);
-	XFS_TRANS_UNRESERVE_AND_MOD_DQUOTS(tp->t_mountp, tp);
+	xfs_trans_unreserve_and_mod_dquots(tp);
 
 	xfs_trans_free_items(tp, flags);
 	xfs_trans_free_busy(tp);
@@ -1183,7 +1182,7 @@ xfs_trans_cancel(
 	}
 #endif
 	xfs_trans_unreserve_and_mod_sb(tp);
-	XFS_TRANS_UNRESERVE_AND_MOD_DQUOTS(mp, tp);
+	xfs_trans_unreserve_and_mod_dquots(tp);
 
 	if (tp->t_ticket) {
 		if (flags & XFS_TRANS_RELEASE_LOG_RES) {
@@ -1213,7 +1212,7 @@ xfs_trans_free(
 	xfs_trans_t	*tp)
 {
 	atomic_dec(&tp->t_mountp->m_active_trans);
-	XFS_TRANS_FREE_DQINFO(tp->t_mountp, tp);
+	xfs_trans_free_dqinfo(tp);
 	kmem_zone_free(xfs_trans_zone, tp);
 }
 
Index: xfs/fs/xfs/xfs_utils.c
===================================================================
--- xfs.orig/fs/xfs/xfs_utils.c	2009-05-27 11:14:50.062939545 +0200
+++ xfs/fs/xfs/xfs_utils.c	2009-05-27 11:17:27.982973196 +0200
@@ -166,7 +166,7 @@ xfs_dir_ialloc(
 			xfs_buf_relse(ialloc_context);
 			if (dqinfo) {
 				tp->t_dqinfo = dqinfo;
-				XFS_TRANS_FREE_DQINFO(tp->t_mountp, tp);
+				xfs_trans_free_dqinfo(tp);
 			}
 			*tpp = ntp;
 			*ipp = NULL;
Index: xfs/fs/xfs/xfs_bmap.c
===================================================================
--- xfs.orig/fs/xfs/xfs_bmap.c	2009-05-27 11:14:50.067939483 +0200
+++ xfs/fs/xfs/xfs_bmap.c	2009-05-27 11:17:27.987965801 +0200
@@ -2691,7 +2691,7 @@ xfs_bmap_rtalloc(
 		 * Adjust the disk quota also. This was reserved
 		 * earlier.
 		 */
-		XFS_TRANS_MOD_DQUOT_BYINO(mp, ap->tp, ap->ip,
+		xfs_trans_mod_dquot_byino(ap->tp, ap->ip,
 			ap->wasdel ? XFS_TRANS_DQ_DELRTBCOUNT :
 					XFS_TRANS_DQ_RTBCOUNT, (long) ralen);
 	} else {
@@ -2995,7 +2995,7 @@ xfs_bmap_btalloc(
 		 * Adjust the disk quota also. This was reserved
 		 * earlier.
 		 */
-		XFS_TRANS_MOD_DQUOT_BYINO(mp, ap->tp, ap->ip,
+		xfs_trans_mod_dquot_byino(ap->tp, ap->ip,
 			ap->wasdel ? XFS_TRANS_DQ_DELBCOUNT :
 					XFS_TRANS_DQ_BCOUNT,
 			(long) args.len);
@@ -3066,7 +3066,7 @@ xfs_bmap_btree_to_extents(
 		return error;
 	xfs_bmap_add_free(cbno, 1, cur->bc_private.b.flist, mp);
 	ip->i_d.di_nblocks--;
-	XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, XFS_TRANS_DQ_BCOUNT, -1L);
+	xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L);
 	xfs_trans_binval(tp, cbp);
 	if (cur->bc_bufs[0] == cbp)
 		cur->bc_bufs[0] = NULL;
@@ -3386,7 +3386,7 @@ xfs_bmap_del_extent(
 	 * Adjust quota data.
 	 */
 	if (qfield)
-		XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, qfield, (long)-nblks);
+		xfs_trans_mod_dquot_byino(tp, ip, qfield, (long)-nblks);
 
 	/*
 	 * Account for change in delayed indirect blocks.
@@ -3523,7 +3523,7 @@ xfs_bmap_extents_to_btree(
 	*firstblock = cur->bc_private.b.firstblock = args.fsbno;
 	cur->bc_private.b.allocated++;
 	ip->i_d.di_nblocks++;
-	XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, XFS_TRANS_DQ_BCOUNT, 1L);
+	xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, 1L);
 	abp = xfs_btree_get_bufl(mp, tp, args.fsbno, 0);
 	/*
 	 * Fill in the child block.
@@ -3690,7 +3690,7 @@ xfs_bmap_local_to_extents(
 		XFS_BMAP_TRACE_POST_UPDATE("new", ip, 0, whichfork);
 		XFS_IFORK_NEXT_SET(ip, whichfork, 1);
 		ip->i_d.di_nblocks = 1;
-		XFS_TRANS_MOD_DQUOT_BYINO(args.mp, tp, ip,
+		xfs_trans_mod_dquot_byino(tp, ip,
 			XFS_TRANS_DQ_BCOUNT, 1L);
 		flags |= xfs_ilog_fext(whichfork);
 	} else {
@@ -4048,7 +4048,7 @@ xfs_bmap_add_attrfork(
 			XFS_TRANS_PERM_LOG_RES, XFS_ADDAFORK_LOG_COUNT)))
 		goto error0;
 	xfs_ilock(ip, XFS_ILOCK_EXCL);
-	error = XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip, blks, 0, rsvd ?
+	error = xfs_trans_reserve_quota_nblks(tp, ip, blks, 0, rsvd ?
 			XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_FORCE_RES :
 			XFS_QMOPT_RES_REGBLKS);
 	if (error) {
@@ -4983,10 +4983,11 @@ xfs_bmapi(
 				 * adjusted later.  We return if we haven't
 				 * allocated blocks already inside this loop.
 				 */
-				if ((error = XFS_TRANS_RESERVE_QUOTA_NBLKS(
-						mp, NULL, ip, (long)alen, 0,
+				error = xfs_trans_reserve_quota_nblks(
+						NULL, ip, (long)alen, 0,
 						rt ? XFS_QMOPT_RES_RTBLKS :
-						     XFS_QMOPT_RES_REGBLKS))) {
+						     XFS_QMOPT_RES_REGBLKS);
+				if (error) {
 					if (n == 0) {
 						*nmap = 0;
 						ASSERT(cur == NULL);
@@ -5035,8 +5036,8 @@ xfs_bmapi(
 					if (XFS_IS_QUOTA_ON(mp))
 						/* unreserve the blocks now */
 						(void)
-						XFS_TRANS_UNRESERVE_QUOTA_NBLKS(
-							mp, NULL, ip,
+						xfs_trans_unreserve_quota_nblks(
+							NULL, ip,
 							(long)alen, 0, rt ?
 							XFS_QMOPT_RES_RTBLKS :
 							XFS_QMOPT_RES_REGBLKS);
@@ -5691,14 +5692,14 @@ xfs_bunmapi(
 				do_div(rtexts, mp->m_sb.sb_rextsize);
 				xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS,
 						(int64_t)rtexts, rsvd);
-				(void)XFS_TRANS_RESERVE_QUOTA_NBLKS(mp,
-					NULL, ip, -((long)del.br_blockcount), 0,
+				(void)xfs_trans_reserve_quota_nblks(NULL,
+					ip, -((long)del.br_blockcount), 0,
 					XFS_QMOPT_RES_RTBLKS);
 			} else {
 				xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS,
 						(int64_t)del.br_blockcount, rsvd);
-				(void)XFS_TRANS_RESERVE_QUOTA_NBLKS(mp,
-					NULL, ip, -((long)del.br_blockcount), 0,
+				(void)xfs_trans_reserve_quota_nblks(NULL,
+					ip, -((long)del.br_blockcount), 0,
 					XFS_QMOPT_RES_REGBLKS);
 			}
 			ip->i_delayed_blks -= del.br_blockcount;
Index: xfs/fs/xfs/xfs_bmap_btree.c
===================================================================
--- xfs.orig/fs/xfs/xfs_bmap_btree.c	2009-05-27 11:14:50.073964481 +0200
+++ xfs/fs/xfs/xfs_bmap_btree.c	2009-05-27 11:17:27.990960596 +0200
@@ -590,7 +590,7 @@ xfs_bmbt_alloc_block(
 	cur->bc_private.b.allocated++;
 	cur->bc_private.b.ip->i_d.di_nblocks++;
 	xfs_trans_log_inode(args.tp, cur->bc_private.b.ip, XFS_ILOG_CORE);
-	XFS_TRANS_MOD_DQUOT_BYINO(args.mp, args.tp, cur->bc_private.b.ip,
+	xfs_trans_mod_dquot_byino(args.tp, cur->bc_private.b.ip,
 			XFS_TRANS_DQ_BCOUNT, 1L);
 
 	new->l = cpu_to_be64(args.fsbno);
@@ -618,7 +618,7 @@ xfs_bmbt_free_block(
 	ip->i_d.di_nblocks--;
 
 	xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
-	XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, XFS_TRANS_DQ_BCOUNT, -1L);
+	xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L);
 	xfs_trans_binval(tp, bp);
 	return 0;
 }
Index: xfs/fs/xfs/xfs_vnodeops.c
===================================================================
--- xfs.orig/fs/xfs/xfs_vnodeops.c	2009-05-27 11:14:50.077939638 +0200
+++ xfs/fs/xfs/xfs_vnodeops.c	2009-05-27 11:25:30.776848132 +0200
@@ -118,7 +118,7 @@ xfs_setattr(
 		 */
 		ASSERT(udqp == NULL);
 		ASSERT(gdqp == NULL);
-		code = XFS_QM_DQVOPALLOC(mp, ip, uid, gid, ip->i_d.di_projid,
+		code = xfs_qm_vop_dqalloc(ip, uid, gid, ip->i_d.di_projid,
 					 qflags, &udqp, &gdqp);
 		if (code)
 			return code;
@@ -180,10 +180,11 @@ xfs_setattr(
 		 * Do a quota reservation only if uid/gid is actually
 		 * going to change.
 		 */
-		if ((XFS_IS_UQUOTA_ON(mp) && iuid != uid) ||
-		    (XFS_IS_GQUOTA_ON(mp) && igid != gid)) {
+		if (XFS_IS_QUOTA_RUNNING(mp) &&
+		    ((XFS_IS_UQUOTA_ON(mp) && iuid != uid) ||
+		     (XFS_IS_GQUOTA_ON(mp) && igid != gid))) {
 			ASSERT(tp);
-			code = XFS_QM_DQVOPCHOWNRESV(mp, tp, ip, udqp, gdqp,
+			code = xfs_qm_vop_chown_reserve(tp, ip, udqp, gdqp,
 						capable(CAP_FOWNER) ?
 						XFS_QMOPT_FORCE_RES : 0);
 			if (code)	/* out of quota */
@@ -217,7 +218,7 @@ xfs_setattr(
 		/*
 		 * Make sure that the dquots are attached to the inode.
 		 */
-		code = XFS_QM_DQATTACH(mp, ip, XFS_QMOPT_ILOCKED);
+		code = xfs_qm_dqattach_locked(ip, 0);
 		if (code)
 			goto error_return;
 
@@ -351,21 +352,21 @@ xfs_setattr(
 		 * in the transaction.
 		 */
 		if (iuid != uid) {
-			if (XFS_IS_UQUOTA_ON(mp)) {
+			if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_UQUOTA_ON(mp)) {
 				ASSERT(mask & ATTR_UID);
 				ASSERT(udqp);
-				olddquot1 = XFS_QM_DQVOPCHOWN(mp, tp, ip,
+				olddquot1 = xfs_qm_vop_chown(tp, ip,
 							&ip->i_udquot, udqp);
 			}
 			ip->i_d.di_uid = uid;
 			inode->i_uid = uid;
 		}
 		if (igid != gid) {
-			if (XFS_IS_GQUOTA_ON(mp)) {
+			if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_GQUOTA_ON(mp)) {
 				ASSERT(!XFS_IS_PQUOTA_ON(mp));
 				ASSERT(mask & ATTR_GID);
 				ASSERT(gdqp);
-				olddquot2 = XFS_QM_DQVOPCHOWN(mp, tp, ip,
+				olddquot2 = xfs_qm_vop_chown(tp, ip,
 							&ip->i_gdquot, gdqp);
 			}
 			ip->i_d.di_gid = gid;
@@ -461,10 +462,10 @@ xfs_setattr(
 	/*
 	 * Release any dquot(s) the inode had kept before chown.
 	 */
-	XFS_QM_DQRELE(mp, olddquot1);
-	XFS_QM_DQRELE(mp, olddquot2);
-	XFS_QM_DQRELE(mp, udqp);
-	XFS_QM_DQRELE(mp, gdqp);
+	xfs_qm_dqrele(olddquot1);
+	xfs_qm_dqrele(olddquot2);
+	xfs_qm_dqrele(udqp);
+	xfs_qm_dqrele(gdqp);
 
 	if (code) {
 		return code;
@@ -482,8 +483,8 @@ xfs_setattr(
 	commit_flags |= XFS_TRANS_ABORT;
 	/* FALLTHROUGH */
  error_return:
-	XFS_QM_DQRELE(mp, udqp);
-	XFS_QM_DQRELE(mp, gdqp);
+	xfs_qm_dqrele(udqp);
+	xfs_qm_dqrele(gdqp);
 	if (tp) {
 		xfs_trans_cancel(tp, commit_flags);
 	}
@@ -739,7 +740,8 @@ xfs_free_eofblocks(
 		/*
 		 * Attach the dquots to the inode up front.
 		 */
-		if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
+		error = xfs_qm_dqattach(ip, 0);
+		if (error)
 			return error;
 
 		/*
@@ -1181,7 +1183,8 @@ xfs_inactive(
 
 	ASSERT(ip->i_d.di_nlink == 0);
 
-	if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
+	error = xfs_qm_dqattach(ip, 0);
+	if (error)
 		return VN_INACTIVE_CACHE;
 
 	tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE);
@@ -1307,7 +1310,7 @@ xfs_inactive(
 		/*
 		 * Credit the quota account(s). The inode is gone.
 		 */
-		XFS_TRANS_MOD_DQUOT_BYINO(mp, tp, ip, XFS_TRANS_DQ_ICOUNT, -1);
+		xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_ICOUNT, -1);
 
 		/*
 		 * Just ignore errors at this point.  There is nothing we can
@@ -1323,11 +1326,11 @@ xfs_inactive(
 			xfs_fs_cmn_err(CE_NOTE, mp, "xfs_inactive: "
 				"xfs_trans_commit() returned error %d", error);
 	}
+
 	/*
 	 * Release the dquots held by inode, if any.
 	 */
-	XFS_QM_DQDETACH(mp, ip);
-
+	xfs_qm_dqdetach(ip);
 	xfs_iunlock(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
 
  out:
@@ -1427,8 +1430,7 @@ xfs_create(
 	/*
 	 * Make sure that we have allocated dquot(s) on disk.
 	 */
-	error = XFS_QM_DQVOPALLOC(mp, dp,
-			current_fsuid(), current_fsgid(), prid,
+	error = xfs_qm_vop_dqalloc(dp, current_fsuid(), current_fsgid(), prid,
 			XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, &udqp, &gdqp);
 	if (error)
 		goto std_return;
@@ -1489,7 +1491,7 @@ xfs_create(
 	/*
 	 * Reserve disk quota and the inode.
 	 */
-	error = XFS_TRANS_RESERVE_QUOTA(mp, tp, udqp, gdqp, resblks, 1, 0);
+	error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp, resblks, 1, 0);
 	if (error)
 		goto out_trans_cancel;
 
@@ -1561,7 +1563,7 @@ xfs_create(
 	 * These ids of the inode couldn't have changed since the new
 	 * inode has been locked ever since it was created.
 	 */
-	XFS_QM_DQVOPCREATE(mp, tp, ip, udqp, gdqp);
+	xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp);
 
 	/*
 	 * xfs_trans_commit normally decrements the vnode ref count
@@ -1580,8 +1582,8 @@ xfs_create(
 		goto out_dqrele;
 	}
 
-	XFS_QM_DQRELE(mp, udqp);
-	XFS_QM_DQRELE(mp, gdqp);
+	xfs_qm_dqrele(udqp);
+	xfs_qm_dqrele(gdqp);
 
 	*ipp = ip;
 
@@ -1602,8 +1604,8 @@ xfs_create(
  out_trans_cancel:
 	xfs_trans_cancel(tp, cancel_flags);
  out_dqrele:
-	XFS_QM_DQRELE(mp, udqp);
-	XFS_QM_DQRELE(mp, gdqp);
+	xfs_qm_dqrele(udqp);
+	xfs_qm_dqrele(gdqp);
 
 	if (unlock_dp_on_error)
 		xfs_iunlock(dp, XFS_ILOCK_EXCL);
@@ -1837,11 +1839,11 @@ xfs_remove(
 			return error;
 	}
 
-	error = XFS_QM_DQATTACH(mp, dp, 0);
+	error = xfs_qm_dqattach(dp, 0);
 	if (error)
 		goto std_return;
 
-	error = XFS_QM_DQATTACH(mp, ip, 0);
+	error = xfs_qm_dqattach(ip, 0);
 	if (error)
 		goto std_return;
 
@@ -2028,11 +2030,11 @@ xfs_link(
 
 	/* Return through std_return after this point. */
 
-	error = XFS_QM_DQATTACH(mp, sip, 0);
+	error = xfs_qm_dqattach(sip, 0);
 	if (error)
 		goto std_return;
 
-	error = XFS_QM_DQATTACH(mp, tdp, 0);
+	error = xfs_qm_dqattach(tdp, 0);
 	if (error)
 		goto std_return;
 
@@ -2205,8 +2207,7 @@ xfs_symlink(
 	/*
 	 * Make sure that we have allocated dquot(s) on disk.
 	 */
-	error = XFS_QM_DQVOPALLOC(mp, dp,
-			current_fsuid(), current_fsgid(), prid,
+	error = xfs_qm_vop_dqalloc(dp, current_fsuid(), current_fsgid(), prid,
 			XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, &udqp, &gdqp);
 	if (error)
 		goto std_return;
@@ -2248,7 +2249,7 @@ xfs_symlink(
 	/*
 	 * Reserve disk quota : blocks and inode.
 	 */
-	error = XFS_TRANS_RESERVE_QUOTA(mp, tp, udqp, gdqp, resblks, 1, 0);
+	error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp, resblks, 1, 0);
 	if (error)
 		goto error_return;
 
@@ -2288,7 +2289,7 @@ xfs_symlink(
 	/*
 	 * Also attach the dquot(s) to it, if applicable.
 	 */
-	XFS_QM_DQVOPCREATE(mp, tp, ip, udqp, gdqp);
+	xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp);
 
 	if (resblks)
 		resblks -= XFS_IALLOC_SPACE_RES(mp);
@@ -2376,8 +2377,8 @@ xfs_symlink(
 		goto error2;
 	}
 	error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES);
-	XFS_QM_DQRELE(mp, udqp);
-	XFS_QM_DQRELE(mp, gdqp);
+	xfs_qm_dqrele(udqp);
+	xfs_qm_dqrele(gdqp);
 
 	/* Fall through to std_return with error = 0 or errno from
 	 * xfs_trans_commit	*/
@@ -2401,8 +2402,8 @@ std_return:
 	cancel_flags |= XFS_TRANS_ABORT;
  error_return:
 	xfs_trans_cancel(tp, cancel_flags);
-	XFS_QM_DQRELE(mp, udqp);
-	XFS_QM_DQRELE(mp, gdqp);
+	xfs_qm_dqrele(udqp);
+	xfs_qm_dqrele(gdqp);
 
 	if (unlock_dp_on_error)
 		xfs_iunlock(dp, XFS_ILOCK_EXCL);
@@ -2541,7 +2542,8 @@ xfs_alloc_file_space(
 	if (XFS_FORCED_SHUTDOWN(mp))
 		return XFS_ERROR(EIO);
 
-	if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
+	error = xfs_qm_dqattach(ip, 0);
+	if (error)
 		return error;
 
 	if (len <= 0)
@@ -2628,8 +2630,8 @@ retry:
 			break;
 		}
 		xfs_ilock(ip, XFS_ILOCK_EXCL);
-		error = XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip,
-						      qblocks, 0, quota_flag);
+		error = xfs_trans_reserve_quota_nblks(tp, ip, qblocks,
+						      0, quota_flag);
 		if (error)
 			goto error1;
 
@@ -2688,7 +2690,7 @@ dmapi_enospc_check:
 
 error0:	/* Cancel bmap, unlock inode, unreserve quota blocks, cancel trans */
 	xfs_bmap_cancel(&free_list);
-	XFS_TRANS_UNRESERVE_QUOTA_NBLKS(mp, tp, ip, qblocks, 0, quota_flag);
+	xfs_trans_unreserve_quota_nblks(tp, ip, qblocks, 0, quota_flag);
 
 error1:	/* Just cancel transaction */
 	xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT);
@@ -2827,7 +2829,8 @@ xfs_free_file_space(
 
 	xfs_itrace_entry(ip);
 
-	if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
+	error = xfs_qm_dqattach(ip, 0);
+	if (error)
 		return error;
 
 	error = 0;
@@ -2953,9 +2956,9 @@ xfs_free_file_space(
 			break;
 		}
 		xfs_ilock(ip, XFS_ILOCK_EXCL);
-		error = XFS_TRANS_RESERVE_QUOTA(mp, tp,
-				ip->i_udquot, ip->i_gdquot, resblks, 0,
-				XFS_QMOPT_RES_REGBLKS);
+		error = xfs_trans_reserve_quota(tp, mp,
+				ip->i_udquot, ip->i_gdquot,
+				resblks, 0, XFS_QMOPT_RES_REGBLKS);
 		if (error)
 			goto error1;
 
Index: xfs/fs/xfs/quota/xfs_qm.h
===================================================================
--- xfs.orig/fs/xfs/quota/xfs_qm.h	2009-05-27 11:14:50.012967824 +0200
+++ xfs/fs/xfs/quota/xfs_qm.h	2009-05-27 11:17:27.998843443 +0200
@@ -127,8 +127,6 @@ typedef struct xfs_quotainfo {
 } xfs_quotainfo_t;
 
 
-extern xfs_dqtrxops_t	xfs_trans_dquot_ops;
-
 extern void	xfs_trans_mod_dquot(xfs_trans_t *, xfs_dquot_t *, uint, long);
 extern int	xfs_trans_reserve_quota_bydquots(xfs_trans_t *, xfs_mount_t *,
 			xfs_dquot_t *, xfs_dquot_t *, long, long, uint);
@@ -159,17 +157,11 @@ typedef struct xfs_dquot_acct {
 #define XFS_QM_RTBWARNLIMIT	5
 
 extern void		xfs_qm_destroy_quotainfo(xfs_mount_t *);
-extern void		xfs_qm_mount_quotas(xfs_mount_t *);
 extern int		xfs_qm_quotacheck(xfs_mount_t *);
-extern void		xfs_qm_unmount_quotadestroy(xfs_mount_t *);
-extern void		xfs_qm_unmount_quotas(xfs_mount_t *);
 extern int		xfs_qm_write_sb_changes(xfs_mount_t *, __int64_t);
-extern int		xfs_qm_sync(xfs_mount_t *, int);
 
 /* dquot stuff */
 extern boolean_t	xfs_qm_dqalloc_incore(xfs_dquot_t **);
-extern int		xfs_qm_dqattach(xfs_inode_t *, uint);
-extern void		xfs_qm_dqdetach(xfs_inode_t *);
 extern int		xfs_qm_dqpurge_all(xfs_mount_t *, uint);
 extern void		xfs_qm_dqrele_all_inodes(xfs_mount_t *, uint);
 
@@ -183,19 +175,6 @@ extern int		xfs_qm_scall_getqstat(xfs_mo
 extern int		xfs_qm_scall_quotaon(xfs_mount_t *, uint);
 extern int		xfs_qm_scall_quotaoff(xfs_mount_t *, uint);
 
-/* vop stuff */
-extern int		xfs_qm_vop_dqalloc(xfs_mount_t *, xfs_inode_t *,
-					uid_t, gid_t, prid_t, uint,
-					xfs_dquot_t **, xfs_dquot_t **);
-extern void		xfs_qm_vop_dqattach_and_dqmod_newinode(
-					xfs_trans_t *, xfs_inode_t *,
-					xfs_dquot_t *, xfs_dquot_t *);
-extern int		xfs_qm_vop_rename_dqattach(xfs_inode_t **);
-extern xfs_dquot_t *	xfs_qm_vop_chown(xfs_trans_t *, xfs_inode_t *,
-					xfs_dquot_t **, xfs_dquot_t *);
-extern int		xfs_qm_vop_chown_reserve(xfs_trans_t *, xfs_inode_t *,
-					xfs_dquot_t *, xfs_dquot_t *, uint);
-
 /* list stuff */
 extern void		xfs_qm_freelist_append(xfs_frlist_t *, xfs_dquot_t *);
 extern void		xfs_qm_freelist_unlink(xfs_dquot_t *);
Index: xfs/fs/xfs/quota/xfs_qm_bhv.c
===================================================================
--- xfs.orig/fs/xfs/quota/xfs_qm_bhv.c	2009-05-27 11:14:50.023940799 +0200
+++ xfs/fs/xfs/quota/xfs_qm_bhv.c	2009-05-27 11:17:28.002843883 +0200
@@ -84,7 +84,7 @@ xfs_fill_statvfs_from_dquot(
  * return a statvfs of the project, not the entire filesystem.
  * This makes such trees appear as if they are filesystems in themselves.
  */
-STATIC void
+void
 xfs_qm_statvfs(
 	xfs_inode_t		*ip,
 	struct kstatfs		*statp)
@@ -92,20 +92,13 @@ xfs_qm_statvfs(
 	xfs_mount_t		*mp = ip->i_mount;
 	xfs_dquot_t		*dqp;
 
-	if (!(ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) ||
-	    !((mp->m_qflags & (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))) ==
-	    		      (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))
-		return;
-
 	if (!xfs_qm_dqget(mp, NULL, ip->i_d.di_projid, XFS_DQ_PROJ, 0, &dqp)) {
-		xfs_disk_dquot_t	*dp = &dqp->q_core;
-
-		xfs_fill_statvfs_from_dquot(statp, dp);
+		xfs_fill_statvfs_from_dquot(statp, &dqp->q_core);
 		xfs_qm_dqput(dqp);
 	}
 }
 
-STATIC int
+int
 xfs_qm_newmount(
 	xfs_mount_t	*mp,
 	uint		*needquotamount,
@@ -114,9 +107,6 @@ xfs_qm_newmount(
 	uint		quotaondisk;
 	uint		uquotaondisk = 0, gquotaondisk = 0, pquotaondisk = 0;
 
-	*quotaflags = 0;
-	*needquotamount = B_FALSE;
-
 	quotaondisk = xfs_sb_version_hasquota(&mp->m_sb) &&
 				(mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT);
 
@@ -179,66 +169,6 @@ xfs_qm_newmount(
 	return 0;
 }
 
-STATIC int
-xfs_qm_endmount(
-	xfs_mount_t	*mp,
-	uint		needquotamount,
-	uint		quotaflags)
-{
-	if (needquotamount) {
-		ASSERT(mp->m_qflags == 0);
-		mp->m_qflags = quotaflags;
-		xfs_qm_mount_quotas(mp);
-	}
-
-#if defined(DEBUG) && defined(XFS_LOUD_RECOVERY)
-	if (! (XFS_IS_QUOTA_ON(mp)))
-		xfs_fs_cmn_err(CE_NOTE, mp, "Disk quotas not turned on");
-	else
-		xfs_fs_cmn_err(CE_NOTE, mp, "Disk quotas turned on");
-#endif
-
-#ifdef QUOTADEBUG
-	if (XFS_IS_QUOTA_ON(mp) && xfs_qm_internalqcheck(mp))
-		cmn_err(CE_WARN, "XFS: mount internalqcheck failed");
-#endif
-
-	return 0;
-}
-
-STATIC void
-xfs_qm_dqrele_null(
-	xfs_dquot_t	*dq)
-{
-	/*
-	 * Called from XFS, where we always check first for a NULL dquot.
-	 */
-	if (!dq)
-		return;
-	xfs_qm_dqrele(dq);
-}
-
-
-struct xfs_qmops xfs_qmcore_xfs = {
-	.xfs_qminit		= xfs_qm_newmount,
-	.xfs_qmdone		= xfs_qm_unmount_quotadestroy,
-	.xfs_qmmount		= xfs_qm_endmount,
-	.xfs_qmunmount		= xfs_qm_unmount_quotas,
-	.xfs_dqrele		= xfs_qm_dqrele_null,
-	.xfs_dqattach		= xfs_qm_dqattach,
-	.xfs_dqdetach		= xfs_qm_dqdetach,
-	.xfs_dqpurgeall		= xfs_qm_dqpurge_all,
-	.xfs_dqvopalloc		= xfs_qm_vop_dqalloc,
-	.xfs_dqvopcreate	= xfs_qm_vop_dqattach_and_dqmod_newinode,
-	.xfs_dqvoprename	= xfs_qm_vop_rename_dqattach,
-	.xfs_dqvopchown		= xfs_qm_vop_chown,
-	.xfs_dqvopchownresv	= xfs_qm_vop_chown_reserve,
-	.xfs_dqstatvfs		= xfs_qm_statvfs,
-	.xfs_dqsync		= xfs_qm_sync,
-	.xfs_dqtrxops		= &xfs_trans_dquot_ops,
-};
-EXPORT_SYMBOL(xfs_qmcore_xfs);
-
 void __init
 xfs_qm_init(void)
 {
Index: xfs/fs/xfs/xfs_attr.c
===================================================================
--- xfs.orig/fs/xfs/xfs_attr.c	2009-05-27 11:14:50.084939550 +0200
+++ xfs/fs/xfs/xfs_attr.c	2009-05-27 11:17:28.009816489 +0200
@@ -249,8 +249,9 @@ xfs_attr_set_int(xfs_inode_t *dp, struct
 	/*
 	 * Attach the dquots to the inode.
 	 */
-	if ((error = XFS_QM_DQATTACH(mp, dp, 0)))
-		return (error);
+	error = xfs_qm_dqattach(dp, 0);
+	if (error)
+		return error;
 
 	/*
 	 * If the inode doesn't have an attribute fork, add one.
@@ -311,7 +312,7 @@ xfs_attr_set_int(xfs_inode_t *dp, struct
 	}
 	xfs_ilock(dp, XFS_ILOCK_EXCL);
 
-	error = XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, args.trans, dp, args.total, 0,
+	error = xfs_trans_reserve_quota_nblks(args.trans, dp, args.total, 0,
 				rsvd ? XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_FORCE_RES :
 				       XFS_QMOPT_RES_REGBLKS);
 	if (error) {
@@ -501,8 +502,9 @@ xfs_attr_remove_int(xfs_inode_t *dp, str
 	/*
 	 * Attach the dquots to the inode.
 	 */
-	if ((error = XFS_QM_DQATTACH(mp, dp, 0)))
-		return (error);
+	error = xfs_qm_dqattach(dp, 0);
+	if (error)
+		return error;
 
 	/*
 	 * Start our first transaction of the day.
Index: xfs/fs/xfs/xfs_iomap.c
===================================================================
--- xfs.orig/fs/xfs/xfs_iomap.c	2009-05-27 11:14:50.088939640 +0200
+++ xfs/fs/xfs/xfs_iomap.c	2009-05-27 11:17:28.013815601 +0200
@@ -385,7 +385,7 @@ xfs_iomap_write_direct(
 	 * Make sure that the dquots are there. This doesn't hold
 	 * the ilock across a disk read.
 	 */
-	error = XFS_QM_DQATTACH(ip->i_mount, ip, XFS_QMOPT_ILOCKED);
+	error = xfs_qm_dqattach_locked(ip, 0);
 	if (error)
 		return XFS_ERROR(error);
 
@@ -444,8 +444,7 @@ xfs_iomap_write_direct(
 	if (error)
 		goto error_out;
 
-	error = XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, tp, ip,
-					      qblocks, 0, quota_flag);
+	error = xfs_trans_reserve_quota_nblks(tp, ip, qblocks, 0, quota_flag);
 	if (error)
 		goto error1;
 
@@ -495,7 +494,7 @@ xfs_iomap_write_direct(
 
 error0:	/* Cancel bmap, unlock inode, unreserve quota blocks, cancel trans */
 	xfs_bmap_cancel(&free_list);
-	XFS_TRANS_UNRESERVE_QUOTA_NBLKS(mp, tp, ip, qblocks, 0, quota_flag);
+	xfs_trans_unreserve_quota_nblks(tp, ip, qblocks, 0, quota_flag);
 
 error1:	/* Just cancel transaction */
 	xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT);
@@ -582,7 +581,7 @@ xfs_iomap_write_delay(
 	 * Make sure that the dquots are there. This doesn't hold
 	 * the ilock across a disk read.
 	 */
-	error = XFS_QM_DQATTACH(mp, ip, XFS_QMOPT_ILOCKED);
+	error = xfs_qm_dqattach_locked(ip, 0);
 	if (error)
 		return XFS_ERROR(error);
 
@@ -684,7 +683,8 @@ xfs_iomap_write_allocate(
 	/*
 	 * Make sure that the dquots are there.
 	 */
-	if ((error = XFS_QM_DQATTACH(mp, ip, 0)))
+	error = xfs_qm_dqattach(ip, 0);
+	if (error)
 		return XFS_ERROR(error);
 
 	offset_fsb = XFS_B_TO_FSBT(mp, offset);
Index: xfs/fs/xfs/xfs_mount.h
===================================================================
--- xfs.orig/fs/xfs/xfs_mount.h	2009-05-27 11:14:50.093940346 +0200
+++ xfs/fs/xfs/xfs_mount.h	2009-05-27 11:17:28.017838040 +0200
@@ -64,6 +64,8 @@ struct xfs_swapext;
 struct xfs_mru_cache;
 struct xfs_nameops;
 struct xfs_ail;
+struct xfs_quotainfo;
+
 
 /*
  * Prototypes and functions for the Data Migration subsystem.
@@ -107,86 +109,6 @@ typedef struct xfs_dmops {
 	(*(mp)->m_dm_ops->xfs_send_unmount)(mp,ip,right,mode,rval,fl)
 
 
-/*
- * Prototypes and functions for the Quota Management subsystem.
- */
-
-struct xfs_dquot;
-struct xfs_dqtrxops;
-struct xfs_quotainfo;
-
-typedef int	(*xfs_qminit_t)(struct xfs_mount *, uint *, uint *);
-typedef int	(*xfs_qmmount_t)(struct xfs_mount *, uint, uint);
-typedef void	(*xfs_qmunmount_t)(struct xfs_mount *);
-typedef void	(*xfs_qmdone_t)(struct xfs_mount *);
-typedef void	(*xfs_dqrele_t)(struct xfs_dquot *);
-typedef int	(*xfs_dqattach_t)(struct xfs_inode *, uint);
-typedef void	(*xfs_dqdetach_t)(struct xfs_inode *);
-typedef int	(*xfs_dqpurgeall_t)(struct xfs_mount *, uint);
-typedef int	(*xfs_dqvopalloc_t)(struct xfs_mount *,
-			struct xfs_inode *, uid_t, gid_t, prid_t, uint,
-			struct xfs_dquot **, struct xfs_dquot **);
-typedef void	(*xfs_dqvopcreate_t)(struct xfs_trans *, struct xfs_inode *,
-			struct xfs_dquot *, struct xfs_dquot *);
-typedef int	(*xfs_dqvoprename_t)(struct xfs_inode **);
-typedef struct xfs_dquot * (*xfs_dqvopchown_t)(
-			struct xfs_trans *, struct xfs_inode *,
-			struct xfs_dquot **, struct xfs_dquot *);
-typedef int	(*xfs_dqvopchownresv_t)(struct xfs_trans *, struct xfs_inode *,
-			struct xfs_dquot *, struct xfs_dquot *, uint);
-typedef void	(*xfs_dqstatvfs_t)(struct xfs_inode *, struct kstatfs *);
-typedef int	(*xfs_dqsync_t)(struct xfs_mount *, int flags);
-
-typedef struct xfs_qmops {
-	xfs_qminit_t		xfs_qminit;
-	xfs_qmdone_t		xfs_qmdone;
-	xfs_qmmount_t		xfs_qmmount;
-	xfs_qmunmount_t		xfs_qmunmount;
-	xfs_dqrele_t		xfs_dqrele;
-	xfs_dqattach_t		xfs_dqattach;
-	xfs_dqdetach_t		xfs_dqdetach;
-	xfs_dqpurgeall_t	xfs_dqpurgeall;
-	xfs_dqvopalloc_t	xfs_dqvopalloc;
-	xfs_dqvopcreate_t	xfs_dqvopcreate;
-	xfs_dqvoprename_t	xfs_dqvoprename;
-	xfs_dqvopchown_t	xfs_dqvopchown;
-	xfs_dqvopchownresv_t	xfs_dqvopchownresv;
-	xfs_dqstatvfs_t		xfs_dqstatvfs;
-	xfs_dqsync_t		xfs_dqsync;
-	struct xfs_dqtrxops	*xfs_dqtrxops;
-} xfs_qmops_t;
-
-#define XFS_QM_INIT(mp, mnt, fl) \
-	(*(mp)->m_qm_ops->xfs_qminit)(mp, mnt, fl)
-#define XFS_QM_MOUNT(mp, mnt, fl) \
-	(*(mp)->m_qm_ops->xfs_qmmount)(mp, mnt, fl)
-#define XFS_QM_UNMOUNT(mp) \
-	(*(mp)->m_qm_ops->xfs_qmunmount)(mp)
-#define XFS_QM_DONE(mp) \
-	(*(mp)->m_qm_ops->xfs_qmdone)(mp)
-#define XFS_QM_DQRELE(mp, dq) \
-	(*(mp)->m_qm_ops->xfs_dqrele)(dq)
-#define XFS_QM_DQATTACH(mp, ip, fl) \
-	(*(mp)->m_qm_ops->xfs_dqattach)(ip, fl)
-#define XFS_QM_DQDETACH(mp, ip) \
-	(*(mp)->m_qm_ops->xfs_dqdetach)(ip)
-#define XFS_QM_DQPURGEALL(mp, fl) \
-	(*(mp)->m_qm_ops->xfs_dqpurgeall)(mp, fl)
-#define XFS_QM_DQVOPALLOC(mp, ip, uid, gid, prid, fl, dq1, dq2) \
-	(*(mp)->m_qm_ops->xfs_dqvopalloc)(mp, ip, uid, gid, prid, fl, dq1, dq2)
-#define XFS_QM_DQVOPCREATE(mp, tp, ip, dq1, dq2) \
-	(*(mp)->m_qm_ops->xfs_dqvopcreate)(tp, ip, dq1, dq2)
-#define XFS_QM_DQVOPRENAME(mp, ip) \
-	(*(mp)->m_qm_ops->xfs_dqvoprename)(ip)
-#define XFS_QM_DQVOPCHOWN(mp, tp, ip, dqp, dq) \
-	(*(mp)->m_qm_ops->xfs_dqvopchown)(tp, ip, dqp, dq)
-#define XFS_QM_DQVOPCHOWNRESV(mp, tp, ip, dq1, dq2, fl) \
-	(*(mp)->m_qm_ops->xfs_dqvopchownresv)(tp, ip, dq1, dq2, fl)
-#define XFS_QM_DQSTATVFS(ip, statp) \
-	(*(ip)->i_mount->m_qm_ops->xfs_dqstatvfs)(ip, statp)
-#define XFS_QM_DQSYNC(mp, flags) \
-	(*(mp)->m_qm_ops->xfs_dqsync)(mp, flags)
-
 #ifdef HAVE_PERCPU_SB
 
 /*
@@ -510,8 +432,6 @@ extern int	xfs_sb_validate_fsb_count(str
 
 extern int	xfs_dmops_get(struct xfs_mount *);
 extern void	xfs_dmops_put(struct xfs_mount *);
-extern int	xfs_qmops_get(struct xfs_mount *);
-extern void	xfs_qmops_put(struct xfs_mount *);
 
 extern struct xfs_dmops xfs_dmcore_xfs;
 
Index: xfs/fs/xfs/Makefile
===================================================================
--- xfs.orig/fs/xfs/Makefile	2009-05-27 11:14:50.099970234 +0200
+++ xfs/fs/xfs/Makefile	2009-05-27 11:17:28.019816644 +0200
@@ -88,8 +88,7 @@ xfs-y				+= xfs_alloc.o \
 				   xfs_utils.o \
 				   xfs_vnodeops.o \
 				   xfs_rw.o \
-				   xfs_dmops.o \
-				   xfs_qmops.o
+				   xfs_dmops.o
 
 xfs-$(CONFIG_XFS_TRACE)		+= xfs_btree_trace.o \
 				   xfs_dir2_trace.o
Index: xfs/fs/xfs/linux-2.6/xfs_ioctl.c
===================================================================
--- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl.c	2009-05-27 11:14:50.104939511 +0200
+++ xfs/fs/xfs/linux-2.6/xfs_ioctl.c	2009-05-27 11:26:12.517361521 +0200
@@ -908,7 +908,8 @@ xfs_ioctl_setattr(
 	struct xfs_mount	*mp = ip->i_mount;
 	struct xfs_trans	*tp;
 	unsigned int		lock_flags = 0;
-	struct xfs_dquot	*udqp = NULL, *gdqp = NULL;
+	struct xfs_dquot	*udqp = NULL;
+	struct xfs_dquot	*gdqp = NULL;
 	struct xfs_dquot	*olddquot = NULL;
 	int			code;
 
@@ -928,7 +929,7 @@ xfs_ioctl_setattr(
 	 * because the i_*dquot fields will get updated anyway.
 	 */
 	if (XFS_IS_QUOTA_ON(mp) && (mask & FSX_PROJID)) {
-		code = XFS_QM_DQVOPALLOC(mp, ip, ip->i_d.di_uid,
+		code = xfs_qm_vop_dqalloc(ip, ip->i_d.di_uid,
 					 ip->i_d.di_gid, fa->fsx_projid,
 					 XFS_QMOPT_PQUOTA, &udqp, &gdqp);
 		if (code)
@@ -963,10 +964,11 @@ xfs_ioctl_setattr(
 	 * Do a quota reservation only if projid is actually going to change.
 	 */
 	if (mask & FSX_PROJID) {
-		if (XFS_IS_PQUOTA_ON(mp) &&
+		if (XFS_IS_QUOTA_RUNNING(mp) &&
+		    XFS_IS_PQUOTA_ON(mp) &&
 		    ip->i_d.di_projid != fa->fsx_projid) {
 			ASSERT(tp);
-			code = XFS_QM_DQVOPCHOWNRESV(mp, tp, ip, udqp, gdqp,
+			code = xfs_qm_vop_chown_reserve(tp, ip, udqp, gdqp,
 						capable(CAP_FOWNER) ?
 						XFS_QMOPT_FORCE_RES : 0);
 			if (code)	/* out of quota */
@@ -1068,8 +1070,8 @@ xfs_ioctl_setattr(
 		 * in the transaction.
 		 */
 		if (ip->i_d.di_projid != fa->fsx_projid) {
-			if (XFS_IS_PQUOTA_ON(mp)) {
-				olddquot = XFS_QM_DQVOPCHOWN(mp, tp, ip,
+			if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_PQUOTA_ON(mp)) {
+				olddquot = xfs_qm_vop_chown(tp, ip,
 							&ip->i_gdquot, gdqp);
 			}
 			ip->i_d.di_projid = fa->fsx_projid;
@@ -1115,9 +1117,9 @@ xfs_ioctl_setattr(
 	/*
 	 * Release any dquot(s) the inode had kept before chown.
 	 */
-	XFS_QM_DQRELE(mp, olddquot);
-	XFS_QM_DQRELE(mp, udqp);
-	XFS_QM_DQRELE(mp, gdqp);
+	xfs_qm_dqrele(olddquot);
+	xfs_qm_dqrele(udqp);
+	xfs_qm_dqrele(gdqp);
 
 	if (code)
 		return code;
@@ -1131,8 +1133,8 @@ xfs_ioctl_setattr(
 	return 0;
 
  error_return:
-	XFS_QM_DQRELE(mp, udqp);
-	XFS_QM_DQRELE(mp, gdqp);
+	xfs_qm_dqrele(udqp);
+	xfs_qm_dqrele(gdqp);
 	xfs_trans_cancel(tp, 0);
 	if (lock_flags)
 		xfs_iunlock(ip, lock_flags);
Index: xfs/fs/xfs/linux-2.6/xfs_super.c
===================================================================
--- xfs.orig/fs/xfs/linux-2.6/xfs_super.c	2009-05-27 11:14:50.108938972 +0200
+++ xfs/fs/xfs/linux-2.6/xfs_super.c	2009-05-27 11:17:28.025850723 +0200
@@ -405,6 +405,14 @@ xfs_parseargs(
 		return EINVAL;
 	}
 
+#ifndef CONFIG_XFS_QUOTA
+	if (XFS_IS_QUOTA_RUNNING(mp)) {
+		cmn_err(CE_WARN,
+			"XFS: quota support not available in this kernel.");
+		return EINVAL;
+	}
+#endif
+
 	if ((mp->m_qflags & (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE)) &&
 	    (mp->m_qflags & (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE))) {
 		cmn_err(CE_WARN,
@@ -1098,7 +1106,6 @@ xfs_fs_put_super(
 	xfs_freesb(mp);
 	xfs_icsb_destroy_counters(mp);
 	xfs_close_devices(mp);
-	xfs_qmops_put(mp);
 	xfs_dmops_put(mp);
 	xfs_free_fsname(mp);
 	kfree(mp);
@@ -1168,6 +1175,7 @@ xfs_fs_statfs(
 {
 	struct xfs_mount	*mp = XFS_M(dentry->d_sb);
 	xfs_sb_t		*sbp = &mp->m_sb;
+	struct xfs_inode	*ip = XFS_I(dentry->d_inode);
 	__uint64_t		fakeinos, id;
 	xfs_extlen_t		lsize;
 
@@ -1196,7 +1204,10 @@ xfs_fs_statfs(
 	statp->f_ffree = statp->f_files - (sbp->sb_icount - sbp->sb_ifree);
 	spin_unlock(&mp->m_sb_lock);
 
-	XFS_QM_DQSTATVFS(XFS_I(dentry->d_inode), statp);
+	if ((ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) ||
+	    ((mp->m_qflags & (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))) ==
+			      (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))
+		xfs_qm_statvfs(ip, statp);
 	return 0;
 }
 
@@ -1404,16 +1415,13 @@ xfs_fs_fill_super(
 	error = xfs_dmops_get(mp);
 	if (error)
 		goto out_free_fsname;
-	error = xfs_qmops_get(mp);
-	if (error)
-		goto out_put_dmops;
 
 	if (silent)
 		flags |= XFS_MFSI_QUIET;
 
 	error = xfs_open_devices(mp);
 	if (error)
-		goto out_put_qmops;
+		goto out_put_dmops;
 
 	if (xfs_icsb_init_counters(mp))
 		mp->m_flags |= XFS_MOUNT_NO_PERCPU_SB;
@@ -1482,8 +1490,6 @@ xfs_fs_fill_super(
  out_destroy_counters:
 	xfs_icsb_destroy_counters(mp);
 	xfs_close_devices(mp);
- out_put_qmops:
-	xfs_qmops_put(mp);
  out_put_dmops:
 	xfs_dmops_put(mp);
  out_free_fsname:
Index: xfs/fs/xfs/linux-2.6/xfs_sync.c
===================================================================
--- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c	2009-05-27 11:14:50.113939678 +0200
+++ xfs/fs/xfs/linux-2.6/xfs_sync.c	2009-05-27 11:17:28.027815777 +0200
@@ -43,6 +43,7 @@
 #include "xfs_buf_item.h"
 #include "xfs_inode_item.h"
 #include "xfs_rw.h"
+#include "xfs_quota.h"
 
 #include <linux/kthread.h>
 #include <linux/freezer.h>
@@ -317,12 +318,12 @@ xfs_quiesce_data(
 
 	/* push non-blocking */
 	xfs_sync_inodes(mp, SYNC_DELWRI|SYNC_BDFLUSH);
-	XFS_QM_DQSYNC(mp, SYNC_BDFLUSH);
+	xfs_qm_sync(mp, SYNC_BDFLUSH);
 	xfs_filestream_flush(mp);
 
 	/* push and block */
 	xfs_sync_inodes(mp, SYNC_DELWRI|SYNC_WAIT|SYNC_IOWAIT);
-	XFS_QM_DQSYNC(mp, SYNC_WAIT);
+	xfs_qm_sync(mp, SYNC_WAIT);
 
 	/* write superblock and hoover up shutdown errors */
 	error = xfs_sync_fsdata(mp, 0);
@@ -467,7 +468,7 @@ xfs_sync_worker(
 		xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE);
 		xfs_reclaim_inodes(mp, 0, XFS_IFLUSH_DELWRI_ELSE_ASYNC);
 		/* dgc: errors ignored here */
-		error = XFS_QM_DQSYNC(mp, SYNC_BDFLUSH);
+		error = xfs_qm_sync(mp, SYNC_BDFLUSH);
 		error = xfs_sync_fsdata(mp, SYNC_BDFLUSH);
 		if (xfs_log_need_covered(mp))
 			error = xfs_commit_dummy_trans(mp, XFS_LOG_FORCE);
Index: xfs/fs/xfs/quota/xfs_dquot.c
===================================================================
--- xfs.orig/fs/xfs/quota/xfs_dquot.c	2009-05-27 11:14:50.030940222 +0200
+++ xfs/fs/xfs/quota/xfs_dquot.c	2009-05-27 11:17:28.031850579 +0200
@@ -1194,7 +1194,9 @@ void
 xfs_qm_dqrele(
 	xfs_dquot_t	*dqp)
 {
-	ASSERT(dqp);
+	if (!dqp)
+		return;
+
 	xfs_dqtrace_entry(dqp, "DQRELE");
 
 	xfs_dqlock(dqp);
Index: xfs/fs/xfs/quota/xfs_dquot.h
===================================================================
--- xfs.orig/fs/xfs/quota/xfs_dquot.h	2009-05-27 11:14:50.039940390 +0200
+++ xfs/fs/xfs/quota/xfs_dquot.h	2009-05-27 11:17:28.032850705 +0200
@@ -181,7 +181,6 @@ extern void		xfs_qm_adjust_dqlimits(xfs_
 extern int		xfs_qm_dqget(xfs_mount_t *, xfs_inode_t *,
 					xfs_dqid_t, uint, uint, xfs_dquot_t **);
 extern void		xfs_qm_dqput(xfs_dquot_t *);
-extern void		xfs_qm_dqrele(xfs_dquot_t *);
 extern void		xfs_dqlock(xfs_dquot_t *);
 extern void		xfs_dqlock2(xfs_dquot_t *, xfs_dquot_t *);
 extern void		xfs_dqunlock(xfs_dquot_t *);
Index: xfs/fs/xfs/quota/xfs_qm.c
===================================================================
--- xfs.orig/fs/xfs/quota/xfs_qm.c	2009-05-27 11:14:50.046939534 +0200
+++ xfs/fs/xfs/quota/xfs_qm.c	2009-05-27 11:37:15.354855599 +0200
@@ -287,11 +287,13 @@ xfs_qm_rele_quotafs_ref(
  * Just destroy the quotainfo structure.
  */
 void
-xfs_qm_unmount_quotadestroy(
-	xfs_mount_t	*mp)
+xfs_qm_unmount(
+	struct xfs_mount	*mp)
 {
-	if (mp->m_quotainfo)
+	if (mp->m_quotainfo) {
+		xfs_qm_dqpurge_all(mp, XFS_QMOPT_QUOTALL | XFS_QMOPT_UMOUNTING);
 		xfs_qm_destroy_quotainfo(mp);
+	}
 }
 
 
@@ -385,8 +387,13 @@ xfs_qm_mount_quotas(
 	if (error) {
 		xfs_fs_cmn_err(CE_WARN, mp,
 			"Failed to initialize disk quotas.");
+		return;
 	}
-	return;
+
+#ifdef QUOTADEBUG
+	if (XFS_IS_QUOTA_ON(mp))
+		xfs_qm_internalqcheck(mp);
+#endif
 }
 
 /*
@@ -774,12 +781,11 @@ xfs_qm_dqattach_grouphint(
  * Given a locked inode, attach dquot(s) to it, taking U/G/P-QUOTAON
  * into account.
  * If XFS_QMOPT_DQALLOC, the dquot(s) will be allocated if needed.
- * If XFS_QMOPT_ILOCKED, then inode sent is already locked EXCL.
  * Inode may get unlocked and relocked in here, and the caller must deal with
  * the consequences.
  */
 int
-xfs_qm_dqattach(
+xfs_qm_dqattach_locked(
 	xfs_inode_t	*ip,
 	uint		flags)
 {
@@ -787,17 +793,14 @@ xfs_qm_dqattach(
 	uint		nquotas = 0;
 	int		error = 0;
 
-	if ((! XFS_IS_QUOTA_ON(mp)) ||
-	    (! XFS_NOT_DQATTACHED(mp, ip)) ||
-	    (ip->i_ino == mp->m_sb.sb_uquotino) ||
-	    (ip->i_ino == mp->m_sb.sb_gquotino))
+	if (!XFS_IS_QUOTA_RUNNING(mp) ||
+	    !XFS_IS_QUOTA_ON(mp) ||
+	    !XFS_NOT_DQATTACHED(mp, ip) ||
+	    ip->i_ino == mp->m_sb.sb_uquotino ||
+	    ip->i_ino == mp->m_sb.sb_gquotino)
 		return 0;
 
-	ASSERT((flags & XFS_QMOPT_ILOCKED) == 0 ||
-	       xfs_isilocked(ip, XFS_ILOCK_EXCL));
-
-	if (! (flags & XFS_QMOPT_ILOCKED))
-		xfs_ilock(ip, XFS_ILOCK_EXCL);
+	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
 
 	if (XFS_IS_UQUOTA_ON(mp)) {
 		error = xfs_qm_dqattach_one(ip, ip->i_d.di_uid, XFS_DQ_USER,
@@ -849,8 +852,7 @@ xfs_qm_dqattach(
 		xfs_qm_dqattach_grouphint(ip->i_udquot, ip->i_gdquot);
 	}
 
-      done:
-
+ done:
 #ifdef QUOTADEBUG
 	if (! error) {
 		if (XFS_IS_UQUOTA_ON(mp))
@@ -858,15 +860,22 @@ xfs_qm_dqattach(
 		if (XFS_IS_OQUOTA_ON(mp))
 			ASSERT(ip->i_gdquot);
 	}
+	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
 #endif
+	return error;
+}
 
-	if (! (flags & XFS_QMOPT_ILOCKED))
-		xfs_iunlock(ip, XFS_ILOCK_EXCL);
+int
+xfs_qm_dqattach(
+	struct xfs_inode	*ip,
+	uint			flags)
+{
+	int			error;
+
+	xfs_ilock(ip, XFS_ILOCK_EXCL);
+	error = xfs_qm_dqattach_locked(ip, flags);
+	xfs_iunlock(ip, XFS_ILOCK_EXCL);
 
-#ifdef QUOTADEBUG
-	else
-		ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
-#endif
 	return error;
 }
 
@@ -912,7 +921,7 @@ xfs_qm_sync(
 	boolean_t	nowait;
 	int		error;
 
-	if (! XFS_IS_QUOTA_ON(mp))
+	if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
 		return 0;
 
 	restarts = 0;
@@ -2319,20 +2328,20 @@ xfs_qm_write_sb_changes(
  */
 int
 xfs_qm_vop_dqalloc(
-	xfs_mount_t	*mp,
-	xfs_inode_t	*ip,
-	uid_t		uid,
-	gid_t		gid,
-	prid_t		prid,
-	uint		flags,
-	xfs_dquot_t	**O_udqpp,
-	xfs_dquot_t	**O_gdqpp)
-{
-	int		error;
-	xfs_dquot_t	*uq, *gq;
-	uint		lockflags;
+	struct xfs_inode	*ip,
+	uid_t			uid,
+	gid_t			gid,
+	prid_t			prid,
+	uint			flags,
+	struct xfs_dquot	**O_udqpp,
+	struct xfs_dquot	**O_gdqpp)
+{
+	struct xfs_mount	*mp = ip->i_mount;
+	struct xfs_dquot	*uq, *gq;
+	int			error;
+	uint			lockflags;
 
-	if (!XFS_IS_QUOTA_ON(mp))
+	if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
 		return 0;
 
 	lockflags = XFS_ILOCK_EXCL;
@@ -2346,8 +2355,8 @@ xfs_qm_vop_dqalloc(
 	 * if necessary. The dquot(s) will not be locked.
 	 */
 	if (XFS_NOT_DQATTACHED(mp, ip)) {
-		if ((error = xfs_qm_dqattach(ip, XFS_QMOPT_DQALLOC |
-					    XFS_QMOPT_ILOCKED))) {
+		error = xfs_qm_dqattach_locked(ip, XFS_QMOPT_DQALLOC);
+		if (error) {
 			xfs_iunlock(ip, lockflags);
 			return error;
 		}
@@ -2469,6 +2478,7 @@ xfs_qm_vop_chown(
 	uint		bfield = XFS_IS_REALTIME_INODE(ip) ?
 				 XFS_TRANS_DQ_RTBCOUNT : XFS_TRANS_DQ_BCOUNT;
 
+
 	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
 	ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount));
 
@@ -2508,13 +2518,13 @@ xfs_qm_vop_chown_reserve(
 	xfs_dquot_t	*gdqp,
 	uint		flags)
 {
-	int		error;
-	xfs_mount_t	*mp;
+	xfs_mount_t	*mp = ip->i_mount;
 	uint		delblks, blkflags, prjflags = 0;
 	xfs_dquot_t	*unresudq, *unresgdq, *delblksudq, *delblksgdq;
+	int		error;
+
 
 	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
-	mp = ip->i_mount;
 	ASSERT(XFS_IS_QUOTA_RUNNING(mp));
 
 	delblks = ip->i_delayed_blks;
@@ -2582,28 +2592,23 @@ xfs_qm_vop_chown_reserve(
 
 int
 xfs_qm_vop_rename_dqattach(
-	xfs_inode_t	**i_tab)
+	struct xfs_inode	**i_tab)
 {
-	xfs_inode_t	*ip;
-	int		i;
-	int		error;
-
-	ip = i_tab[0];
+	struct xfs_mount	*mp = i_tab[0]->i_mount;
+	int			i;
 
-	if (! XFS_IS_QUOTA_ON(ip->i_mount))
+	if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
 		return 0;
 
-	if (XFS_NOT_DQATTACHED(ip->i_mount, ip)) {
-		error = xfs_qm_dqattach(ip, 0);
-		if (error)
-			return error;
-	}
-	for (i = 1; (i < 4 && i_tab[i]); i++) {
+	for (i = 0; (i < 4 && i_tab[i]); i++) {
+		struct xfs_inode	*ip = i_tab[i];
+		int			error;
+
 		/*
 		 * Watch out for duplicate entries in the table.
 		 */
-		if ((ip = i_tab[i]) != i_tab[i-1]) {
-			if (XFS_NOT_DQATTACHED(ip->i_mount, ip)) {
+		if (i == 0 || ip != i_tab[i-1]) {
+			if (XFS_NOT_DQATTACHED(mp, ip)) {
 				error = xfs_qm_dqattach(ip, 0);
 				if (error)
 					return error;
@@ -2614,17 +2619,19 @@ xfs_qm_vop_rename_dqattach(
 }
 
 void
-xfs_qm_vop_dqattach_and_dqmod_newinode(
-	xfs_trans_t	*tp,
-	xfs_inode_t	*ip,
-	xfs_dquot_t	*udqp,
-	xfs_dquot_t	*gdqp)
+xfs_qm_vop_create_dqattach(
+	struct xfs_trans	*tp,
+	struct xfs_inode	*ip,
+	struct xfs_dquot	*udqp,
+	struct xfs_dquot	*gdqp)
 {
-	if (!XFS_IS_QUOTA_ON(tp->t_mountp))
+	struct xfs_mount	*mp = tp->t_mountp;
+
+	if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
 		return;
 
 	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
-	ASSERT(XFS_IS_QUOTA_RUNNING(tp->t_mountp));
+	ASSERT(XFS_IS_QUOTA_RUNNING(mp));
 
 	if (udqp) {
 		xfs_dqlock(udqp);
@@ -2632,7 +2639,7 @@ xfs_qm_vop_dqattach_and_dqmod_newinode(
 		xfs_dqunlock(udqp);
 		ASSERT(ip->i_udquot == NULL);
 		ip->i_udquot = udqp;
-		ASSERT(XFS_IS_UQUOTA_ON(tp->t_mountp));
+		ASSERT(XFS_IS_UQUOTA_ON(mp));
 		ASSERT(ip->i_d.di_uid == be32_to_cpu(udqp->q_core.d_id));
 		xfs_trans_mod_dquot(tp, udqp, XFS_TRANS_DQ_ICOUNT, 1);
 	}
@@ -2642,8 +2649,8 @@ xfs_qm_vop_dqattach_and_dqmod_newinode(
 		xfs_dqunlock(gdqp);
 		ASSERT(ip->i_gdquot == NULL);
 		ip->i_gdquot = gdqp;
-		ASSERT(XFS_IS_OQUOTA_ON(tp->t_mountp));
-		ASSERT((XFS_IS_GQUOTA_ON(tp->t_mountp) ?
+		ASSERT(XFS_IS_OQUOTA_ON(mp));
+		ASSERT((XFS_IS_GQUOTA_ON(mp) ?
 			ip->i_d.di_gid : ip->i_d.di_projid) ==
 				be32_to_cpu(gdqp->q_core.d_id));
 		xfs_trans_mod_dquot(tp, gdqp, XFS_TRANS_DQ_ICOUNT, 1);
Index: xfs/fs/xfs/xfs_iget.c
===================================================================
--- xfs.orig/fs/xfs/xfs_iget.c	2009-05-27 11:14:50.118964061 +0200
+++ xfs/fs/xfs/xfs_iget.c	2009-05-27 11:17:28.042941515 +0200
@@ -500,10 +500,7 @@ xfs_ireclaim(
 	 * ilock one but will still hold the iolock.
 	 */
 	xfs_ilock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
-	/*
-	 * Release dquots (and their references) if any.
-	 */
-	XFS_QM_DQDETACH(ip->i_mount, ip);
+	xfs_qm_dqdetach(ip);
 	xfs_iunlock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
 
 	switch (ip->i_d.di_mode & S_IFMT) {
Index: xfs/fs/xfs/xfs_mount.c
===================================================================
--- xfs.orig/fs/xfs/xfs_mount.c	2009-05-27 11:14:50.123970843 +0200
+++ xfs/fs/xfs/xfs_mount.c	2009-05-27 11:38:30.812398301 +0200
@@ -960,6 +960,53 @@ xfs_check_sizes(xfs_mount_t *mp)
 }
 
 /*
+ * Clear the quotaflags in memory and in the superblock.
+ */
+int
+xfs_mount_reset_sbqflags(
+	struct xfs_mount	*mp)
+{
+	int			error;
+	struct xfs_trans	*tp;
+
+	mp->m_qflags = 0;
+
+	/*
+	 * It is OK to look at sb_qflags here in mount path,
+	 * without m_sb_lock.
+	 */
+	if (mp->m_sb.sb_qflags == 0)
+		return 0;
+	spin_lock(&mp->m_sb_lock);
+	mp->m_sb.sb_qflags = 0;
+	spin_unlock(&mp->m_sb_lock);
+
+	/*
+	 * If the fs is readonly, let the incore superblock run
+	 * with quotas off but don't flush the update out to disk
+	 */
+	if (mp->m_flags & XFS_MOUNT_RDONLY)
+		return 0;
+
+#ifdef QUOTADEBUG
+	xfs_fs_cmn_err(CE_NOTE, mp, "Writing superblock quota changes");
+#endif
+
+	tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE);
+	error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0,
+				      XFS_DEFAULT_LOG_COUNT);
+	if (error) {
+		xfs_trans_cancel(tp, 0);
+		xfs_fs_cmn_err(CE_ALERT, mp,
+			"xfs_mount_reset_sbqflags: Superblock update failed!");
+		return error;
+	}
+
+	xfs_mod_sb(tp, XFS_SB_QFLAGS);
+	return xfs_trans_commit(tp, 0);
+}
+
+/*
  * This function does the following on an initial mount of a file system:
  *	- reads the superblock from disk and init the mount struct
  *	- if we're a 32-bit kernel, do a size check on the superblock
@@ -976,7 +1023,8 @@ xfs_mountfs(
 	xfs_sb_t	*sbp = &(mp->m_sb);
 	xfs_inode_t	*rip;
 	__uint64_t	resblks;
-	uint		quotamount, quotaflags;
+	uint		quotamount = 0;
+	uint		quotaflags = 0;
 	int		error = 0;
 
 	xfs_mount_common(mp, sbp);
@@ -1210,9 +1258,28 @@ xfs_mountfs(
 	/*
 	 * Initialise the XFS quota management subsystem for this mount
 	 */
-	error = XFS_QM_INIT(mp, &quotamount, &quotaflags);
-	if (error)
-		goto out_rtunmount;
+	if (XFS_IS_QUOTA_RUNNING(mp)) {
+		error = xfs_qm_newmount(mp, &quotamount, &quotaflags);
+		if (error)
+			goto out_rtunmount;
+	} else {
+		ASSERT(!XFS_IS_QUOTA_ON(mp));
+
+		/*
+		 * If a file system had quotas running earlier, but decided to
+		 * mount without -o uquota/pquota/gquota options, revoke the
+		 * quotachecked license.
+		 */
+		if (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT) {
+			cmn_err(CE_NOTE,
+				"XFS: resetting qflags for filesystem %s",
+				mp->m_fsname);
+
+			error = xfs_mount_reset_sbqflags(mp);
+			if (error)
+				return error;
+		}
+	}
 
 	/*
 	 * Finish recovering the file system.  This part needed to be
@@ -1228,9 +1295,19 @@ xfs_mountfs(
 	/*
 	 * Complete the quota initialisation, post-log-replay component.
 	 */
-	error = XFS_QM_MOUNT(mp, quotamount, quotaflags);
-	if (error)
-		goto out_rtunmount;
+	if (quotamount) {
+		ASSERT(mp->m_qflags == 0);
+		mp->m_qflags = quotaflags;
+
+		xfs_qm_mount_quotas(mp);
+	}
+
+#if defined(DEBUG) && defined(XFS_LOUD_RECOVERY)
+	if (XFS_IS_QUOTA_ON(mp))
+		xfs_fs_cmn_err(CE_NOTE, mp, "Disk quotas turned on");
+	else
+		xfs_fs_cmn_err(CE_NOTE, mp, "Disk quotas not turned on");
+#endif
 
 	/*
 	 * Now we are mounted, reserve a small amount of unused space for
@@ -1279,12 +1356,7 @@ xfs_unmountfs(
 	__uint64_t		resblks;
 	int			error;
 
-	/*
-	 * Release dquot that rootinode, rbmino and rsumino might be holding,
-	 * and release the quota inodes.
-	 */
-	XFS_QM_UNMOUNT(mp);
-
+	xfs_qm_unmount_quotas(mp);
 	xfs_rtunmount_inodes(mp);
 	IRELE(mp->m_rootip);
 
@@ -1301,10 +1373,7 @@ xfs_unmountfs(
 	xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE | XFS_LOG_SYNC);
 	xfs_reclaim_inodes(mp, 0, XFS_IFLUSH_ASYNC);
 
-	XFS_QM_DQPURGEALL(mp, XFS_QMOPT_QUOTALL | XFS_QMOPT_UMOUNTING);
-
-	if (mp->m_quotainfo)
-		XFS_QM_DONE(mp);
+	xfs_qm_unmount(mp);
 
 	/*
 	 * Flush out the log synchronously so that we know for sure
Index: xfs/fs/xfs/xfs_qmops.c
===================================================================
--- xfs.orig/fs/xfs/xfs_qmops.c	2009-05-27 11:14:50.127939714 +0200
+++ /dev/null	1970-01-01 00:00:00.000000000 +0000
@@ -1,152 +0,0 @@
-/*
- * Copyright (c) 2000-2005 Silicon Graphics, Inc.
- * All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write the Free Software Foundation,
- * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-#include "xfs.h"
-#include "xfs_fs.h"
-#include "xfs_types.h"
-#include "xfs_log.h"
-#include "xfs_inum.h"
-#include "xfs_trans.h"
-#include "xfs_sb.h"
-#include "xfs_ag.h"
-#include "xfs_dir2.h"
-#include "xfs_dmapi.h"
-#include "xfs_mount.h"
-#include "xfs_quota.h"
-#include "xfs_error.h"
-
-
-STATIC struct xfs_dquot *
-xfs_dqvopchown_default(
-	struct xfs_trans	*tp,
-	struct xfs_inode	*ip,
-	struct xfs_dquot	**dqp,
-	struct xfs_dquot	*dq)
-{
-	return NULL;
-}
-
-/*
- * Clear the quotaflags in memory and in the superblock.
- */
-int
-xfs_mount_reset_sbqflags(xfs_mount_t *mp)
-{
-	int			error;
-	xfs_trans_t		*tp;
-
-	mp->m_qflags = 0;
-	/*
-	 * It is OK to look at sb_qflags here in mount path,
-	 * without m_sb_lock.
-	 */
-	if (mp->m_sb.sb_qflags == 0)
-		return 0;
-	spin_lock(&mp->m_sb_lock);
-	mp->m_sb.sb_qflags = 0;
-	spin_unlock(&mp->m_sb_lock);
-
-	/*
-	 * if the fs is readonly, let the incore superblock run
-	 * with quotas off but don't flush the update out to disk
-	 */
-	if (mp->m_flags & XFS_MOUNT_RDONLY)
-		return 0;
-#ifdef QUOTADEBUG
-	xfs_fs_cmn_err(CE_NOTE, mp, "Writing superblock quota changes");
-#endif
-	tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE);
-	if ((error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0,
-				      XFS_DEFAULT_LOG_COUNT))) {
-		xfs_trans_cancel(tp, 0);
-		xfs_fs_cmn_err(CE_ALERT, mp,
-			"xfs_mount_reset_sbqflags: Superblock update failed!");
-		return error;
-	}
-	xfs_mod_sb(tp, XFS_SB_QFLAGS);
-	error = xfs_trans_commit(tp, 0);
-	return error;
-}
-
-STATIC int
-xfs_noquota_init(
-	xfs_mount_t	*mp,
-	uint		*needquotamount,
-	uint		*quotaflags)
-{
-	int		error = 0;
-
-	*quotaflags = 0;
-	*needquotamount = B_FALSE;
-
-	ASSERT(!XFS_IS_QUOTA_ON(mp));
-
-	/*
-	 * If a file system had quotas running earlier, but decided to
-	 * mount without -o uquota/pquota/gquota options, revoke the
-	 * quotachecked license.
-	 */
-	if (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT) {
-		cmn_err(CE_NOTE,
-                        "XFS resetting qflags for filesystem %s",
-                        mp->m_fsname);
-
-		error = xfs_mount_reset_sbqflags(mp);
-	}
-	return error;
-}
-
-static struct xfs_qmops xfs_qmcore_stub = {
-	.xfs_qminit		= (xfs_qminit_t) xfs_noquota_init,
-	.xfs_qmdone		= (xfs_qmdone_t) fs_noerr,
-	.xfs_qmmount		= (xfs_qmmount_t) fs_noerr,
-	.xfs_qmunmount		= (xfs_qmunmount_t) fs_noerr,
-	.xfs_dqrele		= (xfs_dqrele_t) fs_noerr,
-	.xfs_dqattach		= (xfs_dqattach_t) fs_noerr,
-	.xfs_dqdetach		= (xfs_dqdetach_t) fs_noerr,
-	.xfs_dqpurgeall		= (xfs_dqpurgeall_t) fs_noerr,
-	.xfs_dqvopalloc		= (xfs_dqvopalloc_t) fs_noerr,
-	.xfs_dqvopcreate	= (xfs_dqvopcreate_t) fs_noerr,
-	.xfs_dqvoprename	= (xfs_dqvoprename_t) fs_noerr,
-	.xfs_dqvopchown		= xfs_dqvopchown_default,
-	.xfs_dqvopchownresv	= (xfs_dqvopchownresv_t) fs_noerr,
-	.xfs_dqstatvfs		= (xfs_dqstatvfs_t) fs_noval,
-	.xfs_dqsync		= (xfs_dqsync_t) fs_noerr,
-};
-
-int
-xfs_qmops_get(struct xfs_mount *mp)
-{
-	if (XFS_IS_QUOTA_RUNNING(mp)) {
-#ifdef CONFIG_XFS_QUOTA
-		mp->m_qm_ops = &xfs_qmcore_xfs;
-#else
-		cmn_err(CE_WARN,
-			"XFS: qouta support not available in this kernel.");
-		return EINVAL;
-#endif
-	} else {
-		mp->m_qm_ops = &xfs_qmcore_stub;
-	}
-
-	return 0;
-}
-
-void
-xfs_qmops_put(struct xfs_mount *mp)
-{
-}
Index: xfs/fs/xfs/xfs_rename.c
===================================================================
--- xfs.orig/fs/xfs/xfs_rename.c	2009-05-27 11:14:50.134968541 +0200
+++ xfs/fs/xfs/xfs_rename.c	2009-05-27 11:17:28.050941486 +0200
@@ -166,7 +166,8 @@ xfs_rename(
 	/*
 	 * Attach the dquots to the inodes
 	 */
-	if ((error = XFS_QM_DQVOPRENAME(mp, inodes))) {
+	error = xfs_qm_vop_rename_dqattach(inodes);
+	if (error) {
 		xfs_trans_cancel(tp, cancel_flags);
 		goto std_return;
 	}

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] xfs: kill xfs_qmops
  2009-05-27  9:56   ` Christoph Hellwig
@ 2009-05-27 20:06     ` Eric Sandeen
  0 siblings, 0 replies; 6+ messages in thread
From: Eric Sandeen @ 2009-05-27 20:06 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: xfs

Christoph Hellwig wrote:
...

> never, but that's a bug because the loop should now start at 0.  Looks
> like out quota testing in xfsqa still isn't that good or the first
> inode is always already attached in normal operation (probably the latter).
> 
> Updated patch below:
> 
> 
> Subject: xfs: kill xfs_qmops
> From: Christoph Hellwig <hch@lst.de>
> 
> Kill the quota ops function vector and replace it with direct calls or
> stubs in the CONFIG_XFS_QUOTA=n case.
> 
> Make sure we check XFS_IS_QUOTA_RUNNING in the right spots.  We can remove
> the number of those checks because the XFS_TRANS_DQ_DIRTY flag can't be set
> otherwise.
> 
> This brings us back closer to the way this code worked in IRIX and earlier
> Linux versions, but we keep a lot of the more useful factoring of common
> code.
> 
> Eventually we should also kill xfs_qm_bhv.c, but that's left for a later
> patch.
> 
> Reduces the size of the source code by about 250 lines and the size of
> XFS module by about 1.5 kilobytes with quotas enabled:
> 
>    text	   data	    bss	    dec	    hex	filename
>  615957	   2960	   3848	 622765	  980ad	fs/xfs/xfs.o
>  617231	   3152	   3848	 624231	  98667	fs/xfs/xfs.o.old
> 
> 
> Fallout:
> 
>  - xfs_qm_dqattach is split into xfs_qm_dqattach_locked which expects
>    the inode locked and xfs_qm_dqattach which does the locking around it,
>    thus removing XFS_QMOPT_ILOCKED.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> 

Looks better to me now, thanks.  Though worrisome that quota doesn't
seem well-tested in xfsqa, as you said... but as far as I can tell seems
ok now.  Have arekm test it a bit too ;)

Reviewed-by: Eric Sandeen <sandeen@sandeen.net>

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2009-05-27 20:06 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-02-24 14:37 [PATCH] xfs: kill xfs_qmops Christoph Hellwig
2009-03-16  7:55 ` Christoph Hellwig
2009-03-29  7:44   ` Christoph Hellwig
2009-05-26 17:34 ` Eric Sandeen
2009-05-27  9:56   ` Christoph Hellwig
2009-05-27 20:06     ` Eric Sandeen

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.