Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8856a657 authored by Darrick J. Wong's avatar Darrick J. Wong Committed by Greg Kroah-Hartman
Browse files

xfs: convert EIO to EFSCORRUPTED when log contents are invalid



commit 895e196fb6f84402dcd0c1d3c3feb8a58049564e upstream.

Convert EIO to EFSCORRUPTED in the logging code when we can determine
that the log contents are invalid.

Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Acked-by: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarChandan Babu R <chandan.babu@oracle.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9185003c
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -456,7 +456,7 @@ xfs_bui_recover(
	if (buip->bui_format.bui_nextents != XFS_BUI_MAX_FAST_EXTENTS) {
		set_bit(XFS_BUI_RECOVERED, &buip->bui_flags);
		xfs_bui_release(buip);
		return -EIO;
		return -EFSCORRUPTED;
	}

	/*
@@ -490,7 +490,7 @@ xfs_bui_recover(
		 */
		set_bit(XFS_BUI_RECOVERED, &buip->bui_flags);
		xfs_bui_release(buip);
		return -EIO;
		return -EFSCORRUPTED;
	}

	error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate,
+1 −1
Original line number Diff line number Diff line
@@ -624,7 +624,7 @@ xfs_efi_recover(
			 */
			set_bit(XFS_EFI_RECOVERED, &efip->efi_flags);
			xfs_efi_release(efip);
			return -EIO;
			return -EFSCORRUPTED;
		}
	}

+16 −16
Original line number Diff line number Diff line
@@ -471,7 +471,7 @@ xlog_find_verify_log_record(
			xfs_warn(log->l_mp,
		"Log inconsistent (didn't find previous header)");
			ASSERT(0);
			error = -EIO;
			error = -EFSCORRUPTED;
			goto out;
		}

@@ -1350,7 +1350,7 @@ xlog_find_tail(
		return error;
	if (!error) {
		xfs_warn(log->l_mp, "%s: couldn't find sync record", __func__);
		return -EIO;
		return -EFSCORRUPTED;
	}
	*tail_blk = BLOCK_LSN(be64_to_cpu(rhead->h_tail_lsn));

@@ -3166,7 +3166,7 @@ xlog_recover_inode_pass2(
		default:
			xfs_warn(log->l_mp, "%s: Invalid flag", __func__);
			ASSERT(0);
			error = -EIO;
			error = -EFSCORRUPTED;
			goto out_release;
		}
	}
@@ -3247,12 +3247,12 @@ xlog_recover_dquot_pass2(
	recddq = item->ri_buf[1].i_addr;
	if (recddq == NULL) {
		xfs_alert(log->l_mp, "NULL dquot in %s.", __func__);
		return -EIO;
		return -EFSCORRUPTED;
	}
	if (item->ri_buf[1].i_len < sizeof(xfs_disk_dquot_t)) {
		xfs_alert(log->l_mp, "dquot too small (%d) in %s.",
			item->ri_buf[1].i_len, __func__);
		return -EIO;
		return -EFSCORRUPTED;
	}

	/*
@@ -3279,7 +3279,7 @@ xlog_recover_dquot_pass2(
	if (fa) {
		xfs_alert(mp, "corrupt dquot ID 0x%x in log at %pS",
				dq_f->qlf_id, fa);
		return -EIO;
		return -EFSCORRUPTED;
	}
	ASSERT(dq_f->qlf_len == 1);

@@ -4018,7 +4018,7 @@ xlog_recover_commit_pass1(
		xfs_warn(log->l_mp, "%s: invalid item type (%d)",
			__func__, ITEM_TYPE(item));
		ASSERT(0);
		return -EIO;
		return -EFSCORRUPTED;
	}
}

@@ -4066,7 +4066,7 @@ xlog_recover_commit_pass2(
		xfs_warn(log->l_mp, "%s: invalid item type (%d)",
			__func__, ITEM_TYPE(item));
		ASSERT(0);
		return -EIO;
		return -EFSCORRUPTED;
	}
}

@@ -4187,7 +4187,7 @@ xlog_recover_add_to_cont_trans(
		ASSERT(len <= sizeof(struct xfs_trans_header));
		if (len > sizeof(struct xfs_trans_header)) {
			xfs_warn(log->l_mp, "%s: bad header length", __func__);
			return -EIO;
			return -EFSCORRUPTED;
		}

		xlog_recover_add_item(&trans->r_itemq);
@@ -4243,13 +4243,13 @@ xlog_recover_add_to_trans(
			xfs_warn(log->l_mp, "%s: bad header magic number",
				__func__);
			ASSERT(0);
			return -EIO;
			return -EFSCORRUPTED;
		}

		if (len > sizeof(struct xfs_trans_header)) {
			xfs_warn(log->l_mp, "%s: bad header length", __func__);
			ASSERT(0);
			return -EIO;
			return -EFSCORRUPTED;
		}

		/*
@@ -4285,7 +4285,7 @@ xlog_recover_add_to_trans(
				  in_f->ilf_size);
			ASSERT(0);
			kmem_free(ptr);
			return -EIO;
			return -EFSCORRUPTED;
		}

		item->ri_total = in_f->ilf_size;
@@ -4389,7 +4389,7 @@ xlog_recovery_process_trans(
	default:
		xfs_warn(log->l_mp, "%s: bad flag 0x%x", __func__, flags);
		ASSERT(0);
		error = -EIO;
		error = -EFSCORRUPTED;
		break;
	}
	if (error || freeit)
@@ -4469,7 +4469,7 @@ xlog_recover_process_ophdr(
		xfs_warn(log->l_mp, "%s: bad clientid 0x%x",
			__func__, ohead->oh_clientid);
		ASSERT(0);
		return -EIO;
		return -EFSCORRUPTED;
	}

	/*
@@ -4479,7 +4479,7 @@ xlog_recover_process_ophdr(
	if (dp + len > end) {
		xfs_warn(log->l_mp, "%s: bad length 0x%x", __func__, len);
		WARN_ON(1);
		return -EIO;
		return -EFSCORRUPTED;
	}

	trans = xlog_recover_ophdr_to_trans(rhash, rhead, ohead);
@@ -5209,7 +5209,7 @@ xlog_valid_rec_header(
	    (be32_to_cpu(rhead->h_version) & (~XLOG_VERSION_OKBITS))))) {
		xfs_warn(log->l_mp, "%s: unrecognised log version (%d).",
			__func__, be32_to_cpu(rhead->h_version));
		return -EIO;
		return -EFSCORRUPTED;
	}

	/* LR body must have data or it wouldn't have been written */
+1 −1
Original line number Diff line number Diff line
@@ -497,7 +497,7 @@ xfs_cui_recover(
			 */
			set_bit(XFS_CUI_RECOVERED, &cuip->cui_flags);
			xfs_cui_release(cuip);
			return -EIO;
			return -EFSCORRUPTED;
		}
	}

+1 −1
Original line number Diff line number Diff line
@@ -539,7 +539,7 @@ xfs_rui_recover(
			 */
			set_bit(XFS_RUI_RECOVERED, &ruip->rui_flags);
			xfs_rui_release(ruip);
			return -EIO;
			return -EFSCORRUPTED;
		}
	}