mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-11 23:03:55 +08:00
iomap: switch iomap_bmap to use iomap_iter
Rewrite the ->bmap implementation based on iomap_iter. Signed-off-by: Christoph Hellwig <hch@lst.de> [djwong: restructure the loop to make its behavior a little clearer] Reviewed-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Dave Chinner <dchinner@redhat.com>
This commit is contained in:
parent
7892386d35
commit
6d8a1287a4
@ -92,37 +92,32 @@ int iomap_fiemap(struct inode *inode, struct fiemap_extent_info *fi,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iomap_fiemap);
|
||||
|
||||
static loff_t
|
||||
iomap_bmap_actor(struct inode *inode, loff_t pos, loff_t length,
|
||||
void *data, struct iomap *iomap, struct iomap *srcmap)
|
||||
{
|
||||
sector_t *bno = data, addr;
|
||||
|
||||
if (iomap->type == IOMAP_MAPPED) {
|
||||
addr = (pos - iomap->offset + iomap->addr) >> inode->i_blkbits;
|
||||
*bno = addr;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* legacy ->bmap interface. 0 is the error return (!) */
|
||||
sector_t
|
||||
iomap_bmap(struct address_space *mapping, sector_t bno,
|
||||
const struct iomap_ops *ops)
|
||||
{
|
||||
struct inode *inode = mapping->host;
|
||||
loff_t pos = bno << inode->i_blkbits;
|
||||
unsigned blocksize = i_blocksize(inode);
|
||||
struct iomap_iter iter = {
|
||||
.inode = mapping->host,
|
||||
.pos = (loff_t)bno << mapping->host->i_blkbits,
|
||||
.len = i_blocksize(mapping->host),
|
||||
.flags = IOMAP_REPORT,
|
||||
};
|
||||
const unsigned int blkshift = mapping->host->i_blkbits - SECTOR_SHIFT;
|
||||
int ret;
|
||||
|
||||
if (filemap_write_and_wait(mapping))
|
||||
return 0;
|
||||
|
||||
bno = 0;
|
||||
ret = iomap_apply(inode, pos, blocksize, 0, ops, &bno,
|
||||
iomap_bmap_actor);
|
||||
while ((ret = iomap_iter(&iter, ops)) > 0) {
|
||||
if (iter.iomap.type == IOMAP_MAPPED)
|
||||
bno = iomap_sector(&iter.iomap, iter.pos) >> blkshift;
|
||||
/* leave iter.processed unset to abort loop */
|
||||
}
|
||||
if (ret)
|
||||
return 0;
|
||||
|
||||
return bno;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iomap_bmap);
|
||||
|
Loading…
Reference in New Issue
Block a user