diff options
author | Tzafrir Cohen <tzafrir.cohen@xorcom.com> | 2010-07-13 08:44:36 +0000 |
---|---|---|
committer | Tzafrir Cohen <tzafrir.cohen@xorcom.com> | 2010-07-13 08:44:36 +0000 |
commit | 330259c92d09fba56efca9d5be4cd2b237645725 (patch) | |
tree | fa94a11bc75abf2b9ce026a6e3d2f4bbc48f2569 /drivers/dahdi/xpp | |
parent | 5b506aee19dd5e0e7cbfb10451c05ebf2bcb9739 (diff) |
Cleanup: refcount_xpd()
* Change refcount_xpd(): instead of returning a pointer to the atomic
counter, return directly its value (just like refcount_xbus())
* Add a refcount_xbus and refcount_xpd attributes to sysfs (for debugging)
git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@8878 a0bf4364-ded3-4de4-8d8a-66a801d63aff
Diffstat (limited to 'drivers/dahdi/xpp')
-rw-r--r-- | drivers/dahdi/xpp/xbus-core.c | 2 | ||||
-rw-r--r-- | drivers/dahdi/xpp/xbus-sysfs.c | 25 | ||||
-rw-r--r-- | drivers/dahdi/xpp/xpd.h | 1 | ||||
-rw-r--r-- | drivers/dahdi/xpp/xpp_dahdi.c | 12 |
4 files changed, 35 insertions, 5 deletions
diff --git a/drivers/dahdi/xpp/xbus-core.c b/drivers/dahdi/xpp/xbus-core.c index 22f25ef..3906f41 100644 --- a/drivers/dahdi/xpp/xbus-core.c +++ b/drivers/dahdi/xpp/xbus-core.c @@ -148,6 +148,8 @@ xbus_t *get_xbus(const char *msg, xbus_t *xbus) XBUS_DBG(DEVICES, xbus, "%s: refcount_xbus=%d\n", msg, refcount_xbus(xbus)); dev = get_device(&xbus->astribank); + if (!dev) + return NULL; return dev_to_xbus(dev); } diff --git a/drivers/dahdi/xpp/xbus-sysfs.c b/drivers/dahdi/xpp/xbus-sysfs.c index a48b806..9634cd2 100644 --- a/drivers/dahdi/xpp/xbus-sysfs.c +++ b/drivers/dahdi/xpp/xbus-sysfs.c @@ -205,6 +205,16 @@ static DEVICE_ATTR_READER(waitfor_xpds_show, dev, buf) return len; } +static DEVICE_ATTR_READER(refcount_xbus_show, dev, buf) +{ + xbus_t *xbus; + int len; + + xbus = dev_to_xbus(dev); + len = sprintf(buf, "%d\n", refcount_xbus(xbus)); + return len; +} + static DEVICE_ATTR_READER(driftinfo_show, dev, buf) { xbus_t *xbus; @@ -290,6 +300,7 @@ static struct device_attribute xbus_dev_attrs[] = { __ATTR_RO(label), __ATTR_RO(status), __ATTR_RO(timing), + __ATTR_RO(refcount_xbus), __ATTR_RO(waitfor_xpds), __ATTR_RO(driftinfo), __ATTR(cls, S_IWUSR, NULL, cls_store), @@ -677,6 +688,19 @@ static DEVICE_ATTR_READER(timing_priority_show, dev, buf) return len; } +static DEVICE_ATTR_READER(refcount_xpd_show, dev, buf) +{ + xpd_t *xpd; + int len = 0; + + BUG_ON(!dev); + xpd = dev_to_xpd(dev); + if (!xpd) + return -ENODEV; + len += sprintf(buf + len, "%d\n", refcount_xpd(xpd)); + return len; +} + static int xpd_match(struct device *dev, struct device_driver *driver) { struct xpd_driver *xpd_driver; @@ -701,6 +725,7 @@ static struct device_attribute xpd_dev_attrs[] = { __ATTR_RO(type), __ATTR_RO(offhook), __ATTR_RO(timing_priority), + __ATTR_RO(refcount_xpd), __ATTR_NULL, }; diff --git a/drivers/dahdi/xpp/xpd.h b/drivers/dahdi/xpp/xpd.h index daf1954..d58b40a 100644 --- a/drivers/dahdi/xpp/xpd.h +++ b/drivers/dahdi/xpp/xpd.h @@ -257,6 +257,7 @@ int xpd_driver_register(struct device_driver *driver); void xpd_driver_unregister(struct device_driver *driver); xpd_t *get_xpd(const char *msg, xpd_t *xpd); void put_xpd(const char *msg, xpd_t *xpd); +int refcount_xpd(xpd_t *xpd); #endif diff --git a/drivers/dahdi/xpp/xpp_dahdi.c b/drivers/dahdi/xpp/xpp_dahdi.c index 3e4b9b2..26fa223 100644 --- a/drivers/dahdi/xpp/xpp_dahdi.c +++ b/drivers/dahdi/xpp/xpp_dahdi.c @@ -122,11 +122,11 @@ static int proc_xpd_blink_write(struct file *file, const char __user *buffer, un /*------------------------- XPD Management -------------------------*/ -static atomic_t *refcount_xpd(xpd_t *xpd) +int refcount_xpd(xpd_t *xpd) { struct kref *kref = &xpd->xpd_dev.kobj.kref; - return &kref->refcount; + return atomic_read(&kref->refcount); } xpd_t *get_xpd(const char *msg, xpd_t *xpd) @@ -134,15 +134,17 @@ xpd_t *get_xpd(const char *msg, xpd_t *xpd) struct device *dev; XPD_DBG(DEVICES, xpd, "%s: refcount_xpd=%d\n", - msg, atomic_read(refcount_xpd(xpd))); + msg, refcount_xpd(xpd)); dev = get_device(&xpd->xpd_dev); + if (!dev) + return NULL; return dev_to_xpd(dev); } void put_xpd(const char *msg, xpd_t *xpd) { XPD_DBG(DEVICES, xpd, "%s: refcount_xpd=%d\n", - msg, atomic_read(refcount_xpd(xpd))); + msg, refcount_xpd(xpd)); put_device(&xpd->xpd_dev); } @@ -331,7 +333,7 @@ static int xpd_read_proc(char *page, char **start, off_t off, int count, int *eo len += sprintf(page + len, "xpd_state: %s (%d)\n", xpd_statename(xpd->xpd_state), xpd->xpd_state); len += sprintf(page + len, "open_counter=%d refcount=%d\n", - atomic_read(&xpd->open_counter), atomic_read(refcount_xpd(xpd))); + atomic_read(&xpd->open_counter), refcount_xpd(xpd)); len += sprintf(page + len, "Address: U=%d S=%d\n", xpd->addr.unit, xpd->addr.subunit); len += sprintf(page + len, "Subunits: %d\n", xpd->subunits); len += sprintf(page + len, "Type: %d.%d\n\n", xpd->type, xpd->subtype); |