mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
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: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
parent
b3751e6ab4
commit
19319b5321
@ -1835,8 +1835,8 @@ int ext4_inline_data_iomap(struct inode *inode, struct iomap *iomap)
|
||||
iomap->offset = 0;
|
||||
iomap->length = min_t(loff_t, ext4_get_inline_size(inode),
|
||||
i_size_read(inode));
|
||||
iomap->type = 0;
|
||||
iomap->flags = IOMAP_F_DATA_INLINE;
|
||||
iomap->type = IOMAP_INLINE;
|
||||
iomap->flags = 0;
|
||||
|
||||
out:
|
||||
up_read(&EXT4_I(inode)->xattr_sem);
|
||||
|
@ -680,8 +680,7 @@ static void gfs2_stuffed_iomap(struct inode *inode, struct iomap *iomap)
|
||||
sizeof(struct gfs2_dinode);
|
||||
iomap->offset = 0;
|
||||
iomap->length = i_size_read(inode);
|
||||
iomap->type = IOMAP_MAPPED;
|
||||
iomap->flags = IOMAP_F_DATA_INLINE;
|
||||
iomap->type = IOMAP_INLINE;
|
||||
}
|
||||
|
||||
/**
|
||||
|
21
fs/iomap.c
21
fs/iomap.c
@ -502,10 +502,13 @@ static int iomap_to_fiemap(struct fiemap_extent_info *fi,
|
||||
case IOMAP_DELALLOC:
|
||||
flags |= FIEMAP_EXTENT_DELALLOC | FIEMAP_EXTENT_UNKNOWN;
|
||||
break;
|
||||
case IOMAP_MAPPED:
|
||||
break;
|
||||
case IOMAP_UNWRITTEN:
|
||||
flags |= FIEMAP_EXTENT_UNWRITTEN;
|
||||
break;
|
||||
case IOMAP_MAPPED:
|
||||
case IOMAP_INLINE:
|
||||
flags |= FIEMAP_EXTENT_DATA_INLINE;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -513,8 +516,6 @@ static int iomap_to_fiemap(struct fiemap_extent_info *fi,
|
||||
flags |= FIEMAP_EXTENT_MERGED;
|
||||
if (iomap->flags & IOMAP_F_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,
|
||||
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,
|
||||
struct iomap_swapfile_info *isi = data;
|
||||
int error;
|
||||
|
||||
/* No inline data. */
|
||||
if (iomap->flags & IOMAP_F_DATA_INLINE) {
|
||||
switch (iomap->type) {
|
||||
case IOMAP_MAPPED:
|
||||
case IOMAP_UNWRITTEN:
|
||||
/* Only real or unwritten extents. */
|
||||
break;
|
||||
case IOMAP_INLINE:
|
||||
/* No inline data. */
|
||||
pr_err("swapon: file is inline\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Only real or unwritten extents. */
|
||||
if (iomap->type != IOMAP_MAPPED && iomap->type != IOMAP_UNWRITTEN) {
|
||||
default:
|
||||
pr_err("swapon: file has unallocated extents\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -18,6 +18,7 @@ struct vm_fault;
|
||||
#define IOMAP_DELALLOC 0x02 /* delayed allocation blocks */
|
||||
#define IOMAP_MAPPED 0x03 /* blocks allocated at @addr */
|
||||
#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:
|
||||
@ -34,7 +35,6 @@ struct vm_fault;
|
||||
*/
|
||||
#define IOMAP_F_MERGED 0x10 /* contains multiple blocks/extents */
|
||||
#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:
|
||||
|
Loading…
Reference in New Issue
Block a user