Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1739344 > unrolled thread
| Started by | Ross Zwisler <ross.zwisler@linux.intel.com> |
|---|---|
| First post | 2017-09-26 01:20 +0200 |
| Last post | 2017-09-26 21:10 +0200 |
| Articles | 5 — 3 participants |
Back to article view | Back to linux.kernel
[PATCH 0/7] re-enable XFS per-inode DAX Ross Zwisler <ross.zwisler@linux.intel.com> - 2017-09-26 01:20 +0200
[PATCH 7/7] xfs: re-enable XFS per-inode DAX Ross Zwisler <ross.zwisler@linux.intel.com> - 2017-09-26 01:20 +0200
Re: [PATCH 7/7] xfs: re-enable XFS per-inode DAX Dave Chinner <david@fromorbit.com> - 2017-09-26 02:40 +0200
Re: [PATCH 7/7] xfs: re-enable XFS per-inode DAX Christoph Hellwig <hch@lst.de> - 2017-09-26 08:40 +0200
Re: [PATCH 7/7] xfs: re-enable XFS per-inode DAX Ross Zwisler <ross.zwisler@linux.intel.com> - 2017-09-26 21:10 +0200
| From | Ross Zwisler <ross.zwisler@linux.intel.com> |
|---|---|
| Date | 2017-09-26 01:20 +0200 |
| Subject | [PATCH 0/7] re-enable XFS per-inode DAX |
| Message-ID | <utKPp-4Lc-5@gated-at.bofh.it> |
This series does the work needed to safely re-enable the XFS per-inode DAX flag. This includes fixes to make use of the DAX inode flag more safe and consistent, fixes to the read and write I/O path locking to make S_DAX transitions safe, and some code that prevents the DAX inode flag from transitioning when any mappings are set up. This series has passed my fstests regression testing both with and without DAX, and it also passes Christoph's regression test for the inode flag: https://www.spinics.net/lists/linux-xfs/msg10124.html My goal is to get feedback on this approach and on the XFS implementation, and then to do a similar implementation for ext4 based on my previous ext4 DAX inode flag patches: https://patchwork.kernel.org/patch/9939743/ These patches apply cleanly to v4.14-rc2. Ross Zwisler (7): xfs: always use DAX if mount option is used xfs: validate bdev support for DAX inode flag xfs: protect S_DAX transitions in XFS read path xfs: protect S_DAX transitions in XFS write path xfs: introduce xfs_is_dax_state_changing mm, fs: introduce file_operations->post_mmap() xfs: re-enable XFS per-inode DAX fs/xfs/xfs_file.c | 172 ++++++++++++++++++++++------------------------------- fs/xfs/xfs_ioctl.c | 47 ++++++++++++--- include/linux/fs.h | 1 + mm/mmap.c | 2 + 4 files changed, 114 insertions(+), 108 deletions(-) -- 2.9.5
[toc] | [next] | [standalone]
| From | Ross Zwisler <ross.zwisler@linux.intel.com> |
|---|---|
| Date | 2017-09-26 01:20 +0200 |
| Subject | [PATCH 7/7] xfs: re-enable XFS per-inode DAX |
| Message-ID | <utKPq-4Lc-31@gated-at.bofh.it> |
| In reply to | #1739344 |
Re-enable the XFS per-inode DAX flag, preventing S_DAX from changing when
any mappings are present.
Signed-off-by: Ross Zwisler <ross.zwisler@linux.intel.com>
---
fs/xfs/xfs_ioctl.c | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c
index 386b437..7a24dd5 100644
--- a/fs/xfs/xfs_ioctl.c
+++ b/fs/xfs/xfs_ioctl.c
@@ -1012,12 +1012,10 @@ xfs_diflags_to_linux(
inode->i_flags |= S_NOATIME;
else
inode->i_flags &= ~S_NOATIME;
-#if 0 /* disabled until the flag switching races are sorted out */
if ((xflags & FS_XFLAG_DAX) || (ip->i_mount->m_flags & XFS_MOUNT_DAX))
inode->i_flags |= S_DAX;
else
inode->i_flags &= ~S_DAX;
-#endif
}
static bool
@@ -1049,6 +1047,8 @@ xfs_ioctl_setattr_xflags(
{
struct xfs_mount *mp = ip->i_mount;
uint64_t di_flags2;
+ struct address_space *mapping = VFS_I(ip)->i_mapping;
+ bool dax_changing;
/* Can't change realtime flag if any extents are allocated. */
if ((ip->i_d.di_nextents || ip->i_delayed_blks) &&
@@ -1084,10 +1084,23 @@ xfs_ioctl_setattr_xflags(
if (di_flags2 && ip->i_d.di_version < 3)
return -EINVAL;
+ dax_changing = xfs_is_dax_state_changing(fa->fsx_xflags, ip);
+ if (dax_changing) {
+ i_mmap_lock_read(mapping);
+ if (mapping_mapped(mapping)) {
+ i_mmap_unlock_read(mapping);
+ return -EBUSY;
+ }
+ }
+
ip->i_d.di_flags = xfs_flags2diflags(ip, fa->fsx_xflags);
ip->i_d.di_flags2 = di_flags2;
xfs_diflags_to_linux(ip);
+
+ if (dax_changing)
+ i_mmap_unlock_read(mapping);
+
xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG);
xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
XFS_STATS_INC(mp, xs_ig_attrchg);
--
2.9.5
[toc] | [prev] | [next] | [standalone]
| From | Dave Chinner <david@fromorbit.com> |
|---|---|
| Date | 2017-09-26 02:40 +0200 |
| Subject | Re: [PATCH 7/7] xfs: re-enable XFS per-inode DAX |
| Message-ID | <utM4O-5w4-1@gated-at.bofh.it> |
| In reply to | #1739346 |
On Mon, Sep 25, 2017 at 05:14:04PM -0600, Ross Zwisler wrote:
> Re-enable the XFS per-inode DAX flag, preventing S_DAX from changing when
> any mappings are present.
>
> Signed-off-by: Ross Zwisler <ross.zwisler@linux.intel.com>
> ---
> fs/xfs/xfs_ioctl.c | 17 +++++++++++++++--
> 1 file changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c
> index 386b437..7a24dd5 100644
> --- a/fs/xfs/xfs_ioctl.c
> +++ b/fs/xfs/xfs_ioctl.c
> @@ -1012,12 +1012,10 @@ xfs_diflags_to_linux(
> inode->i_flags |= S_NOATIME;
> else
> inode->i_flags &= ~S_NOATIME;
> -#if 0 /* disabled until the flag switching races are sorted out */
> if ((xflags & FS_XFLAG_DAX) || (ip->i_mount->m_flags & XFS_MOUNT_DAX))
> inode->i_flags |= S_DAX;
> else
> inode->i_flags &= ~S_DAX;
> -#endif
> }
>
> static bool
> @@ -1049,6 +1047,8 @@ xfs_ioctl_setattr_xflags(
> {
> struct xfs_mount *mp = ip->i_mount;
> uint64_t di_flags2;
> + struct address_space *mapping = VFS_I(ip)->i_mapping;
> + bool dax_changing;
>
> /* Can't change realtime flag if any extents are allocated. */
> if ((ip->i_d.di_nextents || ip->i_delayed_blks) &&
> @@ -1084,10 +1084,23 @@ xfs_ioctl_setattr_xflags(
> if (di_flags2 && ip->i_d.di_version < 3)
> return -EINVAL;
>
> + dax_changing = xfs_is_dax_state_changing(fa->fsx_xflags, ip);
> + if (dax_changing) {
> + i_mmap_lock_read(mapping);
> + if (mapping_mapped(mapping)) {
> + i_mmap_unlock_read(mapping);
> + return -EBUSY;
> + }
> + }
> +
> ip->i_d.di_flags = xfs_flags2diflags(ip, fa->fsx_xflags);
> ip->i_d.di_flags2 = di_flags2;
>
> xfs_diflags_to_linux(ip);
> +
> + if (dax_changing)
> + i_mmap_unlock_read(mapping);
Is this safe to be taking here under the ILOCK_EXCL? i.e. this is
the lock order here:
IOLOCK_EXCL -> MMAPLOCK_EXCL -> ILOCK_EXCL -> i_mmap_rwsem
The truncate path must run outside the ILOCK
context, and it does this order via unmap_mapping_range:
IOLOCK_EXCL -> MMAPLOCK_EXCL -> i_mmap_rwsem
On a page fault, we do:
mmap_sem -> MMAPLOCK_EXCL -> page lock -> ILOCK_EXCL
Which gives the order
IOLOCK_EXCL
-> mmap_sem
-> MMAPLOCK_EXCL
-> page lock
-> ILOCK_EXCL
-> i_mmap_rwsem
What I'm not clear on is what the orders between page locks and
pte locks and i_mapping_tree_lock and i_mmap_rwsem. If there's any
locks that the filesystem can take above the ILOCK that are also
taken under the i_mmap_rwsem, then we have a deadlock vector.
Historically we've avoided any mm/ level interactions under the
ILOCK_EXCL because of it's location in the page fault path locking
order (e.g. lockdep will go nuts if we take a page fault with the
ILOCK held). Hence I'm extremely wary of putting any other mm/ level
locks under the ILOCK like this without a clear explanation of the
locking orders and why it won't deadlock....
Cheers,
Dave.
--
Dave Chinner
david@fromorbit.com
[toc] | [prev] | [next] | [standalone]
| From | Christoph Hellwig <hch@lst.de> |
|---|---|
| Date | 2017-09-26 08:40 +0200 |
| Subject | Re: [PATCH 7/7] xfs: re-enable XFS per-inode DAX |
| Message-ID | <utRHb-10R-1@gated-at.bofh.it> |
| In reply to | #1739346 |
On Mon, Sep 25, 2017 at 05:14:04PM -0600, Ross Zwisler wrote: > Re-enable the XFS per-inode DAX flag, preventing S_DAX from changing when > any mappings are present. Before we re-enable it please come up with a coherent description of the per-inode DAX flag that makes sense to a user. We'll also need to find a good place to document it, e.g. a new ioctl_setflags man page.
[toc] | [prev] | [next] | [standalone]
| From | Ross Zwisler <ross.zwisler@linux.intel.com> |
|---|---|
| Date | 2017-09-26 21:10 +0200 |
| Subject | Re: [PATCH 7/7] xfs: re-enable XFS per-inode DAX |
| Message-ID | <uu3p0-jm-7@gated-at.bofh.it> |
| In reply to | #1739539 |
On Tue, Sep 26, 2017 at 08:36:11AM +0200, Christoph Hellwig wrote: > On Mon, Sep 25, 2017 at 05:14:04PM -0600, Ross Zwisler wrote: > > Re-enable the XFS per-inode DAX flag, preventing S_DAX from changing when > > any mappings are present. > > Before we re-enable it please come up with a coherent description > of the per-inode DAX flag that makes sense to a user. We'll also need > to find a good place to document it, e.g. a new ioctl_setflags man > page. I agree that documentation is a great place to start, if we can just agree on what we want the functionality to be. :)
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web