From 6593097586fb134cf399d6d954202ce92b5f94ec Mon Sep 17 00:00:00 2001 From: Oron Peled Date: Mon, 17 Mar 2014 11:55:29 -0400 Subject: [PATCH] xpp: fix PANIC for old dahdi_registration * dahdi_registration writes multiple times to: /sys/bus/astribanks/devices/*/*/span * In some race cases this resulted in corruption and eventual kernel panic. * Until migration to "assigned-spans" is complete: - Accept and ignore multiple "dahdi registrations" from user-space. Signed-off-by: Tzafrir Cohen --- drivers/dahdi/xpp/xbus-core.c | 12 ++++++++---- drivers/dahdi/xpp/xbus-sysfs.c | 30 ++++-------------------------- 2 files changed, 12 insertions(+), 30 deletions(-) diff --git a/drivers/dahdi/xpp/xbus-core.c b/drivers/dahdi/xpp/xbus-core.c index 8887c1e..a7bb798 100644 --- a/drivers/dahdi/xpp/xbus-core.c +++ b/drivers/dahdi/xpp/xbus-core.c @@ -953,10 +953,14 @@ int xbus_register_dahdi_device(xbus_t *xbus) goto err; } if (xbus_is_registered(xbus)) { - XBUS_ERR(xbus, "Already registered to DAHDI\n"); - WARN_ON(1); - ret = -EINVAL; - goto err; + /* + * Ignore duplicate registrations (from dahdi_registration) + * Until we completely migrate to dahdi_autoreg=1 and + * hotplug-based span-assignments + */ + XBUS_DBG(DEVICES, xbus, "Already registered to DAHDI\n"); + ret = 0; + goto out; } xbus->ddev = dahdi_create_device(); if (!xbus->ddev) { diff --git a/drivers/dahdi/xpp/xbus-sysfs.c b/drivers/dahdi/xpp/xbus-sysfs.c index 5861054..24dcda2 100644 --- a/drivers/dahdi/xpp/xbus-sysfs.c +++ b/drivers/dahdi/xpp/xbus-sysfs.c @@ -23,7 +23,6 @@ #include #include #include -#include #include #ifdef PROTOCOL_DEBUG #include @@ -596,8 +595,6 @@ static DEVICE_ATTR_READER(span_show, dev, buf) return len; } -static DEFINE_MUTEX(span_store_mutex); - /* * For backward compatibility with old dahdi-tools * Remove after dahdi_registration is upgraded @@ -619,29 +616,10 @@ static DEVICE_ATTR_WRITER(span_store, dev, buf, count) return -ENODEV; XPD_DBG(DEVICES, xpd, "%s -- deprecated (should use assigned-spans)\n", (dahdi_reg) ? "register" : "unregister"); - ret = mutex_lock_interruptible(&span_store_mutex); - if (ret < 0) { - XBUS_ERR(xpd->xbus, "span_store_mutex already taken\n"); - return ret; - } - if (xbus_is_registered(xpd->xbus)) { - if (dahdi_reg) { - XPD_DBG(DEVICES, xpd, - "already registered %s. Ignored.\n", - xpd->xbus->busname); - } else { - xbus_unregister_dahdi_device(xpd->xbus); - } - } else { - if (!dahdi_reg) { - XPD_DBG(DEVICES, xpd, - "already unregistered %s. Ignored.\n", - xpd->xbus->busname); - } else { - xbus_register_dahdi_device(xpd->xbus); - } - } - mutex_unlock(&span_store_mutex); + if (dahdi_reg) + xbus_register_dahdi_device(xpd->xbus); + else + xbus_unregister_dahdi_device(xpd->xbus); return count; }