|
@@ -859,25 +859,25 @@ xfs_merge_ioc_xflags(
|
|
|
unsigned int xflags = start;
|
|
|
|
|
|
if (flags & FS_IMMUTABLE_FL)
|
|
|
- xflags |= XFS_XFLAG_IMMUTABLE;
|
|
|
+ xflags |= FS_XFLAG_IMMUTABLE;
|
|
|
else
|
|
|
- xflags &= ~XFS_XFLAG_IMMUTABLE;
|
|
|
+ xflags &= ~FS_XFLAG_IMMUTABLE;
|
|
|
if (flags & FS_APPEND_FL)
|
|
|
- xflags |= XFS_XFLAG_APPEND;
|
|
|
+ xflags |= FS_XFLAG_APPEND;
|
|
|
else
|
|
|
- xflags &= ~XFS_XFLAG_APPEND;
|
|
|
+ xflags &= ~FS_XFLAG_APPEND;
|
|
|
if (flags & FS_SYNC_FL)
|
|
|
- xflags |= XFS_XFLAG_SYNC;
|
|
|
+ xflags |= FS_XFLAG_SYNC;
|
|
|
else
|
|
|
- xflags &= ~XFS_XFLAG_SYNC;
|
|
|
+ xflags &= ~FS_XFLAG_SYNC;
|
|
|
if (flags & FS_NOATIME_FL)
|
|
|
- xflags |= XFS_XFLAG_NOATIME;
|
|
|
+ xflags |= FS_XFLAG_NOATIME;
|
|
|
else
|
|
|
- xflags &= ~XFS_XFLAG_NOATIME;
|
|
|
+ xflags &= ~FS_XFLAG_NOATIME;
|
|
|
if (flags & FS_NODUMP_FL)
|
|
|
- xflags |= XFS_XFLAG_NODUMP;
|
|
|
+ xflags |= FS_XFLAG_NODUMP;
|
|
|
else
|
|
|
- xflags &= ~XFS_XFLAG_NODUMP;
|
|
|
+ xflags &= ~FS_XFLAG_NODUMP;
|
|
|
|
|
|
return xflags;
|
|
|
}
|
|
@@ -945,40 +945,51 @@ xfs_set_diflags(
|
|
|
unsigned int xflags)
|
|
|
{
|
|
|
unsigned int di_flags;
|
|
|
+ uint64_t di_flags2;
|
|
|
|
|
|
/* can't set PREALLOC this way, just preserve it */
|
|
|
di_flags = (ip->i_d.di_flags & XFS_DIFLAG_PREALLOC);
|
|
|
- if (xflags & XFS_XFLAG_IMMUTABLE)
|
|
|
+ if (xflags & FS_XFLAG_IMMUTABLE)
|
|
|
di_flags |= XFS_DIFLAG_IMMUTABLE;
|
|
|
- if (xflags & XFS_XFLAG_APPEND)
|
|
|
+ if (xflags & FS_XFLAG_APPEND)
|
|
|
di_flags |= XFS_DIFLAG_APPEND;
|
|
|
- if (xflags & XFS_XFLAG_SYNC)
|
|
|
+ if (xflags & FS_XFLAG_SYNC)
|
|
|
di_flags |= XFS_DIFLAG_SYNC;
|
|
|
- if (xflags & XFS_XFLAG_NOATIME)
|
|
|
+ if (xflags & FS_XFLAG_NOATIME)
|
|
|
di_flags |= XFS_DIFLAG_NOATIME;
|
|
|
- if (xflags & XFS_XFLAG_NODUMP)
|
|
|
+ if (xflags & FS_XFLAG_NODUMP)
|
|
|
di_flags |= XFS_DIFLAG_NODUMP;
|
|
|
- if (xflags & XFS_XFLAG_NODEFRAG)
|
|
|
+ if (xflags & FS_XFLAG_NODEFRAG)
|
|
|
di_flags |= XFS_DIFLAG_NODEFRAG;
|
|
|
- if (xflags & XFS_XFLAG_FILESTREAM)
|
|
|
+ if (xflags & FS_XFLAG_FILESTREAM)
|
|
|
di_flags |= XFS_DIFLAG_FILESTREAM;
|
|
|
if (S_ISDIR(ip->i_d.di_mode)) {
|
|
|
- if (xflags & XFS_XFLAG_RTINHERIT)
|
|
|
+ if (xflags & FS_XFLAG_RTINHERIT)
|
|
|
di_flags |= XFS_DIFLAG_RTINHERIT;
|
|
|
- if (xflags & XFS_XFLAG_NOSYMLINKS)
|
|
|
+ if (xflags & FS_XFLAG_NOSYMLINKS)
|
|
|
di_flags |= XFS_DIFLAG_NOSYMLINKS;
|
|
|
- if (xflags & XFS_XFLAG_EXTSZINHERIT)
|
|
|
+ if (xflags & FS_XFLAG_EXTSZINHERIT)
|
|
|
di_flags |= XFS_DIFLAG_EXTSZINHERIT;
|
|
|
- if (xflags & XFS_XFLAG_PROJINHERIT)
|
|
|
+ if (xflags & FS_XFLAG_PROJINHERIT)
|
|
|
di_flags |= XFS_DIFLAG_PROJINHERIT;
|
|
|
} else if (S_ISREG(ip->i_d.di_mode)) {
|
|
|
- if (xflags & XFS_XFLAG_REALTIME)
|
|
|
+ if (xflags & FS_XFLAG_REALTIME)
|
|
|
di_flags |= XFS_DIFLAG_REALTIME;
|
|
|
- if (xflags & XFS_XFLAG_EXTSIZE)
|
|
|
+ if (xflags & FS_XFLAG_EXTSIZE)
|
|
|
di_flags |= XFS_DIFLAG_EXTSIZE;
|
|
|
}
|
|
|
-
|
|
|
ip->i_d.di_flags = di_flags;
|
|
|
+
|
|
|
+ /* diflags2 only valid for v3 inodes. */
|
|
|
+ if (ip->i_d.di_version < 3)
|
|
|
+ return;
|
|
|
+
|
|
|
+ di_flags2 = 0;
|
|
|
+ if (xflags & FS_XFLAG_DAX)
|
|
|
+ di_flags2 |= XFS_DIFLAG2_DAX;
|
|
|
+
|
|
|
+ ip->i_d.di_flags2 = di_flags2;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
STATIC void
|
|
@@ -988,22 +999,27 @@ xfs_diflags_to_linux(
|
|
|
struct inode *inode = VFS_I(ip);
|
|
|
unsigned int xflags = xfs_ip2xflags(ip);
|
|
|
|
|
|
- if (xflags & XFS_XFLAG_IMMUTABLE)
|
|
|
+ if (xflags & FS_XFLAG_IMMUTABLE)
|
|
|
inode->i_flags |= S_IMMUTABLE;
|
|
|
else
|
|
|
inode->i_flags &= ~S_IMMUTABLE;
|
|
|
- if (xflags & XFS_XFLAG_APPEND)
|
|
|
+ if (xflags & FS_XFLAG_APPEND)
|
|
|
inode->i_flags |= S_APPEND;
|
|
|
else
|
|
|
inode->i_flags &= ~S_APPEND;
|
|
|
- if (xflags & XFS_XFLAG_SYNC)
|
|
|
+ if (xflags & FS_XFLAG_SYNC)
|
|
|
inode->i_flags |= S_SYNC;
|
|
|
else
|
|
|
inode->i_flags &= ~S_SYNC;
|
|
|
- if (xflags & XFS_XFLAG_NOATIME)
|
|
|
+ if (xflags & FS_XFLAG_NOATIME)
|
|
|
inode->i_flags |= S_NOATIME;
|
|
|
else
|
|
|
inode->i_flags &= ~S_NOATIME;
|
|
|
+ if (xflags & FS_XFLAG_DAX)
|
|
|
+ inode->i_flags |= S_DAX;
|
|
|
+ else
|
|
|
+ inode->i_flags &= ~S_DAX;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
static int
|
|
@@ -1016,11 +1032,11 @@ xfs_ioctl_setattr_xflags(
|
|
|
|
|
|
/* Can't change realtime flag if any extents are allocated. */
|
|
|
if ((ip->i_d.di_nextents || ip->i_delayed_blks) &&
|
|
|
- XFS_IS_REALTIME_INODE(ip) != (fa->fsx_xflags & XFS_XFLAG_REALTIME))
|
|
|
+ XFS_IS_REALTIME_INODE(ip) != (fa->fsx_xflags & FS_XFLAG_REALTIME))
|
|
|
return -EINVAL;
|
|
|
|
|
|
/* If realtime flag is set then must have realtime device */
|
|
|
- if (fa->fsx_xflags & XFS_XFLAG_REALTIME) {
|
|
|
+ if (fa->fsx_xflags & FS_XFLAG_REALTIME) {
|
|
|
if (mp->m_sb.sb_rblocks == 0 || mp->m_sb.sb_rextsize == 0 ||
|
|
|
(ip->i_d.di_extsize % mp->m_sb.sb_rextsize))
|
|
|
return -EINVAL;
|
|
@@ -1031,7 +1047,7 @@ xfs_ioctl_setattr_xflags(
|
|
|
* we have appropriate permission.
|
|
|
*/
|
|
|
if (((ip->i_d.di_flags & (XFS_DIFLAG_IMMUTABLE | XFS_DIFLAG_APPEND)) ||
|
|
|
- (fa->fsx_xflags & (XFS_XFLAG_IMMUTABLE | XFS_XFLAG_APPEND))) &&
|
|
|
+ (fa->fsx_xflags & (FS_XFLAG_IMMUTABLE | FS_XFLAG_APPEND))) &&
|
|
|
!capable(CAP_LINUX_IMMUTABLE))
|
|
|
return -EPERM;
|
|
|
|
|
@@ -1095,8 +1111,8 @@ out_cancel:
|
|
|
* extent size hint validation is somewhat cumbersome. Rules are:
|
|
|
*
|
|
|
* 1. extent size hint is only valid for directories and regular files
|
|
|
- * 2. XFS_XFLAG_EXTSIZE is only valid for regular files
|
|
|
- * 3. XFS_XFLAG_EXTSZINHERIT is only valid for directories.
|
|
|
+ * 2. FS_XFLAG_EXTSIZE is only valid for regular files
|
|
|
+ * 3. FS_XFLAG_EXTSZINHERIT is only valid for directories.
|
|
|
* 4. can only be changed on regular files if no extents are allocated
|
|
|
* 5. can be changed on directories at any time
|
|
|
* 6. extsize hint of 0 turns off hints, clears inode flags.
|
|
@@ -1112,10 +1128,10 @@ xfs_ioctl_setattr_check_extsize(
|
|
|
{
|
|
|
struct xfs_mount *mp = ip->i_mount;
|
|
|
|
|
|
- if ((fa->fsx_xflags & XFS_XFLAG_EXTSIZE) && !S_ISREG(ip->i_d.di_mode))
|
|
|
+ if ((fa->fsx_xflags & FS_XFLAG_EXTSIZE) && !S_ISREG(ip->i_d.di_mode))
|
|
|
return -EINVAL;
|
|
|
|
|
|
- if ((fa->fsx_xflags & XFS_XFLAG_EXTSZINHERIT) &&
|
|
|
+ if ((fa->fsx_xflags & FS_XFLAG_EXTSZINHERIT) &&
|
|
|
!S_ISDIR(ip->i_d.di_mode))
|
|
|
return -EINVAL;
|
|
|
|
|
@@ -1132,7 +1148,7 @@ xfs_ioctl_setattr_check_extsize(
|
|
|
return -EINVAL;
|
|
|
|
|
|
if (XFS_IS_REALTIME_INODE(ip) ||
|
|
|
- (fa->fsx_xflags & XFS_XFLAG_REALTIME)) {
|
|
|
+ (fa->fsx_xflags & FS_XFLAG_REALTIME)) {
|
|
|
size = mp->m_sb.sb_rextsize << mp->m_sb.sb_blocklog;
|
|
|
} else {
|
|
|
size = mp->m_sb.sb_blocksize;
|
|
@@ -1143,7 +1159,7 @@ xfs_ioctl_setattr_check_extsize(
|
|
|
if (fa->fsx_extsize % size)
|
|
|
return -EINVAL;
|
|
|
} else
|
|
|
- fa->fsx_xflags &= ~(XFS_XFLAG_EXTSIZE | XFS_XFLAG_EXTSZINHERIT);
|
|
|
+ fa->fsx_xflags &= ~(FS_XFLAG_EXTSIZE | FS_XFLAG_EXTSZINHERIT);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -1168,7 +1184,7 @@ xfs_ioctl_setattr_check_projid(
|
|
|
|
|
|
if (xfs_get_projid(ip) != fa->fsx_projid)
|
|
|
return -EINVAL;
|
|
|
- if ((fa->fsx_xflags & XFS_XFLAG_PROJINHERIT) !=
|
|
|
+ if ((fa->fsx_xflags & FS_XFLAG_PROJINHERIT) !=
|
|
|
(ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT))
|
|
|
return -EINVAL;
|
|
|
|