From 50488edac1f0fc4b6320e505c76638fa9196a9e3 Mon Sep 17 00:00:00 2001 From: kalpak Date: Tue, 20 Jan 2009 04:43:58 +0000 Subject: [PATCH] b=17942 i=adilger i=girish update fiemap structures and API to match upstream --- .../patches/ext3-fiemap-2.6-rhel5.patch | 114 +++++++++++---------- .../patches/ext3-fiemap-2.6-sles10.patch | 111 ++++++++++---------- .../patches/ext3-fiemap-2.6.22-vanilla.patch | 81 ++++++++------- lustre/include/lustre/ll_fiemap.h | 85 +++++++-------- lustre/include/lustre/lustre_user.h | 2 +- lustre/include/obd.h | 2 +- lustre/ptlrpc/wiretest.c | 18 ++-- lustre/utils/wirecheck.c | 7 +- lustre/utils/wiretest.c | 18 ++-- 9 files changed, 221 insertions(+), 217 deletions(-) diff --git a/ldiskfs/kernel_patches/patches/ext3-fiemap-2.6-rhel5.patch b/ldiskfs/kernel_patches/patches/ext3-fiemap-2.6-rhel5.patch index 5dad8b1..5b5a082 100644 --- a/ldiskfs/kernel_patches/patches/ext3-fiemap-2.6-rhel5.patch +++ b/ldiskfs/kernel_patches/patches/ext3-fiemap-2.6-rhel5.patch @@ -1,11 +1,11 @@ A large part of this code is from the generic VFS code in fs/ioctl.c in the upstream kernel. -Index: linux-2.6.18-53.1.14/fs/ext3/ioctl.c +Index: linux-2.6.18-92.1.17/fs/ext3/ioctl.c =================================================================== ---- linux-2.6.18-53.1.14.orig/fs/ext3/ioctl.c -+++ linux-2.6.18-53.1.14/fs/ext3/ioctl.c -@@ -15,7 +15,159 @@ +--- linux-2.6.18-92.1.17.orig/fs/ext3/ioctl.c ++++ linux-2.6.18-92.1.17/fs/ext3/ioctl.c +@@ -15,7 +15,161 @@ #include #include #include @@ -19,9 +19,9 @@ Index: linux-2.6.18-53.1.14/fs/ext3/ioctl.c + * @fieinfo: Fiemap context passed into ->fiemap + * @logical: Extent logical start offset, in bytes + * @phys: Extent physical start offset, in bytes -+ * @len: Extent length, in bytes ++ * @len: Extent length, in bytes + * @flags: FIEMAP_EXTENT flags that describe this extent -+ * @lun: LUN on which this extent resides ++ * @lun: LUN on which this extent resides + * + * Called from file system ->fiemap callback. Will populate extent + * info as passed in via arguments and copy to user memory. On @@ -31,9 +31,9 @@ Index: linux-2.6.18-53.1.14/fs/ext3/ioctl.c + * extent that will fit in user array. + */ +#define SET_UNKNOWN_FLAGS (FIEMAP_EXTENT_DELALLOC) -+#define SET_NO_DIRECT_FLAGS (FIEMAP_EXTENT_DATA_COMPRESSED \ -+ |FIEMAP_EXTENT_DATA_ENCRYPTED \ ++#define SET_NO_DIRECT_FLAGS (FIEMAP_EXTENT_DATA_ENCRYPTED \ + |FIEMAP_EXTENT_NET) ++#define SET_NO_UNMOUNTED_IO_FLAGS (FIEMAP_EXTENT_DATA_ENCRYPTED) +#define SET_NOT_ALIGNED_FLAGS (FIEMAP_EXTENT_DATA_TAIL|FIEMAP_EXTENT_DATA_INLINE) +int fiemap_fill_next_extent(struct fiemap_extent_info *fieinfo, u64 logical, + u64 phys, u64 len, u32 flags, dev_t dev) @@ -43,19 +43,21 @@ Index: linux-2.6.18-53.1.14/fs/ext3/ioctl.c + + /* only count the extents */ + if (fieinfo->fi_extents_max == 0) { -+ fieinfo->fi_extents_mapped++; -+ return (flags & FIEMAP_EXTENT_LAST) ? 1 : 0; ++ fieinfo->fi_extents_mapped++; ++ return (flags & FIEMAP_EXTENT_LAST) ? 1 : 0; + } + + if (fieinfo->fi_extents_mapped >= fieinfo->fi_extents_max) -+ return 1; ++ return 1; + + if (flags & SET_UNKNOWN_FLAGS) -+ flags |= FIEMAP_EXTENT_UNKNOWN; ++ flags |= FIEMAP_EXTENT_UNKNOWN; + if (flags & SET_NO_DIRECT_FLAGS) -+ flags |= FIEMAP_EXTENT_NO_DIRECT; ++ flags |= FIEMAP_EXTENT_NO_DIRECT; + if (flags & SET_NOT_ALIGNED_FLAGS) -+ flags |= FIEMAP_EXTENT_NOT_ALIGNED; ++ flags |= FIEMAP_EXTENT_NOT_ALIGNED; ++ if (flags & SET_NO_UNMOUNTED_IO_FLAGS) ++ flags |= FIEMAP_EXTENT_ENCODED; + + extent.fe_logical = logical; + extent.fe_physical = phys; @@ -65,11 +67,11 @@ Index: linux-2.6.18-53.1.14/fs/ext3/ioctl.c + + dest += fieinfo->fi_extents_mapped; + if (copy_to_user(dest, &extent, sizeof(extent))) -+ return -EFAULT; ++ return -EFAULT; + + fieinfo->fi_extents_mapped++; + if (fieinfo->fi_extents_mapped == fieinfo->fi_extents_max) -+ return 1; ++ return 1; + + return (flags & FIEMAP_EXTENT_LAST) ? 1 : 0; +} @@ -131,11 +133,11 @@ Index: linux-2.6.18-53.1.14/fs/ext3/ioctl.c + int error = 0; + + if (copy_from_user(&fiemap, (struct fiemap __user *) arg, -+ sizeof(struct fiemap))) ++ sizeof(struct fiemap))) + return -EFAULT; + + if (fiemap.fm_extent_count > FIEMAP_MAX_EXTENTS) -+ return -EINVAL; ++ return -EINVAL; + + error = fiemap_check_ranges(sb, fiemap.fm_start, fiemap.fm_length, + &len); @@ -149,7 +151,7 @@ Index: linux-2.6.18-53.1.14/fs/ext3/ioctl.c + if (fiemap.fm_extent_count != 0 && + !access_ok(VERIFY_WRITE, (void *)arg, + offsetof(typeof(fiemap), fm_extents[fiemap.fm_extent_count]))) -+ return -EFAULT; ++ return -EFAULT; + + if (fieinfo.fi_flags & FIEMAP_FLAG_SYNC) + filemap_write_and_wait(inode->i_mapping); @@ -165,7 +167,7 @@ Index: linux-2.6.18-53.1.14/fs/ext3/ioctl.c int ext3_ioctl (struct inode * inode, struct file * filp, unsigned int cmd, unsigned long arg) -@@ -272,7 +424,9 @@ flags_err: +@@ -272,7 +426,9 @@ flags_err: return err; } @@ -176,11 +178,11 @@ Index: linux-2.6.18-53.1.14/fs/ext3/ioctl.c default: return -ENOTTY; -Index: linux-2.6.18-53.1.14/include/linux/ext3_fs.h +Index: linux-2.6.18-92.1.17/include/linux/ext3_fs.h =================================================================== ---- linux-2.6.18-53.1.14.orig/include/linux/ext3_fs.h -+++ linux-2.6.18-53.1.14/include/linux/ext3_fs.h -@@ -257,15 +257,19 @@ struct ext3_new_group_data { +--- linux-2.6.18-92.1.17.orig/include/linux/ext3_fs.h ++++ linux-2.6.18-92.1.17/include/linux/ext3_fs.h +@@ -258,15 +258,19 @@ struct ext3_new_group_data { #define EXT3_IOC_SETFLAGS _IOW('f', 2, long) #define EXT3_IOC_GETVERSION _IOR('f', 3, long) #define EXT3_IOC_SETVERSION _IOW('f', 4, long) @@ -188,7 +190,7 @@ Index: linux-2.6.18-53.1.14/include/linux/ext3_fs.h +#define EXT3_IOC_SETRSVSZ _IOW('f', 6, long) #define EXT3_IOC_GROUP_EXTEND _IOW('f', 7, unsigned long) #define EXT3_IOC_GROUP_ADD _IOW('f', 8,struct ext3_new_group_input) -+#define EXT3_IOC_FIEMAP _IOWR('f', 10, struct fiemap) ++#define EXT3_IOC_FIEMAP _IOWR('f', 11, struct fiemap) #define EXT3_IOC_GETVERSION_OLD _IOR('v', 1, long) #define EXT3_IOC_SETVERSION_OLD _IOW('v', 2, long) #ifdef CONFIG_JBD_DEBUG @@ -202,7 +204,7 @@ Index: linux-2.6.18-53.1.14/include/linux/ext3_fs.h /* * Mount options -@@ -1040,6 +1044,9 @@ extern int ext3_block_truncate_page(hand +@@ -1041,6 +1045,9 @@ extern int ext3_block_truncate_page(hand /* ioctl.c */ extern int ext3_ioctl (struct inode *, struct file *, unsigned int, unsigned long); @@ -212,7 +214,7 @@ Index: linux-2.6.18-53.1.14/include/linux/ext3_fs.h /* namei.c */ extern int ext3_orphan_add(handle_t *, struct inode *); -@@ -1117,7 +1124,6 @@ ext3_get_blocks_wrap(handle_t *handle, s +@@ -1118,7 +1125,6 @@ ext3_get_blocks_wrap(handle_t *handle, s return ret; } @@ -220,10 +222,10 @@ Index: linux-2.6.18-53.1.14/include/linux/ext3_fs.h #endif /* __KERNEL__ */ /* EXT3_IOC_CREATE_INUM at bottom of file (visible to kernel and user). */ -Index: linux-2.6.18-53.1.14/include/linux/ext3_extents.h +Index: linux-2.6.18-92.1.17/include/linux/ext3_extents.h =================================================================== ---- linux-2.6.18-53.1.14.orig/include/linux/ext3_extents.h -+++ linux-2.6.18-53.1.14/include/linux/ext3_extents.h +--- linux-2.6.18-92.1.17.orig/include/linux/ext3_extents.h ++++ linux-2.6.18-92.1.17/include/linux/ext3_extents.h @@ -142,8 +142,10 @@ struct ext3_ext_path { * callback must return valid extent (passed or newly created) */ @@ -237,9 +239,9 @@ Index: linux-2.6.18-53.1.14/include/linux/ext3_extents.h #define EXT_CONTINUE 0 #define EXT_BREAK 1 -@@ -152,6 +154,26 @@ typedef int (*ext_prepare_callback)(stru - +@@ -153,6 +155,26 @@ typedef int (*ext_prepare_callback)(stru #define EXT_MAX_BLOCK 0xffffffff + #define EXT_UNSET_BLOCK 1 +/* + * EXT_INIT_MAX_LEN is the maximum number of blocks we can have in an @@ -264,7 +266,7 @@ Index: linux-2.6.18-53.1.14/include/linux/ext3_extents.h #define EXT_FLAGS_CLR_UNKNOWN 0x7 /* Flags cleared on modification */ #define EXT_HDR_GEN_BITS 24 #define EXT_HDR_GEN_MASK ((1 << EXT_HDR_GEN_BITS) - 1) -@@ -219,6 +241,12 @@ ext3_ext_invalidate_cache(struct inode * +@@ -220,6 +242,12 @@ ext3_ext_invalidate_cache(struct inode * EXT3_I(inode)->i_cached_extent.ec_type = EXT3_EXT_CACHE_NO; } @@ -277,10 +279,10 @@ Index: linux-2.6.18-53.1.14/include/linux/ext3_extents.h extern int ext3_ext_search_left(struct inode *, struct ext3_ext_path *, unsigned long *, unsigned long *); extern int ext3_ext_search_right(struct inode *, struct ext3_ext_path *, unsigned long *, unsigned long *); extern int ext3_extent_tree_init(handle_t *, struct inode *); -Index: linux-2.6.18-53.1.14/fs/ext3/extents.c +Index: linux-2.6.18-92.1.17/fs/ext3/extents.c =================================================================== ---- linux-2.6.18-53.1.14.orig/fs/ext3/extents.c -+++ linux-2.6.18-53.1.14/fs/ext3/extents.c +--- linux-2.6.18-92.1.17.orig/fs/ext3/extents.c ++++ linux-2.6.18-92.1.17/fs/ext3/extents.c @@ -41,6 +41,7 @@ #include #include @@ -402,11 +404,11 @@ Index: linux-2.6.18-53.1.14/fs/ext3/extents.c EXPORT_SYMBOL(ext3_mark_inode_dirty); EXPORT_SYMBOL(ext3_ext_invalidate_cache); EXPORT_SYMBOL(ext3_ext_insert_extent); -Index: linux-2.6.18-53.1.14/fs/ext3/fiemap.h +Index: linux-2.6.18-92.1.17/fs/ext3/fiemap.h =================================================================== --- /dev/null -+++ linux-2.6.18-53.1.14/fs/ext3/fiemap.h -@@ -0,0 +1,84 @@ ++++ linux-2.6.18-92.1.17/fs/ext3/fiemap.h +@@ -0,0 +1,85 @@ +/* + * FIEMAP ioctl infrastructure. + * @@ -425,8 +427,10 @@ Index: linux-2.6.18-53.1.14/fs/ext3/fiemap.h + __u64 fe_physical; /* physical offset in bytes for the start + * of the extent from the beginning of the disk */ + __u64 fe_length; /* length in bytes for this extent */ ++ __u64 fe_reserved64[2]; + __u32 fe_flags; /* FIEMAP_EXTENT_* flags for this extent */ + __u32 fe_device; /* device number for this extent */ ++ __u32 fe_reserved[2]; +}; + +struct fiemap { @@ -463,32 +467,30 @@ Index: linux-2.6.18-53.1.14/fs/ext3/fiemap.h +/* ldiskfs only supports FLAG_SYNC flag currently */ +#define FIEMAP_FLAGS_COMPAT (FIEMAP_FLAG_SYNC | FIEMAP_FLAG_XATTR) + -+ +#define FIEMAP_EXTENT_LAST 0x00000001 /* Last extent in file. */ +#define FIEMAP_EXTENT_UNKNOWN 0x00000002 /* Data location unknown. */ +#define FIEMAP_EXTENT_DELALLOC 0x00000004 /* Location still pending. -+ * Sets EXTENT_UNKNOWN. */ -+#define FIEMAP_EXTENT_NO_DIRECT 0x00000008 /* Data mapping undefined */ -+#define FIEMAP_EXTENT_SECONDARY 0x00000010 /* Data copied offline. May -+ * set EXTENT_NO_DIRECT. */ -+#define FIEMAP_EXTENT_NET 0x00000020 /* Data stored remotely. -+ * Sets EXTENT_NO_DIRECT. */ -+#define FIEMAP_EXTENT_DATA_COMPRESSED 0x00000040 /* Data is compressed by fs. -+ * Sets EXTENT_NO_DIRECT. */ ++ * Sets EXTENT_UNKNOWN. */ ++#define FIEMAP_EXTENT_ENCODED 0x00000008 /* Data can not be read ++ * while fs is unmounted */ +#define FIEMAP_EXTENT_DATA_ENCRYPTED 0x00000080 /* Data is encrypted by fs. -+ * Sets EXTENT_NO_DIRECT. */ ++ * Sets EXTENT_NO_DIRECT. */ +#define FIEMAP_EXTENT_NOT_ALIGNED 0x00000100 /* Extent offsets may not be -+ * block aligned. */ ++ * block aligned. */ +#define FIEMAP_EXTENT_DATA_INLINE 0x00000200 /* Data mixed with metadata. -+ * Sets EXTENT_NOT_ALIGNED.*/ ++ * Sets EXTENT_NOT_ALIGNED.*/ +#define FIEMAP_EXTENT_DATA_TAIL 0x00000400 /* Multiple files in block. -+ * Sets EXTENT_NOT_ALIGNED.*/ ++ * Sets EXTENT_NOT_ALIGNED.*/ +#define FIEMAP_EXTENT_UNWRITTEN 0x00000800 /* Space allocated, but -+ * no data (i.e. zero). */ ++ * no data (i.e. zero). */ +#define FIEMAP_EXTENT_MERGED 0x00001000 /* File does not natively -+ * support extents. Result -+ * merged for efficiency. */ ++ * support extents. Result ++ * merged for efficiency. */ ++ ++/* Lustre specific flags - use a high bit, don't conflict with upstream flag */ ++#define FIEMAP_EXTENT_NO_DIRECT 0x40000000 /* Data mapping undefined */ ++#define FIEMAP_EXTENT_NET 0x80000000 /* Data stored remotely. ++ * Sets NO_DIRECT flag */ + +#endif /* _LINUX_EXT3_FIEMAP_H */ + - diff --git a/ldiskfs/kernel_patches/patches/ext3-fiemap-2.6-sles10.patch b/ldiskfs/kernel_patches/patches/ext3-fiemap-2.6-sles10.patch index a8c567a..0059db5 100644 --- a/ldiskfs/kernel_patches/patches/ext3-fiemap-2.6-sles10.patch +++ b/ldiskfs/kernel_patches/patches/ext3-fiemap-2.6-sles10.patch @@ -1,11 +1,11 @@ A large part of this code is from the generic VFS code in fs/ioctl.c in the upstream kernel. -Index: linux-2.6.16.60-0.23/fs/ext3/ioctl.c +Index: linux-2.6.9-67.0.22/fs/ext3/ioctl.c =================================================================== ---- linux-2.6.16.60-0.23.orig/fs/ext3/ioctl.c -+++ linux-2.6.16.60-0.23/fs/ext3/ioctl.c -@@ -15,7 +15,159 @@ +--- linux-2.6.9-67.0.22.orig/fs/ext3/ioctl.c ++++ linux-2.6.9-67.0.22/fs/ext3/ioctl.c +@@ -14,7 +14,161 @@ #include #include #include @@ -19,9 +19,9 @@ Index: linux-2.6.16.60-0.23/fs/ext3/ioctl.c + * @fieinfo: Fiemap context passed into ->fiemap + * @logical: Extent logical start offset, in bytes + * @phys: Extent physical start offset, in bytes -+ * @len: Extent length, in bytes ++ * @len: Extent length, in bytes + * @flags: FIEMAP_EXTENT flags that describe this extent -+ * @lun: LUN on which this extent resides ++ * @lun: LUN on which this extent resides + * + * Called from file system ->fiemap callback. Will populate extent + * info as passed in via arguments and copy to user memory. On @@ -31,9 +31,9 @@ Index: linux-2.6.16.60-0.23/fs/ext3/ioctl.c + * extent that will fit in user array. + */ +#define SET_UNKNOWN_FLAGS (FIEMAP_EXTENT_DELALLOC) -+#define SET_NO_DIRECT_FLAGS (FIEMAP_EXTENT_DATA_COMPRESSED \ -+ |FIEMAP_EXTENT_DATA_ENCRYPTED \ ++#define SET_NO_DIRECT_FLAGS (FIEMAP_EXTENT_DATA_ENCRYPTED \ + |FIEMAP_EXTENT_NET) ++#define SET_NO_UNMOUNTED_IO_FLAGS (FIEMAP_EXTENT_DATA_ENCRYPTED) +#define SET_NOT_ALIGNED_FLAGS (FIEMAP_EXTENT_DATA_TAIL|FIEMAP_EXTENT_DATA_INLINE) +int fiemap_fill_next_extent(struct fiemap_extent_info *fieinfo, u64 logical, + u64 phys, u64 len, u32 flags, dev_t dev) @@ -43,19 +43,21 @@ Index: linux-2.6.16.60-0.23/fs/ext3/ioctl.c + + /* only count the extents */ + if (fieinfo->fi_extents_max == 0) { -+ fieinfo->fi_extents_mapped++; -+ return (flags & FIEMAP_EXTENT_LAST) ? 1 : 0; ++ fieinfo->fi_extents_mapped++; ++ return (flags & FIEMAP_EXTENT_LAST) ? 1 : 0; + } + + if (fieinfo->fi_extents_mapped >= fieinfo->fi_extents_max) -+ return 1; ++ return 1; + + if (flags & SET_UNKNOWN_FLAGS) -+ flags |= FIEMAP_EXTENT_UNKNOWN; ++ flags |= FIEMAP_EXTENT_UNKNOWN; + if (flags & SET_NO_DIRECT_FLAGS) -+ flags |= FIEMAP_EXTENT_NO_DIRECT; ++ flags |= FIEMAP_EXTENT_NO_DIRECT; + if (flags & SET_NOT_ALIGNED_FLAGS) -+ flags |= FIEMAP_EXTENT_NOT_ALIGNED; ++ flags |= FIEMAP_EXTENT_NOT_ALIGNED; ++ if (flags & SET_NO_UNMOUNTED_IO_FLAGS) ++ flags |= FIEMAP_EXTENT_ENCODED; + + extent.fe_logical = logical; + extent.fe_physical = phys; @@ -65,11 +67,11 @@ Index: linux-2.6.16.60-0.23/fs/ext3/ioctl.c + + dest += fieinfo->fi_extents_mapped; + if (copy_to_user(dest, &extent, sizeof(extent))) -+ return -EFAULT; ++ return -EFAULT; + + fieinfo->fi_extents_mapped++; + if (fieinfo->fi_extents_mapped == fieinfo->fi_extents_max) -+ return 1; ++ return 1; + + return (flags & FIEMAP_EXTENT_LAST) ? 1 : 0; +} @@ -131,11 +133,11 @@ Index: linux-2.6.16.60-0.23/fs/ext3/ioctl.c + int error = 0; + + if (copy_from_user(&fiemap, (struct fiemap __user *) arg, -+ sizeof(struct fiemap))) ++ sizeof(struct fiemap))) + return -EFAULT; + + if (fiemap.fm_extent_count > FIEMAP_MAX_EXTENTS) -+ return -EINVAL; ++ return -EINVAL; + + error = fiemap_check_ranges(sb, fiemap.fm_start, fiemap.fm_length, + &len); @@ -149,7 +151,7 @@ Index: linux-2.6.16.60-0.23/fs/ext3/ioctl.c + if (fiemap.fm_extent_count != 0 && + !access_ok(VERIFY_WRITE, (void *)arg, + offsetof(typeof(fiemap), fm_extents[fiemap.fm_extent_count]))) -+ return -EFAULT; ++ return -EFAULT; + + if (fieinfo.fi_flags & FIEMAP_FLAG_SYNC) + filemap_write_and_wait(inode->i_mapping); @@ -165,7 +167,7 @@ Index: linux-2.6.16.60-0.23/fs/ext3/ioctl.c int ext3_ioctl (struct inode * inode, struct file * filp, unsigned int cmd, unsigned long arg) -@@ -262,7 +414,9 @@ flags_err: +@@ -244,7 +398,9 @@ flags_err: return err; } @@ -176,10 +178,10 @@ Index: linux-2.6.16.60-0.23/fs/ext3/ioctl.c default: return -ENOTTY; -Index: linux-2.6.16.60-0.23/include/linux/ext3_fs.h +Index: linux-2.6.9-67.0.22/include/linux/ext3_fs.h =================================================================== ---- linux-2.6.16.60-0.23.orig/include/linux/ext3_fs.h -+++ linux-2.6.16.60-0.23/include/linux/ext3_fs.h +--- linux-2.6.9-67.0.22.orig/include/linux/ext3_fs.h ++++ linux-2.6.9-67.0.22/include/linux/ext3_fs.h @@ -260,15 +260,19 @@ struct ext3_new_group_data { #define EXT3_IOC_SETFLAGS _IOW('f', 2, long) #define EXT3_IOC_GETVERSION _IOR('f', 3, long) @@ -188,7 +190,7 @@ Index: linux-2.6.16.60-0.23/include/linux/ext3_fs.h +#define EXT3_IOC_SETRSVSZ _IOW('f', 6, long) #define EXT3_IOC_GROUP_EXTEND _IOW('f', 7, unsigned long) #define EXT3_IOC_GROUP_ADD _IOW('f', 8,struct ext3_new_group_input) -+#define EXT3_IOC_FIEMAP _IOWR('f', 10, struct fiemap) ++#define EXT3_IOC_FIEMAP _IOWR('f', 11, struct fiemap) #define EXT3_IOC_GETVERSION_OLD _IOR('v', 1, long) #define EXT3_IOC_SETVERSION_OLD _IOW('v', 2, long) #ifdef CONFIG_JBD_DEBUG @@ -201,8 +203,8 @@ Index: linux-2.6.16.60-0.23/include/linux/ext3_fs.h +#define EXT3_FIEMAP_FLAGS_COMPAT (FIEMAP_FLAG_SYNC) /* - * Mount options -@@ -996,6 +1000,9 @@ extern int ext3_writepage_trans_blocks(s + * Structure of an inode on the disk +@@ -963,6 +967,9 @@ extern void ext3_set_aops(struct inode * /* ioctl.c */ extern int ext3_ioctl (struct inode *, struct file *, unsigned int, unsigned long); @@ -212,10 +214,10 @@ Index: linux-2.6.16.60-0.23/include/linux/ext3_fs.h /* namei.c */ extern int ext3_orphan_add(handle_t *, struct inode *); -Index: linux-2.6.16.60-0.23/include/linux/ext3_extents.h +Index: linux-2.6.9-67.0.22/include/linux/ext3_extents.h =================================================================== ---- linux-2.6.16.60-0.23.orig/include/linux/ext3_extents.h -+++ linux-2.6.16.60-0.23/include/linux/ext3_extents.h +--- linux-2.6.9-67.0.22.orig/include/linux/ext3_extents.h ++++ linux-2.6.9-67.0.22/include/linux/ext3_extents.h @@ -170,7 +170,10 @@ struct ext3_extents_helpers { */ typedef int (*ext_prepare_callback)(struct ext3_extents_tree *, @@ -254,7 +256,7 @@ Index: linux-2.6.16.60-0.23/include/linux/ext3_extents.h #define EXT_FIRST_EXTENT(__hdr__) \ ((struct ext3_extent *) (((char *) (__hdr__)) + \ -@@ -242,6 +264,12 @@ struct ext3_extent_tree_stats { +@@ -244,6 +266,12 @@ struct ext3_extent_tree_stats { int leaf_num; }; @@ -267,10 +269,10 @@ Index: linux-2.6.16.60-0.23/include/linux/ext3_extents.h extern int ext3_ext_search_left(struct ext3_extents_tree *, struct ext3_ext_path *, unsigned long *, unsigned long *); extern int ext3_ext_search_right(struct ext3_extents_tree *, struct ext3_ext_path *, unsigned long *, unsigned long *); extern void ext3_init_tree_desc(struct ext3_extents_tree *, struct inode *); -Index: linux-2.6.16.60-0.23/fs/ext3/extents.c +Index: linux-2.6.9-67.0.22/fs/ext3/extents.c =================================================================== ---- linux-2.6.16.60-0.23.orig/fs/ext3/extents.c -+++ linux-2.6.16.60-0.23/fs/ext3/extents.c +--- linux-2.6.9-67.0.22.orig/fs/ext3/extents.c ++++ linux-2.6.9-67.0.22/fs/ext3/extents.c @@ -41,6 +41,7 @@ #include #include @@ -279,7 +281,7 @@ Index: linux-2.6.16.60-0.23/fs/ext3/extents.c #include -@@ -1488,7 +1489,7 @@ int ext3_ext_walk_space(struct ext3_exte +@@ -1489,7 +1490,7 @@ int ext3_ext_walk_space(struct ext3_exte EXT_ASSERT(cbex.ec_len > 0); EXT_ASSERT(path[depth].p_hdr); @@ -288,7 +290,7 @@ Index: linux-2.6.16.60-0.23/fs/ext3/extents.c ext3_ext_drop_refs(path); if (err < 0) -@@ -2502,7 +2503,109 @@ int ext3_ext_calc_blockmap_metadata(stru +@@ -2503,7 +2504,109 @@ int ext3_ext_calc_blockmap_metadata(stru ext3_init_tree_desc(&tree, inode); return ext3_ext_calc_metadata_amount(&tree, blocks); } @@ -399,11 +401,11 @@ Index: linux-2.6.16.60-0.23/fs/ext3/extents.c EXPORT_SYMBOL(ext3_init_tree_desc); EXPORT_SYMBOL(ext3_mark_inode_dirty); EXPORT_SYMBOL(ext3_ext_invalidate_cache); -Index: linux-2.6.16.60-0.23/fs/ext3/fiemap.h +Index: linux-2.6.9-67.0.22/fs/ext3/fiemap.h =================================================================== --- /dev/null -+++ linux-2.6.16.60-0.23/fs/ext3/fiemap.h -@@ -0,0 +1,84 @@ ++++ linux-2.6.9-67.0.22/fs/ext3/fiemap.h +@@ -0,0 +1,85 @@ +/* + * FIEMAP ioctl infrastructure. + * @@ -422,8 +424,10 @@ Index: linux-2.6.16.60-0.23/fs/ext3/fiemap.h + __u64 fe_physical; /* physical offset in bytes for the start + * of the extent from the beginning of the disk */ + __u64 fe_length; /* length in bytes for this extent */ ++ __u64 fe_reserved64[2]; + __u32 fe_flags; /* FIEMAP_EXTENT_* flags for this extent */ + __u32 fe_device; /* device number for this extent */ ++ __u32 fe_reserved[2]; +}; + +struct fiemap { @@ -460,31 +464,30 @@ Index: linux-2.6.16.60-0.23/fs/ext3/fiemap.h +/* ldiskfs only supports FLAG_SYNC flag currently */ +#define FIEMAP_FLAGS_COMPAT (FIEMAP_FLAG_SYNC | FIEMAP_FLAG_XATTR) + -+ +#define FIEMAP_EXTENT_LAST 0x00000001 /* Last extent in file. */ +#define FIEMAP_EXTENT_UNKNOWN 0x00000002 /* Data location unknown. */ +#define FIEMAP_EXTENT_DELALLOC 0x00000004 /* Location still pending. -+ * Sets EXTENT_UNKNOWN. */ -+#define FIEMAP_EXTENT_NO_DIRECT 0x00000008 /* Data mapping undefined */ -+#define FIEMAP_EXTENT_SECONDARY 0x00000010 /* Data copied offline. May -+ * set EXTENT_NO_DIRECT. */ -+#define FIEMAP_EXTENT_NET 0x00000020 /* Data stored remotely. -+ * Sets EXTENT_NO_DIRECT. */ -+#define FIEMAP_EXTENT_DATA_COMPRESSED 0x00000040 /* Data is compressed by fs. -+ * Sets EXTENT_NO_DIRECT. */ ++ * Sets EXTENT_UNKNOWN. */ ++#define FIEMAP_EXTENT_ENCODED 0x00000008 /* Data can not be read ++ * while fs is unmounted */ +#define FIEMAP_EXTENT_DATA_ENCRYPTED 0x00000080 /* Data is encrypted by fs. -+ * Sets EXTENT_NO_DIRECT. */ ++ * Sets EXTENT_NO_DIRECT. */ +#define FIEMAP_EXTENT_NOT_ALIGNED 0x00000100 /* Extent offsets may not be -+ * block aligned. */ ++ * block aligned. */ +#define FIEMAP_EXTENT_DATA_INLINE 0x00000200 /* Data mixed with metadata. -+ * Sets EXTENT_NOT_ALIGNED.*/ ++ * Sets EXTENT_NOT_ALIGNED.*/ +#define FIEMAP_EXTENT_DATA_TAIL 0x00000400 /* Multiple files in block. -+ * Sets EXTENT_NOT_ALIGNED.*/ ++ * Sets EXTENT_NOT_ALIGNED.*/ +#define FIEMAP_EXTENT_UNWRITTEN 0x00000800 /* Space allocated, but -+ * no data (i.e. zero). */ ++ * no data (i.e. zero). */ +#define FIEMAP_EXTENT_MERGED 0x00001000 /* File does not natively -+ * support extents. Result -+ * merged for efficiency. */ ++ * support extents. Result ++ * merged for efficiency. */ ++ ++/* Lustre specific flags - use a high bit, don't conflict with upstream flag */ ++#define FIEMAP_EXTENT_NO_DIRECT 0x40000000 /* Data mapping undefined */ ++#define FIEMAP_EXTENT_NET 0x80000000 /* Data stored remotely. ++ * Sets NO_DIRECT flag */ + +#endif /* _LINUX_EXT3_FIEMAP_H */ + diff --git a/ldiskfs/kernel_patches/patches/ext3-fiemap-2.6.22-vanilla.patch b/ldiskfs/kernel_patches/patches/ext3-fiemap-2.6.22-vanilla.patch index 76474bf..80897e8 100644 --- a/ldiskfs/kernel_patches/patches/ext3-fiemap-2.6.22-vanilla.patch +++ b/ldiskfs/kernel_patches/patches/ext3-fiemap-2.6.22-vanilla.patch @@ -5,7 +5,7 @@ Index: linux-2.6.22.14/fs/ext3/ioctl.c =================================================================== --- linux-2.6.22.14.orig/fs/ext3/ioctl.c +++ linux-2.6.22.14/fs/ext3/ioctl.c -@@ -17,6 +17,159 @@ +@@ -17,6 +17,161 @@ #include #include #include @@ -19,9 +19,9 @@ Index: linux-2.6.22.14/fs/ext3/ioctl.c + * @fieinfo: Fiemap context passed into ->fiemap + * @logical: Extent logical start offset, in bytes + * @phys: Extent physical start offset, in bytes -+ * @len: Extent length, in bytes ++ * @len: Extent length, in bytes + * @flags: FIEMAP_EXTENT flags that describe this extent -+ * @lun: LUN on which this extent resides ++ * @lun: LUN on which this extent resides + * + * Called from file system ->fiemap callback. Will populate extent + * info as passed in via arguments and copy to user memory. On @@ -31,9 +31,9 @@ Index: linux-2.6.22.14/fs/ext3/ioctl.c + * extent that will fit in user array. + */ +#define SET_UNKNOWN_FLAGS (FIEMAP_EXTENT_DELALLOC) -+#define SET_NO_DIRECT_FLAGS (FIEMAP_EXTENT_DATA_COMPRESSED \ -+ |FIEMAP_EXTENT_DATA_ENCRYPTED \ ++#define SET_NO_DIRECT_FLAGS (FIEMAP_EXTENT_DATA_ENCRYPTED \ + |FIEMAP_EXTENT_NET) ++#define SET_NO_UNMOUNTED_IO_FLAGS (FIEMAP_EXTENT_DATA_ENCRYPTED) +#define SET_NOT_ALIGNED_FLAGS (FIEMAP_EXTENT_DATA_TAIL|FIEMAP_EXTENT_DATA_INLINE) +int fiemap_fill_next_extent(struct fiemap_extent_info *fieinfo, u64 logical, + u64 phys, u64 len, u32 flags, dev_t dev) @@ -43,19 +43,21 @@ Index: linux-2.6.22.14/fs/ext3/ioctl.c + + /* only count the extents */ + if (fieinfo->fi_extents_max == 0) { -+ fieinfo->fi_extents_mapped++; -+ return (flags & FIEMAP_EXTENT_LAST) ? 1 : 0; ++ fieinfo->fi_extents_mapped++; ++ return (flags & FIEMAP_EXTENT_LAST) ? 1 : 0; + } + + if (fieinfo->fi_extents_mapped >= fieinfo->fi_extents_max) -+ return 1; ++ return 1; + + if (flags & SET_UNKNOWN_FLAGS) -+ flags |= FIEMAP_EXTENT_UNKNOWN; ++ flags |= FIEMAP_EXTENT_UNKNOWN; + if (flags & SET_NO_DIRECT_FLAGS) -+ flags |= FIEMAP_EXTENT_NO_DIRECT; ++ flags |= FIEMAP_EXTENT_NO_DIRECT; + if (flags & SET_NOT_ALIGNED_FLAGS) -+ flags |= FIEMAP_EXTENT_NOT_ALIGNED; ++ flags |= FIEMAP_EXTENT_NOT_ALIGNED; ++ if (flags & SET_NO_UNMOUNTED_IO_FLAGS) ++ flags |= FIEMAP_EXTENT_ENCODED; + + extent.fe_logical = logical; + extent.fe_physical = phys; @@ -65,11 +67,11 @@ Index: linux-2.6.22.14/fs/ext3/ioctl.c + + dest += fieinfo->fi_extents_mapped; + if (copy_to_user(dest, &extent, sizeof(extent))) -+ return -EFAULT; ++ return -EFAULT; + + fieinfo->fi_extents_mapped++; + if (fieinfo->fi_extents_mapped == fieinfo->fi_extents_max) -+ return 1; ++ return 1; + + return (flags & FIEMAP_EXTENT_LAST) ? 1 : 0; +} @@ -131,11 +133,11 @@ Index: linux-2.6.22.14/fs/ext3/ioctl.c + int error = 0; + + if (copy_from_user(&fiemap, (struct fiemap __user *) arg, -+ sizeof(struct fiemap))) ++ sizeof(struct fiemap))) + return -EFAULT; + + if (fiemap.fm_extent_count > FIEMAP_MAX_EXTENTS) -+ return -EINVAL; ++ return -EINVAL; + + error = fiemap_check_ranges(sb, fiemap.fm_start, fiemap.fm_length, + &len); @@ -149,7 +151,7 @@ Index: linux-2.6.22.14/fs/ext3/ioctl.c + if (fiemap.fm_extent_count != 0 && + !access_ok(VERIFY_WRITE, (void *)arg, + offsetof(typeof(fiemap), fm_extents[fiemap.fm_extent_count]))) -+ return -EFAULT; ++ return -EFAULT; + + if (fieinfo.fi_flags & FIEMAP_FLAG_SYNC) + filemap_write_and_wait(inode->i_mapping); @@ -165,7 +167,7 @@ Index: linux-2.6.22.14/fs/ext3/ioctl.c int ext3_ioctl (struct inode * inode, struct file * filp, unsigned int cmd, unsigned long arg) -@@ -274,7 +427,9 @@ flags_err: +@@ -274,7 +429,9 @@ flags_err: return err; } @@ -180,7 +182,7 @@ Index: linux-2.6.22.14/include/linux/ext3_fs.h =================================================================== --- linux-2.6.22.14.orig/include/linux/ext3_fs.h +++ linux-2.6.22.14/include/linux/ext3_fs.h -@@ -254,15 +254,16 @@ struct ext3_new_group_data { +@@ -255,15 +255,16 @@ struct ext3_new_group_data { #define EXT3_IOC_SETFLAGS FS_IOC_SETFLAGS #define EXT3_IOC_GETVERSION _IOR('f', 3, long) #define EXT3_IOC_SETVERSION _IOW('f', 4, long) @@ -188,7 +190,7 @@ Index: linux-2.6.22.14/include/linux/ext3_fs.h +#define EXT3_IOC_SETRSVSZ _IOW('f', 6, long) #define EXT3_IOC_GROUP_EXTEND _IOW('f', 7, unsigned long) #define EXT3_IOC_GROUP_ADD _IOW('f', 8,struct ext3_new_group_input) -+#define EXT3_IOC_FIEMAP _IOWR('f', 10, struct fiemap) ++#define EXT3_IOC_FIEMAP _IOWR('f', 11, struct fiemap) #define EXT3_IOC_GETVERSION_OLD FS_IOC_GETVERSION #define EXT3_IOC_SETVERSION_OLD FS_IOC_SETVERSION #ifdef CONFIG_JBD_DEBUG @@ -199,7 +201,7 @@ Index: linux-2.6.22.14/include/linux/ext3_fs.h /* * ioctl commands in 32 bit emulation -@@ -280,6 +281,8 @@ struct ext3_new_group_data { +@@ -281,6 +282,8 @@ struct ext3_new_group_data { #define EXT3_IOC32_GETVERSION_OLD FS_IOC32_GETVERSION #define EXT3_IOC32_SETVERSION_OLD FS_IOC32_SETVERSION @@ -208,7 +210,7 @@ Index: linux-2.6.22.14/include/linux/ext3_fs.h /* * Mount options -@@ -1056,6 +1059,9 @@ extern int ext3_block_truncate_page(hand +@@ -1057,6 +1060,9 @@ extern int ext3_block_truncate_page(hand extern int ext3_ioctl (struct inode *, struct file *, unsigned int, unsigned long); extern long ext3_compat_ioctl (struct file *, unsigned int, unsigned long); @@ -218,7 +220,7 @@ Index: linux-2.6.22.14/include/linux/ext3_fs.h /* namei.c */ extern int ext3_orphan_add(handle_t *, struct inode *); -@@ -1133,7 +1139,6 @@ ext3_get_blocks_wrap(handle_t *handle, s +@@ -1134,7 +1140,6 @@ ext3_get_blocks_wrap(handle_t *handle, s return ret; } @@ -412,7 +414,7 @@ Index: linux-2.6.22.14/fs/ext3/fiemap.h =================================================================== --- /dev/null +++ linux-2.6.22.14/fs/ext3/fiemap.h -@@ -0,0 +1,84 @@ +@@ -0,0 +1,85 @@ +/* + * FIEMAP ioctl infrastructure. + * @@ -431,8 +433,10 @@ Index: linux-2.6.22.14/fs/ext3/fiemap.h + __u64 fe_physical; /* physical offset in bytes for the start + * of the extent from the beginning of the disk */ + __u64 fe_length; /* length in bytes for this extent */ ++ __u64 fe_reserved64[2]; + __u32 fe_flags; /* FIEMAP_EXTENT_* flags for this extent */ + __u32 fe_device; /* device number for this extent */ ++ __u32 fe_reserved[2]; +}; + +struct fiemap { @@ -469,31 +473,30 @@ Index: linux-2.6.22.14/fs/ext3/fiemap.h +/* ldiskfs only supports FLAG_SYNC flag currently */ +#define FIEMAP_FLAGS_COMPAT (FIEMAP_FLAG_SYNC | FIEMAP_FLAG_XATTR) + -+ +#define FIEMAP_EXTENT_LAST 0x00000001 /* Last extent in file. */ +#define FIEMAP_EXTENT_UNKNOWN 0x00000002 /* Data location unknown. */ +#define FIEMAP_EXTENT_DELALLOC 0x00000004 /* Location still pending. -+ * Sets EXTENT_UNKNOWN. */ -+#define FIEMAP_EXTENT_NO_DIRECT 0x00000008 /* Data mapping undefined */ -+#define FIEMAP_EXTENT_SECONDARY 0x00000010 /* Data copied offline. May -+ * set EXTENT_NO_DIRECT. */ -+#define FIEMAP_EXTENT_NET 0x00000020 /* Data stored remotely. -+ * Sets EXTENT_NO_DIRECT. */ -+#define FIEMAP_EXTENT_DATA_COMPRESSED 0x00000040 /* Data is compressed by fs. -+ * Sets EXTENT_NO_DIRECT. */ ++ * Sets EXTENT_UNKNOWN. */ ++#define FIEMAP_EXTENT_ENCODED 0x00000008 /* Data can not be read ++ * while fs is unmounted */ +#define FIEMAP_EXTENT_DATA_ENCRYPTED 0x00000080 /* Data is encrypted by fs. -+ * Sets EXTENT_NO_DIRECT. */ ++ * Sets EXTENT_NO_DIRECT. */ +#define FIEMAP_EXTENT_NOT_ALIGNED 0x00000100 /* Extent offsets may not be -+ * block aligned. */ ++ * block aligned. */ +#define FIEMAP_EXTENT_DATA_INLINE 0x00000200 /* Data mixed with metadata. -+ * Sets EXTENT_NOT_ALIGNED.*/ ++ * Sets EXTENT_NOT_ALIGNED.*/ +#define FIEMAP_EXTENT_DATA_TAIL 0x00000400 /* Multiple files in block. -+ * Sets EXTENT_NOT_ALIGNED.*/ ++ * Sets EXTENT_NOT_ALIGNED.*/ +#define FIEMAP_EXTENT_UNWRITTEN 0x00000800 /* Space allocated, but -+ * no data (i.e. zero). */ ++ * no data (i.e. zero). */ +#define FIEMAP_EXTENT_MERGED 0x00001000 /* File does not natively -+ * support extents. Result -+ * merged for efficiency. */ ++ * support extents. Result ++ * merged for efficiency. */ ++ ++/* Lustre specific flags - use a high bit, don't conflict with upstream flag */ ++#define FIEMAP_EXTENT_NO_DIRECT 0x40000000 /* Data mapping undefined */ ++#define FIEMAP_EXTENT_NET 0x80000000 /* Data stored remotely. ++ * Sets NO_DIRECT flag */ + +#endif /* _LINUX_EXT3_FIEMAP_H */ + diff --git a/lustre/include/lustre/ll_fiemap.h b/lustre/include/lustre/ll_fiemap.h index 92f71a9..271ca5b 100644 --- a/lustre/include/lustre/ll_fiemap.h +++ b/lustre/include/lustre/ll_fiemap.h @@ -50,27 +50,27 @@ #include struct ll_fiemap_extent { - __u64 fe_logical; /* logical offset in bytes for the start of - * the extent from the beginning of the file */ - __u64 fe_physical; /* physical offset in bytes for the start - * of the extent from the beginning of the disk */ - __u64 fe_length; /* length in bytes for the extent */ - __u32 fe_flags; /* FIEMAP_EXTENT_* flags for the extent */ - __u32 fe_device; /* device number for this extent */ + __u64 fe_logical; /* logical offset in bytes for the start of + * the extent from the beginning of the file */ + __u64 fe_physical; /* physical offset in bytes for the start + * of the extent from the beginning of the disk */ + __u64 fe_length; /* length in bytes for this extent */ + __u64 fe_reserved64[2]; + __u32 fe_flags; /* FIEMAP_EXTENT_* flags for this extent */ + __u32 fe_device; /* device number for this extent */ + __u32 fe_reserved[2]; }; struct ll_user_fiemap { - __u64 fm_start; /* logical offset (inclusive) at - * which to start mapping (in) */ - __u64 fm_length; /* logical length of mapping which - * userspace wants (in) */ - __u32 fm_flags; /* FIEMAP_FLAG_* flags for request (in/out) */ - __u32 fm_mapped_extents;/* number of extents that were mapped (out) */ - __u32 fm_extent_count; /* size of fm_extents array (in) */ - __u32 fm_reserved; - struct ll_fiemap_extent fm_extents[0]; /* array of mapped extents (out). - * Lustre uses first extent to - * send end_offset */ + __u64 fm_start; /* logical offset (inclusive) at + * which to start mapping (in) */ + __u64 fm_length; /* logical length of mapping which + * userspace wants (in) */ + __u32 fm_flags; /* FIEMAP_FLAG_* flags for request (in/out) */ + __u32 fm_mapped_extents;/* number of extents that were mapped (out) */ + __u32 fm_extent_count; /* size of fm_extents array (in) */ + __u32 fm_reserved; + struct ll_fiemap_extent fm_extents[0]; /* array of mapped extents (out) */ }; #define FIEMAP_MAX_OFFSET (~0ULL) @@ -82,30 +82,31 @@ struct ll_user_fiemap { #define FIEMAP_FLAGS_COMPAT (FIEMAP_FLAG_SYNC | FIEMAP_FLAG_XATTR | \ FIEMAP_FLAG_DEVICE_ORDER) -#define FIEMAP_EXTENT_LAST 0x00000001 /* Last extent in file. */ -#define FIEMAP_EXTENT_UNKNOWN 0x00000002 /* Data location unknown. */ -#define FIEMAP_EXTENT_DELALLOC 0x00000004 /* Location still pending. - * Sets EXTENT_UNKNOWN. */ -#define FIEMAP_EXTENT_NO_DIRECT 0x00000008 /* Data mapping undefined */ -#define FIEMAP_EXTENT_SECONDARY 0x00000010 /* Data copied offline. May - * set EXTENT_NO_DIRECT. */ -#define FIEMAP_EXTENT_NET 0x00000020 /* Data stored remotely. - * Sets EXTENT_NO_DIRECT. */ -#define FIEMAP_EXTENT_DATA_COMPRESSED 0x00000040 /* Data is compressed by fs. - * Sets EXTENT_NO_DIRECT. */ -#define FIEMAP_EXTENT_DATA_ENCRYPTED 0x00000080 /* Data is encrypted by fs. - * Sets EXTENT_NO_DIRECT. */ -#define FIEMAP_EXTENT_NOT_ALIGNED 0x00000100 /* Extent offsets may not be - * block aligned. */ -#define FIEMAP_EXTENT_DATA_INLINE 0x00000200 /* Data mixed with metadata. - * Sets EXTENT_NOT_ALIGNED.*/ -#define FIEMAP_EXTENT_DATA_TAIL 0x00000400 /* Multiple files in block. - * Sets EXTENT_NOT_ALIGNED.*/ -#define FIEMAP_EXTENT_UNWRITTEN 0x00000800 /* Space allocated, but - * no data (i.e. zero). */ -#define FIEMAP_EXTENT_MERGED 0x00001000 /* File does not natively - * support extents. Result - * merged for efficiency. */ + +#define FIEMAP_EXTENT_LAST 0x00000001 /* Last extent in file. */ +#define FIEMAP_EXTENT_UNKNOWN 0x00000002 /* Data location unknown. */ +#define FIEMAP_EXTENT_DELALLOC 0x00000004 /* Location still pending. + * Sets EXTENT_UNKNOWN. */ +#define FIEMAP_EXTENT_ENCODED 0x00000008 /* Data can not be read + * while fs is unmounted */ +#define FIEMAP_EXTENT_DATA_ENCRYPTED 0x00000080 /* Data is encrypted by fs. + * Sets EXTENT_NO_DIRECT. */ +#define FIEMAP_EXTENT_NOT_ALIGNED 0x00000100 /* Extent offsets may not be + * block aligned. */ +#define FIEMAP_EXTENT_DATA_INLINE 0x00000200 /* Data mixed with metadata. + * Sets EXTENT_NOT_ALIGNED.*/ +#define FIEMAP_EXTENT_DATA_TAIL 0x00000400 /* Multiple files in block. + * Sets EXTENT_NOT_ALIGNED.*/ +#define FIEMAP_EXTENT_UNWRITTEN 0x00000800 /* Space allocated, but + * no data (i.e. zero). */ +#define FIEMAP_EXTENT_MERGED 0x00001000 /* File does not natively + * support extents. Result + * merged for efficiency. */ + +/* Lustre specific flags - use a high bit, don't conflict with upstream flag */ +#define FIEMAP_EXTENT_NO_DIRECT 0x40000000 /* Data mapping undefined */ +#define FIEMAP_EXTENT_NET 0x80000000 /* Data stored remotely. + * Sets NO_DIRECT flag */ #else diff --git a/lustre/include/lustre/lustre_user.h b/lustre/include/lustre/lustre_user.h index f263c38..4dfafcd 100644 --- a/lustre/include/lustre/lustre_user.h +++ b/lustre/include/lustre/lustre_user.h @@ -62,7 +62,7 @@ #define EXT3_IOC_SETVERSION _IOW('f', 4, long) #define EXT3_IOC_GETVERSION_OLD _IOR('v', 1, long) #define EXT3_IOC_SETVERSION_OLD _IOW('v', 2, long) -#define EXT3_IOC_FIEMAP _IOWR('f', 10, struct ll_user_fiemap) +#define EXT3_IOC_FIEMAP _IOWR('f', 11, struct ll_user_fiemap) #endif /* FIEMAP flags supported by Lustre */ diff --git a/lustre/include/obd.h b/lustre/include/obd.h index 5e5f54b..449adb5 100644 --- a/lustre/include/obd.h +++ b/lustre/include/obd.h @@ -1027,7 +1027,7 @@ enum obd_cleanup_stage { #define KEY_BLOCKSIZE "blocksize" #define KEY_BLOCKSIZE_BITS "blocksize_bits" #define KEY_MAX_EASIZE "max_ea_size" -#define KEY_FIEMAP "FIEMAP" +#define KEY_FIEMAP "fiemap" /* XXX unused */ #define KEY_ASYNC "async" diff --git a/lustre/ptlrpc/wiretest.c b/lustre/ptlrpc/wiretest.c index 998eff1..2407c0b 100644 --- a/lustre/ptlrpc/wiretest.c +++ b/lustre/ptlrpc/wiretest.c @@ -61,13 +61,12 @@ #include #include #include - void lustre_assert_wire_constants(void) { /* Wire protocol assertions generated by 'wirecheck' * (make -C lustre/utils newwiretest) - * running on Linux vb1 2.6.18-build.1 #1 SMP Thu Mar 27 14:34:21 MDT 2008 i686 i686 i386 GNU - * with gcc version 4.1.2 20070626 (Red Hat 4.1.2-14) */ + * running on Linux localhost.localdomain 2.6.18-prep #3 SMP Sun Nov 23 08:04:44 EST 2008 i68 + * with gcc version 4.1.1 20061011 (Red Hat 4.1.1-30) */ /* Constants... */ @@ -2419,7 +2418,7 @@ void lustre_assert_wire_constants(void) CLASSERT(FIEMAP_FLAG_DEVICE_ORDER == 0x40000000); /* Checks for struct ll_fiemap_extent */ - LASSERTF((int)sizeof(struct ll_fiemap_extent) == 32, " found %lld\n", + LASSERTF((int)sizeof(struct ll_fiemap_extent) == 56, " found %lld\n", (long long)(int)sizeof(struct ll_fiemap_extent)); LASSERTF((int)offsetof(struct ll_fiemap_extent, fe_logical) == 0, " found %lld\n", (long long)(int)offsetof(struct ll_fiemap_extent, fe_logical)); @@ -2433,27 +2432,26 @@ void lustre_assert_wire_constants(void) (long long)(int)offsetof(struct ll_fiemap_extent, fe_length)); LASSERTF((int)sizeof(((struct ll_fiemap_extent *)0)->fe_length) == 8, " found %lld\n", (long long)(int)sizeof(((struct ll_fiemap_extent *)0)->fe_length)); - LASSERTF((int)offsetof(struct ll_fiemap_extent, fe_flags) == 24, " found %lld\n", + LASSERTF((int)offsetof(struct ll_fiemap_extent, fe_flags) == 40, " found %lld\n", (long long)(int)offsetof(struct ll_fiemap_extent, fe_flags)); LASSERTF((int)sizeof(((struct ll_fiemap_extent *)0)->fe_flags) == 4, " found %lld\n", (long long)(int)sizeof(((struct ll_fiemap_extent *)0)->fe_flags)); - LASSERTF((int)offsetof(struct ll_fiemap_extent, fe_device) == 28, " found %lld\n", + LASSERTF((int)offsetof(struct ll_fiemap_extent, fe_device) == 44, " found %lld\n", (long long)(int)offsetof(struct ll_fiemap_extent, fe_device)); LASSERTF((int)sizeof(((struct ll_fiemap_extent *)0)->fe_device) == 4, " found %lld\n", (long long)(int)sizeof(((struct ll_fiemap_extent *)0)->fe_device)); CLASSERT(FIEMAP_EXTENT_LAST == 0x00000001); CLASSERT(FIEMAP_EXTENT_UNKNOWN == 0x00000002); CLASSERT(FIEMAP_EXTENT_DELALLOC == 0x00000004); - CLASSERT(FIEMAP_EXTENT_NO_DIRECT == 0x00000008); - CLASSERT(FIEMAP_EXTENT_SECONDARY == 0x00000010); - CLASSERT(FIEMAP_EXTENT_NET == 0x00000020); - CLASSERT(FIEMAP_EXTENT_DATA_COMPRESSED == 0x00000040); + CLASSERT(FIEMAP_EXTENT_ENCODED == 0x00000008); CLASSERT(FIEMAP_EXTENT_DATA_ENCRYPTED == 0x00000080); CLASSERT(FIEMAP_EXTENT_NOT_ALIGNED == 0x00000100); CLASSERT(FIEMAP_EXTENT_DATA_INLINE == 0x00000200); CLASSERT(FIEMAP_EXTENT_DATA_TAIL == 0x00000400); CLASSERT(FIEMAP_EXTENT_UNWRITTEN == 0x00000800); CLASSERT(FIEMAP_EXTENT_MERGED == 0x00001000); + CLASSERT(FIEMAP_EXTENT_NO_DIRECT == 0x40000000); + CLASSERT(FIEMAP_EXTENT_NET == 0x80000000); #if defined(LIBLUSTRE_POSIX_ACL) && defined(CONFIG_FS_POSIX_ACL) /* Checks for type posix_acl_xattr_entry */ diff --git a/lustre/utils/wirecheck.c b/lustre/utils/wirecheck.c index 3c0ef9e..ddfcd97 100644 --- a/lustre/utils/wirecheck.c +++ b/lustre/utils/wirecheck.c @@ -1191,16 +1191,15 @@ check_ll_fiemap_extent(void) CHECK_CDEFINE(FIEMAP_EXTENT_LAST); CHECK_CDEFINE(FIEMAP_EXTENT_UNKNOWN); CHECK_CDEFINE(FIEMAP_EXTENT_DELALLOC); - CHECK_CDEFINE(FIEMAP_EXTENT_NO_DIRECT); - CHECK_CDEFINE(FIEMAP_EXTENT_SECONDARY); - CHECK_CDEFINE(FIEMAP_EXTENT_NET); - CHECK_CDEFINE(FIEMAP_EXTENT_DATA_COMPRESSED); + CHECK_CDEFINE(FIEMAP_EXTENT_ENCODED); CHECK_CDEFINE(FIEMAP_EXTENT_DATA_ENCRYPTED); CHECK_CDEFINE(FIEMAP_EXTENT_NOT_ALIGNED); CHECK_CDEFINE(FIEMAP_EXTENT_DATA_INLINE); CHECK_CDEFINE(FIEMAP_EXTENT_DATA_TAIL); CHECK_CDEFINE(FIEMAP_EXTENT_UNWRITTEN); CHECK_CDEFINE(FIEMAP_EXTENT_MERGED); + CHECK_CDEFINE(FIEMAP_EXTENT_NO_DIRECT); + CHECK_CDEFINE(FIEMAP_EXTENT_NET); } static void diff --git a/lustre/utils/wiretest.c b/lustre/utils/wiretest.c index ca74af3..dd98a0e 100644 --- a/lustre/utils/wiretest.c +++ b/lustre/utils/wiretest.c @@ -59,13 +59,12 @@ int main() return ret; } - void lustre_assert_wire_constants(void) { /* Wire protocol assertions generated by 'wirecheck' * (make -C lustre/utils newwiretest) - * running on Linux vb1 2.6.18-build.1 #1 SMP Thu Mar 27 14:34:21 MDT 2008 i686 i686 i386 GNU - * with gcc version 4.1.2 20070626 (Red Hat 4.1.2-14) */ + * running on Linux localhost.localdomain 2.6.18-prep #3 SMP Sun Nov 23 08:04:44 EST 2008 i68 + * with gcc version 4.1.1 20061011 (Red Hat 4.1.1-30) */ /* Constants... */ @@ -2417,7 +2416,7 @@ void lustre_assert_wire_constants(void) CLASSERT(FIEMAP_FLAG_DEVICE_ORDER == 0x40000000); /* Checks for struct ll_fiemap_extent */ - LASSERTF((int)sizeof(struct ll_fiemap_extent) == 32, " found %lld\n", + LASSERTF((int)sizeof(struct ll_fiemap_extent) == 56, " found %lld\n", (long long)(int)sizeof(struct ll_fiemap_extent)); LASSERTF((int)offsetof(struct ll_fiemap_extent, fe_logical) == 0, " found %lld\n", (long long)(int)offsetof(struct ll_fiemap_extent, fe_logical)); @@ -2431,27 +2430,26 @@ void lustre_assert_wire_constants(void) (long long)(int)offsetof(struct ll_fiemap_extent, fe_length)); LASSERTF((int)sizeof(((struct ll_fiemap_extent *)0)->fe_length) == 8, " found %lld\n", (long long)(int)sizeof(((struct ll_fiemap_extent *)0)->fe_length)); - LASSERTF((int)offsetof(struct ll_fiemap_extent, fe_flags) == 24, " found %lld\n", + LASSERTF((int)offsetof(struct ll_fiemap_extent, fe_flags) == 40, " found %lld\n", (long long)(int)offsetof(struct ll_fiemap_extent, fe_flags)); LASSERTF((int)sizeof(((struct ll_fiemap_extent *)0)->fe_flags) == 4, " found %lld\n", (long long)(int)sizeof(((struct ll_fiemap_extent *)0)->fe_flags)); - LASSERTF((int)offsetof(struct ll_fiemap_extent, fe_device) == 28, " found %lld\n", + LASSERTF((int)offsetof(struct ll_fiemap_extent, fe_device) == 44, " found %lld\n", (long long)(int)offsetof(struct ll_fiemap_extent, fe_device)); LASSERTF((int)sizeof(((struct ll_fiemap_extent *)0)->fe_device) == 4, " found %lld\n", (long long)(int)sizeof(((struct ll_fiemap_extent *)0)->fe_device)); CLASSERT(FIEMAP_EXTENT_LAST == 0x00000001); CLASSERT(FIEMAP_EXTENT_UNKNOWN == 0x00000002); CLASSERT(FIEMAP_EXTENT_DELALLOC == 0x00000004); - CLASSERT(FIEMAP_EXTENT_NO_DIRECT == 0x00000008); - CLASSERT(FIEMAP_EXTENT_SECONDARY == 0x00000010); - CLASSERT(FIEMAP_EXTENT_NET == 0x00000020); - CLASSERT(FIEMAP_EXTENT_DATA_COMPRESSED == 0x00000040); + CLASSERT(FIEMAP_EXTENT_ENCODED == 0x00000008); CLASSERT(FIEMAP_EXTENT_DATA_ENCRYPTED == 0x00000080); CLASSERT(FIEMAP_EXTENT_NOT_ALIGNED == 0x00000100); CLASSERT(FIEMAP_EXTENT_DATA_INLINE == 0x00000200); CLASSERT(FIEMAP_EXTENT_DATA_TAIL == 0x00000400); CLASSERT(FIEMAP_EXTENT_UNWRITTEN == 0x00000800); CLASSERT(FIEMAP_EXTENT_MERGED == 0x00001000); + CLASSERT(FIEMAP_EXTENT_NO_DIRECT == 0x40000000); + CLASSERT(FIEMAP_EXTENT_NET == 0x80000000); #if defined(LIBLUSTRE_POSIX_ACL) && defined(CONFIG_FS_POSIX_ACL) /* Checks for type posix_acl_xattr_entry */ -- 1.8.3.1