From: Dave Jiang <dave.jiang@intel.com>
To: John Groves <john@jagalactic.com>, John Groves <John@Groves.net>,
Miklos Szeredi <miklos@szeredi.hu>,
Dan Williams <dan.j.williams@intel.com>,
Bernd Schubert <bschubert@ddn.com>,
Alison Schofield <alison.schofield@intel.com>
Cc: John Groves <jgroves@micron.com>,
Jonathan Corbet <corbet@lwn.net>,
Shuah Khan <skhan@linuxfoundation.org>,
Vishal Verma <vishal.l.verma@intel.com>,
Matthew Wilcox <willy@infradead.org>, Jan Kara <jack@suse.cz>,
Alexander Viro <viro@zeniv.linux.org.uk>,
David Hildenbrand <david@kernel.org>,
Christian Brauner <brauner@kernel.org>,
"Darrick J . Wong" <djwong@kernel.org>,
Randy Dunlap <rdunlap@infradead.org>,
Jeff Layton <jlayton@kernel.org>,
Amir Goldstein <amir73il@gmail.com>,
Jonathan Cameron <Jonathan.Cameron@huawei.com>,
Stefan Hajnoczi <shajnocz@redhat.com>,
Joanne Koong <joannelkoong@gmail.com>,
Josef Bacik <josef@toxicpanda.com>,
Bagas Sanjaya <bagasdotme@gmail.com>,
Chen Linxuan <chenlinxuan@uniontech.com>,
James Morse <james.morse@arm.com>, Fuad Tabba <tabba@google.com>,
Sean Christopherson <seanjc@google.com>,
Shivank Garg <shivankg@amd.com>,
Ackerley Tng <ackerleytng@google.com>,
Gregory Price <gourry@gourry.net>,
Aravind Ramesh <arramesh@micron.com>,
Ajay Joshi <ajayjoshi@micron.com>,
"venkataravis@micron.com" <venkataravis@micron.com>,
"linux-doc@vger.kernel.org" <linux-doc@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"nvdimm@lists.linux.dev" <nvdimm@lists.linux.dev>,
"linux-cxl@vger.kernel.org" <linux-cxl@vger.kernel.org>,
"linux-fsdevel@vger.kernel.org" <linux-fsdevel@vger.kernel.org>
Subject: Re: [PATCH V9 7/8] dax: Add fs_dax_get() func to prepare dax for fs-dax usage
Date: Tue, 24 Mar 2026 08:25:36 -0700 [thread overview]
Message-ID: <a46671a3-ec70-415f-90a4-04cd2c2e9016@intel.com> (raw)
In-Reply-To: <0100019d1d484ddc-2487f887-7ecd-49a3-abfe-9dabec28873f-000000@email.amazonses.com>
On 3/23/26 5:39 PM, John Groves wrote:
> From: John Groves <john@groves.net>
>
> The fs_dax_get() function should be called by fs-dax file systems after
> opening a fsdev dax device. This adds holder_operations, which provides
> a memory failure callback path and effects exclusivity between callers
> of fs_dax_get().
>
> fs_dax_get() is specific to fsdev_dax, so it checks the driver type
> (which required touching bus.[ch]). fs_dax_get() fails if fsdev_dax is
> not bound to the memory.
>
> This function serves the same role as fs_dax_get_by_bdev(), which dax
> file systems call after opening the pmem block device.
>
> This can't be located in fsdev.c because struct dax_device is opaque
> there.
>
> This will be called by fs/fuse/famfs.c in a subsequent commit.
>
> Signed-off-by: John Groves <john@groves.net>
Reviewed-by: Dave Jiang <dave.jiang@intel.com>
> ---
> drivers/dax/bus.c | 2 --
> drivers/dax/bus.h | 2 ++
> drivers/dax/super.c | 66 ++++++++++++++++++++++++++++++++++++++++++++-
> include/linux/dax.h | 17 +++++++++---
> 4 files changed, 80 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/dax/bus.c b/drivers/dax/bus.c
> index 562e2b06f61a..8a8710a8234e 100644
> --- a/drivers/dax/bus.c
> +++ b/drivers/dax/bus.c
> @@ -39,8 +39,6 @@ static int dax_bus_uevent(const struct device *dev, struct kobj_uevent_env *env)
> return add_uevent_var(env, "MODALIAS=" DAX_DEVICE_MODALIAS_FMT, 0);
> }
>
> -#define to_dax_drv(__drv) container_of_const(__drv, struct dax_device_driver, drv)
> -
> static struct dax_id *__dax_match_id(const struct dax_device_driver *dax_drv,
> const char *dev_name)
> {
> diff --git a/drivers/dax/bus.h b/drivers/dax/bus.h
> index 880bdf7e72d7..dc6f112ac4a4 100644
> --- a/drivers/dax/bus.h
> +++ b/drivers/dax/bus.h
> @@ -42,6 +42,8 @@ struct dax_device_driver {
> void (*remove)(struct dev_dax *dev);
> };
>
> +#define to_dax_drv(__drv) container_of_const(__drv, struct dax_device_driver, drv)
> +
> int __dax_driver_register(struct dax_device_driver *dax_drv,
> struct module *module, const char *mod_name);
> #define dax_driver_register(driver) \
> diff --git a/drivers/dax/super.c b/drivers/dax/super.c
> index ba0b4cd18a77..d4ab60c406bf 100644
> --- a/drivers/dax/super.c
> +++ b/drivers/dax/super.c
> @@ -14,6 +14,7 @@
> #include <linux/fs.h>
> #include <linux/cacheinfo.h>
> #include "dax-private.h"
> +#include "bus.h"
>
> /**
> * struct dax_device - anchor object for dax services
> @@ -111,6 +112,10 @@ struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev, u64 *start_off,
> }
> EXPORT_SYMBOL_GPL(fs_dax_get_by_bdev);
>
> +#endif /* CONFIG_BLOCK && CONFIG_FS_DAX */
> +
> +#if IS_ENABLED(CONFIG_FS_DAX)
> +
> void fs_put_dax(struct dax_device *dax_dev, void *holder)
> {
> if (dax_dev && holder &&
> @@ -119,7 +124,66 @@ void fs_put_dax(struct dax_device *dax_dev, void *holder)
> put_dax(dax_dev);
> }
> EXPORT_SYMBOL_GPL(fs_put_dax);
> -#endif /* CONFIG_BLOCK && CONFIG_FS_DAX */
> +
> +/**
> + * fs_dax_get() - get ownership of a devdax via holder/holder_ops
> + *
> + * fs-dax file systems call this function to prepare to use a devdax device for
> + * fsdax. This is like fs_dax_get_by_bdev(), but the caller already has struct
> + * dev_dax (and there is no bdev). The holder makes this exclusive.
> + *
> + * @dax_dev: dev to be prepared for fs-dax usage
> + * @holder: filesystem or mapped device inside the dax_device
> + * @hops: operations for the inner holder
> + *
> + * Returns: 0 on success, <0 on failure
> + */
> +int fs_dax_get(struct dax_device *dax_dev, void *holder,
> + const struct dax_holder_operations *hops)
> +{
> + struct dev_dax *dev_dax;
> + struct dax_device_driver *dax_drv;
> + int id;
> +
> + id = dax_read_lock();
> + if (!dax_dev || !dax_alive(dax_dev) || !igrab(&dax_dev->inode)) {
> + dax_read_unlock(id);
> + return -ENODEV;
> + }
> + dax_read_unlock(id);
> +
> + /* Verify the device is bound to fsdev_dax driver */
> + dev_dax = dax_get_private(dax_dev);
> + if (!dev_dax) {
> + iput(&dax_dev->inode);
> + return -ENODEV;
> + }
> +
> + device_lock(&dev_dax->dev);
> + if (!dev_dax->dev.driver) {
> + device_unlock(&dev_dax->dev);
> + iput(&dax_dev->inode);
> + return -ENODEV;
> + }
> + dax_drv = to_dax_drv(dev_dax->dev.driver);
> + if (dax_drv->type != DAXDRV_FSDEV_TYPE) {
> + device_unlock(&dev_dax->dev);
> + iput(&dax_dev->inode);
> + return -EOPNOTSUPP;
> + }
> + device_unlock(&dev_dax->dev);
> +
> + if (cmpxchg(&dax_dev->holder_data, NULL, holder)) {
> + iput(&dax_dev->inode);
> + return -EBUSY;
> + }
> +
> + dax_dev->holder_ops = hops;
> +
> + return 0;
> +}
> +EXPORT_SYMBOL_GPL(fs_dax_get);
> +#endif /* CONFIG_FS_DAX */
>
> enum dax_device_flags {
> /* !alive + rcu grace period == no new operations / mappings */
> diff --git a/include/linux/dax.h b/include/linux/dax.h
> index b19bfe0c2fd1..bf37b9a982f3 100644
> --- a/include/linux/dax.h
> +++ b/include/linux/dax.h
> @@ -130,7 +130,6 @@ int dax_add_host(struct dax_device *dax_dev, struct gendisk *disk);
> void dax_remove_host(struct gendisk *disk);
> struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev, u64 *start_off,
> void *holder, const struct dax_holder_operations *ops);
> -void fs_put_dax(struct dax_device *dax_dev, void *holder);
> #else
> static inline int dax_add_host(struct dax_device *dax_dev, struct gendisk *disk)
> {
> @@ -145,12 +144,13 @@ static inline struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev,
> {
> return NULL;
> }
> -static inline void fs_put_dax(struct dax_device *dax_dev, void *holder)
> -{
> -}
> #endif /* CONFIG_BLOCK && CONFIG_FS_DAX */
>
> #if IS_ENABLED(CONFIG_FS_DAX)
> +void fs_put_dax(struct dax_device *dax_dev, void *holder);
> +int fs_dax_get(struct dax_device *dax_dev, void *holder,
> + const struct dax_holder_operations *hops);
> +struct dax_device *inode_dax(struct inode *inode);
> int dax_writeback_mapping_range(struct address_space *mapping,
> struct dax_device *dax_dev, struct writeback_control *wbc);
> int dax_folio_reset_order(struct folio *folio);
> @@ -164,6 +164,15 @@ dax_entry_t dax_lock_mapping_entry(struct address_space *mapping,
> void dax_unlock_mapping_entry(struct address_space *mapping,
> unsigned long index, dax_entry_t cookie);
> #else
> +static inline void fs_put_dax(struct dax_device *dax_dev, void *holder)
> +{
> +}
> +
> +static inline int fs_dax_get(struct dax_device *dax_dev, void *holder,
> + const struct dax_holder_operations *hops)
> +{
> + return -EOPNOTSUPP;
> +}
> static inline struct page *dax_layout_busy_page(struct address_space *mapping)
> {
> return NULL;
next prev parent reply other threads:[~2026-03-24 15:25 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20260324003630.4930-1-john@jagalactic.com>
2026-03-24 0:36 ` [PATCH BUNDLE v9] famfs: Fabric-Attached Memory File System John Groves
2026-03-24 0:37 ` [PATCH V9 0/8] dax: prepare for famfs John Groves
2026-03-24 0:37 ` [PATCH V9 1/8] dax: move dax_pgoff_to_phys from [drivers/dax/] device.c to bus.c John Groves
2026-03-24 14:18 ` Jonathan Cameron
2026-03-24 23:44 ` Ira Weiny
2026-03-25 11:55 ` Jonathan Cameron
2026-03-24 0:38 ` [PATCH V9 2/8] dax: Factor out dax_folio_reset_order() helper John Groves
2026-03-24 14:23 ` Jonathan Cameron
2026-03-24 0:38 ` [PATCH V9 3/8] dax: add fsdev.c driver for fs-dax on character dax John Groves
2026-03-24 14:39 ` Jonathan Cameron
2026-03-25 12:43 ` John Groves
2026-03-25 16:04 ` Ira Weiny
2026-03-26 14:33 ` John Groves
2026-03-26 22:46 ` Ira Weiny
2026-03-27 0:56 ` John Groves
2026-03-27 16:40 ` Ira Weiny
2026-03-24 15:19 ` Dave Jiang
2026-03-25 4:48 ` Ira Weiny
2026-03-24 0:38 ` [PATCH V9 4/8] dax: Save the kva from memremap John Groves
2026-03-24 14:40 ` Jonathan Cameron
2026-03-24 0:39 ` [PATCH V9 5/8] dax: Add dax_operations for use by fs-dax on fsdev dax John Groves
2026-03-24 14:51 ` Jonathan Cameron
2026-03-24 15:23 ` Dave Jiang
2026-03-25 21:28 ` Dave Jiang
2026-03-27 14:06 ` John Groves
2026-03-25 22:40 ` Dave Jiang
2026-03-27 14:14 ` John Groves
2026-03-24 0:39 ` [PATCH V9 6/8] dax: Add dax_set_ops() for setting dax_operations at bind time John Groves
2026-03-24 14:53 ` Jonathan Cameron
2026-03-24 0:39 ` [PATCH V9 7/8] dax: Add fs_dax_get() func to prepare dax for fs-dax usage John Groves
2026-03-24 15:05 ` Jonathan Cameron
2026-03-27 14:45 ` John Groves
2026-03-24 15:25 ` Dave Jiang [this message]
2026-03-24 0:39 ` [PATCH V9 8/8] dax: export dax_dev_get() John Groves
2026-03-24 15:06 ` Jonathan Cameron
2026-03-24 0:39 ` [PATCH V9 00/10] famfs: port into fuse John Groves
2026-03-24 0:40 ` [PATCH V9 01/10] famfs_fuse: Update macro s/FUSE_IS_DAX/FUSE_IS_VIRTIO_DAX/ John Groves
2026-03-24 15:12 ` Jonathan Cameron
2026-03-27 14:52 ` John Groves
2026-03-24 0:40 ` [PATCH V9 02/10] famfs_fuse: Basic fuse kernel ABI enablement for famfs John Groves
2026-03-24 0:40 ` [PATCH V9 03/10] famfs_fuse: Plumb the GET_FMAP message/response John Groves
2026-03-24 0:41 ` [PATCH V9 04/10] famfs_fuse: Create files with famfs fmaps John Groves
2026-03-24 0:41 ` [PATCH V9 05/10] famfs_fuse: GET_DAXDEV message and daxdev_table John Groves
2026-03-24 0:41 ` [PATCH V9 06/10] famfs_fuse: Plumb dax iomap and fuse read/write/mmap John Groves
2026-03-24 0:41 ` [PATCH V9 07/10] famfs_fuse: Add holder_operations for dax notify_failure() John Groves
2026-03-24 0:41 ` [PATCH V9 08/10] famfs_fuse: Add DAX address_space_operations with noop_dirty_folio John Groves
2026-03-24 0:42 ` [PATCH V9 09/10] famfs_fuse: Add famfs fmap metadata documentation John Groves
2026-03-24 0:42 ` [PATCH V9 10/10] famfs_fuse: Add documentation John Groves
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=a46671a3-ec70-415f-90a4-04cd2c2e9016@intel.com \
--to=dave.jiang@intel.com \
--cc=John@Groves.net \
--cc=Jonathan.Cameron@huawei.com \
--cc=ackerleytng@google.com \
--cc=ajayjoshi@micron.com \
--cc=alison.schofield@intel.com \
--cc=amir73il@gmail.com \
--cc=arramesh@micron.com \
--cc=bagasdotme@gmail.com \
--cc=brauner@kernel.org \
--cc=bschubert@ddn.com \
--cc=chenlinxuan@uniontech.com \
--cc=corbet@lwn.net \
--cc=dan.j.williams@intel.com \
--cc=david@kernel.org \
--cc=djwong@kernel.org \
--cc=gourry@gourry.net \
--cc=jack@suse.cz \
--cc=james.morse@arm.com \
--cc=jgroves@micron.com \
--cc=jlayton@kernel.org \
--cc=joannelkoong@gmail.com \
--cc=john@jagalactic.com \
--cc=josef@toxicpanda.com \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=miklos@szeredi.hu \
--cc=nvdimm@lists.linux.dev \
--cc=rdunlap@infradead.org \
--cc=seanjc@google.com \
--cc=shajnocz@redhat.com \
--cc=shivankg@amd.com \
--cc=skhan@linuxfoundation.org \
--cc=tabba@google.com \
--cc=venkataravis@micron.com \
--cc=viro@zeniv.linux.org.uk \
--cc=vishal.l.verma@intel.com \
--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: link
Be 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.