-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathblkback-be-mutex.diff
154 lines (130 loc) · 3.69 KB
/
blkback-be-mutex.diff
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
diff -r 2eacc3b7dcc5 drivers/xen/blkback/blkback.c
--- a/drivers/xen/blkback/blkback.c Thu Jun 24 23:17:00 2010 -0700
+++ b/drivers/xen/blkback/blkback.c Thu Jun 24 23:17:47 2010 -0700
@@ -456,7 +456,7 @@
if (debug_lvl)
printk(KERN_DEBUG "%s: exiting\n", current->comm);
- blkback_close(blkif);
+ blkback_close(blkif->be);
return 0;
}
diff -r 2eacc3b7dcc5 drivers/xen/blkback/common.h
--- a/drivers/xen/blkback/common.h Thu Jun 24 23:17:00 2010 -0700
+++ b/drivers/xen/blkback/common.h Thu Jun 24 23:17:47 2010 -0700
@@ -151,6 +151,6 @@
void blkback_resume(blkif_t *blkif);
void blkback_signal_resumed(blkif_t *blkif);
-void blkback_close(blkif_t *blkif);
+void blkback_close(struct backend_info *be);
#endif /* __BLKIF__BACKEND__COMMON_H__ */
diff -r 2eacc3b7dcc5 drivers/xen/blkback/xenbus.c
--- a/drivers/xen/blkback/xenbus.c Thu Jun 24 23:17:00 2010 -0700
+++ b/drivers/xen/blkback/xenbus.c Thu Jun 24 23:17:47 2010 -0700
@@ -29,6 +29,7 @@
struct backend_info
{
+ struct mutex mutex;
struct xenbus_device *dev;
blkif_t *blkif;
struct xenbus_watch backend_watch;
@@ -42,8 +43,6 @@
int shutdown_signalled;
};
-DECLARE_MUTEX(blkback_dev_sem);
-
static void connect(struct backend_info *);
static int connect_ring(struct backend_info *);
static void backend_changed(struct xenbus_watch *, const char **,
@@ -206,11 +205,11 @@
/* NB. this should actually be a link to /sys/block. */
- down(&blkback_dev_sem);
+ mutex_lock(&be->mutex);
bdev = blkif->bdev;
if (bdev)
rdev = bdev->bd_inode->i_rdev;
- up(&blkback_dev_sem);
+ mutex_unlock(&be->mutex);
if (rdev)
rv = sprintf(buf, "%x:%x\n", MAJOR(rdev), MINOR(rdev));
@@ -275,7 +274,7 @@
struct xenbus_device *xbdev = be->dev;
int err;
- down(&blkback_dev_sem);
+ mutex_lock(&be->mutex);
if (be->shutdown_signalled)
goto out;
@@ -291,7 +290,7 @@
be->shutdown_signalled = 1;
out:
- up(&blkback_dev_sem);
+ mutex_unlock(&be->mutex);
}
static void backend_release(struct backend_info *be)
@@ -320,9 +319,9 @@
{
struct backend_info *be = xbdev->dev.driver_data;
- down(&blkback_dev_sem);
+ mutex_lock(&be->mutex);
be->dev = NULL;
- up(&blkback_dev_sem);
+ mutex_unlock(&be->mutex);
if (be->backend_watch.node) {
unregister_xenbus_watch(&be->backend_watch);
@@ -356,18 +355,20 @@
/*
* called by kthread when closing
*/
-void blkback_close(blkif_t *blkif)
+void blkback_close(struct backend_info *be)
{
+ blkif_t *blkif = be->blkif;
+
blkif_disconnect(blkif);
- down(&blkback_dev_sem);
+ mutex_lock(&be->mutex);
blkif_bdev_close(blkif);
blkif->be->major = 0;
blkif->be->minor = 0;
blkif->remove_requested = 0;
- up(&blkback_dev_sem);
+ mutex_unlock(&be->mutex);
blkif->xenblkd = NULL;
backend_release(blkif->be);
@@ -435,14 +436,14 @@
int err;
struct backend_info *be = blkif->be;
- down(&blkback_dev_sem);
+ mutex_lock(&be->mutex);
if (be->dev) {
err = xenbus_write(XBT_NIL,
be->dev->nodename, "pause-done", "");
if (err)
xenbus_dev_error(be->dev, err, "writing pause-done");
}
- up(&blkback_dev_sem);
+ mutex_unlock(&be->mutex);
}
void blkback_signal_resumed(blkif_t *blkif)
@@ -450,7 +451,7 @@
int err;
struct backend_info *be = blkif->be;
- down(&blkback_dev_sem);
+ mutex_lock(&be->mutex);
if (be->dev) {
if (blkif->bdev &&
be->dev->state == XenbusStateConnected)
@@ -460,7 +461,7 @@
if (err)
xenbus_dev_error(be->dev, err, "removing pause-done");
}
- up(&blkback_dev_sem);
+ mutex_unlock(&be->mutex);
}
static void backend_pause(struct xenbus_watch *watch,
@@ -519,6 +520,7 @@
be->dev = dev;
dev->dev.driver_data = be;
atomic_set(&be->refcnt, 1);
+ mutex_init(&be->mutex);
be->blkif = blkif_alloc(dev->otherend_id);
if (IS_ERR(be->blkif)) {