Commit 19319b53 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Darrick J. Wong

iomap: inline data should be an iomap type, not a flag

Inline data is fundamentally different from our normal mapped case in that
it doesn't even have a block address.  So instead of having a flag for it
it should be an entirely separate iomap range type.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
parent b3751e6a
...@@ -1835,8 +1835,8 @@ int ext4_inline_data_iomap(struct inode *inode, struct iomap *iomap) ...@@ -1835,8 +1835,8 @@ int ext4_inline_data_iomap(struct inode *inode, struct iomap *iomap)
iomap->offset = 0; iomap->offset = 0;
iomap->length = min_t(loff_t, ext4_get_inline_size(inode), iomap->length = min_t(loff_t, ext4_get_inline_size(inode),
i_size_read(inode)); i_size_read(inode));
iomap->type = 0; iomap->type = IOMAP_INLINE;
iomap->flags = IOMAP_F_DATA_INLINE; iomap->flags = 0;
out: out:
up_read(&EXT4_I(inode)->xattr_sem); up_read(&EXT4_I(inode)->xattr_sem);
......
...@@ -680,8 +680,7 @@ static void gfs2_stuffed_iomap(struct inode *inode, struct iomap *iomap) ...@@ -680,8 +680,7 @@ static void gfs2_stuffed_iomap(struct inode *inode, struct iomap *iomap)
sizeof(struct gfs2_dinode); sizeof(struct gfs2_dinode);
iomap->offset = 0; iomap->offset = 0;
iomap->length = i_size_read(inode); iomap->length = i_size_read(inode);
iomap->type = IOMAP_MAPPED; iomap->type = IOMAP_INLINE;
iomap->flags = IOMAP_F_DATA_INLINE;
} }
/** /**
......
...@@ -502,10 +502,13 @@ static int iomap_to_fiemap(struct fiemap_extent_info *fi, ...@@ -502,10 +502,13 @@ static int iomap_to_fiemap(struct fiemap_extent_info *fi,
case IOMAP_DELALLOC: case IOMAP_DELALLOC:
flags |= FIEMAP_EXTENT_DELALLOC | FIEMAP_EXTENT_UNKNOWN; flags |= FIEMAP_EXTENT_DELALLOC | FIEMAP_EXTENT_UNKNOWN;
break; break;
case IOMAP_MAPPED:
break;
case IOMAP_UNWRITTEN: case IOMAP_UNWRITTEN:
flags |= FIEMAP_EXTENT_UNWRITTEN; flags |= FIEMAP_EXTENT_UNWRITTEN;
break; break;
case IOMAP_MAPPED: case IOMAP_INLINE:
flags |= FIEMAP_EXTENT_DATA_INLINE;
break; break;
} }
...@@ -513,8 +516,6 @@ static int iomap_to_fiemap(struct fiemap_extent_info *fi, ...@@ -513,8 +516,6 @@ static int iomap_to_fiemap(struct fiemap_extent_info *fi,
flags |= FIEMAP_EXTENT_MERGED; flags |= FIEMAP_EXTENT_MERGED;
if (iomap->flags & IOMAP_F_SHARED) if (iomap->flags & IOMAP_F_SHARED)
flags |= FIEMAP_EXTENT_SHARED; flags |= FIEMAP_EXTENT_SHARED;
if (iomap->flags & IOMAP_F_DATA_INLINE)
flags |= FIEMAP_EXTENT_DATA_INLINE;
return fiemap_fill_next_extent(fi, iomap->offset, return fiemap_fill_next_extent(fi, iomap->offset,
iomap->addr != IOMAP_NULL_ADDR ? iomap->addr : 0, iomap->addr != IOMAP_NULL_ADDR ? iomap->addr : 0,
...@@ -1214,14 +1215,16 @@ static loff_t iomap_swapfile_activate_actor(struct inode *inode, loff_t pos, ...@@ -1214,14 +1215,16 @@ static loff_t iomap_swapfile_activate_actor(struct inode *inode, loff_t pos,
struct iomap_swapfile_info *isi = data; struct iomap_swapfile_info *isi = data;
int error; int error;
switch (iomap->type) {
case IOMAP_MAPPED:
case IOMAP_UNWRITTEN:
/* Only real or unwritten extents. */
break;
case IOMAP_INLINE:
/* No inline data. */ /* No inline data. */
if (iomap->flags & IOMAP_F_DATA_INLINE) {
pr_err("swapon: file is inline\n"); pr_err("swapon: file is inline\n");
return -EINVAL; return -EINVAL;
} default:
/* Only real or unwritten extents. */
if (iomap->type != IOMAP_MAPPED && iomap->type != IOMAP_UNWRITTEN) {
pr_err("swapon: file has unallocated extents\n"); pr_err("swapon: file has unallocated extents\n");
return -EINVAL; return -EINVAL;
} }
......
...@@ -18,6 +18,7 @@ struct vm_fault; ...@@ -18,6 +18,7 @@ struct vm_fault;
#define IOMAP_DELALLOC 0x02 /* delayed allocation blocks */ #define IOMAP_DELALLOC 0x02 /* delayed allocation blocks */
#define IOMAP_MAPPED 0x03 /* blocks allocated at @addr */ #define IOMAP_MAPPED 0x03 /* blocks allocated at @addr */
#define IOMAP_UNWRITTEN 0x04 /* blocks allocated at @addr in unwritten state */ #define IOMAP_UNWRITTEN 0x04 /* blocks allocated at @addr in unwritten state */
#define IOMAP_INLINE 0x05 /* data inline in the inode */
/* /*
* Flags for all iomap mappings: * Flags for all iomap mappings:
...@@ -34,7 +35,6 @@ struct vm_fault; ...@@ -34,7 +35,6 @@ struct vm_fault;
*/ */
#define IOMAP_F_MERGED 0x10 /* contains multiple blocks/extents */ #define IOMAP_F_MERGED 0x10 /* contains multiple blocks/extents */
#define IOMAP_F_SHARED 0x20 /* block shared with another file */ #define IOMAP_F_SHARED 0x20 /* block shared with another file */
#define IOMAP_F_DATA_INLINE 0x40 /* data inline in the inode */
/* /*
* Magic value for addr: * Magic value for addr:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment