]> xenbits.xensource.com Git - people/ssmith/nc2-2.6.27.bak/.git/commitdiff
patch blk-fix-sysfs-remove-race
authorSteven Smith <ssmith@weybridge.uk.xensource.com>
Thu, 28 May 2009 10:54:19 +0000 (11:54 +0100)
committerSteven Smith <ssmith@weybridge.uk.xensource.com>
Thu, 28 May 2009 10:54:19 +0000 (11:54 +0100)
drivers/xen/blkback/xenbus.c
drivers/xen/blktap/xenbus.c

index a1ac90017b2ab08f86f565c92ba2b4f2b96d2ffd..d4bf1ba7da00b2be4bf6ef03ec5e9b5925abb636 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 6b25526a3bb8994b89141ff58d4458910af6ec5d..e0de318ad518a154f4491a0b323904e4c39a74e4 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;
 }