From: Shiyang Ruan <ruansy.fnst@fujitsu.com> To: <linux-kernel@vger.kernel.org>, <linux-xfs@vger.kernel.org>, <linux-nvdimm@lists.01.org>, <linux-mm@kvack.org>, <linux-fsdevel@vger.kernel.org>, <dm-devel@redhat.com> Cc: <darrick.wong@oracle.com>, <dan.j.williams@intel.com>, <david@fromorbit.com>, <hch@lst.de>, <agk@redhat.com>, <snitzer@redhat.com>, <rgoldwyn@suse.de> Subject: [PATCH v4 02/10] dax: Introduce holder for dax_device Date: Fri, 4 Jun 2021 09:18:36 +0800 [thread overview] Message-ID: <20210604011844.1756145-3-ruansy.fnst@fujitsu.com> (raw) In-Reply-To: <20210604011844.1756145-1-ruansy.fnst@fujitsu.com> To easily track filesystem from a pmem device, we introduce a holder for dax_device structure, and also its operation. This holder is used to remember who is using this dax_device: - When it is the backend of a filesystem, the holder will be the superblock of this filesystem. - When this pmem device is one of the targets in a mapped device, the holder will be this mapped device. In this case, the mapped device has its own dax_device and it will follow the first rule. So that we can finally track to the filesystem we needed. The holder and holder_ops will be set when filesystem is being mounted, or an target device is being activated. Signed-off-by: Shiyang Ruan <ruansy.fnst@fujitsu.com> --- drivers/dax/super.c | 38 ++++++++++++++++++++++++++++++++++++++ include/linux/dax.h | 10 ++++++++++ 2 files changed, 48 insertions(+) diff --git a/drivers/dax/super.c b/drivers/dax/super.c index 5fa6ae9dbc8b..d118e2a7dc70 100644 --- a/drivers/dax/super.c +++ b/drivers/dax/super.c @@ -222,8 +222,10 @@ struct dax_device { struct cdev cdev; const char *host; void *private; + void *holder; unsigned long flags; const struct dax_operations *ops; + const struct dax_holder_operations *holder_ops; }; static ssize_t write_cache_show(struct device *dev, @@ -373,6 +375,24 @@ int dax_zero_page_range(struct dax_device *dax_dev, pgoff_t pgoff, } EXPORT_SYMBOL_GPL(dax_zero_page_range); +int dax_corrupted_range(struct dax_device *dax_dev, struct block_device *bdev, + loff_t offset, size_t size, void *data) +{ + int rc = -ENXIO; + if (!dax_dev) + return rc; + + if (dax_dev->holder) { + rc = dax_dev->holder_ops->corrupted_range(dax_dev, bdev, offset, + size, data); + if (rc == -ENODEV) + rc = -ENXIO; + } else + rc = -EOPNOTSUPP; + return rc; +} +EXPORT_SYMBOL_GPL(dax_corrupted_range); + #ifdef CONFIG_ARCH_HAS_PMEM_API void arch_wb_cache_pmem(void *addr, size_t size); void dax_flush(struct dax_device *dax_dev, void *addr, size_t size) @@ -624,6 +644,24 @@ void put_dax(struct dax_device *dax_dev) } EXPORT_SYMBOL_GPL(put_dax); +void dax_set_holder(struct dax_device *dax_dev, void *holder, + const struct dax_holder_operations *ops) +{ + if (!dax_dev) + return; + dax_dev->holder = holder; + dax_dev->holder_ops = ops; +} +EXPORT_SYMBOL_GPL(dax_set_holder); + +void *dax_get_holder(struct dax_device *dax_dev) +{ + if (!dax_dev) + return NULL; + return dax_dev->holder; +} +EXPORT_SYMBOL_GPL(dax_get_holder); + /** * dax_get_by_host() - temporary lookup mechanism for filesystem-dax * @host: alternate name for the device registered by a dax driver diff --git a/include/linux/dax.h b/include/linux/dax.h index b52f084aa643..1ce343a960ab 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h @@ -38,10 +38,18 @@ struct dax_operations { int (*zero_page_range)(struct dax_device *, pgoff_t, size_t); }; +struct dax_holder_operations { + int (*corrupted_range)(struct dax_device *, struct block_device *, + loff_t, size_t, void *); +}; + extern struct attribute_group dax_attribute_group; #if IS_ENABLED(CONFIG_DAX) struct dax_device *dax_get_by_host(const char *host); +void dax_set_holder(struct dax_device *dax_dev, void *holder, + const struct dax_holder_operations *ops); +void *dax_get_holder(struct dax_device *dax_dev); struct dax_device *alloc_dax(void *private, const char *host, const struct dax_operations *ops, unsigned long flags); void put_dax(struct dax_device *dax_dev); @@ -226,6 +234,8 @@ size_t dax_copy_to_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr, size_t bytes, struct iov_iter *i); int dax_zero_page_range(struct dax_device *dax_dev, pgoff_t pgoff, size_t nr_pages); +int dax_corrupted_range(struct dax_device *dax_dev, struct block_device *bdev, + loff_t offset, size_t size, void *data); void dax_flush(struct dax_device *dax_dev, void *addr, size_t size); ssize_t dax_iomap_rw(struct kiocb *iocb, struct iov_iter *iter, -- 2.31.1
WARNING: multiple messages have this Message-ID (diff)
From: Shiyang Ruan <ruansy.fnst@fujitsu.com> To: <linux-kernel@vger.kernel.org>, <linux-xfs@vger.kernel.org>, <linux-nvdimm@lists.01.org>, <linux-mm@kvack.org>, <linux-fsdevel@vger.kernel.org>, <dm-devel@redhat.com> Cc: snitzer@redhat.com, darrick.wong@oracle.com, rgoldwyn@suse.de, david@fromorbit.com, dan.j.williams@intel.com, hch@lst.de, agk@redhat.com Subject: [dm-devel] [PATCH v4 02/10] dax: Introduce holder for dax_device Date: Fri, 4 Jun 2021 09:18:36 +0800 [thread overview] Message-ID: <20210604011844.1756145-3-ruansy.fnst@fujitsu.com> (raw) In-Reply-To: <20210604011844.1756145-1-ruansy.fnst@fujitsu.com> To easily track filesystem from a pmem device, we introduce a holder for dax_device structure, and also its operation. This holder is used to remember who is using this dax_device: - When it is the backend of a filesystem, the holder will be the superblock of this filesystem. - When this pmem device is one of the targets in a mapped device, the holder will be this mapped device. In this case, the mapped device has its own dax_device and it will follow the first rule. So that we can finally track to the filesystem we needed. The holder and holder_ops will be set when filesystem is being mounted, or an target device is being activated. Signed-off-by: Shiyang Ruan <ruansy.fnst@fujitsu.com> --- drivers/dax/super.c | 38 ++++++++++++++++++++++++++++++++++++++ include/linux/dax.h | 10 ++++++++++ 2 files changed, 48 insertions(+) diff --git a/drivers/dax/super.c b/drivers/dax/super.c index 5fa6ae9dbc8b..d118e2a7dc70 100644 --- a/drivers/dax/super.c +++ b/drivers/dax/super.c @@ -222,8 +222,10 @@ struct dax_device { struct cdev cdev; const char *host; void *private; + void *holder; unsigned long flags; const struct dax_operations *ops; + const struct dax_holder_operations *holder_ops; }; static ssize_t write_cache_show(struct device *dev, @@ -373,6 +375,24 @@ int dax_zero_page_range(struct dax_device *dax_dev, pgoff_t pgoff, } EXPORT_SYMBOL_GPL(dax_zero_page_range); +int dax_corrupted_range(struct dax_device *dax_dev, struct block_device *bdev, + loff_t offset, size_t size, void *data) +{ + int rc = -ENXIO; + if (!dax_dev) + return rc; + + if (dax_dev->holder) { + rc = dax_dev->holder_ops->corrupted_range(dax_dev, bdev, offset, + size, data); + if (rc == -ENODEV) + rc = -ENXIO; + } else + rc = -EOPNOTSUPP; + return rc; +} +EXPORT_SYMBOL_GPL(dax_corrupted_range); + #ifdef CONFIG_ARCH_HAS_PMEM_API void arch_wb_cache_pmem(void *addr, size_t size); void dax_flush(struct dax_device *dax_dev, void *addr, size_t size) @@ -624,6 +644,24 @@ void put_dax(struct dax_device *dax_dev) } EXPORT_SYMBOL_GPL(put_dax); +void dax_set_holder(struct dax_device *dax_dev, void *holder, + const struct dax_holder_operations *ops) +{ + if (!dax_dev) + return; + dax_dev->holder = holder; + dax_dev->holder_ops = ops; +} +EXPORT_SYMBOL_GPL(dax_set_holder); + +void *dax_get_holder(struct dax_device *dax_dev) +{ + if (!dax_dev) + return NULL; + return dax_dev->holder; +} +EXPORT_SYMBOL_GPL(dax_get_holder); + /** * dax_get_by_host() - temporary lookup mechanism for filesystem-dax * @host: alternate name for the device registered by a dax driver diff --git a/include/linux/dax.h b/include/linux/dax.h index b52f084aa643..1ce343a960ab 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h @@ -38,10 +38,18 @@ struct dax_operations { int (*zero_page_range)(struct dax_device *, pgoff_t, size_t); }; +struct dax_holder_operations { + int (*corrupted_range)(struct dax_device *, struct block_device *, + loff_t, size_t, void *); +}; + extern struct attribute_group dax_attribute_group; #if IS_ENABLED(CONFIG_DAX) struct dax_device *dax_get_by_host(const char *host); +void dax_set_holder(struct dax_device *dax_dev, void *holder, + const struct dax_holder_operations *ops); +void *dax_get_holder(struct dax_device *dax_dev); struct dax_device *alloc_dax(void *private, const char *host, const struct dax_operations *ops, unsigned long flags); void put_dax(struct dax_device *dax_dev); @@ -226,6 +234,8 @@ size_t dax_copy_to_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr, size_t bytes, struct iov_iter *i); int dax_zero_page_range(struct dax_device *dax_dev, pgoff_t pgoff, size_t nr_pages); +int dax_corrupted_range(struct dax_device *dax_dev, struct block_device *bdev, + loff_t offset, size_t size, void *data); void dax_flush(struct dax_device *dax_dev, void *addr, size_t size); ssize_t dax_iomap_rw(struct kiocb *iocb, struct iov_iter *iter, -- 2.31.1 -- dm-devel mailing list dm-devel@redhat.com https://listman.redhat.com/mailman/listinfo/dm-devel
next prev parent reply other threads:[~2021-06-04 1:19 UTC|newest] Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-06-04 1:18 [PATCH v4 00/10] fsdax: introduce fs query to support reflink Shiyang Ruan 2021-06-04 1:18 ` [dm-devel] " Shiyang Ruan 2021-06-04 1:18 ` [PATCH v4 01/10] pagemap: Introduce ->memory_failure() Shiyang Ruan 2021-06-04 1:18 ` [dm-devel] " Shiyang Ruan 2021-06-16 0:18 ` Dan Williams 2021-06-16 0:18 ` [dm-devel] " Dan Williams 2021-06-16 0:18 ` Dan Williams 2021-06-04 1:18 ` Shiyang Ruan [this message] 2021-06-04 1:18 ` [dm-devel] [PATCH v4 02/10] dax: Introduce holder for dax_device Shiyang Ruan 2021-06-16 0:46 ` Dan Williams 2021-06-16 0:46 ` [dm-devel] " Dan Williams 2021-06-16 0:46 ` Dan Williams 2021-06-04 1:18 ` [PATCH v4 03/10] fs: Introduce ->corrupted_range() for superblock Shiyang Ruan 2021-06-04 1:18 ` [dm-devel] " Shiyang Ruan 2021-06-16 0:48 ` Dan Williams 2021-06-16 0:48 ` [dm-devel] " Dan Williams 2021-06-16 0:48 ` Dan Williams 2021-06-17 6:51 ` ruansy.fnst 2021-06-17 6:51 ` [dm-devel] " ruansy.fnst 2021-06-17 7:04 ` Dan Williams 2021-06-17 7:04 ` [dm-devel] " Dan Williams 2021-06-17 7:04 ` Dan Williams 2021-06-17 8:12 ` ruansy.fnst 2021-06-17 8:12 ` [dm-devel] " ruansy.fnst 2021-06-04 1:18 ` [PATCH v4 04/10] mm, fsdax: Refactor memory-failure handler for dax mapping Shiyang Ruan 2021-06-04 1:18 ` [dm-devel] " Shiyang Ruan 2021-06-16 6:30 ` Dan Williams 2021-06-16 6:30 ` [dm-devel] " Dan Williams 2021-06-16 6:30 ` Dan Williams 2021-06-17 7:51 ` ruansy.fnst 2021-06-17 7:51 ` [dm-devel] " ruansy.fnst 2021-06-04 1:18 ` [PATCH v4 05/10] mm, pmem: Implement ->memory_failure() in pmem driver Shiyang Ruan 2021-06-04 1:18 ` [dm-devel] " Shiyang Ruan 2021-06-16 6:49 ` Dan Williams 2021-06-16 6:49 ` [dm-devel] " Dan Williams 2021-06-16 6:49 ` Dan Williams 2021-06-04 1:18 ` [PATCH v4 06/10] fs/dax: Implement dax_holder_operations Shiyang Ruan 2021-06-04 1:18 ` [dm-devel] " Shiyang Ruan 2021-06-04 1:18 ` [PATCH v4 07/10] dm: Introduce ->rmap() to find bdev offset Shiyang Ruan 2021-06-04 1:18 ` [dm-devel] " Shiyang Ruan 2021-06-04 1:18 ` [PATCH v4 08/10] md: Implement dax_holder_operations Shiyang Ruan 2021-06-04 1:18 ` [dm-devel] " Shiyang Ruan 2021-06-04 5:48 ` kernel test robot 2021-06-04 5:48 ` kernel test robot 2021-06-04 5:48 ` [dm-devel] " kernel test robot 2021-06-04 1:18 ` [PATCH v4 09/10] xfs: Implement ->corrupted_range() for XFS Shiyang Ruan 2021-06-04 1:18 ` [dm-devel] " Shiyang Ruan 2021-06-04 5:22 ` kernel test robot 2021-06-04 5:22 ` kernel test robot 2021-06-04 5:22 ` [dm-devel] " kernel test robot 2021-06-04 5:40 ` kernel test robot 2021-06-04 5:40 ` kernel test robot 2021-06-04 5:40 ` [dm-devel] " kernel test robot 2021-06-04 1:18 ` [PATCH v4 10/10] fs/dax: Remove useless functions Shiyang Ruan 2021-06-04 1:18 ` [dm-devel] " Shiyang Ruan
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=20210604011844.1756145-3-ruansy.fnst@fujitsu.com \ --to=ruansy.fnst@fujitsu.com \ --cc=agk@redhat.com \ --cc=dan.j.williams@intel.com \ --cc=darrick.wong@oracle.com \ --cc=david@fromorbit.com \ --cc=dm-devel@redhat.com \ --cc=hch@lst.de \ --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=rgoldwyn@suse.de \ --cc=snitzer@redhat.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.