···984984985985/*986986 * Values for di_flags987987- * There should be a one-to-one correspondence between these flags and the988988- * XFS_XFLAG_s.989987 */990988#define XFS_DIFLAG_REALTIME_BIT 0 /* file's blocks come from rt area */991989#define XFS_DIFLAG_PREALLOC_BIT 1 /* file space has been preallocated */···10221024 XFS_DIFLAG_NOATIME | XFS_DIFLAG_NODUMP | XFS_DIFLAG_RTINHERIT | \10231025 XFS_DIFLAG_PROJINHERIT | XFS_DIFLAG_NOSYMLINKS | XFS_DIFLAG_EXTSIZE | \10241026 XFS_DIFLAG_EXTSZINHERIT | XFS_DIFLAG_NODEFRAG | XFS_DIFLAG_FILESTREAM)10271027+10281028+/*10291029+ * Values for di_flags2 These start by being exposed to userspace in the upper10301030+ * 16 bits of the XFS_XFLAG_s range.10311031+ */10321032+#define XFS_DIFLAG2_DAX_BIT 0 /* use DAX for this inode */10331033+#define XFS_DIFLAG2_DAX (1 << XFS_DIFLAG2_DAX_BIT)10341034+10351035+#define XFS_DIFLAG2_ANY (XFS_DIFLAG2_DAX)1025103610261037/*10271038 * Inode number format:
+2-36
fs/xfs/libxfs/xfs_fs.h
···3636#endif37373838/*3939- * Structure for XFS_IOC_FSGETXATTR[A] and XFS_IOC_FSSETXATTR.4040- */4141-#ifndef HAVE_FSXATTR4242-struct fsxattr {4343- __u32 fsx_xflags; /* xflags field value (get/set) */4444- __u32 fsx_extsize; /* extsize field value (get/set)*/4545- __u32 fsx_nextents; /* nextents field value (get) */4646- __u32 fsx_projid; /* project identifier (get/set) */4747- unsigned char fsx_pad[12];4848-};4949-#endif5050-5151-/*5252- * Flags for the bs_xflags/fsx_xflags field5353- * There should be a one-to-one correspondence between these flags and the5454- * XFS_DIFLAG_s.5555- */5656-#define XFS_XFLAG_REALTIME 0x00000001 /* data in realtime volume */5757-#define XFS_XFLAG_PREALLOC 0x00000002 /* preallocated file extents */5858-#define XFS_XFLAG_IMMUTABLE 0x00000008 /* file cannot be modified */5959-#define XFS_XFLAG_APPEND 0x00000010 /* all writes append */6060-#define XFS_XFLAG_SYNC 0x00000020 /* all writes synchronous */6161-#define XFS_XFLAG_NOATIME 0x00000040 /* do not update access time */6262-#define XFS_XFLAG_NODUMP 0x00000080 /* do not include in backups */6363-#define XFS_XFLAG_RTINHERIT 0x00000100 /* create with rt bit set */6464-#define XFS_XFLAG_PROJINHERIT 0x00000200 /* create with parents projid */6565-#define XFS_XFLAG_NOSYMLINKS 0x00000400 /* disallow symlink creation */6666-#define XFS_XFLAG_EXTSIZE 0x00000800 /* extent size allocator hint */6767-#define XFS_XFLAG_EXTSZINHERIT 0x00001000 /* inherit inode extent size */6868-#define XFS_XFLAG_NODEFRAG 0x00002000 /* do not defragment */6969-#define XFS_XFLAG_FILESTREAM 0x00004000 /* use filestream allocator */7070-#define XFS_XFLAG_HASATTR 0x80000000 /* no DIFLAG for this */7171-7272-/*7339 * Structure for XFS_IOC_GETBMAP.7440 * On input, fill in bmv_offset and bmv_length of the first structure7541 * to indicate the area of interest in the file, and bmv_entries with···480514#define XFS_IOC_ALLOCSP _IOW ('X', 10, struct xfs_flock64)481515#define XFS_IOC_FREESP _IOW ('X', 11, struct xfs_flock64)482516#define XFS_IOC_DIOINFO _IOR ('X', 30, struct dioattr)483483-#define XFS_IOC_FSGETXATTR _IOR ('X', 31, struct fsxattr)484484-#define XFS_IOC_FSSETXATTR _IOW ('X', 32, struct fsxattr)517517+#define XFS_IOC_FSGETXATTR FS_IOC_FSGETXATTR518518+#define XFS_IOC_FSSETXATTR FS_IOC_FSSETXATTR485519#define XFS_IOC_ALLOCSP64 _IOW ('X', 36, struct xfs_flock64)486520#define XFS_IOC_FREESP64 _IOW ('X', 37, struct xfs_flock64)487521#define XFS_IOC_GETBMAP _IOWR('X', 38, struct getbmap)
···859859 unsigned int xflags = start;860860861861 if (flags & FS_IMMUTABLE_FL)862862- xflags |= XFS_XFLAG_IMMUTABLE;862862+ xflags |= FS_XFLAG_IMMUTABLE;863863 else864864- xflags &= ~XFS_XFLAG_IMMUTABLE;864864+ xflags &= ~FS_XFLAG_IMMUTABLE;865865 if (flags & FS_APPEND_FL)866866- xflags |= XFS_XFLAG_APPEND;866866+ xflags |= FS_XFLAG_APPEND;867867 else868868- xflags &= ~XFS_XFLAG_APPEND;868868+ xflags &= ~FS_XFLAG_APPEND;869869 if (flags & FS_SYNC_FL)870870- xflags |= XFS_XFLAG_SYNC;870870+ xflags |= FS_XFLAG_SYNC;871871 else872872- xflags &= ~XFS_XFLAG_SYNC;872872+ xflags &= ~FS_XFLAG_SYNC;873873 if (flags & FS_NOATIME_FL)874874- xflags |= XFS_XFLAG_NOATIME;874874+ xflags |= FS_XFLAG_NOATIME;875875 else876876- xflags &= ~XFS_XFLAG_NOATIME;876876+ xflags &= ~FS_XFLAG_NOATIME;877877 if (flags & FS_NODUMP_FL)878878- xflags |= XFS_XFLAG_NODUMP;878878+ xflags |= FS_XFLAG_NODUMP;879879 else880880- xflags &= ~XFS_XFLAG_NODUMP;880880+ xflags &= ~FS_XFLAG_NODUMP;881881882882 return xflags;883883}···945945 unsigned int xflags)946946{947947 unsigned int di_flags;948948+ uint64_t di_flags2;948949949950 /* can't set PREALLOC this way, just preserve it */950951 di_flags = (ip->i_d.di_flags & XFS_DIFLAG_PREALLOC);951951- if (xflags & XFS_XFLAG_IMMUTABLE)952952+ if (xflags & FS_XFLAG_IMMUTABLE)952953 di_flags |= XFS_DIFLAG_IMMUTABLE;953953- if (xflags & XFS_XFLAG_APPEND)954954+ if (xflags & FS_XFLAG_APPEND)954955 di_flags |= XFS_DIFLAG_APPEND;955955- if (xflags & XFS_XFLAG_SYNC)956956+ if (xflags & FS_XFLAG_SYNC)956957 di_flags |= XFS_DIFLAG_SYNC;957957- if (xflags & XFS_XFLAG_NOATIME)958958+ if (xflags & FS_XFLAG_NOATIME)958959 di_flags |= XFS_DIFLAG_NOATIME;959959- if (xflags & XFS_XFLAG_NODUMP)960960+ if (xflags & FS_XFLAG_NODUMP)960961 di_flags |= XFS_DIFLAG_NODUMP;961961- if (xflags & XFS_XFLAG_NODEFRAG)962962+ if (xflags & FS_XFLAG_NODEFRAG)962963 di_flags |= XFS_DIFLAG_NODEFRAG;963963- if (xflags & XFS_XFLAG_FILESTREAM)964964+ if (xflags & FS_XFLAG_FILESTREAM)964965 di_flags |= XFS_DIFLAG_FILESTREAM;965966 if (S_ISDIR(ip->i_d.di_mode)) {966966- if (xflags & XFS_XFLAG_RTINHERIT)967967+ if (xflags & FS_XFLAG_RTINHERIT)967968 di_flags |= XFS_DIFLAG_RTINHERIT;968968- if (xflags & XFS_XFLAG_NOSYMLINKS)969969+ if (xflags & FS_XFLAG_NOSYMLINKS)969970 di_flags |= XFS_DIFLAG_NOSYMLINKS;970970- if (xflags & XFS_XFLAG_EXTSZINHERIT)971971+ if (xflags & FS_XFLAG_EXTSZINHERIT)971972 di_flags |= XFS_DIFLAG_EXTSZINHERIT;972972- if (xflags & XFS_XFLAG_PROJINHERIT)973973+ if (xflags & FS_XFLAG_PROJINHERIT)973974 di_flags |= XFS_DIFLAG_PROJINHERIT;974975 } else if (S_ISREG(ip->i_d.di_mode)) {975975- if (xflags & XFS_XFLAG_REALTIME)976976+ if (xflags & FS_XFLAG_REALTIME)976977 di_flags |= XFS_DIFLAG_REALTIME;977977- if (xflags & XFS_XFLAG_EXTSIZE)978978+ if (xflags & FS_XFLAG_EXTSIZE)978979 di_flags |= XFS_DIFLAG_EXTSIZE;979980 }980980-981981 ip->i_d.di_flags = di_flags;982982+983983+ /* diflags2 only valid for v3 inodes. */984984+ if (ip->i_d.di_version < 3)985985+ return;986986+987987+ di_flags2 = 0;988988+ if (xflags & FS_XFLAG_DAX)989989+ di_flags2 |= XFS_DIFLAG2_DAX;990990+991991+ ip->i_d.di_flags2 = di_flags2;992992+982993}983994984995STATIC void···999988 struct inode *inode = VFS_I(ip);1000989 unsigned int xflags = xfs_ip2xflags(ip);100199010021002- if (xflags & XFS_XFLAG_IMMUTABLE)991991+ if (xflags & FS_XFLAG_IMMUTABLE)1003992 inode->i_flags |= S_IMMUTABLE;1004993 else1005994 inode->i_flags &= ~S_IMMUTABLE;10061006- if (xflags & XFS_XFLAG_APPEND)995995+ if (xflags & FS_XFLAG_APPEND)1007996 inode->i_flags |= S_APPEND;1008997 else1009998 inode->i_flags &= ~S_APPEND;10101010- if (xflags & XFS_XFLAG_SYNC)999999+ if (xflags & FS_XFLAG_SYNC)10111000 inode->i_flags |= S_SYNC;10121001 else10131002 inode->i_flags &= ~S_SYNC;10141014- if (xflags & XFS_XFLAG_NOATIME)10031003+ if (xflags & FS_XFLAG_NOATIME)10151004 inode->i_flags |= S_NOATIME;10161005 else10171006 inode->i_flags &= ~S_NOATIME;10071007+ if (xflags & FS_XFLAG_DAX)10081008+ inode->i_flags |= S_DAX;10091009+ else10101010+ inode->i_flags &= ~S_DAX;10111011+10181012}1019101310201014static int···1032101610331017 /* Can't change realtime flag if any extents are allocated. */10341018 if ((ip->i_d.di_nextents || ip->i_delayed_blks) &&10351035- XFS_IS_REALTIME_INODE(ip) != (fa->fsx_xflags & XFS_XFLAG_REALTIME))10191019+ XFS_IS_REALTIME_INODE(ip) != (fa->fsx_xflags & FS_XFLAG_REALTIME))10361020 return -EINVAL;1037102110381022 /* If realtime flag is set then must have realtime device */10391039- if (fa->fsx_xflags & XFS_XFLAG_REALTIME) {10231023+ if (fa->fsx_xflags & FS_XFLAG_REALTIME) {10401024 if (mp->m_sb.sb_rblocks == 0 || mp->m_sb.sb_rextsize == 0 ||10411025 (ip->i_d.di_extsize % mp->m_sb.sb_rextsize))10421026 return -EINVAL;···10471031 * we have appropriate permission.10481032 */10491033 if (((ip->i_d.di_flags & (XFS_DIFLAG_IMMUTABLE | XFS_DIFLAG_APPEND)) ||10501050- (fa->fsx_xflags & (XFS_XFLAG_IMMUTABLE | XFS_XFLAG_APPEND))) &&10341034+ (fa->fsx_xflags & (FS_XFLAG_IMMUTABLE | FS_XFLAG_APPEND))) &&10511035 !capable(CAP_LINUX_IMMUTABLE))10521036 return -EPERM;10531037···11111095 * extent size hint validation is somewhat cumbersome. Rules are:11121096 *11131097 * 1. extent size hint is only valid for directories and regular files11141114- * 2. XFS_XFLAG_EXTSIZE is only valid for regular files11151115- * 3. XFS_XFLAG_EXTSZINHERIT is only valid for directories.10981098+ * 2. FS_XFLAG_EXTSIZE is only valid for regular files10991099+ * 3. FS_XFLAG_EXTSZINHERIT is only valid for directories.11161100 * 4. can only be changed on regular files if no extents are allocated11171101 * 5. can be changed on directories at any time11181102 * 6. extsize hint of 0 turns off hints, clears inode flags.···11281112{11291113 struct xfs_mount *mp = ip->i_mount;1130111411311131- if ((fa->fsx_xflags & XFS_XFLAG_EXTSIZE) && !S_ISREG(ip->i_d.di_mode))11151115+ if ((fa->fsx_xflags & FS_XFLAG_EXTSIZE) && !S_ISREG(ip->i_d.di_mode))11321116 return -EINVAL;1133111711341134- if ((fa->fsx_xflags & XFS_XFLAG_EXTSZINHERIT) &&11181118+ if ((fa->fsx_xflags & FS_XFLAG_EXTSZINHERIT) &&11351119 !S_ISDIR(ip->i_d.di_mode))11361120 return -EINVAL;11371121···11481132 return -EINVAL;1149113311501134 if (XFS_IS_REALTIME_INODE(ip) ||11511151- (fa->fsx_xflags & XFS_XFLAG_REALTIME)) {11351135+ (fa->fsx_xflags & FS_XFLAG_REALTIME)) {11521136 size = mp->m_sb.sb_rextsize << mp->m_sb.sb_blocklog;11531137 } else {11541138 size = mp->m_sb.sb_blocksize;···11591143 if (fa->fsx_extsize % size)11601144 return -EINVAL;11611145 } else11621162- fa->fsx_xflags &= ~(XFS_XFLAG_EXTSIZE | XFS_XFLAG_EXTSZINHERIT);11461146+ fa->fsx_xflags &= ~(FS_XFLAG_EXTSIZE | FS_XFLAG_EXTSZINHERIT);1163114711641148 return 0;11651149}···1184116811851169 if (xfs_get_projid(ip) != fa->fsx_projid)11861170 return -EINVAL;11871187- if ((fa->fsx_xflags & XFS_XFLAG_PROJINHERIT) !=11711171+ if ((fa->fsx_xflags & FS_XFLAG_PROJINHERIT) !=11881172 (ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT))11891173 return -EINVAL;11901174
+2-2
fs/xfs/xfs_iops.c
···12011201 inode->i_flags |= S_SYNC;12021202 if (flags & XFS_DIFLAG_NOATIME)12031203 inode->i_flags |= S_NOATIME;12041204- /* XXX: Also needs an on-disk per inode flag! */12051205- if (ip->i_mount->m_flags & XFS_MOUNT_DAX)12041204+ if (ip->i_mount->m_flags & XFS_MOUNT_DAX ||12051205+ ip->i_d.di_flags2 & XFS_DIFLAG2_DAX)12061206 inode->i_flags |= S_DAX;12071207}12081208
+33
include/uapi/linux/fs.h
···110110#define MS_MGC_VAL 0xC0ED0000111111#define MS_MGC_MSK 0xffff0000112112113113+/*114114+ * Structure for FS_IOC_FSGETXATTR[A] and FS_IOC_FSSETXATTR.115115+ */116116+struct fsxattr {117117+ __u32 fsx_xflags; /* xflags field value (get/set) */118118+ __u32 fsx_extsize; /* extsize field value (get/set)*/119119+ __u32 fsx_nextents; /* nextents field value (get) */120120+ __u32 fsx_projid; /* project identifier (get/set) */121121+ unsigned char fsx_pad[12];122122+};123123+124124+/*125125+ * Flags for the fsx_xflags field126126+ */127127+#define FS_XFLAG_REALTIME 0x00000001 /* data in realtime volume */128128+#define FS_XFLAG_PREALLOC 0x00000002 /* preallocated file extents */129129+#define FS_XFLAG_IMMUTABLE 0x00000008 /* file cannot be modified */130130+#define FS_XFLAG_APPEND 0x00000010 /* all writes append */131131+#define FS_XFLAG_SYNC 0x00000020 /* all writes synchronous */132132+#define FS_XFLAG_NOATIME 0x00000040 /* do not update access time */133133+#define FS_XFLAG_NODUMP 0x00000080 /* do not include in backups */134134+#define FS_XFLAG_RTINHERIT 0x00000100 /* create with rt bit set */135135+#define FS_XFLAG_PROJINHERIT 0x00000200 /* create with parents projid */136136+#define FS_XFLAG_NOSYMLINKS 0x00000400 /* disallow symlink creation */137137+#define FS_XFLAG_EXTSIZE 0x00000800 /* extent size allocator hint */138138+#define FS_XFLAG_EXTSZINHERIT 0x00001000 /* inherit inode extent size */139139+#define FS_XFLAG_NODEFRAG 0x00002000 /* do not defragment */140140+#define FS_XFLAG_FILESTREAM 0x00004000 /* use filestream allocator */141141+#define FS_XFLAG_DAX 0x00008000 /* use DAX for IO */142142+#define FS_XFLAG_HASATTR 0x80000000 /* no DIFLAG for this */143143+113144/* the read-only stuff doesn't really belong here, but any other place is114145 probably as bad and I don't want to create yet another include file. */115146···200169#define FS_IOC32_SETFLAGS _IOW('f', 2, int)201170#define FS_IOC32_GETVERSION _IOR('v', 1, int)202171#define FS_IOC32_SETVERSION _IOW('v', 2, int)172172+#define FS_IOC_FSGETXATTR _IOR ('X', 31, struct fsxattr)173173+#define FS_IOC_FSSETXATTR _IOW ('X', 32, struct fsxattr)203174204175/*205176 * Inode flags (FS_IOC_GETFLAGS / FS_IOC_SETFLAGS)