mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-03 09:04:21 +08:00
xfs: limit xfs_imap_to_bmap to a single mapping
We only call xfs_iomap for single mappings anyway, so remove all code dealing with multiple mappings from xfs_imap_to_bmap and add asserts that we never get results that we do not expect. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Alex Elder <aelder@sgi.com>
This commit is contained in:
parent
4a5224d7b1
commit
826bf0adce
@ -55,49 +55,41 @@
|
||||
#define XFS_STRAT_WRITE_IMAPS 2
|
||||
#define XFS_WRITE_IMAPS XFS_BMAP_MAX_NMAP
|
||||
|
||||
STATIC int
|
||||
STATIC void
|
||||
xfs_imap_to_bmap(
|
||||
xfs_inode_t *ip,
|
||||
xfs_off_t offset,
|
||||
xfs_bmbt_irec_t *imap,
|
||||
xfs_iomap_t *iomapp,
|
||||
int imaps, /* Number of imap entries */
|
||||
int iomaps, /* Number of iomap entries */
|
||||
int flags)
|
||||
{
|
||||
xfs_mount_t *mp = ip->i_mount;
|
||||
int pbm;
|
||||
xfs_fsblock_t start_block;
|
||||
|
||||
iomapp->iomap_offset = XFS_FSB_TO_B(mp, imap->br_startoff);
|
||||
iomapp->iomap_delta = offset - iomapp->iomap_offset;
|
||||
iomapp->iomap_bsize = XFS_FSB_TO_B(mp, imap->br_blockcount);
|
||||
iomapp->iomap_flags = flags;
|
||||
|
||||
for (pbm = 0; imaps && pbm < iomaps; imaps--, iomapp++, imap++, pbm++) {
|
||||
iomapp->iomap_offset = XFS_FSB_TO_B(mp, imap->br_startoff);
|
||||
iomapp->iomap_delta = offset - iomapp->iomap_offset;
|
||||
iomapp->iomap_bsize = XFS_FSB_TO_B(mp, imap->br_blockcount);
|
||||
iomapp->iomap_flags = flags;
|
||||
|
||||
if (XFS_IS_REALTIME_INODE(ip)) {
|
||||
iomapp->iomap_flags |= IOMAP_REALTIME;
|
||||
iomapp->iomap_target = mp->m_rtdev_targp;
|
||||
} else {
|
||||
iomapp->iomap_target = mp->m_ddev_targp;
|
||||
}
|
||||
start_block = imap->br_startblock;
|
||||
if (start_block == HOLESTARTBLOCK) {
|
||||
iomapp->iomap_bn = IOMAP_DADDR_NULL;
|
||||
iomapp->iomap_flags |= IOMAP_HOLE;
|
||||
} else if (start_block == DELAYSTARTBLOCK) {
|
||||
iomapp->iomap_bn = IOMAP_DADDR_NULL;
|
||||
iomapp->iomap_flags |= IOMAP_DELAY;
|
||||
} else {
|
||||
iomapp->iomap_bn = xfs_fsb_to_db(ip, start_block);
|
||||
if (ISUNWRITTEN(imap))
|
||||
iomapp->iomap_flags |= IOMAP_UNWRITTEN;
|
||||
}
|
||||
|
||||
offset += iomapp->iomap_bsize - iomapp->iomap_delta;
|
||||
if (XFS_IS_REALTIME_INODE(ip)) {
|
||||
iomapp->iomap_flags |= IOMAP_REALTIME;
|
||||
iomapp->iomap_target = mp->m_rtdev_targp;
|
||||
} else {
|
||||
iomapp->iomap_target = mp->m_ddev_targp;
|
||||
}
|
||||
start_block = imap->br_startblock;
|
||||
if (start_block == HOLESTARTBLOCK) {
|
||||
iomapp->iomap_bn = IOMAP_DADDR_NULL;
|
||||
iomapp->iomap_flags |= IOMAP_HOLE;
|
||||
} else if (start_block == DELAYSTARTBLOCK) {
|
||||
iomapp->iomap_bn = IOMAP_DADDR_NULL;
|
||||
iomapp->iomap_flags |= IOMAP_DELAY;
|
||||
} else {
|
||||
iomapp->iomap_bn = xfs_fsb_to_db(ip, start_block);
|
||||
if (ISUNWRITTEN(imap))
|
||||
iomapp->iomap_flags |= IOMAP_UNWRITTEN;
|
||||
}
|
||||
return pbm; /* Return the number filled */
|
||||
}
|
||||
|
||||
int
|
||||
@ -119,6 +111,7 @@ xfs_iomap(
|
||||
int iomap_flags = 0;
|
||||
|
||||
ASSERT((ip->i_d.di_mode & S_IFMT) == S_IFREG);
|
||||
ASSERT(niomaps && *niomaps == 1);
|
||||
|
||||
if (XFS_FORCED_SHUTDOWN(mp))
|
||||
return XFS_ERROR(EIO);
|
||||
@ -203,12 +196,11 @@ xfs_iomap(
|
||||
break;
|
||||
}
|
||||
|
||||
if (nimaps) {
|
||||
*niomaps = xfs_imap_to_bmap(ip, offset, &imap,
|
||||
iomapp, nimaps, *niomaps, iomap_flags);
|
||||
} else if (niomaps) {
|
||||
*niomaps = 0;
|
||||
}
|
||||
ASSERT(nimaps <= 1);
|
||||
|
||||
if (nimaps)
|
||||
xfs_imap_to_bmap(ip, offset, &imap, iomapp, nimaps, iomap_flags);
|
||||
*niomaps = nimaps;
|
||||
|
||||
out:
|
||||
if (lockmode)
|
||||
|
Loading…
Reference in New Issue
Block a user