diff options
Diffstat (limited to 'drivers/infiniband/core/sysfs.c')
| -rw-r--r-- | drivers/infiniband/core/sysfs.c | 16 | 
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/infiniband/core/sysfs.c b/drivers/infiniband/core/sysfs.c index 211ba3223f6..7ce7a6c782f 100644 --- a/drivers/infiniband/core/sysfs.c +++ b/drivers/infiniband/core/sysfs.c @@ -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;  | 
