mirror of
https://github.com/torvalds/linux.git
synced 2026-05-21 13:27:57 +02:00
xfs: check for shared rt extents when rebuilding rt file's data fork
When we're rebuilding the data fork of a realtime file, we need to cross-reference each mapping with the rt refcount btree to ensure that the reflink flag is set if there are any shared extents found. Signed-off-by: "Darrick J. Wong" <djwong@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
92b2019493
commit
12f4d20328
|
|
@ -101,14 +101,21 @@ xrep_bmap_discover_shared(
|
|||
xfs_filblks_t blockcount)
|
||||
{
|
||||
struct xfs_scrub *sc = rb->sc;
|
||||
struct xfs_btree_cur *cur;
|
||||
xfs_agblock_t agbno;
|
||||
xfs_agblock_t fbno;
|
||||
xfs_extlen_t flen;
|
||||
int error;
|
||||
|
||||
agbno = XFS_FSB_TO_AGBNO(sc->mp, startblock);
|
||||
error = xfs_refcount_find_shared(sc->sa.refc_cur, agbno, blockcount,
|
||||
&fbno, &flen, false);
|
||||
if (XFS_IS_REALTIME_INODE(sc->ip)) {
|
||||
agbno = xfs_rtb_to_rgbno(sc->mp, startblock);
|
||||
cur = sc->sr.refc_cur;
|
||||
} else {
|
||||
agbno = XFS_FSB_TO_AGBNO(sc->mp, startblock);
|
||||
cur = sc->sa.refc_cur;
|
||||
}
|
||||
error = xfs_refcount_find_shared(cur, agbno, blockcount, &fbno, &flen,
|
||||
false);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
|
|
@ -450,7 +457,9 @@ xrep_bmap_scan_rtgroup(
|
|||
return 0;
|
||||
|
||||
error = xrep_rtgroup_init(sc, rtg, &sc->sr,
|
||||
XFS_RTGLOCK_RMAP | XFS_RTGLOCK_BITMAP_SHARED);
|
||||
XFS_RTGLOCK_RMAP |
|
||||
XFS_RTGLOCK_REFCOUNT |
|
||||
XFS_RTGLOCK_BITMAP_SHARED);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
|
|
@ -903,10 +912,6 @@ xrep_bmap_init_reflink_scan(
|
|||
if (whichfork != XFS_DATA_FORK)
|
||||
return RLS_IRRELEVANT;
|
||||
|
||||
/* cannot share realtime extents */
|
||||
if (XFS_IS_REALTIME_INODE(sc->ip))
|
||||
return RLS_IRRELEVANT;
|
||||
|
||||
return RLS_UNKNOWN;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user