Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 17de0a9f authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Dave Chinner
Browse files

iomap: don't set FIEMAP_EXTENT_MERGED for extent based filesystems



Filesystems like XFS that use extents should not set the
FIEMAP_EXTENT_MERGED flag in the fiemap extent structures.  To allow
for both behaviors for the upcoming gfs2 usage split the iomap
type field into type and flags, and only set FIEMAP_EXTENT_MERGED if
the IOMAP_F_MERGED flag is set.  The flags field will also come in
handy for future features such as shared extents on reflink-enabled
file systems.

Reported-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Acked-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
parent 800b2694
Loading
Loading
Loading
Loading
+4 −1
Original line number Original line Diff line number Diff line
@@ -428,9 +428,12 @@ static int iomap_to_fiemap(struct fiemap_extent_info *fi,
		break;
		break;
	}
	}


	if (iomap->flags & IOMAP_F_MERGED)
		flags |= FIEMAP_EXTENT_MERGED;

	return fiemap_fill_next_extent(fi, iomap->offset,
	return fiemap_fill_next_extent(fi, iomap->offset,
			iomap->blkno != IOMAP_NULL_BLOCK ? iomap->blkno << 9: 0,
			iomap->blkno != IOMAP_NULL_BLOCK ? iomap->blkno << 9: 0,
			iomap->length, flags | FIEMAP_EXTENT_MERGED);
			iomap->length, flags);


}
}


+7 −1
Original line number Original line Diff line number Diff line
@@ -18,6 +18,11 @@ struct vm_fault;
#define IOMAP_MAPPED	0x03	/* blocks allocated @blkno */
#define IOMAP_MAPPED	0x03	/* blocks allocated @blkno */
#define IOMAP_UNWRITTEN	0x04	/* blocks allocated @blkno in unwritten state */
#define IOMAP_UNWRITTEN	0x04	/* blocks allocated @blkno in unwritten state */


/*
 * Flags for iomap mappings:
 */
#define IOMAP_F_MERGED	0x01	/* contains multiple blocks/extents */

/*
/*
 * Magic value for blkno:
 * Magic value for blkno:
 */
 */
@@ -27,7 +32,8 @@ struct iomap {
	sector_t		blkno;	/* 1st sector of mapping, 512b units */
	sector_t		blkno;	/* 1st sector of mapping, 512b units */
	loff_t			offset;	/* file offset of mapping, bytes */
	loff_t			offset;	/* file offset of mapping, bytes */
	u64			length;	/* length of mapping, bytes */
	u64			length;	/* length of mapping, bytes */
	int			type;	/* type of mapping */
	u16			type;	/* type of mapping */
	u16			flags;	/* flags for mapping */
	struct block_device	*bdev;	/* block device for I/O */
	struct block_device	*bdev;	/* block device for I/O */
};
};