diff options
author | Christoph Hellwig <hch@lst.de> | 2016-10-20 00:51:28 -0400 |
---|---|---|
committer | Dave Chinner <david@fromorbit.com> | 2016-10-20 00:51:28 -0400 |
commit | d33fd776f992332be110f6ceca6dad60cb5d513f (patch) | |
tree | 9c1a91b8e168edf4ff798ce9d821a55ac76fabef | |
parent | 5faaf4fa0a20d38edc4df57baf24ea35b7e91178 (diff) |
iomap: add IOMAP_REPORT
This allows the file system to tell a FIEMAP from a read operation, and thus
avoids the need to report flags that aren't actually used in the read path.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
-rw-r--r-- | fs/iomap.c | 2 | ||||
-rw-r--r-- | include/linux/iomap.h | 17 |
2 files changed, 12 insertions, 7 deletions
diff --git a/fs/iomap.c b/fs/iomap.c index 013d1d36fbbf..a92204012e2d 100644 --- a/fs/iomap.c +++ b/fs/iomap.c | |||
@@ -561,7 +561,7 @@ int iomap_fiemap(struct inode *inode, struct fiemap_extent_info *fi, | |||
561 | } | 561 | } |
562 | 562 | ||
563 | while (len > 0) { | 563 | while (len > 0) { |
564 | ret = iomap_apply(inode, start, len, 0, ops, &ctx, | 564 | ret = iomap_apply(inode, start, len, IOMAP_REPORT, ops, &ctx, |
565 | iomap_fiemap_actor); | 565 | iomap_fiemap_actor); |
566 | /* inode with no (attribute) mapping will give ENOENT */ | 566 | /* inode with no (attribute) mapping will give ENOENT */ |
567 | if (ret == -ENOENT) | 567 | if (ret == -ENOENT) |
diff --git a/include/linux/iomap.h b/include/linux/iomap.h index e63e288dee83..7892f55a1866 100644 --- a/include/linux/iomap.h +++ b/include/linux/iomap.h | |||
@@ -19,11 +19,15 @@ struct vm_fault; | |||
19 | #define IOMAP_UNWRITTEN 0x04 /* blocks allocated @blkno in unwritten state */ | 19 | #define IOMAP_UNWRITTEN 0x04 /* blocks allocated @blkno in unwritten state */ |
20 | 20 | ||
21 | /* | 21 | /* |
22 | * Flags for iomap mappings: | 22 | * Flags for all iomap mappings: |
23 | */ | 23 | */ |
24 | #define IOMAP_F_MERGED 0x01 /* contains multiple blocks/extents */ | 24 | #define IOMAP_F_NEW 0x01 /* blocks have been newly allocated */ |
25 | #define IOMAP_F_SHARED 0x02 /* block shared with another file */ | 25 | |
26 | #define IOMAP_F_NEW 0x04 /* blocks have been newly allocated */ | 26 | /* |
27 | * Flags that only need to be reported for IOMAP_REPORT requests: | ||
28 | */ | ||
29 | #define IOMAP_F_MERGED 0x10 /* contains multiple blocks/extents */ | ||
30 | #define IOMAP_F_SHARED 0x20 /* block shared with another file */ | ||
27 | 31 | ||
28 | /* | 32 | /* |
29 | * Magic value for blkno: | 33 | * Magic value for blkno: |
@@ -42,8 +46,9 @@ struct iomap { | |||
42 | /* | 46 | /* |
43 | * Flags for iomap_begin / iomap_end. No flag implies a read. | 47 | * Flags for iomap_begin / iomap_end. No flag implies a read. |
44 | */ | 48 | */ |
45 | #define IOMAP_WRITE (1 << 0) | 49 | #define IOMAP_WRITE (1 << 0) /* writing, must allocate blocks */ |
46 | #define IOMAP_ZERO (1 << 1) | 50 | #define IOMAP_ZERO (1 << 1) /* zeroing operation, may skip holes */ |
51 | #define IOMAP_REPORT (1 << 2) /* report extent status, e.g. FIEMAP */ | ||
47 | 52 | ||
48 | struct iomap_ops { | 53 | struct iomap_ops { |
49 | /* | 54 | /* |