From: Dan Williams <dan.j.williams@intel.com> To: akpm@linux-foundation.org Cc: jack@suse.cz, linux-nvdimm@lists.01.org, Matthew Wilcox <mawilcox@microsoft.com>, linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, hch@lst.de Subject: [PATCH v4 11/18] fs, dax: introduce DEFINE_FSDAX_AOPS Date: Sat, 23 Dec 2017 16:56:59 -0800 [thread overview] Message-ID: <151407701943.38751.8997225433943672290.stgit@dwillia2-desk3.amr.corp.intel.com> (raw) In-Reply-To: <151407695916.38751.2866053440557472361.stgit@dwillia2-desk3.amr.corp.intel.com> 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. Otherwise, direct-I/O triggers incorrect page cache assumptions and warnings like the following: WARNING: CPU: 27 PID: 1783 at fs/xfs/xfs_aops.c:1468 xfs_vm_set_page_dirty+0xf3/0x1b0 [xfs] [..] CPU: 27 PID: 1783 Comm: dma-collision Tainted: G O 4.15.0-rc2+ #984 [..] Call Trace: set_page_dirty_lock+0x40/0x60 bio_set_pages_dirty+0x37/0x50 iomap_dio_actor+0x2b7/0x3b0 ? iomap_dio_zero+0x110/0x110 iomap_apply+0xa4/0x110 iomap_dio_rw+0x29e/0x3b0 ? iomap_dio_zero+0x110/0x110 ? xfs_file_dio_aio_read+0x7c/0x1a0 [xfs] xfs_file_dio_aio_read+0x7c/0x1a0 [xfs] xfs_file_read_iter+0xa0/0xc0 [xfs] __vfs_read+0xf9/0x170 vfs_read+0xa6/0x150 SyS_pread64+0x93/0xb0 entry_SYSCALL_64_fastpath+0x1f/0x96 ...where the default set_page_dirty() handler assumes that dirty state is being tracked in 'struct page' flags. A DEFINE_FSDAX_AOPS macro helper is provided instead of a global 'struct address_space_operations fs_dax_aops' instance, because ->writepages needs to be an fs-specific implementation. Cc: Jeff Moyer <jmoyer@redhat.com> Cc: Christoph Hellwig <hch@lst.de> Cc: Matthew Wilcox <mawilcox@microsoft.com> Cc: Ross Zwisler <ross.zwisler@linux.intel.com> Suggested-by: Jan Kara <jack@suse.cz> Signed-off-by: Dan Williams <dan.j.williams@intel.com> --- fs/dax.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/dax.h | 32 ++++++++++++++++++++++++ 2 files changed, 101 insertions(+) diff --git a/fs/dax.c b/fs/dax.c index 54071cd27e8c..fadc1b13838b 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -45,6 +45,75 @@ /* The 'colour' (ie low bits) within a PMD of a page offset. */ #define PG_PMD_COLOUR ((PMD_SIZE >> PAGE_SHIFT) - 1) +int dax_set_page_dirty(struct page *page) +{ + /* + * Unlike __set_page_dirty_no_writeback, dax does all dirty + * tracking in the radix in response to mkwrite faults. + */ + return 0; +} +EXPORT_SYMBOL(dax_set_page_dirty); + +ssize_t dax_direct_IO(struct kiocb *kiocb, struct iov_iter *iter) +{ + /* + * The expectation is that filesystems that implement DAX + * support also arrange for ->read_iter and ->write_iter to + * bypass ->direct_IO. + */ + WARN_ONCE(1, "dax: incomplete fs implementation\n"); + return -EINVAL; +} +EXPORT_SYMBOL(dax_direct_IO); + +int dax_writepage(struct page *page, struct writeback_control *wbc) +{ + WARN_ONCE(1, "dax: incomplete fs implementation\n"); + return -EINVAL; +} +EXPORT_SYMBOL(dax_writepage); + +int dax_readpage(struct file *filp, struct page *page) +{ + WARN_ONCE(1, "dax: incomplete fs implementation\n"); + return -EINVAL; +} +EXPORT_SYMBOL(dax_readpage); + +int dax_readpages(struct file *filp, struct address_space *mapping, + struct list_head *pages, unsigned nr_pages) +{ + WARN_ONCE(1, "dax: incomplete fs implementation\n"); + return -EINVAL; +} +EXPORT_SYMBOL(dax_readpages); + +int dax_write_begin(struct file *filp, struct address_space *mapping, + loff_t pos, unsigned len, unsigned flags, + struct page **pagep, void **fsdata) +{ + WARN_ONCE(1, "dax: incomplete fs implementation\n"); + return -EINVAL; +} +EXPORT_SYMBOL(dax_write_begin); + +int dax_write_end(struct file *filp, struct address_space *mapping, + loff_t pos, unsigned len, unsigned copied, + struct page *page, void *fsdata) +{ + WARN_ONCE(1, "dax: incomplete fs implementation\n"); + return -EINVAL; +} +EXPORT_SYMBOL(dax_write_end); + +void dax_invalidatepage(struct page *page, unsigned int offset, + unsigned int length) +{ + /* nothing to do for dax */ +} +EXPORT_SYMBOL(dax_invalidatepage); + static wait_queue_head_t wait_table[DAX_WAIT_TABLE_ENTRIES]; static int __init init_dax_wait_table(void) diff --git a/include/linux/dax.h b/include/linux/dax.h index 1c6ed44fe9fc..3502abcbea31 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h @@ -53,6 +53,34 @@ static inline struct dax_device *fs_dax_get_by_host(const char *host) struct dax_device *fs_dax_claim_bdev(struct block_device *bdev, void *owner); void fs_dax_release(struct dax_device *dax_dev, void *owner); +int dax_set_page_dirty(struct page *page); +ssize_t dax_direct_IO(struct kiocb *kiocb, struct iov_iter *iter); +int dax_writepage(struct page *page, struct writeback_control *wbc); +int dax_readpage(struct file *filp, struct page *page); +int dax_readpages(struct file *filp, struct address_space *mapping, + struct list_head *pages, unsigned nr_pages); +int dax_write_begin(struct file *filp, struct address_space *mapping, + loff_t pos, unsigned len, unsigned flags, + struct page **pagep, void **fsdata); +int dax_write_end(struct file *filp, struct address_space *mapping, + loff_t pos, unsigned len, unsigned copied, + struct page *page, void *fsdata); +void dax_invalidatepage(struct page *page, unsigned int offset, + unsigned int length); + +#define DEFINE_FSDAX_AOPS(name, writepages_fn) \ +const struct address_space_operations name = { \ + .set_page_dirty = dax_set_page_dirty, \ + .direct_IO = dax_direct_IO, \ + .writepage = dax_writepage, \ + .readpage = dax_readpage, \ + .writepages = writepages_fn, \ + .readpages = dax_readpages, \ + .write_begin = dax_write_begin, \ + .write_end = dax_write_end, \ + .invalidatepage = dax_invalidatepage, \ +} + #else static inline int bdev_dax_supported(struct super_block *sb, int blocksize) { @@ -73,6 +101,10 @@ static inline struct dax_device *fs_dax_claim_bdev(struct block_device *bdev, static inline void fs_dax_release(struct dax_device *dax_dev, void *owner) { } + +#define DEFINE_FSDAX_AOPS(name, writepages_fn) \ +const struct address_space_operations name = { 0 } + #endif int dax_read_lock(void); _______________________________________________ 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: Dan Williams <dan.j.williams@intel.com> To: akpm@linux-foundation.org Cc: jack@suse.cz, Matthew Wilcox <mawilcox@microsoft.com>, linux-nvdimm@lists.01.org, linux-xfs@vger.kernel.org, Jeff Moyer <jmoyer@redhat.com>, linux-fsdevel@vger.kernel.org, ross.zwisler@linux.intel.com, hch@lst.de Subject: [PATCH v4 11/18] fs, dax: introduce DEFINE_FSDAX_AOPS Date: Sat, 23 Dec 2017 16:56:59 -0800 [thread overview] Message-ID: <151407701943.38751.8997225433943672290.stgit@dwillia2-desk3.amr.corp.intel.com> (raw) In-Reply-To: <151407695916.38751.2866053440557472361.stgit@dwillia2-desk3.amr.corp.intel.com> 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. Otherwise, direct-I/O triggers incorrect page cache assumptions and warnings like the following: WARNING: CPU: 27 PID: 1783 at fs/xfs/xfs_aops.c:1468 xfs_vm_set_page_dirty+0xf3/0x1b0 [xfs] [..] CPU: 27 PID: 1783 Comm: dma-collision Tainted: G O 4.15.0-rc2+ #984 [..] Call Trace: set_page_dirty_lock+0x40/0x60 bio_set_pages_dirty+0x37/0x50 iomap_dio_actor+0x2b7/0x3b0 ? iomap_dio_zero+0x110/0x110 iomap_apply+0xa4/0x110 iomap_dio_rw+0x29e/0x3b0 ? iomap_dio_zero+0x110/0x110 ? xfs_file_dio_aio_read+0x7c/0x1a0 [xfs] xfs_file_dio_aio_read+0x7c/0x1a0 [xfs] xfs_file_read_iter+0xa0/0xc0 [xfs] __vfs_read+0xf9/0x170 vfs_read+0xa6/0x150 SyS_pread64+0x93/0xb0 entry_SYSCALL_64_fastpath+0x1f/0x96 ...where the default set_page_dirty() handler assumes that dirty state is being tracked in 'struct page' flags. A DEFINE_FSDAX_AOPS macro helper is provided instead of a global 'struct address_space_operations fs_dax_aops' instance, because ->writepages needs to be an fs-specific implementation. Cc: Jeff Moyer <jmoyer@redhat.com> Cc: Christoph Hellwig <hch@lst.de> Cc: Matthew Wilcox <mawilcox@microsoft.com> Cc: Ross Zwisler <ross.zwisler@linux.intel.com> Suggested-by: Jan Kara <jack@suse.cz> Signed-off-by: Dan Williams <dan.j.williams@intel.com> --- fs/dax.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/dax.h | 32 ++++++++++++++++++++++++ 2 files changed, 101 insertions(+) diff --git a/fs/dax.c b/fs/dax.c index 54071cd27e8c..fadc1b13838b 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -45,6 +45,75 @@ /* The 'colour' (ie low bits) within a PMD of a page offset. */ #define PG_PMD_COLOUR ((PMD_SIZE >> PAGE_SHIFT) - 1) +int dax_set_page_dirty(struct page *page) +{ + /* + * Unlike __set_page_dirty_no_writeback, dax does all dirty + * tracking in the radix in response to mkwrite faults. + */ + return 0; +} +EXPORT_SYMBOL(dax_set_page_dirty); + +ssize_t dax_direct_IO(struct kiocb *kiocb, struct iov_iter *iter) +{ + /* + * The expectation is that filesystems that implement DAX + * support also arrange for ->read_iter and ->write_iter to + * bypass ->direct_IO. + */ + WARN_ONCE(1, "dax: incomplete fs implementation\n"); + return -EINVAL; +} +EXPORT_SYMBOL(dax_direct_IO); + +int dax_writepage(struct page *page, struct writeback_control *wbc) +{ + WARN_ONCE(1, "dax: incomplete fs implementation\n"); + return -EINVAL; +} +EXPORT_SYMBOL(dax_writepage); + +int dax_readpage(struct file *filp, struct page *page) +{ + WARN_ONCE(1, "dax: incomplete fs implementation\n"); + return -EINVAL; +} +EXPORT_SYMBOL(dax_readpage); + +int dax_readpages(struct file *filp, struct address_space *mapping, + struct list_head *pages, unsigned nr_pages) +{ + WARN_ONCE(1, "dax: incomplete fs implementation\n"); + return -EINVAL; +} +EXPORT_SYMBOL(dax_readpages); + +int dax_write_begin(struct file *filp, struct address_space *mapping, + loff_t pos, unsigned len, unsigned flags, + struct page **pagep, void **fsdata) +{ + WARN_ONCE(1, "dax: incomplete fs implementation\n"); + return -EINVAL; +} +EXPORT_SYMBOL(dax_write_begin); + +int dax_write_end(struct file *filp, struct address_space *mapping, + loff_t pos, unsigned len, unsigned copied, + struct page *page, void *fsdata) +{ + WARN_ONCE(1, "dax: incomplete fs implementation\n"); + return -EINVAL; +} +EXPORT_SYMBOL(dax_write_end); + +void dax_invalidatepage(struct page *page, unsigned int offset, + unsigned int length) +{ + /* nothing to do for dax */ +} +EXPORT_SYMBOL(dax_invalidatepage); + static wait_queue_head_t wait_table[DAX_WAIT_TABLE_ENTRIES]; static int __init init_dax_wait_table(void) diff --git a/include/linux/dax.h b/include/linux/dax.h index 1c6ed44fe9fc..3502abcbea31 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h @@ -53,6 +53,34 @@ static inline struct dax_device *fs_dax_get_by_host(const char *host) struct dax_device *fs_dax_claim_bdev(struct block_device *bdev, void *owner); void fs_dax_release(struct dax_device *dax_dev, void *owner); +int dax_set_page_dirty(struct page *page); +ssize_t dax_direct_IO(struct kiocb *kiocb, struct iov_iter *iter); +int dax_writepage(struct page *page, struct writeback_control *wbc); +int dax_readpage(struct file *filp, struct page *page); +int dax_readpages(struct file *filp, struct address_space *mapping, + struct list_head *pages, unsigned nr_pages); +int dax_write_begin(struct file *filp, struct address_space *mapping, + loff_t pos, unsigned len, unsigned flags, + struct page **pagep, void **fsdata); +int dax_write_end(struct file *filp, struct address_space *mapping, + loff_t pos, unsigned len, unsigned copied, + struct page *page, void *fsdata); +void dax_invalidatepage(struct page *page, unsigned int offset, + unsigned int length); + +#define DEFINE_FSDAX_AOPS(name, writepages_fn) \ +const struct address_space_operations name = { \ + .set_page_dirty = dax_set_page_dirty, \ + .direct_IO = dax_direct_IO, \ + .writepage = dax_writepage, \ + .readpage = dax_readpage, \ + .writepages = writepages_fn, \ + .readpages = dax_readpages, \ + .write_begin = dax_write_begin, \ + .write_end = dax_write_end, \ + .invalidatepage = dax_invalidatepage, \ +} + #else static inline int bdev_dax_supported(struct super_block *sb, int blocksize) { @@ -73,6 +101,10 @@ static inline struct dax_device *fs_dax_claim_bdev(struct block_device *bdev, static inline void fs_dax_release(struct dax_device *dax_dev, void *owner) { } + +#define DEFINE_FSDAX_AOPS(name, writepages_fn) \ +const struct address_space_operations name = { 0 } + #endif int dax_read_lock(void);
next prev parent reply other threads:[~2017-12-24 1:00 UTC|newest] Thread overview: 136+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-12-24 0:56 [PATCH v4 00/18] dax: fix dma vs truncate/hole-punch Dan Williams 2017-12-24 0:56 ` Dan Williams 2017-12-24 0:56 ` Dan Williams 2017-12-24 0:56 ` [PATCH v4 01/18] mm, dax: introduce pfn_t_special() Dan Williams 2017-12-24 0:56 ` Dan Williams 2018-01-04 8:16 ` Christoph Hellwig 2018-01-04 8:16 ` Christoph Hellwig 2017-12-24 0:56 ` [PATCH v4 02/18] ext4: auto disable dax instead of failing mount Dan Williams 2017-12-24 0:56 ` Dan Williams 2018-01-03 14:20 ` Jan Kara 2018-01-03 14:20 ` Jan Kara 2017-12-24 0:56 ` [PATCH v4 03/18] ext2: " Dan Williams 2017-12-24 0:56 ` Dan Williams 2018-01-03 14:21 ` Jan Kara 2018-01-03 14:21 ` Jan Kara 2017-12-24 0:56 ` [PATCH v4 04/18] dax: require 'struct page' by default for filesystem dax Dan Williams 2017-12-24 0:56 ` Dan Williams 2018-01-03 15:29 ` Jan Kara 2018-01-03 15:29 ` Jan Kara 2018-01-04 8:16 ` Christoph Hellwig 2018-01-04 8:16 ` Christoph Hellwig 2018-01-08 11:58 ` Gerald Schaefer 2018-01-08 11:58 ` Gerald Schaefer 2017-12-24 0:56 ` [PATCH v4 05/18] dax: stop using VM_MIXEDMAP for dax Dan Williams 2017-12-24 0:56 ` Dan Williams 2018-01-03 15:27 ` Jan Kara 2018-01-03 15:27 ` Jan Kara 2017-12-24 0:56 ` [PATCH v4 06/18] dax: stop using VM_HUGEPAGE " Dan Williams 2017-12-24 0:56 ` Dan Williams 2017-12-24 0:56 ` [PATCH v4 07/18] dax: store pfns in the radix Dan Williams 2017-12-24 0:56 ` Dan Williams 2017-12-27 0:17 ` Ross Zwisler 2017-12-27 0:17 ` Ross Zwisler 2018-01-02 20:15 ` Dan Williams 2018-01-02 20:15 ` Dan Williams 2018-01-03 15:39 ` Jan Kara 2018-01-03 15:39 ` Jan Kara 2017-12-24 0:56 ` [PATCH v4 08/18] tools/testing/nvdimm: add 'bio_delay' mechanism Dan Williams 2017-12-24 0:56 ` Dan Williams 2017-12-27 18:08 ` Ross Zwisler 2017-12-27 18:08 ` Ross Zwisler 2018-01-02 20:35 ` Dan Williams 2018-01-02 20:35 ` Dan Williams 2018-01-02 21:44 ` Dave Chinner 2018-01-02 21:44 ` Dave Chinner 2018-01-02 21:51 ` Dan Williams 2018-01-02 21:51 ` Dan Williams 2018-01-03 15:46 ` Jan Kara 2018-01-03 15:46 ` Jan Kara 2018-01-03 20:37 ` Jeff Moyer 2018-01-03 20:37 ` Jeff Moyer 2017-12-24 0:56 ` [PATCH v4 09/18] mm, dax: enable filesystems to trigger dev_pagemap ->page_free callbacks Dan Williams 2017-12-24 0:56 ` Dan Williams 2018-01-04 8:20 ` Christoph Hellwig 2018-01-04 8:20 ` Christoph Hellwig 2017-12-24 0:56 ` [PATCH v4 10/18] mm, dev_pagemap: introduce CONFIG_DEV_PAGEMAP_OPS Dan Williams 2017-12-24 0:56 ` Dan Williams 2018-01-04 8:25 ` Christoph Hellwig 2018-01-04 8:25 ` Christoph Hellwig 2017-12-24 0:56 ` Dan Williams [this message] 2017-12-24 0:56 ` [PATCH v4 11/18] fs, dax: introduce DEFINE_FSDAX_AOPS Dan Williams 2017-12-27 5:29 ` Matthew Wilcox 2017-12-27 5:29 ` Matthew Wilcox 2018-01-02 20:21 ` Dan Williams 2018-01-02 20:21 ` Dan Williams 2018-01-03 16:05 ` Jan Kara 2018-01-03 16:05 ` Jan Kara 2018-01-04 8:27 ` Christoph Hellwig 2018-01-04 8:27 ` Christoph Hellwig 2018-01-02 21:41 ` Dave Chinner 2018-01-02 21:41 ` Dave Chinner 2017-12-24 0:57 ` [PATCH v4 12/18] xfs: use DEFINE_FSDAX_AOPS Dan Williams 2017-12-24 0:57 ` Dan Williams 2018-01-02 21:15 ` Darrick J. Wong 2018-01-02 21:15 ` Darrick J. Wong 2018-01-02 21:40 ` Dan Williams 2018-01-02 21:40 ` Dan Williams 2018-01-03 16:09 ` Jan Kara 2018-01-03 16:09 ` Jan Kara 2018-01-04 8:28 ` Christoph Hellwig 2018-01-04 8:28 ` Christoph Hellwig 2017-12-24 0:57 ` [PATCH v4 13/18] ext4: " Dan Williams 2017-12-24 0:57 ` Dan Williams 2017-12-24 0:57 ` Dan Williams 2018-01-04 8:29 ` Christoph Hellwig 2018-01-04 8:29 ` Christoph Hellwig 2018-01-04 8:29 ` Christoph Hellwig 2017-12-24 0:57 ` [PATCH v4 14/18] ext2: " Dan Williams 2017-12-24 0:57 ` Dan Williams 2018-01-04 8:29 ` Christoph Hellwig 2018-01-04 8:29 ` Christoph Hellwig 2017-12-24 0:57 ` [PATCH v4 15/18] mm, fs, dax: use page->mapping to warn if dma collides with truncate Dan Williams 2017-12-24 0:57 ` Dan Williams 2018-01-04 8:30 ` Christoph Hellwig 2018-01-04 8:30 ` Christoph Hellwig 2018-01-04 9:39 ` Jan Kara 2018-01-04 9:39 ` Jan Kara 2017-12-24 0:57 ` [PATCH v4 16/18] wait_bit: introduce {wait_on,wake_up}_atomic_one Dan Williams 2017-12-24 0:57 ` Dan Williams 2018-01-04 8:30 ` Christoph Hellwig 2018-01-04 8:30 ` Christoph Hellwig 2017-12-24 0:57 ` [PATCH v4 17/18] mm, fs, dax: dax_flush_dma, handle dma vs block-map-change collisions Dan Williams 2017-12-24 0:57 ` Dan Williams 2018-01-04 8:31 ` Christoph Hellwig 2018-01-04 8:31 ` Christoph Hellwig 2018-01-04 11:12 ` Jan Kara 2018-01-04 11:12 ` Jan Kara 2018-01-07 21:58 ` Dan Williams 2018-01-07 21:58 ` Dan Williams 2018-01-08 13:50 ` Jan Kara 2018-01-08 13:50 ` Jan Kara 2018-03-08 17:02 ` Dan Williams 2018-03-08 17:02 ` Dan Williams 2018-03-09 12:56 ` Jan Kara 2018-03-09 12:56 ` Jan Kara 2018-03-09 16:15 ` Dan Williams 2018-03-09 16:15 ` Dan Williams 2018-03-09 17:26 ` Dan Williams 2018-03-09 17:26 ` Dan Williams 2017-12-24 0:57 ` [PATCH v4 18/18] xfs, dax: wire up dax_flush_dma support via a new xfs_sync_dma helper Dan Williams 2017-12-24 0:57 ` Dan Williams 2018-01-02 21:07 ` Darrick J. Wong 2018-01-02 21:07 ` Darrick J. Wong 2018-01-02 23:00 ` Dave Chinner 2018-01-02 23:00 ` Dave Chinner 2018-01-03 2:21 ` Dan Williams 2018-01-03 2:21 ` Dan Williams 2018-01-03 7:51 ` Dave Chinner 2018-01-03 7:51 ` Dave Chinner 2018-01-04 8:34 ` Christoph Hellwig 2018-01-04 8:34 ` Christoph Hellwig 2018-01-04 8:33 ` Christoph Hellwig 2018-01-04 8:33 ` Christoph Hellwig 2018-01-04 8:17 ` [PATCH v4 00/18] dax: fix dma vs truncate/hole-punch Christoph Hellwig 2018-01-04 8:17 ` Christoph Hellwig 2018-01-04 8:17 ` 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=151407701943.38751.8997225433943672290.stgit@dwillia2-desk3.amr.corp.intel.com \ --to=dan.j.williams@intel.com \ --cc=akpm@linux-foundation.org \ --cc=hch@lst.de \ --cc=jack@suse.cz \ --cc=linux-fsdevel@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.