Create a per-inode extent size allocator hint for copy-on-write. This hint is separate from the existing extent size hint so that CoW can take advantage of the fragmentation-reducing properties of extent size hints without disabling delalloc for regular writes. The extent size hint that's fed to the allocator during a copy on write operation is the greater of the cowextsize and regular extsize hint. During reflink, if we're sharing the entire source file to the entire destination file and the destination file doesn't already have a cowextsize hint, propagate the source file's cowextsize hint to the destination file. [Plumb in the appropriate fsxattr flags and fields in the headers.] Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> --- include/darwin.h | 7 ++++++- include/freebsd.h | 6 +++++- include/irix.h | 6 +++++- include/linux.h | 7 ++++++- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/include/darwin.h b/include/darwin.h index 4132bfd..6c9f87a 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -292,7 +292,8 @@ struct fsxattr { __u32 fsx_extsize; /* extsize field value (get/set)*/ __u32 fsx_nextents; /* nextents field value (get) */ __u32 fsx_projid; /* project identifier (get/set) */ - unsigned char fsx_pad[12]; + __u32 fsx_cowextsize; /* cow extsize field value (get/set) */ + unsigned char fsx_pad[8]; }; /* @@ -320,4 +321,8 @@ struct fsxattr { #endif +#ifndef FS_XFLAG_COWEXTSIZE +#define FS_XFLAG_COWEXTSIZE 0x00010000 /* CoW extent size allocator hint */ +#endif + #endif /* __XFS_DARWIN_H__ */ diff --git a/include/freebsd.h b/include/freebsd.h index 32268ef..72935ec 100644 --- a/include/freebsd.h +++ b/include/freebsd.h @@ -181,7 +181,8 @@ struct fsxattr { __u32 fsx_extsize; /* extsize field value (get/set)*/ __u32 fsx_nextents; /* nextents field value (get) */ __u32 fsx_projid; /* project identifier (get/set) */ - unsigned char fsx_pad[12]; + __u32 fsx_cowextsize; /* cow extsize field value (get/set) */ + unsigned char fsx_pad[8]; }; /* @@ -209,5 +210,8 @@ struct fsxattr { #endif +#ifndef FS_XFLAG_COWEXTSIZE +#define FS_XFLAG_COWEXTSIZE 0x00010000 /* CoW extent size allocator hint */ +#endif #endif /* __XFS_FREEBSD_H__ */ diff --git a/include/irix.h b/include/irix.h index 6094b8a..8bbcbd8 100644 --- a/include/irix.h +++ b/include/irix.h @@ -427,7 +427,8 @@ struct fsxattr { __u32 fsx_extsize; /* extsize field value (get/set)*/ __u32 fsx_nextents; /* nextents field value (get) */ __u32 fsx_projid; /* project identifier (get/set) */ - unsigned char fsx_pad[12]; + __u32 fsx_cowextsize; /* cow extsize field value (get/set) */ + unsigned char fsx_pad[8]; }; /* @@ -455,6 +456,9 @@ struct fsxattr { #endif +#ifndef FS_XFLAG_COWEXTSIZE +#define FS_XFLAG_COWEXTSIZE 0x00010000 /* CoW extent size allocator hint */ +#endif /** * Abstraction of mountpoints. diff --git a/include/linux.h b/include/linux.h index 06f1af4..ddc053e 100644 --- a/include/linux.h +++ b/include/linux.h @@ -181,7 +181,8 @@ struct fsxattr { __u32 fsx_extsize; /* extsize field value (get/set)*/ __u32 fsx_nextents; /* nextents field value (get) */ __u32 fsx_projid; /* project identifier (get/set) */ - unsigned char fsx_pad[12]; + __u32 fsx_cowextsize; /* cow extsize field value (get/set) */ + unsigned char fsx_pad[8]; }; /* @@ -209,4 +210,8 @@ struct fsxattr { #endif +#ifndef FS_XFLAG_COWEXTSIZE +#define FS_XFLAG_COWEXTSIZE 0x00010000 /* CoW extent size allocator hint */ +#endif + #endif /* __XFS_LINUX_H__ */ -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html