Report the iomap_bn field of struct xfs_iomap in terms of filesystem blocks
instead of in terms of bytes. Shift the byte conversions into the caller,
and replace the IOMAP_DELAY and IOMAP_HOLE flag checks with checks for
HOLESTARTBLOCK and DELAYSTARTBLOCK.
Signed-off-by: Christoph Hellwig <hch@xxxxxx>
Index: xfs/fs/xfs/linux-2.6/xfs_aops.c
===================================================================
--- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c 2010-04-27 17:39:18.329254483
+0200
+++ xfs/fs/xfs/linux-2.6/xfs_aops.c 2010-04-27 17:39:20.699003542 +0200
@@ -567,10 +567,12 @@ xfs_map_buffer(
sector_t bn;
struct xfs_mount *m = XFS_I(inode)->i_mount;
xfs_off_t iomap_offset = XFS_FSB_TO_B(m,
mp->iomap_offset);
+ xfs_daddr_t iomap_bn = xfs_fsb_to_db(XFS_I(inode),
mp->iomap_bn);
- ASSERT(mp->iomap_bn != IOMAP_DADDR_NULL);
+ ASSERT(mp->iomap_bn != HOLESTARTBLOCK);
+ ASSERT(mp->iomap_bn != DELAYSTARTBLOCK);
- bn = (mp->iomap_bn >> (inode->i_blkbits - BBSHIFT)) +
+ bn = (iomap_bn >> (inode->i_blkbits - BBSHIFT)) +
((offset - iomap_offset) >> inode->i_blkbits);
ASSERT(bn || XFS_IS_REALTIME_INODE(XFS_I(inode)));
@@ -586,8 +588,8 @@ xfs_map_at_offset(
xfs_iomap_t *iomapp,
xfs_off_t offset)
{
- ASSERT(!(iomapp->iomap_flags & IOMAP_HOLE));
- ASSERT(!(iomapp->iomap_flags & IOMAP_DELAY));
+ ASSERT(iomapp->iomap_bn != HOLESTARTBLOCK);
+ ASSERT(iomapp->iomap_bn != DELAYSTARTBLOCK);
lock_buffer(bh);
xfs_map_buffer(inode, bh, iomapp, offset);
@@ -817,8 +819,8 @@ xfs_convert_page(
continue;
}
- ASSERT(!(mp->iomap_flags & IOMAP_HOLE));
- ASSERT(!(mp->iomap_flags & IOMAP_DELAY));
+ ASSERT(mp->iomap_bn != HOLESTARTBLOCK);
+ ASSERT(mp->iomap_bn != DELAYSTARTBLOCK);
xfs_map_at_offset(inode, bh, mp, offset);
if (startio) {
@@ -1477,7 +1479,8 @@ __xfs_get_blocks(
if (niomap == 0)
return 0;
- if (iomap.iomap_bn != IOMAP_DADDR_NULL) {
+ if (iomap.iomap_bn != HOLESTARTBLOCK &&
+ iomap.iomap_bn != DELAYSTARTBLOCK) {
/*
* For unwritten extents do not report a disk address on
* the read case (treat as if we're reading into a hole).
@@ -1512,7 +1515,7 @@ __xfs_get_blocks(
(iomap.iomap_flags & (IOMAP_NEW|IOMAP_UNWRITTEN))))
set_buffer_new(bh_result);
- if (iomap.iomap_flags & IOMAP_DELAY) {
+ if (iomap.iomap_bn == DELAYSTARTBLOCK) {
BUG_ON(direct);
if (create) {
set_buffer_uptodate(bh_result);
Index: xfs/fs/xfs/xfs_iomap.c
===================================================================
--- xfs.orig/fs/xfs/xfs_iomap.c 2010-04-27 17:39:18.313003820 +0200
+++ xfs/fs/xfs/xfs_iomap.c 2010-04-27 17:39:20.700004101 +0200
@@ -64,24 +64,15 @@ xfs_imap_to_bmap(
int imaps, /* Number of imap entries */
int flags)
{
- xfs_fsblock_t start_block;
-
iomapp->iomap_offset = imap->br_startoff;
iomapp->iomap_bsize = imap->br_blockcount;
iomapp->iomap_flags = flags;
+ iomapp->iomap_bn = imap->br_startblock;
- 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;
- }
+ if (imap->br_startblock != HOLESTARTBLOCK &&
+ imap->br_startblock != DELAYSTARTBLOCK &&
+ ISUNWRITTEN(imap))
+ iomapp->iomap_flags |= IOMAP_UNWRITTEN;
}
int
Index: xfs/fs/xfs/xfs_iomap.h
===================================================================
--- xfs.orig/fs/xfs/xfs_iomap.h 2010-04-27 17:39:18.339273969 +0200
+++ xfs/fs/xfs/xfs_iomap.h 2010-04-27 17:39:27.783067167 +0200
@@ -18,12 +18,8 @@
#ifndef __XFS_IOMAP_H__
#define __XFS_IOMAP_H__
-#define IOMAP_DADDR_NULL ((xfs_daddr_t) (-1LL))
-
-
typedef enum { /* iomap_flags values */
IOMAP_READ = 0, /* mapping for a read */
- IOMAP_HOLE = 0x02, /* mapping covers a hole */
IOMAP_DELAY = 0x04, /* mapping covers delalloc region */
IOMAP_UNWRITTEN = 0x20, /* mapping covers allocated */
/* but uninitialized file data */
|