From: ira.weiny@intel.com To: Dan Williams <dan.j.williams@intel.com>, Jan Kara <jack@suse.cz>, Theodore Ts'o <tytso@mit.edu>, Jeff Layton <jlayton@kernel.org>, Dave Chinner <david@fromorbit.com> Cc: linux-nvdimm@lists.01.org, "John Hubbard" <jhubbard@nvidia.com>, linux-kernel@vger.kernel.org, "Matthew Wilcox" <willy@infradead.org>, linux-xfs@vger.kernel.org, linux-mm@kvack.org, "Jérôme Glisse" <jglisse@redhat.com>, linux-fsdevel@vger.kernel.org, "Andrew Morton" <akpm@linux-foundation.org>, linux-ext4@vger.kernel.org Subject: [PATCH RFC 09/10] fs/xfs: Fail truncate if pages are GUP pinned Date: Wed, 5 Jun 2019 18:45:42 -0700 [thread overview] Message-ID: <20190606014544.8339-10-ira.weiny@intel.com> (raw) In-Reply-To: <20190606014544.8339-1-ira.weiny@intel.com> From: Ira Weiny <ira.weiny@intel.com> If pages are actively gup pinned fail the truncate operation. To support an application who wishes to removing a pin upon SIGIO reception we must change the order of breaking layout leases with respect to DAX layout leases. Check for a GUP pin on the page being truncated and return ETXTBSY if it is GUP pinned. Change the order of XFS break leased layouts and break DAX layouts. Select EXPORT_BLOCK_OPS for FS_DAX to ensure that xfs_break_lease_layouts() is defined for FS_DAX as well as pNFS. Update comment for xfs_break_lease_layouts() Signed-off-by: Ira Weiny <ira.weiny@intel.com> --- fs/Kconfig | 1 + fs/xfs/xfs_file.c | 8 ++++++-- fs/xfs/xfs_pnfs.c | 14 +++++++------- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/fs/Kconfig b/fs/Kconfig index f1046cf6ad85..c54b0b88abbf 100644 --- a/fs/Kconfig +++ b/fs/Kconfig @@ -49,6 +49,7 @@ config FS_DAX select DEV_PAGEMAP_OPS if (ZONE_DEVICE && !FS_DAX_LIMITED) select FS_IOMAP select DAX + select EXPORTFS_BLOCK_OPS help Direct Access (DAX) can be used on memory-backed block devices. If the block device supports DAX and the filesystem supports DAX, diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 350eb5546d36..1dc61c98f7cd 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -756,6 +756,9 @@ xfs_break_dax_layouts( if (!page) return 0; + if (page_gup_pinned(page)) + return -ETXTBSY; + *retry = true; return ___wait_var_event(&page->_refcount, atomic_read(&page->_refcount) == 1, TASK_INTERRUPTIBLE, @@ -779,10 +782,11 @@ xfs_break_layouts( retry = false; switch (reason) { case BREAK_UNMAP: - error = xfs_break_dax_layouts(inode, &retry, off, len); + error = xfs_break_leased_layouts(inode, iolock, &retry); if (error || retry) break; - /* fall through */ + error = xfs_break_dax_layouts(inode, &retry, off, len); + break; case BREAK_WRITE: error = xfs_break_leased_layouts(inode, iolock, &retry); break; diff --git a/fs/xfs/xfs_pnfs.c b/fs/xfs/xfs_pnfs.c index bde2c9f56a46..e70d24d12cbf 100644 --- a/fs/xfs/xfs_pnfs.c +++ b/fs/xfs/xfs_pnfs.c @@ -21,14 +21,14 @@ #include "xfs_pnfs.h" /* - * Ensure that we do not have any outstanding pNFS layouts that can be used by - * clients to directly read from or write to this inode. This must be called - * before every operation that can remove blocks from the extent map. - * Additionally we call it during the write operation, where aren't concerned - * about exposing unallocated blocks but just want to provide basic + * Ensure that we do not have any outstanding pNFS or longterm GUP layouts that + * can be used by clients to directly read from or write to this inode. This + * must be called before every operation that can remove blocks from the extent + * map. Additionally we call it during the write operation, where aren't + * concerned about exposing unallocated blocks but just want to provide basic * synchronization between a local writer and pNFS clients. mmap writes would - * also benefit from this sort of synchronization, but due to the tricky locking - * rules in the page fault path we don't bother. + * also benefit from this sort of synchronization, but due to the tricky + * locking rules in the page fault path we don't bother. */ int xfs_break_leased_layouts( -- 2.20.1 _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm
WARNING: multiple messages have this Message-ID (diff)
From: ira.weiny@intel.com To: Dan Williams <dan.j.williams@intel.com>, Jan Kara <jack@suse.cz>, "Theodore Ts'o" <tytso@mit.edu>, Jeff Layton <jlayton@kernel.org>, Dave Chinner <david@fromorbit.com> Cc: "Ira Weiny" <ira.weiny@intel.com>, "Matthew Wilcox" <willy@infradead.org>, linux-xfs@vger.kernel.org, "Andrew Morton" <akpm@linux-foundation.org>, "John Hubbard" <jhubbard@nvidia.com>, "Jérôme Glisse" <jglisse@redhat.com>, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nvdimm@lists.01.org, linux-ext4@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH RFC 09/10] fs/xfs: Fail truncate if pages are GUP pinned Date: Wed, 5 Jun 2019 18:45:42 -0700 [thread overview] Message-ID: <20190606014544.8339-10-ira.weiny@intel.com> (raw) In-Reply-To: <20190606014544.8339-1-ira.weiny@intel.com> From: Ira Weiny <ira.weiny@intel.com> If pages are actively gup pinned fail the truncate operation. To support an application who wishes to removing a pin upon SIGIO reception we must change the order of breaking layout leases with respect to DAX layout leases. Check for a GUP pin on the page being truncated and return ETXTBSY if it is GUP pinned. Change the order of XFS break leased layouts and break DAX layouts. Select EXPORT_BLOCK_OPS for FS_DAX to ensure that xfs_break_lease_layouts() is defined for FS_DAX as well as pNFS. Update comment for xfs_break_lease_layouts() Signed-off-by: Ira Weiny <ira.weiny@intel.com> --- fs/Kconfig | 1 + fs/xfs/xfs_file.c | 8 ++++++-- fs/xfs/xfs_pnfs.c | 14 +++++++------- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/fs/Kconfig b/fs/Kconfig index f1046cf6ad85..c54b0b88abbf 100644 --- a/fs/Kconfig +++ b/fs/Kconfig @@ -49,6 +49,7 @@ config FS_DAX select DEV_PAGEMAP_OPS if (ZONE_DEVICE && !FS_DAX_LIMITED) select FS_IOMAP select DAX + select EXPORTFS_BLOCK_OPS help Direct Access (DAX) can be used on memory-backed block devices. If the block device supports DAX and the filesystem supports DAX, diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 350eb5546d36..1dc61c98f7cd 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -756,6 +756,9 @@ xfs_break_dax_layouts( if (!page) return 0; + if (page_gup_pinned(page)) + return -ETXTBSY; + *retry = true; return ___wait_var_event(&page->_refcount, atomic_read(&page->_refcount) == 1, TASK_INTERRUPTIBLE, @@ -779,10 +782,11 @@ xfs_break_layouts( retry = false; switch (reason) { case BREAK_UNMAP: - error = xfs_break_dax_layouts(inode, &retry, off, len); + error = xfs_break_leased_layouts(inode, iolock, &retry); if (error || retry) break; - /* fall through */ + error = xfs_break_dax_layouts(inode, &retry, off, len); + break; case BREAK_WRITE: error = xfs_break_leased_layouts(inode, iolock, &retry); break; diff --git a/fs/xfs/xfs_pnfs.c b/fs/xfs/xfs_pnfs.c index bde2c9f56a46..e70d24d12cbf 100644 --- a/fs/xfs/xfs_pnfs.c +++ b/fs/xfs/xfs_pnfs.c @@ -21,14 +21,14 @@ #include "xfs_pnfs.h" /* - * Ensure that we do not have any outstanding pNFS layouts that can be used by - * clients to directly read from or write to this inode. This must be called - * before every operation that can remove blocks from the extent map. - * Additionally we call it during the write operation, where aren't concerned - * about exposing unallocated blocks but just want to provide basic + * Ensure that we do not have any outstanding pNFS or longterm GUP layouts that + * can be used by clients to directly read from or write to this inode. This + * must be called before every operation that can remove blocks from the extent + * map. Additionally we call it during the write operation, where aren't + * concerned about exposing unallocated blocks but just want to provide basic * synchronization between a local writer and pNFS clients. mmap writes would - * also benefit from this sort of synchronization, but due to the tricky locking - * rules in the page fault path we don't bother. + * also benefit from this sort of synchronization, but due to the tricky + * locking rules in the page fault path we don't bother. */ int xfs_break_leased_layouts( -- 2.20.1
next prev parent reply other threads:[~2019-06-06 1:45 UTC|newest] Thread overview: 136+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-06-06 1:45 [PATCH RFC 00/10] RDMA/FS DAX truncate proposal ira.weiny 2019-06-06 1:45 ` ira.weiny 2019-06-06 1:45 ` [PATCH RFC 01/10] fs/locks: Add trace_leases_conflict ira.weiny 2019-06-09 12:52 ` Jeff Layton 2019-06-06 1:45 ` [PATCH RFC 02/10] fs/locks: Export F_LAYOUT lease to user space ira.weiny 2019-06-06 1:45 ` ira.weiny 2019-06-09 13:00 ` Jeff Layton 2019-06-09 13:00 ` Jeff Layton 2019-06-11 21:38 ` Ira Weiny 2019-06-11 21:38 ` Ira Weiny 2019-06-12 9:46 ` Jan Kara 2019-06-06 1:45 ` [PATCH RFC 03/10] mm/gup: Pass flags down to __gup_device_huge* calls ira.weiny 2019-06-06 1:45 ` ira.weiny 2019-06-06 6:18 ` Christoph Hellwig 2019-06-06 16:10 ` Ira Weiny 2019-06-06 1:45 ` [PATCH RFC 04/10] mm/gup: Ensure F_LAYOUT lease is held prior to GUP'ing pages ira.weiny 2019-06-06 1:45 ` ira.weiny 2019-06-06 1:45 ` [PATCH RFC 05/10] fs/ext4: Teach ext4 to break layout leases ira.weiny 2019-06-06 1:45 ` ira.weiny 2019-06-06 1:45 ` [PATCH RFC 06/10] fs/ext4: Teach dax_layout_busy_page() to operate on a sub-range ira.weiny 2019-06-06 1:45 ` ira.weiny 2019-06-06 1:45 ` [PATCH RFC 07/10] fs/ext4: Fail truncate if pages are GUP pinned ira.weiny 2019-06-06 1:45 ` ira.weiny 2019-06-06 10:58 ` Jan Kara 2019-06-06 10:58 ` Jan Kara 2019-06-06 16:17 ` Ira Weiny 2019-06-06 1:45 ` [PATCH RFC 08/10] fs/xfs: Teach xfs to use new dax_layout_busy_page() ira.weiny 2019-06-06 1:45 ` ira.weiny 2019-06-06 1:45 ` ira.weiny [this message] 2019-06-06 1:45 ` [PATCH RFC 09/10] fs/xfs: Fail truncate if pages are GUP pinned ira.weiny 2019-06-06 1:45 ` [PATCH RFC 10/10] mm/gup: Remove FOLL_LONGTERM DAX exclusion ira.weiny 2019-06-06 1:45 ` ira.weiny 2019-06-06 5:52 ` [PATCH RFC 00/10] RDMA/FS DAX truncate proposal John Hubbard 2019-06-06 5:52 ` John Hubbard 2019-06-06 17:11 ` Ira Weiny 2019-06-06 17:11 ` Ira Weiny 2019-06-06 19:46 ` Jason Gunthorpe 2019-06-06 10:42 ` Jan Kara 2019-06-06 15:35 ` Dan Williams 2019-06-06 19:51 ` Jason Gunthorpe 2019-06-06 22:22 ` Ira Weiny 2019-06-07 10:36 ` Jan Kara 2019-06-07 12:17 ` Jason Gunthorpe 2019-06-07 14:52 ` Ira Weiny 2019-06-07 14:52 ` Ira Weiny 2019-06-07 15:10 ` Jason Gunthorpe 2019-06-12 10:29 ` Jan Kara 2019-06-12 10:29 ` Jan Kara 2019-06-12 11:47 ` Jason Gunthorpe 2019-06-12 12:09 ` Jan Kara 2019-06-12 12:09 ` Jan Kara 2019-06-12 18:41 ` Dan Williams 2019-06-13 7:17 ` Jan Kara 2019-06-13 7:17 ` Jan Kara 2019-06-12 19:14 ` Jason Gunthorpe 2019-06-12 22:13 ` Ira Weiny 2019-06-12 22:54 ` Dan Williams 2019-06-12 22:54 ` Dan Williams 2019-06-12 23:33 ` Ira Weiny 2019-06-12 23:33 ` Ira Weiny 2019-06-13 1:14 ` Dan Williams 2019-06-13 1:14 ` Dan Williams 2019-06-13 15:13 ` Jason Gunthorpe 2019-06-13 16:25 ` Dan Williams 2019-06-13 16:25 ` Dan Williams 2019-06-13 17:18 ` Jason Gunthorpe 2019-06-13 16:53 ` Dan Williams 2019-06-13 16:53 ` Dan Williams 2019-06-13 15:12 ` Jason Gunthorpe 2019-06-13 7:53 ` Jan Kara 2019-06-13 7:53 ` Jan Kara 2019-06-12 18:49 ` Dan Williams 2019-06-12 18:49 ` Dan Williams 2019-06-13 7:43 ` Jan Kara 2019-06-06 22:03 ` Ira Weiny 2019-06-06 22:03 ` Ira Weiny 2019-06-06 22:26 ` Ira Weiny 2019-06-06 22:28 ` Dave Chinner 2019-06-07 11:04 ` Jan Kara 2019-06-07 18:25 ` Ira Weiny 2019-06-07 18:25 ` Ira Weiny 2019-06-07 18:25 ` Ira Weiny 2019-06-07 18:50 ` Jason Gunthorpe 2019-06-08 0:10 ` Dave Chinner 2019-06-08 0:10 ` Dave Chinner 2019-06-09 1:29 ` Ira Weiny 2019-06-09 1:29 ` Ira Weiny 2019-06-09 1:29 ` Ira Weiny 2019-06-12 12:37 ` Matthew Wilcox 2019-06-12 12:37 ` Matthew Wilcox 2019-06-12 12:37 ` Matthew Wilcox 2019-06-12 23:30 ` Ira Weiny 2019-06-12 23:30 ` Ira Weiny 2019-06-12 23:30 ` Ira Weiny 2019-06-13 0:55 ` Dave Chinner 2019-06-13 0:55 ` Dave Chinner 2019-06-13 0:55 ` Dave Chinner 2019-06-13 20:34 ` Ira Weiny 2019-06-13 20:34 ` Ira Weiny 2019-06-13 20:34 ` Ira Weiny 2019-06-14 3:42 ` Dave Chinner 2019-06-13 0:25 ` Dave Chinner 2019-06-13 0:25 ` Dave Chinner 2019-06-13 3:23 ` Matthew Wilcox 2019-06-13 3:23 ` Matthew Wilcox 2019-06-13 3:23 ` Matthew Wilcox 2019-06-13 4:36 ` Dave Chinner 2019-06-13 4:36 ` Dave Chinner 2019-06-13 4:36 ` Dave Chinner 2019-06-13 10:47 ` Matthew Wilcox 2019-06-13 10:47 ` Matthew Wilcox 2019-06-13 10:47 ` Matthew Wilcox 2019-06-13 15:29 ` Jason Gunthorpe 2019-06-13 15:27 ` Matthew Wilcox 2019-06-13 15:27 ` Matthew Wilcox 2019-06-13 15:27 ` Matthew Wilcox 2019-06-13 21:13 ` Ira Weiny 2019-06-13 21:13 ` Ira Weiny 2019-06-13 23:45 ` Jason Gunthorpe 2019-06-14 0:00 ` Ira Weiny 2019-06-14 0:00 ` Ira Weiny 2019-06-14 2:09 ` Dave Chinner 2019-06-14 2:09 ` Dave Chinner 2019-06-14 2:09 ` Dave Chinner 2019-06-14 2:31 ` Matthew Wilcox 2019-06-14 2:31 ` Matthew Wilcox 2019-06-14 3:07 ` Dave Chinner 2019-06-14 3:07 ` Dave Chinner 2019-06-14 3:07 ` Dave Chinner 2019-06-20 14:52 ` Jan Kara 2019-06-20 14:52 ` Jan Kara 2019-06-13 20:34 ` Ira Weiny 2019-06-13 20:34 ` Ira Weiny 2019-06-13 20:34 ` Ira Weiny 2019-06-14 2:58 ` Dave Chinner 2019-06-14 2:58 ` Dave Chinner
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20190606014544.8339-10-ira.weiny@intel.com \ --to=ira.weiny@intel.com \ --cc=akpm@linux-foundation.org \ --cc=dan.j.williams@intel.com \ --cc=david@fromorbit.com \ --cc=jack@suse.cz \ --cc=jglisse@redhat.com \ --cc=jhubbard@nvidia.com \ --cc=jlayton@kernel.org \ --cc=linux-ext4@vger.kernel.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=linux-nvdimm@lists.01.org \ --cc=linux-xfs@vger.kernel.org \ --cc=tytso@mit.edu \ --cc=willy@infradead.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.