18
18
#include "qed.h"
19
19
#include "qemu/bswap.h"
20
20
21
+ /* Called either from qed_check or with table_lock held. */
21
22
static int qed_read_table (BDRVQEDState * s , uint64_t offset , QEDTable * table )
22
23
{
23
24
QEMUIOVector qiov ;
@@ -32,18 +33,22 @@ static int qed_read_table(BDRVQEDState *s, uint64_t offset, QEDTable *table)
32
33
33
34
trace_qed_read_table (s , offset , table );
34
35
36
+ if (qemu_in_coroutine ()) {
37
+ qemu_co_mutex_unlock (& s -> table_lock );
38
+ }
35
39
ret = bdrv_preadv (s -> bs -> file , offset , & qiov );
40
+ if (qemu_in_coroutine ()) {
41
+ qemu_co_mutex_lock (& s -> table_lock );
42
+ }
36
43
if (ret < 0 ) {
37
44
goto out ;
38
45
}
39
46
40
47
/* Byteswap offsets */
41
- qed_acquire (s );
42
48
noffsets = qiov .size / sizeof (uint64_t );
43
49
for (i = 0 ; i < noffsets ; i ++ ) {
44
50
table -> offsets [i ] = le64_to_cpu (table -> offsets [i ]);
45
51
}
46
- qed_release (s );
47
52
48
53
ret = 0 ;
49
54
out :
@@ -61,6 +66,8 @@ static int qed_read_table(BDRVQEDState *s, uint64_t offset, QEDTable *table)
61
66
* @index: Index of first element
62
67
* @n: Number of elements
63
68
* @flush: Whether or not to sync to disk
69
+ *
70
+ * Called either from qed_check or with table_lock held.
64
71
*/
65
72
static int qed_write_table (BDRVQEDState * s , uint64_t offset , QEDTable * table ,
66
73
unsigned int index , unsigned int n , bool flush )
@@ -97,16 +104,20 @@ static int qed_write_table(BDRVQEDState *s, uint64_t offset, QEDTable *table,
97
104
/* Adjust for offset into table */
98
105
offset += start * sizeof (uint64_t );
99
106
107
+ if (qemu_in_coroutine ()) {
108
+ qemu_co_mutex_unlock (& s -> table_lock );
109
+ }
100
110
ret = bdrv_pwritev (s -> bs -> file , offset , & qiov );
111
+ if (qemu_in_coroutine ()) {
112
+ qemu_co_mutex_lock (& s -> table_lock );
113
+ }
101
114
trace_qed_write_table_cb (s , table , flush , ret );
102
115
if (ret < 0 ) {
103
116
goto out ;
104
117
}
105
118
106
119
if (flush ) {
107
- qed_acquire (s );
108
120
ret = bdrv_flush (s -> bs );
109
- qed_release (s );
110
121
if (ret < 0 ) {
111
122
goto out ;
112
123
}
@@ -123,6 +134,7 @@ int qed_read_l1_table_sync(BDRVQEDState *s)
123
134
return qed_read_table (s , s -> header .l1_table_offset , s -> l1_table );
124
135
}
125
136
137
+ /* Called either from qed_check or with table_lock held. */
126
138
int qed_write_l1_table (BDRVQEDState * s , unsigned int index , unsigned int n )
127
139
{
128
140
BLKDBG_EVENT (s -> bs -> file , BLKDBG_L1_UPDATE );
@@ -136,6 +148,7 @@ int qed_write_l1_table_sync(BDRVQEDState *s, unsigned int index,
136
148
return qed_write_l1_table (s , index , n );
137
149
}
138
150
151
+ /* Called either from qed_check or with table_lock held. */
139
152
int qed_read_l2_table (BDRVQEDState * s , QEDRequest * request , uint64_t offset )
140
153
{
141
154
int ret ;
@@ -154,7 +167,6 @@ int qed_read_l2_table(BDRVQEDState *s, QEDRequest *request, uint64_t offset)
154
167
BLKDBG_EVENT (s -> bs -> file , BLKDBG_L2_LOAD );
155
168
ret = qed_read_table (s , offset , request -> l2_table -> table );
156
169
157
- qed_acquire (s );
158
170
if (ret ) {
159
171
/* can't trust loaded L2 table anymore */
160
172
qed_unref_l2_cache_entry (request -> l2_table );
@@ -170,7 +182,6 @@ int qed_read_l2_table(BDRVQEDState *s, QEDRequest *request, uint64_t offset)
170
182
request -> l2_table = qed_find_l2_cache_entry (& s -> l2_cache , offset );
171
183
assert (request -> l2_table != NULL );
172
184
}
173
- qed_release (s );
174
185
175
186
return ret ;
176
187
}
@@ -180,6 +191,7 @@ int qed_read_l2_table_sync(BDRVQEDState *s, QEDRequest *request, uint64_t offset
180
191
return qed_read_l2_table (s , request , offset );
181
192
}
182
193
194
+ /* Called either from qed_check or with table_lock held. */
183
195
int qed_write_l2_table (BDRVQEDState * s , QEDRequest * request ,
184
196
unsigned int index , unsigned int n , bool flush )
185
197
{
0 commit comments