]> xenbits.xensource.com Git - xenclient/kernel.git/commitdiff
imported patch blk-fix-sysfs-remove-race CA-12483-fix-forced-shutdown-race
authort_jeang <devnull@localhost>
Tue, 6 Jan 2009 12:06:01 +0000 (12:06 +0000)
committert_jeang <devnull@localhost>
Tue, 6 Jan 2009 12:06:01 +0000 (12:06 +0000)
drivers/xen/blkback/xenbus.c
drivers/xen/blktap/xenbus.c

index 30285f493063cc59953c28e312205389eaa5e292..c48456d822c5b9ab5c6cb4a0f6c86e2718db2dab 100644 (file)
@@ -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;
 }
index 5591f95082a14dbab50d1b53ed824f5da58f0187..1150dfd3f7fb54da83d0dfef371fcce505384e2c 100644 (file)
@@ -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;
 }