mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-28 17:18:39 -05:00
Merge tag 'rtgroups-prep-6.13_2024-11-05' of https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux into staging-merge
xfs: preparation for realtime allocation groups [v5.5 05/10] Prepare for realtime groups by adding a few bug fixes and generic code that will be necessary. With a bit of luck, this should all go splendidly. Signed-off-by: Darrick J. Wong <djwong@kernel.org>
This commit is contained in:
@@ -1601,6 +1601,8 @@ iomap_ioend_can_merge(struct iomap_ioend *ioend, struct iomap_ioend *next)
|
||||
{
|
||||
if (ioend->io_bio.bi_status != next->io_bio.bi_status)
|
||||
return false;
|
||||
if (next->io_flags & IOMAP_F_BOUNDARY)
|
||||
return false;
|
||||
if ((ioend->io_flags & IOMAP_F_SHARED) ^
|
||||
(next->io_flags & IOMAP_F_SHARED))
|
||||
return false;
|
||||
@@ -1720,6 +1722,8 @@ static struct iomap_ioend *iomap_alloc_ioend(struct iomap_writepage_ctx *wpc,
|
||||
INIT_LIST_HEAD(&ioend->io_list);
|
||||
ioend->io_type = wpc->iomap.type;
|
||||
ioend->io_flags = wpc->iomap.flags;
|
||||
if (pos > wpc->iomap.offset)
|
||||
wpc->iomap.flags &= ~IOMAP_F_BOUNDARY;
|
||||
ioend->io_inode = inode;
|
||||
ioend->io_size = 0;
|
||||
ioend->io_offset = pos;
|
||||
@@ -1731,6 +1735,8 @@ static struct iomap_ioend *iomap_alloc_ioend(struct iomap_writepage_ctx *wpc,
|
||||
|
||||
static bool iomap_can_add_to_ioend(struct iomap_writepage_ctx *wpc, loff_t pos)
|
||||
{
|
||||
if (wpc->iomap.offset == pos && (wpc->iomap.flags & IOMAP_F_BOUNDARY))
|
||||
return false;
|
||||
if ((wpc->iomap.flags & IOMAP_F_SHARED) !=
|
||||
(wpc->ioend->io_flags & IOMAP_F_SHARED))
|
||||
return false;
|
||||
|
||||
@@ -480,7 +480,7 @@ xfs_discard_rtdev_extents(
|
||||
trace_xfs_discard_rtextent(mp, busyp->bno, busyp->length);
|
||||
|
||||
error = __blkdev_issue_discard(bdev,
|
||||
XFS_FSB_TO_BB(mp, busyp->bno),
|
||||
xfs_rtb_to_daddr(mp, busyp->bno),
|
||||
XFS_FSB_TO_BB(mp, busyp->length),
|
||||
GFP_NOFS, &bio);
|
||||
if (error)
|
||||
@@ -612,22 +612,25 @@ xfs_trim_rtdev_extents(
|
||||
xfs_rtblock_t start_rtbno, end_rtbno;
|
||||
xfs_rtxnum_t start_rtx, end_rtx;
|
||||
xfs_rgnumber_t start_rgno, end_rgno;
|
||||
xfs_daddr_t daddr_offset;
|
||||
int last_error = 0, error;
|
||||
struct xfs_rtgroup *rtg = NULL;
|
||||
|
||||
/* Shift the start and end downwards to match the rt device. */
|
||||
start_rtbno = xfs_daddr_to_rtb(mp, start);
|
||||
if (start_rtbno > mp->m_sb.sb_dblocks)
|
||||
start_rtbno -= mp->m_sb.sb_dblocks;
|
||||
daddr_offset = XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks);
|
||||
if (start > daddr_offset)
|
||||
start -= daddr_offset;
|
||||
else
|
||||
start_rtbno = 0;
|
||||
start = 0;
|
||||
start_rtbno = xfs_daddr_to_rtb(mp, start);
|
||||
start_rtx = xfs_rtb_to_rtx(mp, start_rtbno);
|
||||
start_rgno = xfs_rtb_to_rgno(mp, start_rtbno);
|
||||
|
||||
end_rtbno = xfs_daddr_to_rtb(mp, end);
|
||||
if (end_rtbno <= mp->m_sb.sb_dblocks)
|
||||
if (end <= daddr_offset)
|
||||
return 0;
|
||||
end_rtbno -= mp->m_sb.sb_dblocks;
|
||||
else
|
||||
end -= daddr_offset;
|
||||
end_rtbno = xfs_daddr_to_rtb(mp, end);
|
||||
end_rtx = xfs_rtb_to_rtx(mp, end_rtbno + mp->m_sb.sb_rextsize - 1);
|
||||
end_rgno = xfs_rtb_to_rgno(mp, end_rtbno);
|
||||
|
||||
|
||||
@@ -53,6 +53,9 @@ struct vm_fault;
|
||||
*
|
||||
* IOMAP_F_XATTR indicates that the iomap is for an extended attribute extent
|
||||
* rather than a file data extent.
|
||||
*
|
||||
* IOMAP_F_BOUNDARY indicates that I/O and I/O completions for this iomap must
|
||||
* never be merged with the mapping before it.
|
||||
*/
|
||||
#define IOMAP_F_NEW (1U << 0)
|
||||
#define IOMAP_F_DIRTY (1U << 1)
|
||||
@@ -64,6 +67,7 @@ struct vm_fault;
|
||||
#define IOMAP_F_BUFFER_HEAD 0
|
||||
#endif /* CONFIG_BUFFER_HEAD */
|
||||
#define IOMAP_F_XATTR (1U << 5)
|
||||
#define IOMAP_F_BOUNDARY (1U << 6)
|
||||
|
||||
/*
|
||||
* Flags set by the core iomap code during operations:
|
||||
|
||||
Reference in New Issue
Block a user