Skip to content

Commit

Permalink
[IB] Fail sysfs queries after device is unregistered
Browse files Browse the repository at this point in the history
We keep IB device structures around until the last sysfs reference is
gone, but we shouldn't ask the low-level driver to do anything after
the LLD unregisters the device.  To handle this, check the reg_state
field and just fail sysfs show() requests if the device has already
been unregistered.

Signed-off-by: Roland Dreier <rolandd@cisco.com>
  • Loading branch information
Roland Dreier committed Oct 18, 2005
1 parent d476306 commit ba8e931
Showing 1 changed file with 16 additions and 0 deletions.
16 changes: 16 additions & 0 deletions drivers/infiniband/core/sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,11 @@ struct port_table_attribute {
int index;
};

static inline int ibdev_is_alive(const struct ib_device *dev)
{
return dev->reg_state == IB_DEV_REGISTERED;
}

static ssize_t port_attr_show(struct kobject *kobj,
struct attribute *attr, char *buf)
{
Expand All @@ -74,6 +79,8 @@ static ssize_t port_attr_show(struct kobject *kobj,

if (!port_attr->show)
return -EIO;
if (!ibdev_is_alive(p->ibdev))
return -ENODEV;

return port_attr->show(p, port_attr, buf);
}
Expand Down Expand Up @@ -581,6 +588,9 @@ static ssize_t show_node_type(struct class_device *cdev, char *buf)
{
struct ib_device *dev = container_of(cdev, struct ib_device, class_dev);

if (!ibdev_is_alive(dev))
return -ENODEV;

switch (dev->node_type) {
case IB_NODE_CA: return sprintf(buf, "%d: CA\n", dev->node_type);
case IB_NODE_SWITCH: return sprintf(buf, "%d: switch\n", dev->node_type);
Expand All @@ -595,6 +605,9 @@ static ssize_t show_sys_image_guid(struct class_device *cdev, char *buf)
struct ib_device_attr attr;
ssize_t ret;

if (!ibdev_is_alive(dev))
return -ENODEV;

ret = ib_query_device(dev, &attr);
if (ret)
return ret;
Expand All @@ -612,6 +625,9 @@ static ssize_t show_node_guid(struct class_device *cdev, char *buf)
struct ib_device_attr attr;
ssize_t ret;

if (!ibdev_is_alive(dev))
return -ENODEV;

ret = ib_query_device(dev, &attr);
if (ret)
return ret;
Expand Down

0 comments on commit ba8e931

Please sign in to comment.