|
@@ -42,17 +42,14 @@ xfs_calc_dquots_per_chunk(
|
|
|
/*
|
|
|
* Do some primitive error checking on ondisk dquot data structures.
|
|
|
*/
|
|
|
-int
|
|
|
-xfs_dqcheck(
|
|
|
+xfs_failaddr_t
|
|
|
+xfs_dquot_verify(
|
|
|
struct xfs_mount *mp,
|
|
|
xfs_disk_dquot_t *ddq,
|
|
|
xfs_dqid_t id,
|
|
|
uint type, /* used only when IO_dorepair is true */
|
|
|
- uint flags,
|
|
|
- const char *str)
|
|
|
+ uint flags)
|
|
|
{
|
|
|
- int errs = 0;
|
|
|
-
|
|
|
/*
|
|
|
* We can encounter an uninitialized dquot buffer for 2 reasons:
|
|
|
* 1. If we crash while deleting the quotainode(s), and those blks got
|
|
@@ -68,77 +65,38 @@ xfs_dqcheck(
|
|
|
* This is all fine; things are still consistent, and we haven't lost
|
|
|
* any quota information. Just don't complain about bad dquot blks.
|
|
|
*/
|
|
|
- if (ddq->d_magic != cpu_to_be16(XFS_DQUOT_MAGIC)) {
|
|
|
- if (flags & XFS_QMOPT_DOWARN)
|
|
|
- xfs_alert(mp,
|
|
|
- "%s : XFS dquot ID 0x%x, magic 0x%x != 0x%x",
|
|
|
- str, id, be16_to_cpu(ddq->d_magic), XFS_DQUOT_MAGIC);
|
|
|
- errs++;
|
|
|
- }
|
|
|
- if (ddq->d_version != XFS_DQUOT_VERSION) {
|
|
|
- if (flags & XFS_QMOPT_DOWARN)
|
|
|
- xfs_alert(mp,
|
|
|
- "%s : XFS dquot ID 0x%x, version 0x%x != 0x%x",
|
|
|
- str, id, ddq->d_version, XFS_DQUOT_VERSION);
|
|
|
- errs++;
|
|
|
- }
|
|
|
+ if (ddq->d_magic != cpu_to_be16(XFS_DQUOT_MAGIC))
|
|
|
+ return __this_address;
|
|
|
+ if (ddq->d_version != XFS_DQUOT_VERSION)
|
|
|
+ return __this_address;
|
|
|
|
|
|
if (ddq->d_flags != XFS_DQ_USER &&
|
|
|
ddq->d_flags != XFS_DQ_PROJ &&
|
|
|
- ddq->d_flags != XFS_DQ_GROUP) {
|
|
|
- if (flags & XFS_QMOPT_DOWARN)
|
|
|
- xfs_alert(mp,
|
|
|
- "%s : XFS dquot ID 0x%x, unknown flags 0x%x",
|
|
|
- str, id, ddq->d_flags);
|
|
|
- errs++;
|
|
|
- }
|
|
|
+ ddq->d_flags != XFS_DQ_GROUP)
|
|
|
+ return __this_address;
|
|
|
|
|
|
- if (id != -1 && id != be32_to_cpu(ddq->d_id)) {
|
|
|
- if (flags & XFS_QMOPT_DOWARN)
|
|
|
- xfs_alert(mp,
|
|
|
- "%s : ondisk-dquot 0x%p, ID mismatch: "
|
|
|
- "0x%x expected, found id 0x%x",
|
|
|
- str, ddq, id, be32_to_cpu(ddq->d_id));
|
|
|
- errs++;
|
|
|
- }
|
|
|
+ if (id != -1 && id != be32_to_cpu(ddq->d_id))
|
|
|
+ return __this_address;
|
|
|
|
|
|
- if (!errs && ddq->d_id) {
|
|
|
- if (ddq->d_blk_softlimit &&
|
|
|
- be64_to_cpu(ddq->d_bcount) >
|
|
|
- be64_to_cpu(ddq->d_blk_softlimit)) {
|
|
|
- if (!ddq->d_btimer) {
|
|
|
- if (flags & XFS_QMOPT_DOWARN)
|
|
|
- xfs_alert(mp,
|
|
|
- "%s : Dquot ID 0x%x (0x%p) BLK TIMER NOT STARTED",
|
|
|
- str, (int)be32_to_cpu(ddq->d_id), ddq);
|
|
|
- errs++;
|
|
|
- }
|
|
|
- }
|
|
|
- if (ddq->d_ino_softlimit &&
|
|
|
- be64_to_cpu(ddq->d_icount) >
|
|
|
- be64_to_cpu(ddq->d_ino_softlimit)) {
|
|
|
- if (!ddq->d_itimer) {
|
|
|
- if (flags & XFS_QMOPT_DOWARN)
|
|
|
- xfs_alert(mp,
|
|
|
- "%s : Dquot ID 0x%x (0x%p) INODE TIMER NOT STARTED",
|
|
|
- str, (int)be32_to_cpu(ddq->d_id), ddq);
|
|
|
- errs++;
|
|
|
- }
|
|
|
- }
|
|
|
- if (ddq->d_rtb_softlimit &&
|
|
|
- be64_to_cpu(ddq->d_rtbcount) >
|
|
|
- be64_to_cpu(ddq->d_rtb_softlimit)) {
|
|
|
- if (!ddq->d_rtbtimer) {
|
|
|
- if (flags & XFS_QMOPT_DOWARN)
|
|
|
- xfs_alert(mp,
|
|
|
- "%s : Dquot ID 0x%x (0x%p) RTBLK TIMER NOT STARTED",
|
|
|
- str, (int)be32_to_cpu(ddq->d_id), ddq);
|
|
|
- errs++;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ if (!ddq->d_id)
|
|
|
+ return NULL;
|
|
|
|
|
|
- return errs;
|
|
|
+ if (ddq->d_blk_softlimit &&
|
|
|
+ be64_to_cpu(ddq->d_bcount) > be64_to_cpu(ddq->d_blk_softlimit) &&
|
|
|
+ !ddq->d_btimer)
|
|
|
+ return __this_address;
|
|
|
+
|
|
|
+ if (ddq->d_ino_softlimit &&
|
|
|
+ be64_to_cpu(ddq->d_icount) > be64_to_cpu(ddq->d_ino_softlimit) &&
|
|
|
+ !ddq->d_itimer)
|
|
|
+ return __this_address;
|
|
|
+
|
|
|
+ if (ddq->d_rtb_softlimit &&
|
|
|
+ be64_to_cpu(ddq->d_rtbcount) > be64_to_cpu(ddq->d_rtb_softlimit) &&
|
|
|
+ !ddq->d_rtbtimer)
|
|
|
+ return __this_address;
|
|
|
+
|
|
|
+ return NULL;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -206,13 +164,13 @@ xfs_dquot_buf_verify_crc(
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-STATIC bool
|
|
|
+STATIC xfs_failaddr_t
|
|
|
xfs_dquot_buf_verify(
|
|
|
struct xfs_mount *mp,
|
|
|
- struct xfs_buf *bp,
|
|
|
- int warn)
|
|
|
+ struct xfs_buf *bp)
|
|
|
{
|
|
|
struct xfs_dqblk *d = (struct xfs_dqblk *)bp->b_addr;
|
|
|
+ xfs_failaddr_t fa;
|
|
|
xfs_dqid_t id = 0;
|
|
|
int ndquots;
|
|
|
int i;
|
|
@@ -236,41 +194,43 @@ xfs_dquot_buf_verify(
|
|
|
*/
|
|
|
for (i = 0; i < ndquots; i++) {
|
|
|
struct xfs_disk_dquot *ddq;
|
|
|
- int error;
|
|
|
|
|
|
ddq = &d[i].dd_diskdq;
|
|
|
|
|
|
if (i == 0)
|
|
|
id = be32_to_cpu(ddq->d_id);
|
|
|
|
|
|
- error = xfs_dqcheck(mp, ddq, id + i, 0, warn, __func__);
|
|
|
- if (error)
|
|
|
- return false;
|
|
|
+ fa = xfs_dquot_verify(mp, ddq, id + i, 0, 0);
|
|
|
+ if (fa)
|
|
|
+ return fa;
|
|
|
}
|
|
|
- return true;
|
|
|
+
|
|
|
+ return NULL;
|
|
|
}
|
|
|
|
|
|
static xfs_failaddr_t
|
|
|
xfs_dquot_buf_verify_struct(
|
|
|
- struct xfs_buf *bp)
|
|
|
+ struct xfs_buf *bp)
|
|
|
{
|
|
|
struct xfs_mount *mp = bp->b_target->bt_mount;
|
|
|
|
|
|
- if (!xfs_dquot_buf_verify(mp, bp, 0))
|
|
|
- return __this_address;
|
|
|
- return NULL;
|
|
|
+ return xfs_dquot_buf_verify(mp, bp);
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
xfs_dquot_buf_read_verify(
|
|
|
- struct xfs_buf *bp)
|
|
|
+ struct xfs_buf *bp)
|
|
|
{
|
|
|
struct xfs_mount *mp = bp->b_target->bt_mount;
|
|
|
+ xfs_failaddr_t fa;
|
|
|
|
|
|
if (!xfs_dquot_buf_verify_crc(mp, bp))
|
|
|
xfs_verifier_error(bp, -EFSBADCRC, __this_address);
|
|
|
- else if (!xfs_dquot_buf_verify(mp, bp, XFS_QMOPT_DOWARN))
|
|
|
- xfs_verifier_error(bp, -EFSCORRUPTED, __this_address);
|
|
|
+ else {
|
|
|
+ fa = xfs_dquot_buf_verify(mp, bp);
|
|
|
+ if (fa)
|
|
|
+ xfs_verifier_error(bp, -EFSCORRUPTED, __this_address);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -286,7 +246,7 @@ xfs_dquot_buf_readahead_verify(
|
|
|
struct xfs_mount *mp = bp->b_target->bt_mount;
|
|
|
|
|
|
if (!xfs_dquot_buf_verify_crc(mp, bp) ||
|
|
|
- !xfs_dquot_buf_verify(mp, bp, 0)) {
|
|
|
+ xfs_dquot_buf_verify(mp, bp) != NULL) {
|
|
|
xfs_buf_ioerror(bp, -EIO);
|
|
|
bp->b_flags &= ~XBF_DONE;
|
|
|
}
|
|
@@ -299,14 +259,14 @@ xfs_dquot_buf_readahead_verify(
|
|
|
*/
|
|
|
static void
|
|
|
xfs_dquot_buf_write_verify(
|
|
|
- struct xfs_buf *bp)
|
|
|
+ struct xfs_buf *bp)
|
|
|
{
|
|
|
struct xfs_mount *mp = bp->b_target->bt_mount;
|
|
|
+ xfs_failaddr_t fa;
|
|
|
|
|
|
- if (!xfs_dquot_buf_verify(mp, bp, XFS_QMOPT_DOWARN)) {
|
|
|
+ fa = xfs_dquot_buf_verify(mp, bp);
|
|
|
+ if (fa)
|
|
|
xfs_verifier_error(bp, -EFSCORRUPTED, __this_address);
|
|
|
- return;
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
const struct xfs_buf_ops xfs_dquot_buf_ops = {
|