From: Jan Kara <jack@suse.cz> To: Dan Williams <dan.j.williams@intel.com> Cc: Jan Kara <jack@suse.cz>, Matthew Wilcox <mawilcox@microsoft.com>, linux-nvdimm@lists.01.org, Dave Chinner <david@fromorbit.com>, linux-kernel@vger.kernel.org, linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, Christoph Hellwig <hch@lst.de> Subject: Re: [PATCH v7 02/14] fs, dax: prepare for dax-specific address_space_operations Date: Thu, 29 Mar 2018 17:28:45 +0200 [thread overview] Message-ID: <20180329152845.wvskcbhremndtuzg@quack2.suse.cz> (raw) In-Reply-To: <152167304153.5268.5998667213622821211.stgit@dwillia2-desk3.amr.corp.intel.com> On Wed 21-03-18 15:57:21, Dan Williams wrote: > In preparation for the dax implementation to start associating dax pages > to inodes via page->mapping, we need to provide a 'struct > address_space_operations' instance for dax. Define some generic VFS aops > helpers for dax. These noop implementations are there in the dax case to > prevent the VFS from falling back to operations with page-cache > assumptions, dax_writeback_mapping_range() may not be referenced in the > FS_DAX=n case. > > Cc: Jeff Moyer <jmoyer@redhat.com> > Cc: Ross Zwisler <ross.zwisler@linux.intel.com> > Suggested-by: Matthew Wilcox <mawilcox@microsoft.com> > Suggested-by: Jan Kara <jack@suse.cz> > Suggested-by: Christoph Hellwig <hch@lst.de> > Reviewed-by: Christoph Hellwig <hch@lst.de> > Suggested-by: Dave Chinner <david@fromorbit.com> > Signed-off-by: Dan Williams <dan.j.williams@intel.com> Looks good to me. I'm just wondering whether we should not add also some stubs calling WARN_ON() and bailing out for stuff like ->migratepage(), ->releasepage(). But probably it is very unlikely we'll introduce bugs that would trigger those paths so feel free to add: Reviewed-by: Jan Kara <jack@suse.cz> Honza > --- > fs/libfs.c | 27 +++++++++++++++++++++++++++ > include/linux/dax.h | 12 +++++++++--- > include/linux/fs.h | 3 +++ > 3 files changed, 39 insertions(+), 3 deletions(-) > > diff --git a/fs/libfs.c b/fs/libfs.c > index 7ff3cb904acd..e49d0ac6f800 100644 > --- a/fs/libfs.c > +++ b/fs/libfs.c > @@ -1060,6 +1060,33 @@ int noop_fsync(struct file *file, loff_t start, loff_t end, int datasync) > } > EXPORT_SYMBOL(noop_fsync); > > +int noop_set_page_dirty(struct page *page) > +{ > + /* > + * Unlike __set_page_dirty_no_writeback that handles dirty page > + * tracking in the page object, dax does all dirty tracking in > + * the inode address_space in response to mkwrite faults. In the > + * dax case we only need to worry about potentially dirty CPU > + * caches, not dirty page cache pages to write back. > + * > + * This callback is defined to prevent fallback to > + * __set_page_dirty_buffers() in set_page_dirty(). > + */ > + return 0; > +} > +EXPORT_SYMBOL_GPL(noop_set_page_dirty); > + > +void noop_invalidatepage(struct page *page, unsigned int offset, > + unsigned int length) > +{ > + /* > + * There is no page cache to invalidate in the dax case, however > + * we need this callback defined to prevent falling back to > + * block_invalidatepage() in do_invalidatepage(). > + */ > +} > +EXPORT_SYMBOL_GPL(noop_invalidatepage); > + > /* Because kfree isn't assignment-compatible with void(void*) ;-/ */ > void kfree_link(void *p) > { > diff --git a/include/linux/dax.h b/include/linux/dax.h > index 0185ecdae135..ae27a7efe7ab 100644 > --- a/include/linux/dax.h > +++ b/include/linux/dax.h > @@ -38,6 +38,7 @@ static inline void put_dax(struct dax_device *dax_dev) > } > #endif > > +struct writeback_control; > int bdev_dax_pgoff(struct block_device *, sector_t, size_t, pgoff_t *pgoff); > #if IS_ENABLED(CONFIG_FS_DAX) > int __bdev_dax_supported(struct super_block *sb, int blocksize); > @@ -57,6 +58,8 @@ static inline void fs_put_dax(struct dax_device *dax_dev) > } > > struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev); > +int dax_writeback_mapping_range(struct address_space *mapping, > + struct block_device *bdev, struct writeback_control *wbc); > #else > static inline int bdev_dax_supported(struct super_block *sb, int blocksize) > { > @@ -76,6 +79,12 @@ static inline struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev) > { > return NULL; > } > + > +static inline int dax_writeback_mapping_range(struct address_space *mapping, > + struct block_device *bdev, struct writeback_control *wbc) > +{ > + return -EOPNOTSUPP; > +} > #endif > > int dax_read_lock(void); > @@ -121,7 +130,4 @@ static inline bool dax_mapping(struct address_space *mapping) > return mapping->host && IS_DAX(mapping->host); > } > > -struct writeback_control; > -int dax_writeback_mapping_range(struct address_space *mapping, > - struct block_device *bdev, struct writeback_control *wbc); > #endif > diff --git a/include/linux/fs.h b/include/linux/fs.h > index 79c413985305..b57db31d294d 100644 > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -3129,6 +3129,9 @@ extern int simple_rmdir(struct inode *, struct dentry *); > extern int simple_rename(struct inode *, struct dentry *, > struct inode *, struct dentry *, unsigned int); > extern int noop_fsync(struct file *, loff_t, loff_t, int); > +extern int noop_set_page_dirty(struct page *page); > +extern void noop_invalidatepage(struct page *page, unsigned int offset, > + unsigned int length); > extern int simple_empty(struct dentry *); > extern int simple_readpage(struct file *file, struct page *page); > extern int simple_write_begin(struct file *file, struct address_space *mapping, > -- Jan Kara <jack@suse.com> SUSE Labs, CR _______________________________________________ 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: Jan Kara <jack@suse.cz> To: Dan Williams <dan.j.williams@intel.com> Cc: linux-nvdimm@lists.01.org, Jeff Moyer <jmoyer@redhat.com>, Ross Zwisler <ross.zwisler@linux.intel.com>, Matthew Wilcox <mawilcox@microsoft.com>, Jan Kara <jack@suse.cz>, Christoph Hellwig <hch@lst.de>, Dave Chinner <david@fromorbit.com>, linux-fsdevel@vger.kernel.org, linux-xfs@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v7 02/14] fs, dax: prepare for dax-specific address_space_operations Date: Thu, 29 Mar 2018 17:28:45 +0200 [thread overview] Message-ID: <20180329152845.wvskcbhremndtuzg@quack2.suse.cz> (raw) In-Reply-To: <152167304153.5268.5998667213622821211.stgit@dwillia2-desk3.amr.corp.intel.com> On Wed 21-03-18 15:57:21, Dan Williams wrote: > In preparation for the dax implementation to start associating dax pages > to inodes via page->mapping, we need to provide a 'struct > address_space_operations' instance for dax. Define some generic VFS aops > helpers for dax. These noop implementations are there in the dax case to > prevent the VFS from falling back to operations with page-cache > assumptions, dax_writeback_mapping_range() may not be referenced in the > FS_DAX=n case. > > Cc: Jeff Moyer <jmoyer@redhat.com> > Cc: Ross Zwisler <ross.zwisler@linux.intel.com> > Suggested-by: Matthew Wilcox <mawilcox@microsoft.com> > Suggested-by: Jan Kara <jack@suse.cz> > Suggested-by: Christoph Hellwig <hch@lst.de> > Reviewed-by: Christoph Hellwig <hch@lst.de> > Suggested-by: Dave Chinner <david@fromorbit.com> > Signed-off-by: Dan Williams <dan.j.williams@intel.com> Looks good to me. I'm just wondering whether we should not add also some stubs calling WARN_ON() and bailing out for stuff like ->migratepage(), ->releasepage(). But probably it is very unlikely we'll introduce bugs that would trigger those paths so feel free to add: Reviewed-by: Jan Kara <jack@suse.cz> Honza > --- > fs/libfs.c | 27 +++++++++++++++++++++++++++ > include/linux/dax.h | 12 +++++++++--- > include/linux/fs.h | 3 +++ > 3 files changed, 39 insertions(+), 3 deletions(-) > > diff --git a/fs/libfs.c b/fs/libfs.c > index 7ff3cb904acd..e49d0ac6f800 100644 > --- a/fs/libfs.c > +++ b/fs/libfs.c > @@ -1060,6 +1060,33 @@ int noop_fsync(struct file *file, loff_t start, loff_t end, int datasync) > } > EXPORT_SYMBOL(noop_fsync); > > +int noop_set_page_dirty(struct page *page) > +{ > + /* > + * Unlike __set_page_dirty_no_writeback that handles dirty page > + * tracking in the page object, dax does all dirty tracking in > + * the inode address_space in response to mkwrite faults. In the > + * dax case we only need to worry about potentially dirty CPU > + * caches, not dirty page cache pages to write back. > + * > + * This callback is defined to prevent fallback to > + * __set_page_dirty_buffers() in set_page_dirty(). > + */ > + return 0; > +} > +EXPORT_SYMBOL_GPL(noop_set_page_dirty); > + > +void noop_invalidatepage(struct page *page, unsigned int offset, > + unsigned int length) > +{ > + /* > + * There is no page cache to invalidate in the dax case, however > + * we need this callback defined to prevent falling back to > + * block_invalidatepage() in do_invalidatepage(). > + */ > +} > +EXPORT_SYMBOL_GPL(noop_invalidatepage); > + > /* Because kfree isn't assignment-compatible with void(void*) ;-/ */ > void kfree_link(void *p) > { > diff --git a/include/linux/dax.h b/include/linux/dax.h > index 0185ecdae135..ae27a7efe7ab 100644 > --- a/include/linux/dax.h > +++ b/include/linux/dax.h > @@ -38,6 +38,7 @@ static inline void put_dax(struct dax_device *dax_dev) > } > #endif > > +struct writeback_control; > int bdev_dax_pgoff(struct block_device *, sector_t, size_t, pgoff_t *pgoff); > #if IS_ENABLED(CONFIG_FS_DAX) > int __bdev_dax_supported(struct super_block *sb, int blocksize); > @@ -57,6 +58,8 @@ static inline void fs_put_dax(struct dax_device *dax_dev) > } > > struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev); > +int dax_writeback_mapping_range(struct address_space *mapping, > + struct block_device *bdev, struct writeback_control *wbc); > #else > static inline int bdev_dax_supported(struct super_block *sb, int blocksize) > { > @@ -76,6 +79,12 @@ static inline struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev) > { > return NULL; > } > + > +static inline int dax_writeback_mapping_range(struct address_space *mapping, > + struct block_device *bdev, struct writeback_control *wbc) > +{ > + return -EOPNOTSUPP; > +} > #endif > > int dax_read_lock(void); > @@ -121,7 +130,4 @@ static inline bool dax_mapping(struct address_space *mapping) > return mapping->host && IS_DAX(mapping->host); > } > > -struct writeback_control; > -int dax_writeback_mapping_range(struct address_space *mapping, > - struct block_device *bdev, struct writeback_control *wbc); > #endif > diff --git a/include/linux/fs.h b/include/linux/fs.h > index 79c413985305..b57db31d294d 100644 > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -3129,6 +3129,9 @@ extern int simple_rmdir(struct inode *, struct dentry *); > extern int simple_rename(struct inode *, struct dentry *, > struct inode *, struct dentry *, unsigned int); > extern int noop_fsync(struct file *, loff_t, loff_t, int); > +extern int noop_set_page_dirty(struct page *page); > +extern void noop_invalidatepage(struct page *page, unsigned int offset, > + unsigned int length); > extern int simple_empty(struct dentry *); > extern int simple_readpage(struct file *file, struct page *page); > extern int simple_write_begin(struct file *file, struct address_space *mapping, > -- Jan Kara <jack@suse.com> SUSE Labs, CR
next prev parent reply other threads:[~2018-03-29 15:22 UTC|newest] Thread overview: 90+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-03-21 22:57 [PATCH v7 00/14] dax: fix dma vs truncate/hole-punch Dan Williams 2018-03-21 22:57 ` Dan Williams 2018-03-21 22:57 ` Dan Williams 2018-03-21 22:57 ` Dan Williams 2018-03-21 22:57 ` [PATCH v7 01/14] dax: store pfns in the radix Dan Williams 2018-03-21 22:57 ` Dan Williams 2018-03-21 22:57 ` Dan Williams 2018-03-21 22:57 ` [PATCH v7 02/14] fs, dax: prepare for dax-specific address_space_operations Dan Williams 2018-03-21 22:57 ` Dan Williams 2018-03-21 22:57 ` Dan Williams 2018-03-29 15:28 ` Jan Kara [this message] 2018-03-29 15:28 ` Jan Kara 2018-03-21 22:57 ` [PATCH v7 03/14] block, dax: remove dead code in blkdev_writepages() Dan Williams 2018-03-21 22:57 ` Dan Williams 2018-03-21 22:57 ` Dan Williams 2018-03-29 15:29 ` Jan Kara 2018-03-29 15:29 ` Jan Kara 2018-03-21 22:57 ` [PATCH v7 04/14] xfs, dax: introduce xfs_dax_aops Dan Williams 2018-03-21 22:57 ` Dan Williams 2018-03-21 22:57 ` Dan Williams 2018-03-29 15:30 ` Jan Kara 2018-03-29 15:30 ` Jan Kara 2018-03-21 22:57 ` [PATCH v7 05/14] ext4, dax: introduce ext4_dax_aops Dan Williams 2018-03-21 22:57 ` Dan Williams 2018-03-21 22:57 ` Dan Williams 2018-03-21 22:57 ` Dan Williams 2018-03-29 15:40 ` Jan Kara 2018-03-29 15:40 ` Jan Kara 2018-03-29 15:40 ` Jan Kara 2018-03-29 18:09 ` Christoph Hellwig 2018-03-29 18:09 ` Christoph Hellwig 2018-03-29 18:09 ` Christoph Hellwig 2018-03-29 22:47 ` Dan Williams 2018-03-29 22:47 ` Dan Williams 2018-03-29 22:47 ` Dan Williams 2018-03-21 22:57 ` [PATCH v7 06/14] ext2, dax: introduce ext2_dax_aops Dan Williams 2018-03-21 22:57 ` Dan Williams 2018-03-29 15:44 ` Jan Kara 2018-03-29 15:44 ` Jan Kara 2018-03-21 22:57 ` [PATCH v7 07/14] fs, dax: use page->mapping to warn if truncate collides with a busy page Dan Williams 2018-03-21 22:57 ` Dan Williams 2018-03-21 22:57 ` Dan Williams 2018-03-29 16:02 ` Jan Kara 2018-03-29 16:02 ` Jan Kara 2018-03-29 19:02 ` Dan Williams 2018-03-29 19:02 ` Dan Williams 2018-03-29 23:02 ` Dan Williams 2018-03-29 23:02 ` Dan Williams 2018-03-30 8:22 ` Jan Kara 2018-03-30 8:22 ` Jan Kara 2018-03-21 22:57 ` [PATCH v7 08/14] mm, dax: enable filesystems to trigger dev_pagemap ->page_free callbacks Dan Williams 2018-03-21 22:57 ` Dan Williams 2018-03-29 16:36 ` Jan Kara 2018-03-29 16:36 ` Jan Kara 2018-03-29 16:36 ` Jan Kara 2018-03-21 22:57 ` [PATCH v7 09/14] mm, dev_pagemap: introduce CONFIG_DEV_PAGEMAP_OPS Dan Williams 2018-03-21 22:57 ` Dan Williams 2018-03-22 7:49 ` Christoph Hellwig 2018-03-22 7:49 ` Christoph Hellwig 2018-03-30 10:37 ` Jan Kara 2018-03-30 10:37 ` Jan Kara 2018-03-30 10:37 ` Jan Kara 2018-03-21 22:58 ` [PATCH v7 10/14] memremap: mark devm_memremap_pages() EXPORT_SYMBOL_GPL Dan Williams 2018-03-21 22:58 ` Dan Williams 2018-03-22 7:51 ` Christoph Hellwig 2018-03-22 7:51 ` Christoph Hellwig 2018-03-21 22:58 ` [PATCH v7 11/14] mm, fs, dax: handle layout changes to pinned dax mappings Dan Williams 2018-03-21 22:58 ` Dan Williams 2018-03-21 22:58 ` Dan Williams 2018-03-21 22:58 ` [PATCH v7 12/14] xfs: prepare xfs_break_layouts() to be called with XFS_MMAPLOCK_EXCL Dan Williams 2018-03-21 22:58 ` Dan Williams 2018-03-22 7:25 ` Christoph Hellwig 2018-03-22 7:25 ` Christoph Hellwig 2018-03-30 15:16 ` Darrick J. Wong 2018-03-30 15:16 ` Darrick J. Wong 2018-03-21 22:58 ` [PATCH v7 13/14] xfs: prepare xfs_break_layouts() for another layout type Dan Williams 2018-03-21 22:58 ` Dan Williams 2018-03-22 7:27 ` Christoph Hellwig 2018-03-22 7:27 ` Christoph Hellwig 2018-03-22 15:50 ` Dan Williams 2018-03-22 15:50 ` Dan Williams 2018-03-21 22:58 ` [PATCH v7 14/14] xfs, dax: introduce xfs_break_dax_layouts() Dan Williams 2018-03-21 22:58 ` Dan Williams 2018-03-21 22:58 ` Dan Williams 2018-03-22 7:43 ` Christoph Hellwig 2018-03-22 7:43 ` Christoph Hellwig 2018-03-22 16:28 ` Dan Williams 2018-03-22 16:28 ` Dan Williams 2018-03-22 17:02 ` Christoph Hellwig 2018-03-22 17:02 ` Christoph Hellwig
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=20180329152845.wvskcbhremndtuzg@quack2.suse.cz \ --to=jack@suse.cz \ --cc=dan.j.williams@intel.com \ --cc=david@fromorbit.com \ --cc=hch@lst.de \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-nvdimm@lists.01.org \ --cc=linux-xfs@vger.kernel.org \ --cc=mawilcox@microsoft.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.