From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Cc: linux-fsdevel@vger.kernel.org, willy@linux.intel.com, jack@suse.cz Subject: [PATCH 3/8] dax: expose __dax_fault for filesystems with locking constraints Date: Tue, 24 Mar 2015 21:51:01 +1100 [thread overview] Message-ID: <1427194266-2885-4-git-send-email-david@fromorbit.com> (raw) In-Reply-To: <1427194266-2885-1-git-send-email-david@fromorbit.com> From: Dave Chinner <dchinner@redhat.com> Some filesystems cannot call dax_fault() directly because they have different locking and/or allocation constraints in the page fault IO path. To handle this, we need to follow the same model as the generic block_page_mkwrite code, where the internals are exposed via __block_page_mkwrite() so that filesystems can wrap the correct locking and operations around the outside. This is loosely based on a patch originally from Matthew Willcox. Unlike the original patch, it does not change ext4 code, error returns or unwritten extent conversion handling. It also adds a __dax_mkwrite() wrapper for .page_mkwrite implementations to do the right thing, too. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/dax.c | 15 +++++++++++++-- include/linux/fs.h | 5 ++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/fs/dax.c b/fs/dax.c index 431ec2b..0121f7d 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -313,7 +313,17 @@ static int dax_insert_mapping(struct inode *inode, struct buffer_head *bh, return error; } -static int do_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, +/** + * __dax_fault - handle a page fault on a DAX file + * @vma: The virtual memory area where the fault occurred + * @vmf: The description of the fault + * @get_block: The filesystem method used to translate file offsets to blocks + * + * When a page fault occurs, filesystems may call this helper in their + * fault handler for DAX files. __dax_fault() assumes the caller has done all + * the necessary locking for the page fault to proceed successfully. + */ +int __dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, get_block_t get_block, dax_iodone_t complete_unwritten) { struct file *file = vma->vm_file; @@ -440,6 +450,7 @@ static int do_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, } goto out; } +EXPORT_SYMBOL(__dax_fault); /** * dax_fault - handle a page fault on a DAX file @@ -460,7 +471,7 @@ int dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, sb_start_pagefault(sb); file_update_time(vma->vm_file); } - result = do_dax_fault(vma, vmf, get_block, complete_unwritten); + result = __dax_fault(vma, vmf, get_block, complete_unwritten); if (vmf->flags & FAULT_FLAG_WRITE) sb_end_pagefault(sb); diff --git a/include/linux/fs.h b/include/linux/fs.h index 82100ae..7e5a2d6 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2606,7 +2606,10 @@ int dax_zero_page_range(struct inode *, loff_t from, unsigned len, get_block_t); int dax_truncate_page(struct inode *, loff_t from, get_block_t); int dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t, dax_iodone_t); -#define dax_mkwrite(vma, vmf, gb, iod) dax_fault(vma, vmf, gb, iod) +int __dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t, + dax_iodone_t); +#define dax_mkwrite(vma, vmf, gb, iod) dax_fault(vma, vmf, gb, iod) +#define __dax_mkwrite(vma, vmf, gb, iod) __dax_fault(vma, vmf, gb, iod) #ifdef CONFIG_BLOCK typedef void (dio_submit_t)(int rw, struct bio *bio, struct inode *inode, -- 2.0.0
WARNING: multiple messages have this Message-ID (diff)
From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Cc: linux-fsdevel@vger.kernel.org, willy@linux.intel.com, jack@suse.cz Subject: [PATCH 3/8] dax: expose __dax_fault for filesystems with locking constraints Date: Tue, 24 Mar 2015 21:51:01 +1100 [thread overview] Message-ID: <1427194266-2885-4-git-send-email-david@fromorbit.com> (raw) In-Reply-To: <1427194266-2885-1-git-send-email-david@fromorbit.com> From: Dave Chinner <dchinner@redhat.com> Some filesystems cannot call dax_fault() directly because they have different locking and/or allocation constraints in the page fault IO path. To handle this, we need to follow the same model as the generic block_page_mkwrite code, where the internals are exposed via __block_page_mkwrite() so that filesystems can wrap the correct locking and operations around the outside. This is loosely based on a patch originally from Matthew Willcox. Unlike the original patch, it does not change ext4 code, error returns or unwritten extent conversion handling. It also adds a __dax_mkwrite() wrapper for .page_mkwrite implementations to do the right thing, too. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/dax.c | 15 +++++++++++++-- include/linux/fs.h | 5 ++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/fs/dax.c b/fs/dax.c index 431ec2b..0121f7d 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -313,7 +313,17 @@ static int dax_insert_mapping(struct inode *inode, struct buffer_head *bh, return error; } -static int do_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, +/** + * __dax_fault - handle a page fault on a DAX file + * @vma: The virtual memory area where the fault occurred + * @vmf: The description of the fault + * @get_block: The filesystem method used to translate file offsets to blocks + * + * When a page fault occurs, filesystems may call this helper in their + * fault handler for DAX files. __dax_fault() assumes the caller has done all + * the necessary locking for the page fault to proceed successfully. + */ +int __dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, get_block_t get_block, dax_iodone_t complete_unwritten) { struct file *file = vma->vm_file; @@ -440,6 +450,7 @@ static int do_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, } goto out; } +EXPORT_SYMBOL(__dax_fault); /** * dax_fault - handle a page fault on a DAX file @@ -460,7 +471,7 @@ int dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, sb_start_pagefault(sb); file_update_time(vma->vm_file); } - result = do_dax_fault(vma, vmf, get_block, complete_unwritten); + result = __dax_fault(vma, vmf, get_block, complete_unwritten); if (vmf->flags & FAULT_FLAG_WRITE) sb_end_pagefault(sb); diff --git a/include/linux/fs.h b/include/linux/fs.h index 82100ae..7e5a2d6 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2606,7 +2606,10 @@ int dax_zero_page_range(struct inode *, loff_t from, unsigned len, get_block_t); int dax_truncate_page(struct inode *, loff_t from, get_block_t); int dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t, dax_iodone_t); -#define dax_mkwrite(vma, vmf, gb, iod) dax_fault(vma, vmf, gb, iod) +int __dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t, + dax_iodone_t); +#define dax_mkwrite(vma, vmf, gb, iod) dax_fault(vma, vmf, gb, iod) +#define __dax_mkwrite(vma, vmf, gb, iod) __dax_fault(vma, vmf, gb, iod) #ifdef CONFIG_BLOCK typedef void (dio_submit_t)(int rw, struct bio *bio, struct inode *inode, -- 2.0.0 _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs
next prev parent reply other threads:[~2015-03-24 10:51 UTC|newest] Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-03-24 10:50 [PATCH 0/8 v2] xfs: DAX support Dave Chinner 2015-03-24 10:50 ` Dave Chinner 2015-03-24 10:50 ` [PATCH 1/8] xfs: mmap lock needs to be inside freeze protection Dave Chinner 2015-04-01 14:34 ` Jan Kara 2015-04-01 14:34 ` Jan Kara 2015-04-06 17:48 ` Brian Foster 2015-04-06 17:48 ` Brian Foster 2015-03-24 10:51 ` [PATCH 2/8] dax: don't abuse get_block mapping for endio callbacks Dave Chinner 2015-03-24 10:51 ` Dave Chinner 2015-04-01 14:53 ` Jan Kara 2015-04-01 14:53 ` Jan Kara 2015-03-24 10:51 ` Dave Chinner [this message] 2015-03-24 10:51 ` [PATCH 3/8] dax: expose __dax_fault for filesystems with locking constraints Dave Chinner 2015-04-01 15:07 ` Jan Kara 2015-04-01 15:07 ` Jan Kara 2015-03-24 10:51 ` [PATCH 4/8] xfs: add DAX block zeroing support Dave Chinner 2015-03-24 10:51 ` Dave Chinner 2015-04-06 17:48 ` Brian Foster 2015-04-06 17:48 ` Brian Foster 2015-03-24 10:51 ` [PATCH 5/8] xfs: add DAX file operations support Dave Chinner 2015-03-24 10:51 ` Dave Chinner 2015-03-24 12:08 ` Boaz Harrosh 2015-03-24 12:08 ` Boaz Harrosh 2015-03-24 12:24 ` Boaz Harrosh 2015-03-24 12:24 ` Boaz Harrosh 2015-03-24 21:17 ` Dave Chinner 2015-03-24 21:17 ` Dave Chinner 2015-03-25 8:47 ` Boaz Harrosh 2015-03-25 8:47 ` Boaz Harrosh 2015-04-06 17:49 ` Brian Foster 2015-04-06 17:49 ` Brian Foster 2015-04-16 8:29 ` Dave Chinner 2015-04-16 8:29 ` Dave Chinner 2015-04-16 9:33 ` Boaz Harrosh 2015-04-16 9:33 ` Boaz Harrosh 2015-04-16 11:47 ` Dave Chinner 2015-04-16 11:47 ` Dave Chinner 2015-03-24 10:51 ` [PATCH 6/8] xfs: add DAX truncate support Dave Chinner 2015-03-24 10:51 ` Dave Chinner 2015-04-06 17:49 ` Brian Foster 2015-04-06 17:49 ` Brian Foster 2015-03-24 10:51 ` [PATCH 7/8] xfs: add DAX IO path support Dave Chinner 2015-03-24 10:51 ` Dave Chinner 2015-04-06 17:49 ` Brian Foster 2015-04-06 17:49 ` Brian Foster 2015-04-16 8:54 ` Dave Chinner 2015-04-16 8:54 ` Dave Chinner 2015-03-24 10:51 ` [PATCH 8/8] xfs: add initial DAX support Dave Chinner 2015-03-24 10:51 ` Dave Chinner 2015-03-24 12:52 ` Boaz Harrosh 2015-03-24 12:52 ` Boaz Harrosh 2015-03-24 21:25 ` Dave Chinner 2015-03-24 21:25 ` Dave Chinner 2015-03-25 9:14 ` Boaz Harrosh 2015-03-25 9:14 ` Boaz Harrosh 2015-04-06 19:00 ` Brian Foster 2015-04-06 19:00 ` Brian Foster 2015-05-28 23:45 [PATCH 0/8 v3] xfs: " Dave Chinner 2015-05-28 23:45 ` [PATCH 3/8] dax: expose __dax_fault for filesystems with locking constraints 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=1427194266-2885-4-git-send-email-david@fromorbit.com \ --to=david@fromorbit.com \ --cc=jack@suse.cz \ --cc=linux-fsdevel@vger.kernel.org \ --cc=willy@linux.intel.com \ --cc=xfs@oss.sgi.com \ /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.