forked from Minki/linux
xfs: separate dquot repair into a separate function
Move the dquot repair code into a separate function and remove XFS_QMOPT_DQREPAIR in favor of calling the helper directly. Remove other dead code because quotacheck is the only caller of DQREPAIR. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Dave Chinner <dchinner@redhat.com>
This commit is contained in:
parent
b55725974c
commit
eeea798028
@ -51,7 +51,6 @@ xfs_dqcheck(
|
||||
uint flags,
|
||||
const char *str)
|
||||
{
|
||||
xfs_dqblk_t *d = (xfs_dqblk_t *)ddq;
|
||||
int errs = 0;
|
||||
|
||||
/*
|
||||
@ -139,17 +138,26 @@ xfs_dqcheck(
|
||||
}
|
||||
}
|
||||
|
||||
if (!errs || !(flags & XFS_QMOPT_DQREPAIR))
|
||||
return errs;
|
||||
return errs;
|
||||
}
|
||||
|
||||
/*
|
||||
* Do some primitive error checking on ondisk dquot data structures.
|
||||
*/
|
||||
int
|
||||
xfs_dquot_repair(
|
||||
struct xfs_mount *mp,
|
||||
struct xfs_disk_dquot *ddq,
|
||||
xfs_dqid_t id,
|
||||
uint type)
|
||||
{
|
||||
struct xfs_dqblk *d = (struct xfs_dqblk *)ddq;
|
||||
|
||||
if (flags & XFS_QMOPT_DOWARN)
|
||||
xfs_notice(mp, "Re-initializing dquot ID 0x%x", id);
|
||||
|
||||
/*
|
||||
* Typically, a repair is only requested by quotacheck.
|
||||
*/
|
||||
ASSERT(id != -1);
|
||||
ASSERT(flags & XFS_QMOPT_DQREPAIR);
|
||||
memset(d, 0, sizeof(xfs_dqblk_t));
|
||||
|
||||
d->dd_diskdq.d_magic = cpu_to_be16(XFS_DQUOT_MAGIC);
|
||||
@ -163,7 +171,7 @@ xfs_dqcheck(
|
||||
XFS_DQUOT_CRC_OFF);
|
||||
}
|
||||
|
||||
return errs;
|
||||
return 0;
|
||||
}
|
||||
|
||||
STATIC bool
|
||||
|
@ -113,7 +113,6 @@ typedef uint16_t xfs_qwarncnt_t;
|
||||
#define XFS_QMOPT_FORCE_RES 0x0000010 /* ignore quota limits */
|
||||
#define XFS_QMOPT_SBVERSION 0x0000040 /* change superblock version num */
|
||||
#define XFS_QMOPT_DOWARN 0x0000400 /* increase warning cnt if needed */
|
||||
#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) */
|
||||
#define XFS_QMOPT_DQNEXT 0x0008000 /* return next dquot >= this ID */
|
||||
@ -156,5 +155,7 @@ typedef uint16_t xfs_qwarncnt_t;
|
||||
extern int xfs_dqcheck(struct xfs_mount *mp, xfs_disk_dquot_t *ddq,
|
||||
xfs_dqid_t id, uint type, uint flags, const char *str);
|
||||
extern int xfs_calc_dquots_per_chunk(unsigned int nbblks);
|
||||
extern int xfs_dquot_repair(struct xfs_mount *mp, struct xfs_disk_dquot *ddq,
|
||||
xfs_dqid_t id, uint type);
|
||||
|
||||
#endif /* __XFS_QUOTA_H__ */
|
||||
|
@ -399,52 +399,6 @@ error0:
|
||||
return error;
|
||||
}
|
||||
|
||||
STATIC int
|
||||
xfs_qm_dqrepair(
|
||||
struct xfs_mount *mp,
|
||||
struct xfs_trans *tp,
|
||||
struct xfs_dquot *dqp,
|
||||
xfs_dqid_t firstid,
|
||||
struct xfs_buf **bpp)
|
||||
{
|
||||
int error;
|
||||
struct xfs_disk_dquot *ddq;
|
||||
struct xfs_dqblk *d;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* Read the buffer without verification so we get the corrupted
|
||||
* buffer returned to us. make sure we verify it on write, though.
|
||||
*/
|
||||
error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, dqp->q_blkno,
|
||||
mp->m_quotainfo->qi_dqchunklen,
|
||||
0, bpp, NULL);
|
||||
|
||||
if (error) {
|
||||
ASSERT(*bpp == NULL);
|
||||
return error;
|
||||
}
|
||||
(*bpp)->b_ops = &xfs_dquot_buf_ops;
|
||||
|
||||
ASSERT(xfs_buf_islocked(*bpp));
|
||||
d = (struct xfs_dqblk *)(*bpp)->b_addr;
|
||||
|
||||
/* Do the actual repair of dquots in this buffer */
|
||||
for (i = 0; i < mp->m_quotainfo->qi_dqperchunk; i++) {
|
||||
ddq = &d[i].dd_diskdq;
|
||||
error = xfs_dqcheck(mp, ddq, firstid + i,
|
||||
dqp->dq_flags & XFS_DQ_ALLTYPES,
|
||||
XFS_QMOPT_DQREPAIR, "xfs_qm_dqrepair");
|
||||
if (error) {
|
||||
/* repair failed, we're screwed */
|
||||
xfs_trans_brelse(tp, *bpp);
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Maps a dquot to the buffer containing its on-disk version.
|
||||
* This returns a ptr to the buffer containing the on-disk dquot
|
||||
@ -526,14 +480,6 @@ xfs_qm_dqtobp(
|
||||
dqp->q_blkno,
|
||||
mp->m_quotainfo->qi_dqchunklen,
|
||||
0, &bp, &xfs_dquot_buf_ops);
|
||||
|
||||
if (error == -EFSCORRUPTED && (flags & XFS_QMOPT_DQREPAIR)) {
|
||||
xfs_dqid_t firstid = (xfs_dqid_t)map.br_startoff *
|
||||
mp->m_quotainfo->qi_dqperchunk;
|
||||
ASSERT(bp == NULL);
|
||||
error = xfs_qm_dqrepair(mp, tp, dqp, firstid, &bp);
|
||||
}
|
||||
|
||||
if (error) {
|
||||
ASSERT(bp == NULL);
|
||||
return error;
|
||||
|
@ -843,6 +843,7 @@ xfs_qm_reset_dqcounts(
|
||||
{
|
||||
struct xfs_dqblk *dqb;
|
||||
int j;
|
||||
int error;
|
||||
|
||||
trace_xfs_reset_dqcounts(bp, _RET_IP_);
|
||||
|
||||
@ -866,8 +867,10 @@ xfs_qm_reset_dqcounts(
|
||||
* output any warnings because it's perfectly possible to
|
||||
* find uninitialised dquot blks. See comment in xfs_dqcheck.
|
||||
*/
|
||||
xfs_dqcheck(mp, ddq, id+j, type, XFS_QMOPT_DQREPAIR,
|
||||
"xfs_quotacheck");
|
||||
error = xfs_dqcheck(mp, ddq, id+j, type, 0, "xfs_quotacheck");
|
||||
if (error)
|
||||
xfs_dquot_repair(mp, ddq, id + j, type);
|
||||
|
||||
/*
|
||||
* Reset type in case we are reusing group quota file for
|
||||
* project quotas or vice versa
|
||||
|
Loading…
Reference in New Issue
Block a user