All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ben Myers <bpm@sgi.com>
To: Chandra Seetharaman <sekharan@us.ibm.com>
Cc: xfs@oss.sgi.com
Subject: Re: [PATCH v9 1/6] xfs: Move code around and remove typedefs
Date: Mon, 24 Jun 2013 16:36:56 -0500	[thread overview]
Message-ID: <20130624213656.GA20932@sgi.com> (raw)
In-Reply-To: <1372042107-27332-2-git-send-email-sekharan@us.ibm.com>

Hi Chandra,

On Sun, Jun 23, 2013 at 09:48:22PM -0500, Chandra Seetharaman wrote:
> Removed some typedefs, defined new functions, made some code clean up all in
> preparation of the series.
> 
> No functional changes.
> 
> Signed-off-by: Chandra Seetharaman <sekharan@us.ibm.com>

As Dave mentioned, there are a few categories of changes that would probably be
better as separate patches.  I count 6:

1) the addition of xfs_is_quota_inode

2) conversion of XFS_DQUOT_TREE macro to xfs_dquot_tree inlined function

3) addition of xfs_dq_to_quota_inode

4) cleanups in xfs_dquot.c (xfs_qm_quotacheck,xfs_qm_init_quotainos,
   xfs_qm_vop_dqalloc,xfs_qm_vop_chown_reserve) and xfs_trans_dquot.c
   (xfs_trans_reserve_quota_bydquots)

5) changes to struct xfs_quotainfo.  I don't have an aversion to the comments
   in the structure.  I'm guessing that you updated from xfs_inode_t to
   struct xfs_inode and then ran into an 80 column issue later in the
   structure.  It'd be nice to have the entries all line up, but I think
   your compromise is fine.  Might have been better off touching only
   the quota inodes and leaving the rest, but... style.

6) add dqtypes enum, make an array in xfs_dquot_acct, update
   xfs_trans_dup_dqinfo.  Now we have a two dimensional array in there, and 
   I wonder if it would be better if it were more strongly typed.  e.g.

   tp->t_dqinfo->dq_type[j]->dqt_ents[i]

   (or something)


A couple more style notes below.  If have the time and see fit to split this
up, great.  Otherwise I will happily take it as is.

Reviewed-by: Ben Myers <bpm@sgi.com>

> ---
>  fs/xfs/xfs_dquot.c       |   16 ++--
>  fs/xfs/xfs_dquot.h       |    4 -
>  fs/xfs/xfs_icache.c      |    3 +-
>  fs/xfs/xfs_itable.c      |    2 +-
>  fs/xfs/xfs_qm.c          |  175 +++++++++++++++++++++++----------------------
>  fs/xfs/xfs_qm.h          |  133 ++++++++++++++++++++++-------------
>  fs/xfs/xfs_qm_syscalls.c |    8 +-
>  fs/xfs/xfs_sb.h          |    6 ++
>  fs/xfs/xfs_symlink.c     |    3 +-
>  fs/xfs/xfs_trans_dquot.c |   83 +++++++++-------------
>  10 files changed, 230 insertions(+), 203 deletions(-)
> 
> diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c
> index 044e97a..f01012d 100644
> --- a/fs/xfs/xfs_dquot.c
> +++ b/fs/xfs/xfs_dquot.c
> @@ -570,13 +570,13 @@ xfs_qm_dqtobp(
>  	xfs_buf_t		**O_bpp,
>  	uint			flags)
>  {
> -	xfs_bmbt_irec_t map;
> -	int		nmaps = 1, error;
> -	xfs_buf_t	*bp;
> -	xfs_inode_t	*quotip = XFS_DQ_TO_QIP(dqp);
> -	xfs_mount_t	*mp = dqp->q_mount;
> -	xfs_dqid_t	id = be32_to_cpu(dqp->q_core.d_id);
> -	xfs_trans_t	*tp = (tpp ? *tpp : NULL);
> +	struct xfs_bmbt_irec	map;
> +	int			nmaps = 1, error;
> +	struct xfs_buf		*bp;
> +	struct xfs_inode	*quotip = xfs_dq_to_quota_inode(dqp);
> +	struct xfs_mount	*mp = dqp->q_mount;
> +	xfs_dqid_t		id = be32_to_cpu(dqp->q_core.d_id);
> +	struct xfs_trans	*tp = (tpp ? *tpp : NULL);
>  
>  	dqp->q_fileoffset = (xfs_fileoff_t)id / mp->m_quotainfo->qi_dqperchunk;
>  
> @@ -804,7 +804,7 @@ xfs_qm_dqget(
>  	xfs_dquot_t	**O_dqpp) /* OUT : locked incore dquot */
>  {
>  	struct xfs_quotainfo	*qi = mp->m_quotainfo;
> -	struct radix_tree_root *tree = XFS_DQUOT_TREE(qi, type);
> +	struct radix_tree_root *tree = xfs_dquot_tree(qi, type);
>  	struct xfs_dquot	*dqp;
>  	int			error;
>  
> diff --git a/fs/xfs/xfs_dquot.h b/fs/xfs/xfs_dquot.h
> index 4f0ebfc..b596626 100644
> --- a/fs/xfs/xfs_dquot.h
> +++ b/fs/xfs/xfs_dquot.h
> @@ -143,10 +143,6 @@ static inline xfs_dquot_t *xfs_inode_dquot(struct xfs_inode *ip, int type)
>  #define XFS_QM_ISUDQ(dqp)	((dqp)->dq_flags & XFS_DQ_USER)
>  #define XFS_QM_ISPDQ(dqp)	((dqp)->dq_flags & XFS_DQ_PROJ)
>  #define XFS_QM_ISGDQ(dqp)	((dqp)->dq_flags & XFS_DQ_GROUP)
> -#define XFS_DQ_TO_QINF(dqp)	((dqp)->q_mount->m_quotainfo)
> -#define XFS_DQ_TO_QIP(dqp)	(XFS_QM_ISUDQ(dqp) ? \
> -				 XFS_DQ_TO_QINF(dqp)->qi_uquotaip : \
> -				 XFS_DQ_TO_QINF(dqp)->qi_gquotaip)
>  
>  extern int		xfs_qm_dqread(struct xfs_mount *, xfs_dqid_t, uint,
>  					uint, struct xfs_dquot	**);
> diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c
> index 96e344e..9560dc1 100644
> --- a/fs/xfs/xfs_icache.c
> +++ b/fs/xfs/xfs_icache.c
> @@ -335,7 +335,8 @@ xfs_iget_cache_miss(
>  	iflags = XFS_INEW;
>  	if (flags & XFS_IGET_DONTCACHE)
>  		iflags |= XFS_IDONTCACHE;
> -	ip->i_udquot = ip->i_gdquot = NULL;
> +	ip->i_udquot = NULL;
> +	ip->i_gdquot = NULL;
>  	xfs_iflags_set(ip, iflags);
>  
>  	/* insert the new inode */
> diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c
> index 2ea7d40..9cbf9e0 100644
> --- a/fs/xfs/xfs_itable.c
> +++ b/fs/xfs/xfs_itable.c
> @@ -43,7 +43,7 @@ xfs_internal_inum(
>  {
>  	return (ino == mp->m_sb.sb_rbmino || ino == mp->m_sb.sb_rsumino ||
>  		(xfs_sb_version_hasquota(&mp->m_sb) &&
> -		 (ino == mp->m_sb.sb_uquotino || ino == mp->m_sb.sb_gquotino)));
> +		 xfs_is_quota_inode(&mp->m_sb, ino)));
>  }
>  
>  /*
> diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c
> index b75c9bb..f5f9925 100644
> --- a/fs/xfs/xfs_qm.c
> +++ b/fs/xfs/xfs_qm.c
> @@ -70,7 +70,7 @@ xfs_qm_dquot_walk(
>  	void			*data)
>  {
>  	struct xfs_quotainfo	*qi = mp->m_quotainfo;
> -	struct radix_tree_root	*tree = XFS_DQUOT_TREE(qi, type);
> +	struct radix_tree_root	*tree = xfs_dquot_tree(qi, type);
>  	uint32_t		next_index;
>  	int			last_error = 0;
>  	int			skipped;
> @@ -189,7 +189,7 @@ xfs_qm_dqpurge(
>  	xfs_dqfunlock(dqp);
>  	xfs_dqunlock(dqp);
>  
> -	radix_tree_delete(XFS_DQUOT_TREE(qi, dqp->q_core.d_flags),
> +	radix_tree_delete(xfs_dquot_tree(qi, dqp->q_core.d_flags),
>  			  be32_to_cpu(dqp->q_core.d_id));
>  	qi->qi_dquots--;
>  
> @@ -489,8 +489,7 @@ xfs_qm_need_dqattach(
>  		return false;
>  	if (!XFS_NOT_DQATTACHED(mp, ip))
>  		return false;
> -	if (ip->i_ino == mp->m_sb.sb_uquotino ||
> -	    ip->i_ino == mp->m_sb.sb_gquotino)
> +	if (xfs_is_quota_inode(&mp->m_sb, ip->i_ino))
>  		return false;
>  	return true;
>  }
> @@ -606,8 +605,7 @@ xfs_qm_dqdetach(
>  
>  	trace_xfs_dquot_dqdetach(ip);
>  
> -	ASSERT(ip->i_ino != ip->i_mount->m_sb.sb_uquotino);
> -	ASSERT(ip->i_ino != ip->i_mount->m_sb.sb_gquotino);
> +	ASSERT(!xfs_is_quota_inode(&ip->i_mount->m_sb, ip->i_ino));
>  	if (ip->i_udquot) {
>  		xfs_qm_dqrele(ip->i_udquot);
>  		ip->i_udquot = NULL;
> @@ -1152,7 +1150,7 @@ xfs_qm_dqusage_adjust(
>  	 * rootino must have its resources accounted for, not so with the quota
>  	 * inodes.
>  	 */
> -	if (ino == mp->m_sb.sb_uquotino || ino == mp->m_sb.sb_gquotino) {
> +	if (xfs_is_quota_inode(&mp->m_sb, ino)) {
>  		*res = BULKSTAT_RV_NOTHING;
>  		return XFS_ERROR(EINVAL);
>  	}
> @@ -1262,19 +1260,20 @@ int
>  xfs_qm_quotacheck(
>  	xfs_mount_t	*mp)
>  {
> -	int		done, count, error, error2;
> -	xfs_ino_t	lastino;
> -	size_t		structsz;
> -	xfs_inode_t	*uip, *gip;
> -	uint		flags;
> -	LIST_HEAD	(buffer_list);
> +	int			done, count, error, error2;
> +	xfs_ino_t		lastino;
> +	size_t			structsz;
> +	uint			flags;
> +	LIST_HEAD		(buffer_list);
> +	struct xfs_inode	*uip = mp->m_quotainfo->qi_uquotaip;
> +	struct xfs_inode	*gip = mp->m_quotainfo->qi_gquotaip;
>  
>  	count = INT_MAX;
>  	structsz = 1;
>  	lastino = 0;
>  	flags = 0;
>  
> -	ASSERT(mp->m_quotainfo->qi_uquotaip || mp->m_quotainfo->qi_gquotaip);
> +	ASSERT(uip || gip);
>  	ASSERT(XFS_IS_QUOTA_RUNNING(mp));
>  
>  	xfs_notice(mp, "Quotacheck needed: Please wait.");
> @@ -1284,7 +1283,6 @@ xfs_qm_quotacheck(
>  	 * their counters to zero. We need a clean slate.
>  	 * We don't log our changes till later.
>  	 */
> -	uip = mp->m_quotainfo->qi_uquotaip;
>  	if (uip) {
>  		error = xfs_qm_dqiterate(mp, uip, XFS_QMOPT_UQUOTA,
>  					 &buffer_list);
> @@ -1293,7 +1291,6 @@ xfs_qm_quotacheck(
>  		flags |= XFS_UQUOTA_CHKD;
>  	}
>  
> -	gip = mp->m_quotainfo->qi_gquotaip;
>  	if (gip) {
>  		error = xfs_qm_dqiterate(mp, gip, XFS_IS_GQUOTA_ON(mp) ?
>  					 XFS_QMOPT_GQUOTA : XFS_QMOPT_PQUOTA,
> @@ -1395,15 +1392,13 @@ STATIC int
>  xfs_qm_init_quotainos(
>  	xfs_mount_t	*mp)
>  {
> -	xfs_inode_t	*uip, *gip;
> -	int		error;
> -	__int64_t	sbflags;
> -	uint		flags;
> +	struct xfs_inode	*uip = NULL;
> +	struct xfs_inode	*gip = NULL;
> +	int			error;
> +	__int64_t		sbflags = 0;
> +	uint			flags = 0;
>  
>  	ASSERT(mp->m_quotainfo);
> -	uip = gip = NULL;
> -	sbflags = 0;
> -	flags = 0;
>  
>  	/*
>  	 * Get the uquota and gquota inodes
> @@ -1412,19 +1407,18 @@ xfs_qm_init_quotainos(
>  		if (XFS_IS_UQUOTA_ON(mp) &&
>  		    mp->m_sb.sb_uquotino != NULLFSINO) {
>  			ASSERT(mp->m_sb.sb_uquotino > 0);
> -			if ((error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino,
> -					     0, 0, &uip)))
> +			error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino,
> +					     0, 0, &uip);
> +			if (error)
>  				return XFS_ERROR(error);
>  		}
>  		if (XFS_IS_OQUOTA_ON(mp) &&
>  		    mp->m_sb.sb_gquotino != NULLFSINO) {
>  			ASSERT(mp->m_sb.sb_gquotino > 0);
> -			if ((error = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino,
> -					     0, 0, &gip))) {
> -				if (uip)
> -					IRELE(uip);
> -				return XFS_ERROR(error);
> -			}
> +			error = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino,
> +					     0, 0, &gip);
> +			if (error)
> +				goto error_rele;
>  		}
>  	} else {
>  		flags |= XFS_QMOPT_SBVERSION;
> @@ -1439,10 +1433,11 @@ xfs_qm_init_quotainos(
>  	 * temporarily switch to read-write to do this.
>  	 */
>  	if (XFS_IS_UQUOTA_ON(mp) && uip == NULL) {
> -		if ((error = xfs_qm_qino_alloc(mp, &uip,
> +		error = xfs_qm_qino_alloc(mp, &uip,
>  					      sbflags | XFS_SB_UQUOTINO,
> -					      flags | XFS_QMOPT_UQUOTA)))
> -			return XFS_ERROR(error);
> +					      flags | XFS_QMOPT_UQUOTA);
> +		if (error)
> +			goto error_rele;
>  
>  		flags &= ~XFS_QMOPT_SBVERSION;
>  	}
> @@ -1451,18 +1446,21 @@ xfs_qm_init_quotainos(
>  				XFS_QMOPT_GQUOTA : XFS_QMOPT_PQUOTA);
>  		error = xfs_qm_qino_alloc(mp, &gip,
>  					  sbflags | XFS_SB_GQUOTINO, flags);
> -		if (error) {
> -			if (uip)
> -				IRELE(uip);
> -
> -			return XFS_ERROR(error);
> -		}
> +		if (error)
> +			goto error_rele;
>  	}
>  
>  	mp->m_quotainfo->qi_uquotaip = uip;
>  	mp->m_quotainfo->qi_gquotaip = gip;
>  
>  	return 0;
> +
> +error_rele:
> +	if (uip)
> +		IRELE(uip);
> +	if (gip)
> +		IRELE(gip);
> +	return XFS_ERROR(error);
>  }
>  
>  STATIC void
> @@ -1473,7 +1471,7 @@ xfs_qm_dqfree_one(
>  	struct xfs_quotainfo	*qi = mp->m_quotainfo;
>  
>  	mutex_lock(&qi->qi_tree_lock);
> -	radix_tree_delete(XFS_DQUOT_TREE(qi, dqp->q_core.d_flags),
> +	radix_tree_delete(xfs_dquot_tree(qi, dqp->q_core.d_flags),
>  			  be32_to_cpu(dqp->q_core.d_id));
>  
>  	qi->qi_dquots--;
> @@ -1659,7 +1657,8 @@ xfs_qm_vop_dqalloc(
>  	struct xfs_dquot	**O_gdqpp)
>  {
>  	struct xfs_mount	*mp = ip->i_mount;
> -	struct xfs_dquot	*uq, *gq;
> +	struct xfs_dquot	*uq = NULL;
> +	struct xfs_dquot	*gq = NULL;
>  	int			error;
>  	uint			lockflags;
>  
> @@ -1684,7 +1683,6 @@ xfs_qm_vop_dqalloc(
>  		}
>  	}
>  
> -	uq = gq = NULL;
>  	if ((flags & XFS_QMOPT_UQUOTA) && XFS_IS_UQUOTA_ON(mp)) {
>  		if (ip->i_d.di_uid != uid) {
>  			/*
> @@ -1697,14 +1695,14 @@ xfs_qm_vop_dqalloc(
>  			 * holding ilock.
>  			 */
>  			xfs_iunlock(ip, lockflags);
> -			if ((error = xfs_qm_dqget(mp, NULL, (xfs_dqid_t) uid,
> +			error = xfs_qm_dqget(mp, NULL, (xfs_dqid_t) uid,
>  						 XFS_DQ_USER,
>  						 XFS_QMOPT_DQALLOC |
>  						 XFS_QMOPT_DOWARN,
> -						 &uq))) {
> -				ASSERT(error != ENOENT);
> +						 &uq);
> +			ASSERT(error != ENOENT);

You have a series of these asserts which used to be in the error case taken out
of the error case.  Clearly the assertion is still true when error == 0... but
I tend to prefer that it still be in the error curlies.  A silly style thing
which I welcome you to reject with prejudice.

> +			if (error)
>  				return error;
> -			}
>  			/*
>  			 * Get the ilock in the right order.
>  			 */
> @@ -1723,16 +1721,14 @@ xfs_qm_vop_dqalloc(
>  	if ((flags & XFS_QMOPT_GQUOTA) && XFS_IS_GQUOTA_ON(mp)) {
>  		if (ip->i_d.di_gid != gid) {
>  			xfs_iunlock(ip, lockflags);
> -			if ((error = xfs_qm_dqget(mp, NULL, (xfs_dqid_t)gid,
> +			error = xfs_qm_dqget(mp, NULL, (xfs_dqid_t)gid,
>  						 XFS_DQ_GROUP,
>  						 XFS_QMOPT_DQALLOC |
>  						 XFS_QMOPT_DOWARN,
> -						 &gq))) {
> -				if (uq)
> -					xfs_qm_dqrele(uq);
> -				ASSERT(error != ENOENT);
> -				return error;
> -			}
> +						 &gq);
> +			ASSERT(error != ENOENT);
> +			if (error)
> +				goto error_rele;
>  			xfs_dqunlock(gq);
>  			lockflags = XFS_ILOC_SHARED;
>  			xfs_ilock(ip, lockflags);
> @@ -1743,16 +1739,14 @@ xfs_qm_vop_dqalloc(
>  	} else if ((flags & XFS_QMOPT_PQUOTA) && XFS_IS_PQUOTA_ON(mp)) {
>  		if (xfs_get_projid(ip) != prid) {
>  			xfs_iunlock(ip, lockflags);
> -			if ((error = xfs_qm_dqget(mp, NULL, (xfs_dqid_t)prid,
> +			error = xfs_qm_dqget(mp, NULL, (xfs_dqid_t)prid,
>  						 XFS_DQ_PROJ,
>  						 XFS_QMOPT_DQALLOC |
>  						 XFS_QMOPT_DOWARN,
> -						 &gq))) {
> -				if (uq)
> -					xfs_qm_dqrele(uq);
> -				ASSERT(error != ENOENT);
> -				return (error);
> -			}
> +						 &gq);
> +			ASSERT(error != ENOENT);
> +			if (error)
> +				goto error_rele;
>  			xfs_dqunlock(gq);
>  			lockflags = XFS_ILOCK_SHARED;
>  			xfs_ilock(ip, lockflags);
> @@ -1774,6 +1768,11 @@ xfs_qm_vop_dqalloc(
>  	else if (gq)
>  		xfs_qm_dqrele(gq);
>  	return 0;
> +
> +error_rele:
> +	if (uq)
> +		xfs_qm_dqrele(uq);
> +	return error;
>  }
>  
>  /*
> @@ -1821,29 +1820,31 @@ xfs_qm_vop_chown(
>   */
>  int
>  xfs_qm_vop_chown_reserve(
> -	xfs_trans_t	*tp,
> -	xfs_inode_t	*ip,
> -	xfs_dquot_t	*udqp,
> -	xfs_dquot_t	*gdqp,
> -	uint		flags)
> +	struct xfs_trans	*tp,
> +	struct xfs_inode	*ip,
> +	struct xfs_dquot	*udqp,
> +	struct xfs_dquot	*gdqp,
> +	uint			flags)
>  {
> -	xfs_mount_t	*mp = ip->i_mount;
> -	uint		delblks, blkflags, prjflags = 0;
> -	xfs_dquot_t	*unresudq, *unresgdq, *delblksudq, *delblksgdq;
> -	int		error;
> +	struct xfs_mount	*mp = ip->i_mount;
> +	uint			delblks, blkflags, prjflags = 0;
> +	struct xfs_dquot	*udq_unres = NULL;
> +	struct xfs_dquot	*gdq_unres = NULL;
> +	struct xfs_dquot	*udq_delblks = NULL;
> +	struct xfs_dquot	*gdq_delblks = NULL;
> +	int			error;
>  
>  
>  	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
>  	ASSERT(XFS_IS_QUOTA_RUNNING(mp));
>  
>  	delblks = ip->i_delayed_blks;
> -	delblksudq = delblksgdq = unresudq = unresgdq = NULL;
>  	blkflags = XFS_IS_REALTIME_INODE(ip) ?
>  			XFS_QMOPT_RES_RTBLKS : XFS_QMOPT_RES_REGBLKS;
>  
>  	if (XFS_IS_UQUOTA_ON(mp) && udqp &&
>  	    ip->i_d.di_uid != (uid_t)be32_to_cpu(udqp->q_core.d_id)) {
> -		delblksudq = udqp;
> +		udq_delblks = udqp;
>  		/*
>  		 * If there are delayed allocation blocks, then we have to
>  		 * unreserve those from the old dquot, and add them to the
> @@ -1851,7 +1852,7 @@ xfs_qm_vop_chown_reserve(
>  		 */
>  		if (delblks) {
>  			ASSERT(ip->i_udquot);
> -			unresudq = ip->i_udquot;
> +			udq_unres = ip->i_udquot;
>  		}
>  	}
>  	if (XFS_IS_OQUOTA_ON(ip->i_mount) && gdqp) {
> @@ -1862,18 +1863,19 @@ xfs_qm_vop_chown_reserve(
>  		if (prjflags ||
>  		    (XFS_IS_GQUOTA_ON(ip->i_mount) &&
>  		     ip->i_d.di_gid != be32_to_cpu(gdqp->q_core.d_id))) {
> -			delblksgdq = gdqp;
> +			gdq_delblks = gdqp;
>  			if (delblks) {
>  				ASSERT(ip->i_gdquot);
> -				unresgdq = ip->i_gdquot;
> +				gdq_unres = ip->i_gdquot;
>  			}
>  		}
>  	}
>  
> -	if ((error = xfs_trans_reserve_quota_bydquots(tp, ip->i_mount,
> -				delblksudq, delblksgdq, ip->i_d.di_nblocks, 1,
> -				flags | blkflags | prjflags)))
> -		return (error);
> +	error = xfs_trans_reserve_quota_bydquots(tp, ip->i_mount,
> +				udq_delblks, gdq_delblks, ip->i_d.di_nblocks, 1,
> +				flags | blkflags | prjflags);
> +	if (error)
> +		return error;
>  
>  	/*
>  	 * Do the delayed blks reservations/unreservations now. Since, these
> @@ -1885,14 +1887,15 @@ xfs_qm_vop_chown_reserve(
>  		/*
>  		 * Do the reservations first. Unreservation can't fail.
>  		 */
> -		ASSERT(delblksudq || delblksgdq);
> -		ASSERT(unresudq || unresgdq);
> -		if ((error = xfs_trans_reserve_quota_bydquots(NULL, ip->i_mount,
> -				delblksudq, delblksgdq, (xfs_qcnt_t)delblks, 0,
> -				flags | blkflags | prjflags)))
> -			return (error);
> +		ASSERT(udq_delblks || gdq_delblks);
> +		ASSERT(udq_unres || gdq_unres);
> +		error = xfs_trans_reserve_quota_bydquots(NULL, ip->i_mount,
> +			    udq_delblks, gdq_delblks, (xfs_qcnt_t)delblks, 0,
> +			    flags | blkflags | prjflags);
> +		if (error)
> +			return error;
>  		xfs_trans_reserve_quota_bydquots(NULL, ip->i_mount,
> -				unresudq, unresgdq, -((xfs_qcnt_t)delblks), 0,
> +				udq_unres, gdq_unres, -((xfs_qcnt_t)delblks), 0,
>  				blkflags);
>  	}
>  
> diff --git a/fs/xfs/xfs_qm.h b/fs/xfs/xfs_qm.h
> index 5d16a6e..4b330f2 100644
> --- a/fs/xfs/xfs_qm.h
> +++ b/fs/xfs/xfs_qm.h
> @@ -42,57 +42,89 @@ extern struct kmem_zone	*xfs_qm_dqtrxzone;
>   * The mount structure keeps a pointer to this.
>   */
>  typedef struct xfs_quotainfo {
> -	struct radix_tree_root qi_uquota_tree;
> -	struct radix_tree_root qi_gquota_tree;
> -	struct mutex qi_tree_lock;
> -	xfs_inode_t	*qi_uquotaip;	 /* user quota inode */
> -	xfs_inode_t	*qi_gquotaip;	 /* group quota inode */
> -	struct list_head qi_lru_list;
> -	struct mutex	 qi_lru_lock;
> -	int		 qi_lru_count;
> -	int		 qi_dquots;
> -	time_t		 qi_btimelimit;	 /* limit for blks timer */
> -	time_t		 qi_itimelimit;	 /* limit for inodes timer */
> -	time_t		 qi_rtbtimelimit;/* limit for rt blks timer */
> -	xfs_qwarncnt_t	 qi_bwarnlimit;	 /* limit for blks warnings */
> -	xfs_qwarncnt_t	 qi_iwarnlimit;	 /* limit for inodes warnings */
> -	xfs_qwarncnt_t	 qi_rtbwarnlimit;/* limit for rt blks warnings */
> -	struct mutex	 qi_quotaofflock;/* to serialize quotaoff */
> -	xfs_filblks_t	 qi_dqchunklen;	 /* # BBs in a chunk of dqs */
> -	uint		 qi_dqperchunk;	 /* # ondisk dqs in above chunk */
> -	xfs_qcnt_t	 qi_bhardlimit;	 /* default data blk hard limit */
> -	xfs_qcnt_t	 qi_bsoftlimit;	 /* default data blk soft limit */
> -	xfs_qcnt_t	 qi_ihardlimit;	 /* default inode count hard limit */
> -	xfs_qcnt_t	 qi_isoftlimit;	 /* default inode count soft limit */
> -	xfs_qcnt_t	 qi_rtbhardlimit;/* default realtime blk hard limit */
> -	xfs_qcnt_t	 qi_rtbsoftlimit;/* default realtime blk soft limit */
> -	struct shrinker  qi_shrinker;
> +	struct radix_tree_root	qi_uquota_tree;
> +	struct radix_tree_root	qi_gquota_tree;
> +	struct mutex		qi_tree_lock;
> +	struct xfs_inode	*qi_uquotaip;	 /* user quota inode */
> +	struct xfs_inode	*qi_gquotaip;	 /* group quota inode */
> +	struct list_head	qi_lru_list;
> +	struct mutex		qi_lru_lock;
> +	int		qi_lru_count;
> +	int		qi_dquots;
> +	time_t		qi_btimelimit;	 /* limit for blks timer */
> +	time_t		qi_itimelimit;	 /* limit for inodes timer */
> +	time_t		qi_rtbtimelimit;/* limit for rt blks timer */
> +	xfs_qwarncnt_t	qi_bwarnlimit;	 /* limit for blks warnings */
> +	xfs_qwarncnt_t	qi_iwarnlimit;	 /* limit for inodes warnings */
> +	xfs_qwarncnt_t	qi_rtbwarnlimit;/* limit for rt blks warnings */
> +	struct mutex	qi_quotaofflock;/* to serialize quotaoff */
> +	xfs_filblks_t	qi_dqchunklen;	 /* # BBs in a chunk of dqs */
> +	uint		qi_dqperchunk;	 /* # ondisk dqs in above chunk */
> +	xfs_qcnt_t	qi_bhardlimit;	 /* default data blk hard limit */
> +	xfs_qcnt_t	qi_bsoftlimit;	 /* default data blk soft limit */
> +	xfs_qcnt_t	qi_ihardlimit;	 /* default inode count hard limit */
> +	xfs_qcnt_t	qi_isoftlimit;	 /* default inode count soft limit */
> +	xfs_qcnt_t	qi_rtbhardlimit;/* default realtime blk hard limit */
> +	xfs_qcnt_t	qi_rtbsoftlimit;/* default realtime blk soft limit */
> +	struct shrinker	qi_shrinker;
>  } xfs_quotainfo_t;
>  
> -#define XFS_DQUOT_TREE(qi, type) \
> -	((type & XFS_DQ_USER) ? \
> -	 &((qi)->qi_uquota_tree) : \
> -	 &((qi)->qi_gquota_tree))
> +static inline struct radix_tree_root *
> +xfs_dquot_tree(
> +	struct xfs_quotainfo	*qi,
> +	int			type)
> +{
> +	switch (type) {
> +	case XFS_DQ_USER:
> +		return &qi->qi_uquota_tree;
> +	case XFS_DQ_GROUP:
> +	case XFS_DQ_PROJ:
> +		return &qi->qi_gquota_tree;
> +	default:
> +		ASSERT(0);
> +	}
> +	return NULL;
> +}
>  
> +static inline struct xfs_inode *
> +xfs_dq_to_quota_inode(struct xfs_dquot *dqp)
> +{
> +	switch (dqp->dq_flags & XFS_DQ_ALLTYPES) {
> +	case XFS_DQ_USER:
> +		return dqp->q_mount->m_quotainfo->qi_uquotaip;
> +	case XFS_DQ_GROUP:
> +	case XFS_DQ_PROJ:
> +		return dqp->q_mount->m_quotainfo->qi_gquotaip;
> +	default:
> +		ASSERT(0);
> +	}
> +	return NULL;
> +}
>  
>  extern int	xfs_qm_calc_dquots_per_chunk(struct xfs_mount *mp,
>  					     unsigned int nbblks);
> -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);
> -extern void	xfs_trans_dqjoin(xfs_trans_t *, xfs_dquot_t *);
> -extern void	xfs_trans_log_dquot(xfs_trans_t *, xfs_dquot_t *);
> +extern void	xfs_trans_mod_dquot(struct xfs_trans *,
> +					struct xfs_dquot *, uint, long);
> +extern int	xfs_trans_reserve_quota_bydquots(struct xfs_trans *,
> +			struct xfs_mount *, struct xfs_dquot *,
> +			struct xfs_dquot *, long, long, uint);
> +extern void	xfs_trans_dqjoin(struct xfs_trans *, struct xfs_dquot *);
> +extern void	xfs_trans_log_dquot(struct xfs_trans *, struct xfs_dquot *);
>  
>  /*
>   * We keep the usr and grp dquots separately so that locking will be easier
>   * to do at commit time. All transactions that we know of at this point
>   * affect no more than two dquots of one type. Hence, the TRANS_MAXDQS value.
>   */
> +enum {
> +	XFS_QM_TRANS_USR = 0,
> +	XFS_QM_TRANS_GRP,
> +	XFS_QM_TRANS_DQTYPES
> +};
>  #define XFS_QM_TRANS_MAXDQS		2
> -typedef struct xfs_dquot_acct {
> -	xfs_dqtrx_t	dqa_usrdquots[XFS_QM_TRANS_MAXDQS];
> -	xfs_dqtrx_t	dqa_grpdquots[XFS_QM_TRANS_MAXDQS];
> -} xfs_dquot_acct_t;
> +struct xfs_dquot_acct {
> +	struct xfs_dqtrx	dqs[XFS_QM_TRANS_DQTYPES][XFS_QM_TRANS_MAXDQS];
> +};
>  
>  /*
>   * Users are allowed to have a usage exceeding their softlimit for
> @@ -106,22 +138,23 @@ typedef struct xfs_dquot_acct {
>  #define XFS_QM_IWARNLIMIT	5
>  #define XFS_QM_RTBWARNLIMIT	5
>  
> -extern void		xfs_qm_destroy_quotainfo(xfs_mount_t *);
> -extern int		xfs_qm_quotacheck(xfs_mount_t *);
> -extern int		xfs_qm_write_sb_changes(xfs_mount_t *, __int64_t);
> +extern void		xfs_qm_destroy_quotainfo(struct xfs_mount *);
> +extern int		xfs_qm_quotacheck(struct xfs_mount *);
> +extern int		xfs_qm_write_sb_changes(struct xfs_mount *, __int64_t);
>  
>  /* dquot stuff */
> -extern void		xfs_qm_dqpurge_all(xfs_mount_t *, uint);
> -extern void		xfs_qm_dqrele_all_inodes(xfs_mount_t *, uint);
> +extern void		xfs_qm_dqpurge_all(struct xfs_mount *, uint);
> +extern void		xfs_qm_dqrele_all_inodes(struct xfs_mount *, uint);
>  
>  /* quota ops */
> -extern int		xfs_qm_scall_trunc_qfiles(xfs_mount_t *, uint);
> -extern int		xfs_qm_scall_getquota(xfs_mount_t *, xfs_dqid_t, uint,
> -					fs_disk_quota_t *);
> +extern int		xfs_qm_scall_trunc_qfiles(struct xfs_mount *, uint);
> +extern int		xfs_qm_scall_getquota(struct xfs_mount *, xfs_dqid_t,
> +					uint, struct fs_disk_quota *);
>  extern int		xfs_qm_scall_setqlim(struct xfs_mount *, xfs_dqid_t, uint,
> -					fs_disk_quota_t *);
> -extern int		xfs_qm_scall_getqstat(xfs_mount_t *, fs_quota_stat_t *);
> -extern int		xfs_qm_scall_quotaon(xfs_mount_t *, uint);
> -extern int		xfs_qm_scall_quotaoff(xfs_mount_t *, uint);
> +					struct fs_disk_quota *);
> +extern int		xfs_qm_scall_getqstat(struct xfs_mount *,
> +					struct fs_quota_stat *);
> +extern int		xfs_qm_scall_quotaon(struct xfs_mount *, uint);
> +extern int		xfs_qm_scall_quotaoff(struct xfs_mount *, uint);
>  
>  #endif /* __XFS_QM_H__ */
> diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c
> index 6cdf6ff..b03b2ab 100644
> --- a/fs/xfs/xfs_qm_syscalls.c
> +++ b/fs/xfs/xfs_qm_syscalls.c
> @@ -407,11 +407,11 @@ xfs_qm_scall_getqstat(
>  	struct fs_quota_stat	*out)
>  {
>  	struct xfs_quotainfo	*q = mp->m_quotainfo;
> -	struct xfs_inode	*uip, *gip;
> -	bool                    tempuqip, tempgqip;
> +	struct xfs_inode	*uip = NULL;
> +	struct xfs_inode	*gip = NULL;
> +	bool                    tempuqip = false;
> +	bool                    tempgqip = false;
>  
> -	uip = gip = NULL;
> -	tempuqip = tempgqip = false;
>  	memset(out, 0, sizeof(fs_quota_stat_t));
>  
>  	out->qs_version = FS_QSTAT_VERSION;
> diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h
> index 2de58a8..78f9e70 100644
> --- a/fs/xfs/xfs_sb.h
> +++ b/fs/xfs/xfs_sb.h
> @@ -618,6 +618,12 @@ xfs_sb_has_incompat_log_feature(
>  	return (sbp->sb_features_log_incompat & feature) != 0;
>  }
>  
> +static inline bool
> +xfs_is_quota_inode(struct xfs_sb *sbp, xfs_ino_t ino)
> +{
> +	return (ino == sbp->sb_uquotino || ino == sbp->sb_gquotino);
> +}
> +
>  /*
>   * end of superblock version macros
>   */
> diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c
> index 738c04b..e830fb5 100644
> --- a/fs/xfs/xfs_symlink.c
> +++ b/fs/xfs/xfs_symlink.c
> @@ -358,7 +358,8 @@ xfs_symlink(
>  	int			n;
>  	xfs_buf_t		*bp;
>  	prid_t			prid;
> -	struct xfs_dquot	*udqp, *gdqp;
> +	struct xfs_dquot	*udqp = NULL;
> +	struct xfs_dquot	*gdqp = NULL;
>  	uint			resblks;
>  
>  	*ipp = NULL;
> diff --git a/fs/xfs/xfs_trans_dquot.c b/fs/xfs/xfs_trans_dquot.c
> index fec75d0..7ea7485 100644
> --- a/fs/xfs/xfs_trans_dquot.c
> +++ b/fs/xfs/xfs_trans_dquot.c
> @@ -103,8 +103,6 @@ xfs_trans_dup_dqinfo(
>  		return;
>  
>  	xfs_trans_alloc_dqinfo(ntp);
> -	oqa = otp->t_dqinfo->dqa_usrdquots;
> -	nqa = ntp->t_dqinfo->dqa_usrdquots;
>  
>  	/*
>  	 * Because the quota blk reservation is carried forward,
> @@ -113,7 +111,9 @@ xfs_trans_dup_dqinfo(
>  	if(otp->t_flags & XFS_TRANS_DQ_DIRTY)
>  		ntp->t_flags |= XFS_TRANS_DQ_DIRTY;
>  
> -	for (j = 0; j < 2; j++) {
> +	for (j = 0; j < XFS_QM_TRANS_DQTYPES; j++) {
> +		oqa = otp->t_dqinfo->dqs[j];
> +		nqa = ntp->t_dqinfo->dqs[j];
>  		for (i = 0; i < XFS_QM_TRANS_MAXDQS; i++) {
>  			if (oqa[i].qt_dquot == NULL)
>  				break;
> @@ -138,8 +138,6 @@ xfs_trans_dup_dqinfo(
>  			oq->qt_ino_res = oq->qt_ino_res_used;
>  

Could clean up this extra line...


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

  parent reply	other threads:[~2013-06-24 21:37 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-24  2:48 [PATCH v9 0/6] Allow pquota and gquota to be used together Chandra Seetharaman
2013-06-24  2:48 ` [PATCH v9 1/6] xfs: Move code around and remove typedefs Chandra Seetharaman
2013-06-24  5:31   ` Dave Chinner
2013-06-24 22:21     ` Chandra Seetharaman
2013-06-24 21:36   ` Ben Myers [this message]
2013-06-24 23:23     ` Chandra Seetharaman
2013-06-24  2:48 ` [PATCH v9 2/6] xfs: Remove incore use of XFS_OQUOTA_ENFD and XFS_OQUOTA_CHKD Chandra Seetharaman
2013-06-24  5:59   ` Dave Chinner
2013-06-24 22:25     ` Chandra Seetharaman
2013-06-25  5:32       ` Dave Chinner
2013-06-24  2:48 ` [PATCH v9 3/6] xfs: Add pquota fields where gquota is used Chandra Seetharaman
2013-06-24  8:00   ` Dave Chinner
2013-06-24 22:33     ` Chandra Seetharaman
2013-06-24 23:25     ` Chandra Seetharaman
2013-06-25  5:33       ` Dave Chinner
2013-06-24  2:48 ` [PATCH v9 4/6] xfs: Start using pquotaino from the superblock Chandra Seetharaman
2013-06-25  6:31   ` Dave Chinner
2013-07-01 15:50     ` Chandra Seetharaman
2013-07-04  1:12       ` Dave Chinner
2013-07-08 23:20         ` Chandra Seetharaman
2013-07-09  1:21           ` Dave Chinner
2013-07-09 21:06             ` Chandra Seetharaman
2013-06-24  2:48 ` [PATCH v9 5/6] xfs: Add proper versioning support to fs_quota_stat Chandra Seetharaman
2013-06-25  6:43   ` Dave Chinner
2013-06-25 22:36     ` Chandra Seetharaman
2013-06-26  1:20       ` Dave Chinner
2013-06-24  2:48 ` [PATCH v9 6/6] xfs: Use new qs_pquota field in fs_quota_stat for Q_XGETQSTAT Chandra Seetharaman
2013-06-25  6:45   ` Dave Chinner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20130624213656.GA20932@sgi.com \
    --to=bpm@sgi.com \
    --cc=sekharan@us.ibm.com \
    --cc=xfs@oss.sgi.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.