public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Jonathan Cameron <jonathan.cameron@huawei.com>
To: John Groves <John@Groves.net>
Cc: Miklos Szeredi <miklos@szeredi.hu>,
	Dan Williams <dan.j.williams@intel.com>,
	Bernd Schubert <bschubert@ddn.com>,
	"Alison Schofield" <alison.schofield@intel.com>,
	John Groves <jgroves@micron.com>,
	Jonathan Corbet <corbet@lwn.net>,
	Vishal Verma <vishal.l.verma@intel.com>,
	Dave Jiang <dave.jiang@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>,
	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>,
	<linux-doc@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<nvdimm@lists.linux.dev>, <linux-cxl@vger.kernel.org>,
	<linux-fsdevel@vger.kernel.org>
Subject: Re: [PATCH V3 07/21] dax: prevent driver unbind while filesystem holds device
Date: Thu, 8 Jan 2026 12:34:50 +0000	[thread overview]
Message-ID: <20260108123450.00004eac@huawei.com> (raw)
In-Reply-To: <20260107153332.64727-8-john@groves.net>

On Wed,  7 Jan 2026 09:33:16 -0600
John Groves <John@Groves.net> wrote:

> From: John Groves <John@Groves.net>
> 
> Add custom bind/unbind sysfs attributes for the dax bus that check
> whether a filesystem has registered as a holder (via fs_dax_get())
> before allowing driver unbind.
> 
> When a filesystem like famfs mounts on a dax device, it registers
> itself as the holder via dax_holder_ops. Previously, there was no
> mechanism to prevent driver unbind while the filesystem was mounted,
> which could cause some havoc.
> 
> The new unbind_store() checks dax_holder() and returns -EBUSY if
> a holder is registered, giving userspace proper feedback that the
> device is in use.
> 
> To use our custom bind/unbind handlers instead of the default ones,
> set suppress_bind_attrs=true on all dax drivers during registration.

Whilst I appreciate that it is painful, so are many other driver unbinds
where services are provided to another driver.  Is there any precedence
for doing something like this? If not, I'd like to see a review on this
from one of the driver core folk. Maybe Greg KH.

Might just be a case of calling it something else to avoid userspace
tooling getting a surprise.

> 
> Signed-off-by: John Groves <john@groves.net>
> ---
>  drivers/dax/bus.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 53 insertions(+)
> 
> diff --git a/drivers/dax/bus.c b/drivers/dax/bus.c
> index 6e0e28116edc..ed453442739d 100644
> --- a/drivers/dax/bus.c
> +++ b/drivers/dax/bus.c
> @@ -151,9 +151,61 @@ static ssize_t remove_id_store(struct device_driver *drv, const char *buf,
>  }
>  static DRIVER_ATTR_WO(remove_id);
>  
> +static const struct bus_type dax_bus_type;
> +
> +/*
> + * Custom bind/unbind handlers for dax bus.
> + * The unbind handler checks if a filesystem holds the dax device and
> + * returns -EBUSY if so, preventing driver unbind while in use.
> + */
> +static ssize_t unbind_store(struct device_driver *drv, const char *buf,
> +		size_t count)
> +{
> +	struct device *dev;
> +	int rc = -ENODEV;
> +
> +	dev = bus_find_device_by_name(&dax_bus_type, NULL, buf);

	struct device *dev __free(put_device) = bus_find_device_by_name()...

and you can just return on error.

> +	if (dev && dev->driver == drv) {
With the __free I'd flip this
	if (!dev || !dev->driver == drv)
		return -ENODEV;

	...

> +		struct dev_dax *dev_dax = to_dev_dax(dev);
> +
> +		if (dax_holder(dev_dax->dax_dev)) {
> +			dev_dbg(dev,
> +				"%s: blocking unbind due to active holder\n",
> +				__func__);
> +			rc = -EBUSY;
> +			goto out;
> +		}
> +		device_release_driver(dev);
> +		rc = count;
> +	}
> +out:
> +	put_device(dev);
> +	return rc;
> +}
> +static DRIVER_ATTR_WO(unbind);
> +
> +static ssize_t bind_store(struct device_driver *drv, const char *buf,
> +		size_t count)
> +{
> +	struct device *dev;
> +	int rc = -ENODEV;
> +
> +	dev = bus_find_device_by_name(&dax_bus_type, NULL, buf);
Use __free magic here as well..
> +	if (dev) {
> +		rc = device_driver_attach(drv, dev);
> +		if (!rc)
> +			rc = count;
then this can be
		if (rc)
			return rc;
		return count;

> +	}
> +	put_device(dev);
> +	return rc;
> +}
> +static DRIVER_ATTR_WO(bind);
> +
>  static struct attribute *dax_drv_attrs[] = {
>  	&driver_attr_new_id.attr,
>  	&driver_attr_remove_id.attr,
> +	&driver_attr_bind.attr,
> +	&driver_attr_unbind.attr,
>  	NULL,
>  };
>  ATTRIBUTE_GROUPS(dax_drv);
> @@ -1591,6 +1643,7 @@ int __dax_driver_register(struct dax_device_driver *dax_drv,
>  	drv->name = mod_name;
>  	drv->mod_name = mod_name;
>  	drv->bus = &dax_bus_type;
> +	drv->suppress_bind_attrs = true;
>  
>  	return driver_register(drv);
>  }


  reply	other threads:[~2026-01-08 12:34 UTC|newest]

Thread overview: 74+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-01-07 15:32 [PATCH BUNDLE] famfs: Fabric-Attached Memory File System John Groves
2026-01-07 15:33 ` [PATCH V3 00/21] famfs: port into fuse John Groves
2026-01-07 15:33   ` [PATCH V3 01/21] dax: move dax_pgoff_to_phys from [drivers/dax/] device.c to bus.c John Groves
2026-01-08 10:43     ` Jonathan Cameron
2026-01-08 13:25       ` John Groves
2026-01-08 15:20         ` Jonathan Cameron
2026-01-07 15:33   ` [PATCH V3 02/21] dax: add fsdev.c driver for fs-dax on character dax John Groves
2026-01-08 11:31     ` Jonathan Cameron
2026-01-08 14:32       ` John Groves
2026-01-08 15:12       ` John Groves
2026-01-08 21:15         ` John Groves
2026-01-08 23:25           ` Gregory Price
2026-01-07 15:33   ` [PATCH V3 03/21] dax: Save the kva from memremap John Groves
2026-01-08 11:32     ` Jonathan Cameron
2026-01-08 15:15       ` John Groves
2026-01-07 15:33   ` [PATCH V3 04/21] dax: Add dax_operations for use by fs-dax on fsdev dax John Groves
2026-01-08 11:50     ` Jonathan Cameron
2026-01-08 15:59       ` John Groves
2026-01-08 16:10         ` Jonathan Cameron
2026-01-07 15:33   ` [PATCH V3 05/21] dax: Add dax_set_ops() for setting dax_operations at bind time John Groves
2026-01-08 12:06     ` Jonathan Cameron
2026-01-08 16:20       ` John Groves
2026-01-07 15:33   ` [PATCH V3 06/21] dax: Add fs_dax_get() func to prepare dax for fs-dax usage John Groves
2026-01-08 12:27     ` Jonathan Cameron
2026-01-08 16:45       ` John Groves
2026-01-07 15:33   ` [PATCH V3 07/21] dax: prevent driver unbind while filesystem holds device John Groves
2026-01-08 12:34     ` Jonathan Cameron [this message]
2026-01-08 18:08       ` John Groves
2026-01-12 18:55     ` John Groves
2026-01-07 15:33   ` [PATCH V3 08/21] dax: export dax_dev_get() John Groves
2026-01-07 15:33   ` [PATCH V3 09/21] famfs_fuse: magic.h: Add famfs magic numbers John Groves
2026-01-07 15:33   ` [PATCH V3 10/21] famfs_fuse: Kconfig John Groves
2026-01-08 12:36     ` Jonathan Cameron
2026-01-12 16:46       ` John Groves
2026-01-07 15:33   ` [PATCH V3 11/21] famfs_fuse: Update macro s/FUSE_IS_DAX/FUSE_IS_VIRTIO_DAX/ John Groves
2026-01-09 18:16     ` Joanne Koong
2026-01-09 22:15       ` [PATCH V3 11/21] famfs_fuse: Update macro s/FUSE_IS_DAX/FUSE_IS_VIRTIO_DAX John Groves
2026-01-07 15:33   ` [PATCH V3 12/21] famfs_fuse: Basic fuse kernel ABI enablement for famfs John Groves
2026-01-09 18:29     ` Joanne Koong
2026-01-09 22:58       ` John Groves
2026-01-07 15:33   ` [PATCH V3 13/21] famfs_fuse: Famfs mount opt: -o shadow=<shadowpath> John Groves
2026-01-09 19:22     ` Joanne Koong
2026-01-10  0:38       ` John Groves
2026-01-11 18:20         ` John Groves
2026-01-07 15:33   ` [PATCH V3 14/21] famfs_fuse: Plumb the GET_FMAP message/response John Groves
2026-01-08 12:49     ` Jonathan Cameron
2026-01-09  2:12       ` John Groves
2026-01-07 15:33   ` [PATCH V3 15/21] famfs_fuse: Create files with famfs fmaps John Groves
2026-01-07 21:30     ` John Groves
2026-01-08 13:14     ` Jonathan Cameron
2026-01-09 14:30       ` John Groves
2026-01-07 15:33   ` [PATCH V3 16/21] famfs_fuse: GET_DAXDEV message and daxdev_table John Groves
2026-01-08 14:45     ` Jonathan Cameron
2026-01-07 15:33   ` [PATCH V3 17/21] famfs_fuse: Plumb dax iomap and fuse read/write/mmap John Groves
2026-01-08 15:13     ` Jonathan Cameron
2026-01-09 17:44       ` John Groves
2026-01-07 15:33   ` [PATCH V3 18/21] famfs_fuse: Add holder_operations for dax notify_failure() John Groves
2026-01-08 15:17     ` Jonathan Cameron
2026-01-09 21:00       ` John Groves
2026-01-07 15:33   ` [PATCH V3 19/21] famfs_fuse: Add DAX address_space_operations with noop_dirty_folio John Groves
2026-01-07 15:33   ` [PATCH V3 20/21] famfs_fuse: Add famfs fmap metadata documentation John Groves
2026-01-07 15:33   ` [PATCH V3 21/21] famfs_fuse: Add documentation John Groves
2026-01-08 15:27     ` Jonathan Cameron
2026-01-11 18:53       ` John Groves
2026-01-07 15:34 ` [PATCH V3 0/4] libfuse: add basic famfs support to libfuse John Groves
2026-01-07 15:34   ` [PATCH V3 1/4] fuse_kernel.h: bring up to baseline 6.19 John Groves
2026-01-07 15:34   ` [PATCH V3 2/4] fuse_kernel.h: add famfs DAX fmap protocol definitions John Groves
2026-01-07 15:34   ` [PATCH V3 3/4] fuse: add API to set kernel mount options John Groves
2026-01-07 15:34   ` [PATCH V3 4/4] fuse: add famfs DAX fmap support John Groves
2026-01-08 15:31     ` Jonathan Cameron
2026-01-11 18:24       ` John Groves
2026-01-07 15:34 ` [PATCH 0/2] ndctl: Add daxctl support for the new "famfs" mode of devdax John Groves
2026-01-07 15:34   ` [PATCH 1/2] daxctl: Add support for famfs mode John Groves
2026-01-07 15:34   ` [PATCH 2/2] Add test/daxctl-famfs.sh to test famfs mode transitions: 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=20260108123450.00004eac@huawei.com \
    --to=jonathan.cameron@huawei.com \
    --cc=John@Groves.net \
    --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=dave.jiang@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=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=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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox