OSDN Git Service

iomap: inline data should be an iomap type, not a flag
authorChristoph Hellwig <hch@lst.de>
Fri, 1 Jun 2018 16:03:06 +0000 (09:03 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Sat, 2 Jun 2018 01:37:32 +0000 (18:37 -0700)
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>
fs/ext4/inline.c
fs/gfs2/bmap.c
fs/iomap.c
include/linux/iomap.h

index 70cf4c7..e1f0089 100644 (file)
@@ -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);
index 278ed08..cbeedd3 100644 (file)
@@ -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;
 }
 
 /**
index f2456d0..df2652b 100644 (file)
@@ -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;
        }
index 4bd8729..8f7095f 100644 (file)
@@ -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: