struct device_attribute *attr, \
char *buf) \
{ \
+ int ret = -ENODEV; \
+ struct backend_info *be; \
struct xenbus_device *dev = to_xenbus_device(_dev); \
- struct backend_info *be = dev->dev.driver_data; \
\
- return sprintf(buf, format, ##args); \
+ down(&blkback_dev_sem); \
+ be = dev->dev.driver_data; \
+ if (be) \
+ ret = sprintf(buf, format, ##args); \
+ up(&blkback_dev_sem); \
+ \
+ return ret; \
} \
static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL)
if (kthread_remove(be))
WPRINTK("BAD REMOVE REQUEST for %s\n", be->nodename);
+ down(&blkback_dev_sem);
xenvbd_sysfs_delif(dev);
- backend_release(be);
-
dev->dev.driver_data = NULL;
+ up(&blkback_dev_sem);
+
+ backend_release(be);
return 0;
}
struct device_attribute *attr, \
char *buf) \
{ \
+ int ret = -ENODEV; \
+ struct backend_info *be; \
struct xenbus_device *dev = to_xenbus_device(_dev); \
- struct backend_info *be = dev->dev.driver_data; \
\
- return sprintf(buf, format, ##args); \
+ down(&blktap_dev_sem); \
+ be = dev->dev.driver_data; \
+ if (be) \
+ ret = sprintf(buf, format, ##args); \
+ up(&blktap_dev_sem); \
+ \
+ return ret; \
} \
static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL)
if (kthread_remove(be))
WPRINTK("BAD REMOVE REQUEST for %s\n", be->nodename);
+ down(&blktap_dev_sem);
xentap_sysfs_delif(dev);
- backend_release(be);
-
dev->dev.driver_data = NULL;
+ up(&blktap_dev_sem);
+
+ backend_release(be);
return 0;
}