Message ID | 20200208193445.27421-4-ira.weiny@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Enable per-file/directory DAX operations V3 | expand |
On Sat, Feb 08, 2020 at 11:34:36AM -0800, ira.weiny@intel.com wrote: > From: Ira Weiny <ira.weiny@intel.com> > > xfs_inode_supports_dax() should reflect if the inode can support DAX not > that it is enabled for DAX. Leave that to other helper functions. > > Change the caller of xfs_inode_supports_dax() to call > xfs_inode_use_dax() which reflects new logic to override the effective > DAX flag with either the mount option or the physical DAX flag. > > To make the logic clear create 2 helper functions for the mount and > physical flag. > > Signed-off-by: Ira Weiny <ira.weiny@intel.com> > --- > fs/xfs/xfs_iops.c | 32 ++++++++++++++++++++++++++------ > 1 file changed, 26 insertions(+), 6 deletions(-) > > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > index 81f2f93caec0..a7db50d923d4 100644 > --- a/fs/xfs/xfs_iops.c > +++ b/fs/xfs/xfs_iops.c > @@ -1236,6 +1236,15 @@ static const struct inode_operations xfs_inline_symlink_inode_operations = { > .update_time = xfs_vn_update_time, > }; > > +static bool > +xfs_inode_mount_is_dax( > + struct xfs_inode *ip) > +{ > + struct xfs_mount *mp = ip->i_mount; > + > + return (mp->m_flags & XFS_MOUNT_DAX) == XFS_MOUNT_DAX; > +} > + > /* Figure out if this file actually supports DAX. */ > static bool > xfs_inode_supports_dax( > @@ -1247,11 +1256,6 @@ xfs_inode_supports_dax( > if (!S_ISREG(VFS_I(ip)->i_mode) || xfs_is_reflink_inode(ip)) > return false; > > - /* DAX mount option or DAX iflag must be set. */ > - if (!(mp->m_flags & XFS_MOUNT_DAX) && > - !(ip->i_d.di_flags2 & XFS_DIFLAG2_DAX)) > - return false; > - > /* Block size must match page size */ > if (mp->m_sb.sb_blocksize != PAGE_SIZE) > return false; > @@ -1260,6 +1264,22 @@ xfs_inode_supports_dax( > return xfs_inode_buftarg(ip)->bt_daxdev != NULL; > } > > +static bool > +xfs_inode_is_dax( > + struct xfs_inode *ip) > +{ > + return (ip->i_d.di_flags2 & XFS_DIFLAG2_DAX) == XFS_DIFLAG2_DAX; > +} I don't think these wrappers add any value at all - the naming of them is entirely confusing, too. e.g. "inode is dax" doesn't tell me that it is checking the on disk flags - it doesn't tell me how it is different to IS_DAX, or why I'd use one versus the other. And then xfs_inode_mount_is_dax() is just... worse. Naming is hard. :) > + > +static bool > +xfs_inode_use_dax( > + struct xfs_inode *ip) > +{ > + return xfs_inode_supports_dax(ip) && > + (xfs_inode_mount_is_dax(ip) || > + xfs_inode_is_dax(ip)); > +} Urk. Naming - we're not "using dax" here, we are checkign to see if we should enable DAX on this inode. IOWs: static bool xfs_inode_enable_dax( struct xfs_inode *ip) { if (!xfs_inode_supports_dax(ip)) return false; if (ip->i_d.di_flags2 & XFS_DIFLAG2_DAX) return true; if (ip->i_mount->m_flags & XFS_MOUNT_DAX) return true; return false; } Cheers, Dave.
On Tue, Feb 11, 2020 at 04:47:48PM +1100, Dave Chinner wrote: > On Sat, Feb 08, 2020 at 11:34:36AM -0800, ira.weiny@intel.com wrote: > > From: Ira Weiny <ira.weiny@intel.com> > > [snip] > > > > +static bool > > +xfs_inode_is_dax( > > + struct xfs_inode *ip) > > +{ > > + return (ip->i_d.di_flags2 & XFS_DIFLAG2_DAX) == XFS_DIFLAG2_DAX; > > +} > > I don't think these wrappers add any value at all - the naming of > them is entirely confusing, too. e.g. "inode is dax" doesn't tell me > that it is checking the on disk flags - it doesn't tell me how it is > different to IS_DAX, or why I'd use one versus the other. And then > xfs_inode_mount_is_dax() is just... worse. > > Naming is hard. :) Sure... I'm particularly bad as well... FWIW I don't see how xfs_inode_mount_is_dax() is worse, I rather think that is pretty clear but I'm not going to quibble over names because I know I'm rubbish at it and I'm certainly not enough of a FS person to make them clear... ;-) > > > + > > +static bool > > +xfs_inode_use_dax( > > + struct xfs_inode *ip) > > +{ > > + return xfs_inode_supports_dax(ip) && > > + (xfs_inode_mount_is_dax(ip) || > > + xfs_inode_is_dax(ip)); > > +} > > Urk. Naming - we're not "using dax" here, we are checkign to see if > we should enable DAX on this inode. IOWs: Well just to defend myself a little bit. My thought was: "When setting i_flags, should I use dax?" > > static bool > xfs_inode_enable_dax( > struct xfs_inode *ip) > { > if (!xfs_inode_supports_dax(ip)) > return false; > > if (ip->i_d.di_flags2 & XFS_DIFLAG2_DAX) > return true; > if (ip->i_mount->m_flags & XFS_MOUNT_DAX) > return true; > return false; > } Anyway, I'm good with this. Changed for V4. Thanks! Ira > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com
diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 81f2f93caec0..a7db50d923d4 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -1236,6 +1236,15 @@ static const struct inode_operations xfs_inline_symlink_inode_operations = { .update_time = xfs_vn_update_time, }; +static bool +xfs_inode_mount_is_dax( + struct xfs_inode *ip) +{ + struct xfs_mount *mp = ip->i_mount; + + return (mp->m_flags & XFS_MOUNT_DAX) == XFS_MOUNT_DAX; +} + /* Figure out if this file actually supports DAX. */ static bool xfs_inode_supports_dax( @@ -1247,11 +1256,6 @@ xfs_inode_supports_dax( if (!S_ISREG(VFS_I(ip)->i_mode) || xfs_is_reflink_inode(ip)) return false; - /* DAX mount option or DAX iflag must be set. */ - if (!(mp->m_flags & XFS_MOUNT_DAX) && - !(ip->i_d.di_flags2 & XFS_DIFLAG2_DAX)) - return false; - /* Block size must match page size */ if (mp->m_sb.sb_blocksize != PAGE_SIZE) return false; @@ -1260,6 +1264,22 @@ xfs_inode_supports_dax( return xfs_inode_buftarg(ip)->bt_daxdev != NULL; } +static bool +xfs_inode_is_dax( + struct xfs_inode *ip) +{ + return (ip->i_d.di_flags2 & XFS_DIFLAG2_DAX) == XFS_DIFLAG2_DAX; +} + +static bool +xfs_inode_use_dax( + struct xfs_inode *ip) +{ + return xfs_inode_supports_dax(ip) && + (xfs_inode_mount_is_dax(ip) || + xfs_inode_is_dax(ip)); +} + STATIC void xfs_diflags_to_iflags( struct inode *inode, @@ -1278,7 +1298,7 @@ xfs_diflags_to_iflags( inode->i_flags |= S_SYNC; if (flags & XFS_DIFLAG_NOATIME) inode->i_flags |= S_NOATIME; - if (xfs_inode_supports_dax(ip)) + if (xfs_inode_use_dax(ip)) inode->i_flags |= S_DAX; }