Commit 2e330e76 authored by Darrick J. Wong's avatar Darrick J. Wong

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: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent 609001bc
...@@ -114,7 +114,6 @@ typedef uint16_t xfs_qwarncnt_t; ...@@ -114,7 +114,6 @@ typedef uint16_t xfs_qwarncnt_t;
#define XFS_QMOPT_SBVERSION 0x0000040 /* change superblock version num */ #define XFS_QMOPT_SBVERSION 0x0000040 /* change superblock version num */
#define XFS_QMOPT_GQUOTA 0x0002000 /* group dquot requested */ #define XFS_QMOPT_GQUOTA 0x0002000 /* group dquot requested */
#define XFS_QMOPT_ENOSPC 0x0004000 /* enospc instead of edquot (prj) */ #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 * flags to xfs_trans_mod_dquot to indicate which field needs to be
......
...@@ -268,8 +268,7 @@ xfs_scrub_quota( ...@@ -268,8 +268,7 @@ xfs_scrub_quota(
if (xfs_scrub_should_terminate(sc, &error)) if (xfs_scrub_should_terminate(sc, &error))
break; break;
error = xfs_qm_dqget(mp, NULL, id, dqtype, XFS_QMOPT_DQNEXT, error = xfs_qm_dqget_next(mp, id, dqtype, &dq);
&dq);
if (error == -ENOENT) if (error == -ENOENT)
break; break;
if (!xfs_scrub_fblock_process_error(sc, XFS_DATA_FORK, if (!xfs_scrub_fblock_process_error(sc, XFS_DATA_FORK,
......
...@@ -736,18 +736,6 @@ xfs_qm_dqget( ...@@ -736,18 +736,6 @@ xfs_qm_dqget(
goto 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++; dqp->q_nrefs++;
mutex_unlock(&qi->qi_tree_lock); mutex_unlock(&qi->qi_tree_lock);
...@@ -774,13 +762,6 @@ xfs_qm_dqget( ...@@ -774,13 +762,6 @@ xfs_qm_dqget(
if (ip) if (ip)
xfs_ilock(ip, XFS_ILOCK_EXCL); 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) if (error)
return error; return error;
...@@ -831,17 +812,6 @@ xfs_qm_dqget( ...@@ -831,17 +812,6 @@ xfs_qm_dqget(
qi->qi_dquots++; qi->qi_dquots++;
mutex_unlock(&qi->qi_tree_lock); 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: dqret:
ASSERT((ip == NULL) || xfs_isilocked(ip, XFS_ILOCK_EXCL)); ASSERT((ip == NULL) || xfs_isilocked(ip, XFS_ILOCK_EXCL));
trace_xfs_dqget_miss(dqp); trace_xfs_dqget_miss(dqp);
...@@ -849,6 +819,39 @@ xfs_qm_dqget( ...@@ -849,6 +819,39 @@ xfs_qm_dqget(
return 0; 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. * 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 *, ...@@ -171,6 +171,8 @@ extern void xfs_qm_adjust_dqlimits(struct xfs_mount *,
struct xfs_dquot *); struct xfs_dquot *);
extern int xfs_qm_dqget(xfs_mount_t *, xfs_inode_t *, extern int xfs_qm_dqget(xfs_mount_t *, xfs_inode_t *,
xfs_dqid_t, uint, uint, xfs_dquot_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_qm_dqput(xfs_dquot_t *);
extern void xfs_dqlock2(struct xfs_dquot *, struct xfs_dquot *); 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); ...@@ -170,8 +170,10 @@ extern void xfs_qm_dqrele_all_inodes(struct xfs_mount *, uint);
/* quota ops */ /* quota ops */
extern int xfs_qm_scall_trunc_qfiles(struct xfs_mount *, uint); extern int xfs_qm_scall_trunc_qfiles(struct xfs_mount *, uint);
extern int xfs_qm_scall_getquota(struct xfs_mount *, xfs_dqid_t *, extern int xfs_qm_scall_getquota(struct xfs_mount *, xfs_dqid_t,
uint, struct qc_dqblk *, uint); 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, extern int xfs_qm_scall_setqlim(struct xfs_mount *, xfs_dqid_t, uint,
struct qc_dqblk *); struct qc_dqblk *);
extern int xfs_qm_scall_quotaon(struct xfs_mount *, uint); extern int xfs_qm_scall_quotaon(struct xfs_mount *, uint);
......
...@@ -622,39 +622,14 @@ xfs_qm_log_quotaoff( ...@@ -622,39 +622,14 @@ xfs_qm_log_quotaoff(
return error; return error;
} }
/* Fill out the quota context. */
int static void
xfs_qm_scall_getquota( xfs_qm_scall_getquota_fill_qc(
struct xfs_mount *mp, struct xfs_mount *mp,
xfs_dqid_t *id,
uint type, uint type,
struct qc_dqblk *dst, const struct xfs_dquot *dqp,
uint dqget_flags) 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)); memset(dst, 0, sizeof(*dst));
dst->d_spc_hardlimit = dst->d_spc_hardlimit =
XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_blk_hardlimit)); XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_blk_hardlimit));
...@@ -696,7 +671,7 @@ xfs_qm_scall_getquota( ...@@ -696,7 +671,7 @@ xfs_qm_scall_getquota(
if (((XFS_IS_UQUOTA_ENFORCED(mp) && type == XFS_DQ_USER) || if (((XFS_IS_UQUOTA_ENFORCED(mp) && type == XFS_DQ_USER) ||
(XFS_IS_GQUOTA_ENFORCED(mp) && type == XFS_DQ_GROUP) || (XFS_IS_GQUOTA_ENFORCED(mp) && type == XFS_DQ_GROUP) ||
(XFS_IS_PQUOTA_ENFORCED(mp) && type == XFS_DQ_PROJ)) && (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) && if ((dst->d_space > dst->d_spc_softlimit) &&
(dst->d_spc_softlimit > 0)) { (dst->d_spc_softlimit > 0)) {
ASSERT(dst->d_spc_timer != 0); ASSERT(dst->d_spc_timer != 0);
...@@ -707,11 +682,70 @@ xfs_qm_scall_getquota( ...@@ -707,11 +682,70 @@ xfs_qm_scall_getquota(
} }
} }
#endif #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: out_put:
xfs_qm_dqput(dqp); xfs_qm_dqput(dqp);
return error; 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 STATIC int
xfs_dqrele_inode( xfs_dqrele_inode(
......
...@@ -239,8 +239,7 @@ xfs_fs_get_dqblk( ...@@ -239,8 +239,7 @@ xfs_fs_get_dqblk(
return -ESRCH; return -ESRCH;
id = from_kqid(&init_user_ns, qid); id = from_kqid(&init_user_ns, qid);
return xfs_qm_scall_getquota(mp, &id, return xfs_qm_scall_getquota(mp, id, xfs_quota_type(qid.type), qdq);
xfs_quota_type(qid.type), qdq, 0);
} }
/* Return quota info for active quota >= this qid */ /* Return quota info for active quota >= this qid */
...@@ -260,9 +259,8 @@ xfs_fs_get_nextdqblk( ...@@ -260,9 +259,8 @@ xfs_fs_get_nextdqblk(
return -ESRCH; return -ESRCH;
id = from_kqid(&init_user_ns, *qid); id = from_kqid(&init_user_ns, *qid);
ret = xfs_qm_scall_getquota(mp, &id, ret = xfs_qm_scall_getquota_next(mp, &id, xfs_quota_type(qid->type),
xfs_quota_type(qid->type), qdq, qdq);
XFS_QMOPT_DQNEXT);
if (ret) if (ret)
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment