diff options
Diffstat (limited to 'fs/xfs/xfs_trans_dquot.c')
| -rw-r--r-- | fs/xfs/xfs_trans_dquot.c | 15 | 
1 files changed, 10 insertions, 5 deletions
diff --git a/fs/xfs/xfs_trans_dquot.c b/fs/xfs/xfs_trans_dquot.c index 577b535a595c..b368e13424c4 100644 --- a/fs/xfs/xfs_trans_dquot.c +++ b/fs/xfs/xfs_trans_dquot.c @@ -379,24 +379,29 @@ xfs_trans_mod_dquot(  /*   * Given an array of dqtrx structures, lock all the dquots associated and join - * them to the transaction, provided they have been modified.  We know that the - * highest number of dquots of one type - usr, grp and prj - involved in a - * transaction is 3 so we don't need to make this very generic. + * them to the transaction, provided they have been modified.   */  STATIC void  xfs_trans_dqlockedjoin(  	struct xfs_trans	*tp,  	struct xfs_dqtrx	*q)  { +	unsigned int		i;  	ASSERT(q[0].qt_dquot != NULL);  	if (q[1].qt_dquot == NULL) {  		xfs_dqlock(q[0].qt_dquot);  		xfs_trans_dqjoin(tp, q[0].qt_dquot); -	} else { -		ASSERT(XFS_QM_TRANS_MAXDQS == 2); +	} else if (q[2].qt_dquot == NULL) {  		xfs_dqlock2(q[0].qt_dquot, q[1].qt_dquot);  		xfs_trans_dqjoin(tp, q[0].qt_dquot);  		xfs_trans_dqjoin(tp, q[1].qt_dquot); +	} else { +		xfs_dqlockn(q); +		for (i = 0; i < XFS_QM_TRANS_MAXDQS; i++) { +			if (q[i].qt_dquot == NULL) +				break; +			xfs_trans_dqjoin(tp, q[i].qt_dquot); +		}  	}  }  |