xfs: refactor XFS_QMOPT_DQNEXT out of existence
There's only one caller of DQNEXT and its semantics can be moved into a separate function, so create the function and get rid of the flag. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
		
							parent
							
								
									609001bca4
								
							
						
					
					
						commit
						2e330e76e0
					
				| @ -114,7 +114,6 @@ typedef uint16_t	xfs_qwarncnt_t; | ||||
| #define XFS_QMOPT_SBVERSION	0x0000040 /* change superblock version num */ | ||||
| #define XFS_QMOPT_GQUOTA	0x0002000 /* group dquot requested */ | ||||
| #define XFS_QMOPT_ENOSPC	0x0004000 /* enospc instead of edquot (prj) */ | ||||
| #define XFS_QMOPT_DQNEXT	0x0008000 /* return next dquot >= this ID */ | ||||
| 
 | ||||
| /*
 | ||||
|  * flags to xfs_trans_mod_dquot to indicate which field needs to be | ||||
|  | ||||
| @ -268,8 +268,7 @@ xfs_scrub_quota( | ||||
| 		if (xfs_scrub_should_terminate(sc, &error)) | ||||
| 			break; | ||||
| 
 | ||||
| 		error = xfs_qm_dqget(mp, NULL, id, dqtype, XFS_QMOPT_DQNEXT, | ||||
| 				&dq); | ||||
| 		error = xfs_qm_dqget_next(mp, id, dqtype, &dq); | ||||
| 		if (error == -ENOENT) | ||||
| 			break; | ||||
| 		if (!xfs_scrub_fblock_process_error(sc, XFS_DATA_FORK, | ||||
|  | ||||
| @ -736,18 +736,6 @@ restart: | ||||
| 			goto restart; | ||||
| 		} | ||||
| 
 | ||||
| 		/* uninit / unused quota found in radix tree, keep looking  */ | ||||
| 		if (flags & XFS_QMOPT_DQNEXT) { | ||||
| 			if (XFS_IS_DQUOT_UNINITIALIZED(dqp)) { | ||||
| 				xfs_dqunlock(dqp); | ||||
| 				mutex_unlock(&qi->qi_tree_lock); | ||||
| 				error = xfs_dq_get_next_id(mp, type, &id); | ||||
| 				if (error) | ||||
| 					return error; | ||||
| 				goto restart; | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		dqp->q_nrefs++; | ||||
| 		mutex_unlock(&qi->qi_tree_lock); | ||||
| 
 | ||||
| @ -774,13 +762,6 @@ restart: | ||||
| 	if (ip) | ||||
| 		xfs_ilock(ip, XFS_ILOCK_EXCL); | ||||
| 
 | ||||
| 	/* If we are asked to find next active id, keep looking */ | ||||
| 	if (error == -ENOENT && (flags & XFS_QMOPT_DQNEXT)) { | ||||
| 		error = xfs_dq_get_next_id(mp, type, &id); | ||||
| 		if (!error) | ||||
| 			goto restart; | ||||
| 	} | ||||
| 
 | ||||
| 	if (error) | ||||
| 		return error; | ||||
| 
 | ||||
| @ -831,17 +812,6 @@ restart: | ||||
| 	qi->qi_dquots++; | ||||
| 	mutex_unlock(&qi->qi_tree_lock); | ||||
| 
 | ||||
| 	/* If we are asked to find next active id, keep looking */ | ||||
| 	if (flags & XFS_QMOPT_DQNEXT) { | ||||
| 		if (XFS_IS_DQUOT_UNINITIALIZED(dqp)) { | ||||
| 			xfs_qm_dqput(dqp); | ||||
| 			error = xfs_dq_get_next_id(mp, type, &id); | ||||
| 			if (error) | ||||
| 				return error; | ||||
| 			goto restart; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  dqret: | ||||
| 	ASSERT((ip == NULL) || xfs_isilocked(ip, XFS_ILOCK_EXCL)); | ||||
| 	trace_xfs_dqget_miss(dqp); | ||||
| @ -849,6 +819,39 @@ restart: | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Starting at @id and progressing upwards, look for an initialized incore | ||||
|  * dquot, lock it, and return it. | ||||
|  */ | ||||
| int | ||||
| xfs_qm_dqget_next( | ||||
| 	struct xfs_mount	*mp, | ||||
| 	xfs_dqid_t		id, | ||||
| 	uint			type, | ||||
| 	struct xfs_dquot	**dqpp) | ||||
| { | ||||
| 	struct xfs_dquot	*dqp; | ||||
| 	int			error = 0; | ||||
| 
 | ||||
| 	*dqpp = NULL; | ||||
| 	for (; !error; error = xfs_dq_get_next_id(mp, type, &id)) { | ||||
| 		error = xfs_qm_dqget(mp, NULL, id, type, 0, &dqp); | ||||
| 		if (error == -ENOENT) | ||||
| 			continue; | ||||
| 		else if (error != 0) | ||||
| 			break; | ||||
| 
 | ||||
| 		if (!XFS_IS_DQUOT_UNINITIALIZED(dqp)) { | ||||
| 			*dqpp = dqp; | ||||
| 			return 0; | ||||
| 		} | ||||
| 
 | ||||
| 		xfs_qm_dqput(dqp); | ||||
| 	} | ||||
| 
 | ||||
| 	return error; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Release a reference to the dquot (decrement ref-count) and unlock it. | ||||
|  * | ||||
|  | ||||
| @ -171,6 +171,8 @@ extern void		xfs_qm_adjust_dqlimits(struct xfs_mount *, | ||||
| 					       struct xfs_dquot *); | ||||
| extern int		xfs_qm_dqget(xfs_mount_t *, xfs_inode_t *, | ||||
| 					xfs_dqid_t, uint, uint, xfs_dquot_t **); | ||||
| extern int		xfs_qm_dqget_next(struct xfs_mount *mp, xfs_dqid_t id, | ||||
| 					uint type, struct xfs_dquot **dqpp); | ||||
| extern void		xfs_qm_dqput(xfs_dquot_t *); | ||||
| 
 | ||||
| extern void		xfs_dqlock2(struct xfs_dquot *, struct xfs_dquot *); | ||||
|  | ||||
| @ -170,8 +170,10 @@ extern void		xfs_qm_dqrele_all_inodes(struct xfs_mount *, uint); | ||||
| 
 | ||||
| /* quota ops */ | ||||
| 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 qc_dqblk *, uint); | ||||
| extern int		xfs_qm_scall_getquota(struct xfs_mount *, xfs_dqid_t, | ||||
| 					uint, struct qc_dqblk *); | ||||
| extern int		xfs_qm_scall_getquota_next(struct xfs_mount *, | ||||
| 					xfs_dqid_t *, uint, struct qc_dqblk *); | ||||
| extern int		xfs_qm_scall_setqlim(struct xfs_mount *, xfs_dqid_t, uint, | ||||
| 					struct qc_dqblk *); | ||||
| extern int		xfs_qm_scall_quotaon(struct xfs_mount *, uint); | ||||
|  | ||||
| @ -622,39 +622,14 @@ out: | ||||
| 	return error; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| int | ||||
| xfs_qm_scall_getquota( | ||||
| /* Fill out the quota context. */ | ||||
| static void | ||||
| xfs_qm_scall_getquota_fill_qc( | ||||
| 	struct xfs_mount	*mp, | ||||
| 	xfs_dqid_t		*id, | ||||
| 	uint			type, | ||||
| 	struct qc_dqblk		*dst, | ||||
| 	uint			dqget_flags) | ||||
| 	const struct xfs_dquot	*dqp, | ||||
| 	struct qc_dqblk		*dst) | ||||
| { | ||||
| 	struct xfs_dquot	*dqp; | ||||
| 	int			error; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Try to get the dquot. We don't want it allocated on disk, so | ||||
| 	 * we aren't passing the XFS_QMOPT_DOALLOC flag. If it doesn't | ||||
| 	 * exist, we'll get ENOENT back. | ||||
| 	 */ | ||||
| 	error = xfs_qm_dqget(mp, NULL, *id, type, dqget_flags, &dqp); | ||||
| 	if (error) | ||||
| 		return error; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * If everything's NULL, this dquot doesn't quite exist as far as | ||||
| 	 * our utility programs are concerned. | ||||
| 	 */ | ||||
| 	if (XFS_IS_DQUOT_UNINITIALIZED(dqp)) { | ||||
| 		error = -ENOENT; | ||||
| 		goto out_put; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Fill in the ID we actually read from disk */ | ||||
| 	*id = be32_to_cpu(dqp->q_core.d_id); | ||||
| 
 | ||||
| 	memset(dst, 0, sizeof(*dst)); | ||||
| 	dst->d_spc_hardlimit = | ||||
| 		XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_blk_hardlimit)); | ||||
| @ -696,7 +671,7 @@ xfs_qm_scall_getquota( | ||||
| 	if (((XFS_IS_UQUOTA_ENFORCED(mp) && type == XFS_DQ_USER) || | ||||
| 	     (XFS_IS_GQUOTA_ENFORCED(mp) && type == XFS_DQ_GROUP) || | ||||
| 	     (XFS_IS_PQUOTA_ENFORCED(mp) && type == XFS_DQ_PROJ)) && | ||||
| 	    *id != 0) { | ||||
| 	    dqp->q_core.d_id != 0) { | ||||
| 		if ((dst->d_space > dst->d_spc_softlimit) && | ||||
| 		    (dst->d_spc_softlimit > 0)) { | ||||
| 			ASSERT(dst->d_spc_timer != 0); | ||||
| @ -707,11 +682,70 @@ xfs_qm_scall_getquota( | ||||
| 		} | ||||
| 	} | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| /* Return the quota information for the dquot matching id. */ | ||||
| int | ||||
| xfs_qm_scall_getquota( | ||||
| 	struct xfs_mount	*mp, | ||||
| 	xfs_dqid_t		id, | ||||
| 	uint			type, | ||||
| 	struct qc_dqblk		*dst) | ||||
| { | ||||
| 	struct xfs_dquot	*dqp; | ||||
| 	int			error; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Try to get the dquot. We don't want it allocated on disk, so | ||||
| 	 * we aren't passing the XFS_QMOPT_DOALLOC flag. If it doesn't | ||||
| 	 * exist, we'll get ENOENT back. | ||||
| 	 */ | ||||
| 	error = xfs_qm_dqget(mp, NULL, id, type, 0, &dqp); | ||||
| 	if (error) | ||||
| 		return error; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * If everything's NULL, this dquot doesn't quite exist as far as | ||||
| 	 * our utility programs are concerned. | ||||
| 	 */ | ||||
| 	if (XFS_IS_DQUOT_UNINITIALIZED(dqp)) { | ||||
| 		error = -ENOENT; | ||||
| 		goto out_put; | ||||
| 	} | ||||
| 
 | ||||
| 	xfs_qm_scall_getquota_fill_qc(mp, type, dqp, dst); | ||||
| 
 | ||||
| out_put: | ||||
| 	xfs_qm_dqput(dqp); | ||||
| 	return error; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Return the quota information for the first initialized dquot whose id | ||||
|  * is at least as high as id. | ||||
|  */ | ||||
| int | ||||
| xfs_qm_scall_getquota_next( | ||||
| 	struct xfs_mount	*mp, | ||||
| 	xfs_dqid_t		*id, | ||||
| 	uint			type, | ||||
| 	struct qc_dqblk		*dst) | ||||
| { | ||||
| 	struct xfs_dquot	*dqp; | ||||
| 	int			error; | ||||
| 
 | ||||
| 	error = xfs_qm_dqget_next(mp, *id, type, &dqp); | ||||
| 	if (error) | ||||
| 		return error; | ||||
| 
 | ||||
| 	/* Fill in the ID we actually read from disk */ | ||||
| 	*id = be32_to_cpu(dqp->q_core.d_id); | ||||
| 
 | ||||
| 	xfs_qm_scall_getquota_fill_qc(mp, type, dqp, dst); | ||||
| 
 | ||||
| 	xfs_qm_dqput(dqp); | ||||
| 	return error; | ||||
| } | ||||
| 
 | ||||
| STATIC int | ||||
| xfs_dqrele_inode( | ||||
|  | ||||
| @ -239,8 +239,7 @@ xfs_fs_get_dqblk( | ||||
| 		return -ESRCH; | ||||
| 
 | ||||
| 	id = from_kqid(&init_user_ns, qid); | ||||
| 	return xfs_qm_scall_getquota(mp, &id, | ||||
| 				      xfs_quota_type(qid.type), qdq, 0); | ||||
| 	return xfs_qm_scall_getquota(mp, id, xfs_quota_type(qid.type), qdq); | ||||
| } | ||||
| 
 | ||||
| /* Return quota info for active quota >= this qid */ | ||||
| @ -260,9 +259,8 @@ xfs_fs_get_nextdqblk( | ||||
| 		return -ESRCH; | ||||
| 
 | ||||
| 	id = from_kqid(&init_user_ns, *qid); | ||||
| 	ret = xfs_qm_scall_getquota(mp, &id, | ||||
| 				    xfs_quota_type(qid->type), qdq, | ||||
| 				    XFS_QMOPT_DQNEXT); | ||||
| 	ret = xfs_qm_scall_getquota_next(mp, &id, xfs_quota_type(qid->type), | ||||
| 			qdq); | ||||
| 	if (ret) | ||||
| 		return ret; | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user