forked from luck/tmp_suning_uos_patched
[IB] Fail sysfs queries after device is unregistered
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>
This commit is contained in:
parent
d476306f1c
commit
ba8e931024
@ -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)
|
||||
{
|
||||
@ -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);
|
||||
}
|
||||
@ -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);
|
||||
@ -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;
|
||||
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user