mirror of
https://github.com/raspberrypi/linux.git
synced 2026-01-04 18:27:36 +00:00
xfs: record rt group metadata errors in the health system
Record the state of per-rtgroup metadata sickness in the rtgroup structure for later reporting. Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
@@ -76,28 +76,31 @@ static int
|
||||
xfs_rtbuf_get(
|
||||
struct xfs_rtalloc_args *args,
|
||||
xfs_fileoff_t block, /* block number in bitmap or summary */
|
||||
int issum) /* is summary not bitmap */
|
||||
enum xfs_rtg_inodes type)
|
||||
{
|
||||
struct xfs_inode *ip = args->rtg->rtg_inodes[type];
|
||||
struct xfs_mount *mp = args->mp;
|
||||
struct xfs_buf **cbpp; /* cached block buffer */
|
||||
xfs_fileoff_t *coffp; /* cached block number */
|
||||
struct xfs_buf *bp; /* block buffer, result */
|
||||
struct xfs_inode *ip; /* bitmap or summary inode */
|
||||
struct xfs_bmbt_irec map;
|
||||
enum xfs_blft type;
|
||||
enum xfs_blft buf_type;
|
||||
int nmap = 1;
|
||||
int error;
|
||||
|
||||
if (issum) {
|
||||
switch (type) {
|
||||
case XFS_RTGI_SUMMARY:
|
||||
cbpp = &args->sumbp;
|
||||
coffp = &args->sumoff;
|
||||
ip = args->rtg->rtg_inodes[XFS_RTGI_SUMMARY];
|
||||
type = XFS_BLFT_RTSUMMARY_BUF;
|
||||
} else {
|
||||
buf_type = XFS_BLFT_RTSUMMARY_BUF;
|
||||
break;
|
||||
case XFS_RTGI_BITMAP:
|
||||
cbpp = &args->rbmbp;
|
||||
coffp = &args->rbmoff;
|
||||
ip = args->rtg->rtg_inodes[XFS_RTGI_BITMAP];
|
||||
type = XFS_BLFT_RTBITMAP_BUF;
|
||||
buf_type = XFS_BLFT_RTBITMAP_BUF;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -120,8 +123,7 @@ xfs_rtbuf_get(
|
||||
return error;
|
||||
|
||||
if (XFS_IS_CORRUPT(mp, nmap == 0 || !xfs_bmap_is_written_extent(&map))) {
|
||||
xfs_rt_mark_sick(mp, issum ? XFS_SICK_RT_SUMMARY :
|
||||
XFS_SICK_RT_BITMAP);
|
||||
xfs_rtginode_mark_sick(args->rtg, type);
|
||||
return -EFSCORRUPTED;
|
||||
}
|
||||
|
||||
@@ -130,12 +132,11 @@ xfs_rtbuf_get(
|
||||
XFS_FSB_TO_DADDR(mp, map.br_startblock),
|
||||
mp->m_bsize, 0, &bp, &xfs_rtbuf_ops);
|
||||
if (xfs_metadata_is_sick(error))
|
||||
xfs_rt_mark_sick(mp, issum ? XFS_SICK_RT_SUMMARY :
|
||||
XFS_SICK_RT_BITMAP);
|
||||
xfs_rtginode_mark_sick(args->rtg, type);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
xfs_trans_buf_set_type(args->tp, bp, type);
|
||||
xfs_trans_buf_set_type(args->tp, bp, buf_type);
|
||||
*cbpp = bp;
|
||||
*coffp = block;
|
||||
return 0;
|
||||
@@ -149,11 +150,11 @@ xfs_rtbitmap_read_buf(
|
||||
struct xfs_mount *mp = args->mp;
|
||||
|
||||
if (XFS_IS_CORRUPT(mp, block >= mp->m_sb.sb_rbmblocks)) {
|
||||
xfs_rt_mark_sick(mp, XFS_SICK_RT_BITMAP);
|
||||
xfs_rtginode_mark_sick(args->rtg, XFS_RTGI_BITMAP);
|
||||
return -EFSCORRUPTED;
|
||||
}
|
||||
|
||||
return xfs_rtbuf_get(args, block, 0);
|
||||
return xfs_rtbuf_get(args, block, XFS_RTGI_BITMAP);
|
||||
}
|
||||
|
||||
int
|
||||
@@ -164,10 +165,10 @@ xfs_rtsummary_read_buf(
|
||||
struct xfs_mount *mp = args->mp;
|
||||
|
||||
if (XFS_IS_CORRUPT(mp, block >= mp->m_rsumblocks)) {
|
||||
xfs_rt_mark_sick(args->mp, XFS_SICK_RT_SUMMARY);
|
||||
xfs_rtginode_mark_sick(args->rtg, XFS_RTGI_SUMMARY);
|
||||
return -EFSCORRUPTED;
|
||||
}
|
||||
return xfs_rtbuf_get(args, block, 1);
|
||||
return xfs_rtbuf_get(args, block, XFS_RTGI_SUMMARY);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user