Message ID | 155002261877.645460.9109209504128012410.stgit@dwillia2-desk3.amr.corp.intel.com (mailing list archive) |
---|---|
State | Mainlined |
Commit | 664525b2d84abca1074c9546654ae9689de8a818 |
Headers | show |
Series | [v2] device-dax: Auto-bind device after successful new_id | expand |
Thanks Dan, remove_id works now. Brice Le 13/02/2019 à 02:50, Dan Williams a écrit : > The typical 'new_id' attribute behavior is to immediately attach a > device to its driver after a new device-id is added. Implement this > behavior for the dax bus. > > Reported-by: Alexander Duyck <alexander.h.duyck@linux.intel.com> > Reported-by: Brice Goglin <Brice.Goglin@inria.fr> > Cc: Dave Hansen <dave.hansen@linux.intel.com> > Signed-off-by: Dan Williams <dan.j.williams@intel.com> > --- > Changes since v1: > * Fix the remove_id path since do_id_store() is shared with the new_id > path (Brice) > > Brice, this works for me. I'll push it out on libnvdimm-pending, or in > the meantime you can apply this patch after reverting commit > a9f1ffdb6a20 on the current state of the branch. > > drivers/dax/bus.c | 24 ++++++++++++++++++------ > 1 file changed, 18 insertions(+), 6 deletions(-) > > diff --git a/drivers/dax/bus.c b/drivers/dax/bus.c > index c620ad52d7e5..a410154d75fb 100644 > --- a/drivers/dax/bus.c > +++ b/drivers/dax/bus.c > @@ -57,8 +57,13 @@ static int dax_match_id(struct dax_device_driver *dax_drv, struct device *dev) > return match; > } > > +enum id_action { > + ID_REMOVE, > + ID_ADD, > +}; > + > static ssize_t do_id_store(struct device_driver *drv, const char *buf, > - size_t count, bool add) > + size_t count, enum id_action action) > { > struct dax_device_driver *dax_drv = to_dax_drv(drv); > unsigned int region_id, id; > @@ -77,7 +82,7 @@ static ssize_t do_id_store(struct device_driver *drv, const char *buf, > mutex_lock(&dax_bus_lock); > dax_id = __dax_match_id(dax_drv, buf); > if (!dax_id) { > - if (add) { > + if (action == ID_ADD) { > dax_id = kzalloc(sizeof(*dax_id), GFP_KERNEL); > if (dax_id) { > strncpy(dax_id->dev_name, buf, DAX_NAME_LEN); > @@ -86,26 +91,33 @@ static ssize_t do_id_store(struct device_driver *drv, const char *buf, > rc = -ENOMEM; > } else > /* nothing to remove */; > - } else if (!add) { > + } else if (action == ID_REMOVE) { > list_del(&dax_id->list); > kfree(dax_id); > } else > /* dax_id already added */; > mutex_unlock(&dax_bus_lock); > - return rc; > + > + if (rc < 0) > + return rc; > + if (action == ID_ADD) > + rc = driver_attach(drv); > + if (rc) > + return rc; > + return count; > } > > static ssize_t new_id_store(struct device_driver *drv, const char *buf, > size_t count) > { > - return do_id_store(drv, buf, count, true); > + return do_id_store(drv, buf, count, ID_ADD); > } > static DRIVER_ATTR_WO(new_id); > > static ssize_t remove_id_store(struct device_driver *drv, const char *buf, > size_t count) > { > - return do_id_store(drv, buf, count, false); > + return do_id_store(drv, buf, count, ID_REMOVE); > } > static DRIVER_ATTR_WO(remove_id); > >
diff --git a/drivers/dax/bus.c b/drivers/dax/bus.c index c620ad52d7e5..a410154d75fb 100644 --- a/drivers/dax/bus.c +++ b/drivers/dax/bus.c @@ -57,8 +57,13 @@ static int dax_match_id(struct dax_device_driver *dax_drv, struct device *dev) return match; } +enum id_action { + ID_REMOVE, + ID_ADD, +}; + static ssize_t do_id_store(struct device_driver *drv, const char *buf, - size_t count, bool add) + size_t count, enum id_action action) { struct dax_device_driver *dax_drv = to_dax_drv(drv); unsigned int region_id, id; @@ -77,7 +82,7 @@ static ssize_t do_id_store(struct device_driver *drv, const char *buf, mutex_lock(&dax_bus_lock); dax_id = __dax_match_id(dax_drv, buf); if (!dax_id) { - if (add) { + if (action == ID_ADD) { dax_id = kzalloc(sizeof(*dax_id), GFP_KERNEL); if (dax_id) { strncpy(dax_id->dev_name, buf, DAX_NAME_LEN); @@ -86,26 +91,33 @@ static ssize_t do_id_store(struct device_driver *drv, const char *buf, rc = -ENOMEM; } else /* nothing to remove */; - } else if (!add) { + } else if (action == ID_REMOVE) { list_del(&dax_id->list); kfree(dax_id); } else /* dax_id already added */; mutex_unlock(&dax_bus_lock); - return rc; + + if (rc < 0) + return rc; + if (action == ID_ADD) + rc = driver_attach(drv); + if (rc) + return rc; + return count; } static ssize_t new_id_store(struct device_driver *drv, const char *buf, size_t count) { - return do_id_store(drv, buf, count, true); + return do_id_store(drv, buf, count, ID_ADD); } static DRIVER_ATTR_WO(new_id); static ssize_t remove_id_store(struct device_driver *drv, const char *buf, size_t count) { - return do_id_store(drv, buf, count, false); + return do_id_store(drv, buf, count, ID_REMOVE); } static DRIVER_ATTR_WO(remove_id);
The typical 'new_id' attribute behavior is to immediately attach a device to its driver after a new device-id is added. Implement this behavior for the dax bus. Reported-by: Alexander Duyck <alexander.h.duyck@linux.intel.com> Reported-by: Brice Goglin <Brice.Goglin@inria.fr> Cc: Dave Hansen <dave.hansen@linux.intel.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com> --- Changes since v1: * Fix the remove_id path since do_id_store() is shared with the new_id path (Brice) Brice, this works for me. I'll push it out on libnvdimm-pending, or in the meantime you can apply this patch after reverting commit a9f1ffdb6a20 on the current state of the branch. drivers/dax/bus.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-)