From 5fd9d2ff3f01676b3f789d94317d9beeee24b3df Mon Sep 17 00:00:00 2001 From: t_jeang Date: Tue, 6 Jan 2009 12:06:01 +0000 Subject: [PATCH] imported patch blk-fix-sysfs-remove-race --- drivers/xen/blkback/xenbus.c | 17 +++++++++++++---- drivers/xen/blktap/xenbus.c | 17 +++++++++++++---- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/drivers/xen/blkback/xenbus.c b/drivers/xen/blkback/xenbus.c index 30285f49..c48456d8 100644 --- a/drivers/xen/blkback/xenbus.c +++ b/drivers/xen/blkback/xenbus.c @@ -123,10 +123,17 @@ static void update_blkif_status(blkif_t *blkif) 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) @@ -275,10 +282,12 @@ static int blkback_remove(struct xenbus_device *dev) 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; } diff --git a/drivers/xen/blktap/xenbus.c b/drivers/xen/blktap/xenbus.c index 5591f950..1150dfd3 100644 --- a/drivers/xen/blktap/xenbus.c +++ b/drivers/xen/blktap/xenbus.c @@ -187,10 +187,17 @@ static int blktap_name(blkif_t *blkif, char *buf) 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) @@ -319,10 +326,12 @@ static int blktap_remove(struct xenbus_device *dev) 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; } -- 2.39.5