1
The following changes since commit ecc1f5adeec4e3324d1b695a7c54e3967c526949:
1
The following changes since commit 9c125d17e9402c232c46610802e5931b3639d77b:
2
2
3
maintainers: Add myself as linux-user reviewer (2017-05-11 13:31:11 -0400)
3
Merge tag 'pull-tcg-20220420' of https://gitlab.com/rth7680/qemu into staging (2022-04-20 16:43:11 -0700)
4
4
5
are available in the git repository at:
5
are available in the Git repository at:
6
6
7
git://github.com/stefanha/qemu.git tags/block-pull-request
7
https://gitlab.com/stefanha/qemu.git tags/block-pull-request
8
8
9
for you to fetch changes up to 321d1dba8bef9676a77e9399484e3cd8bf2cf16a:
9
for you to fetch changes up to d45c83328feab2e4083991693160f0a417cfd9b0:
10
10
11
aio: add missing aio_notify() to aio_enable_external() (2017-05-12 10:36:46 -0400)
11
virtiofsd: Add docs/helper for killpriv_v2/no_killpriv_v2 option (2022-04-21 12:05:15 +0200)
12
13
----------------------------------------------------------------
14
Pull request
15
16
Small contrib/vhost-user-blk, contrib/vhost-user-scsi, and tools/virtiofsd
17
improvements.
12
18
13
----------------------------------------------------------------
19
----------------------------------------------------------------
14
20
15
----------------------------------------------------------------
21
Liu Yiding (1):
22
virtiofsd: Add docs/helper for killpriv_v2/no_killpriv_v2 option
16
23
17
Daniel P. Berrange (1):
24
Sakshi Kaushik (1):
18
coroutine: remove GThread implementation
25
Implements Backend Program conventions for vhost-user-scsi
19
20
Eric Blake (1):
21
block: Simplify BDRV_BLOCK_RAW recursion
22
26
23
Stefan Hajnoczi (1):
27
Stefan Hajnoczi (1):
24
aio: add missing aio_notify() to aio_enable_external()
28
contrib/vhost-user-blk: add missing GOptionEntry NULL terminator
25
29
26
configure | 19 ++---
30
docs/tools/virtiofsd.rst | 5 ++
27
include/block/aio.h | 10 ++-
31
contrib/vhost-user-blk/vhost-user-blk.c | 3 +-
28
block/io.c | 4 +-
32
contrib/vhost-user-scsi/vhost-user-scsi.c | 77 +++++++++++++++--------
29
util/coroutine-gthread.c | 198 -----------------------------------------------
33
tools/virtiofsd/helper.c | 3 +
30
.travis.yml | 5 +-
34
4 files changed, 62 insertions(+), 26 deletions(-)
31
5 files changed, 16 insertions(+), 220 deletions(-)
32
delete mode 100644 util/coroutine-gthread.c
33
35
34
--
36
--
35
2.9.3
37
2.35.1
36
37
diff view generated by jsdifflib
1
The main loop uses aio_disable_external()/aio_enable_external() to
1
From: Sakshi Kaushik <sakshikaushik717@gmail.com>
2
temporarily disable processing of external AioContext clients like
3
device emulation.
4
2
5
This allows monitor commands to quiesce I/O and prevent the guest from
3
Signed-off-by: Sakshi Kaushik <sakshikaushik717@gmail.com>
6
submitting new requests while a monitor command is in progress.
4
Message-id: 20220406162410.8536-1-sakshikaushik717@gmail.com
7
5
8
The aio_enable_external() API is currently broken when an IOThread is in
6
[Name the iSCSI URL long option --iscsi-uri instead of --iscsi_uri for
9
aio_poll() waiting for fd activity when the main loop re-enables
7
consistency, fix --fd which was rejected due to an outdated
10
external clients. Incrementing ctx->external_disable_cnt does not wake
8
--socket-path check, and add missing entries[] terminator.
11
the IOThread from ppoll(2) so fd processing remains suspended and leads
9
--Stefan]
12
to unresponsive emulated devices.
13
10
14
This patch adds an aio_notify() call to aio_enable_external() so the
15
IOThread is kicked out of ppoll(2) and will re-arm the file descriptors.
16
17
The bug can be reproduced as follows:
18
19
$ qemu -M accel=kvm -m 1024 \
20
-object iothread,id=iothread0 \
21
-device virtio-scsi-pci,iothread=iothread0,id=virtio-scsi-pci0 \
22
-drive if=none,id=drive0,aio=native,cache=none,format=raw,file=test.img \
23
-device scsi-hd,id=scsi-hd0,drive=drive0 \
24
-qmp tcp::5555,server,nowait
25
26
$ scripts/qmp/qmp-shell localhost:5555
27
(qemu) blockdev-snapshot-sync device=drive0 snapshot-file=sn1.qcow2
28
mode=absolute-paths format=qcow2
29
30
After blockdev-snapshot-sync completes the SCSI disk will be
31
unresponsive. This leads to request timeouts inside the guest.
32
33
Reported-by: Qianqian Zhu <qizhu@redhat.com>
34
Reviewed-by: Fam Zheng <famz@redhat.com>
35
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
36
Message-id: 20170508180705.20609-1-stefanha@redhat.com
37
Suggested-by: Fam Zheng <famz@redhat.com>
38
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
11
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
39
---
12
---
40
include/block/aio.h | 10 ++++++++--
13
contrib/vhost-user-scsi/vhost-user-scsi.c | 77 +++++++++++++++--------
41
1 file changed, 8 insertions(+), 2 deletions(-)
14
1 file changed, 52 insertions(+), 25 deletions(-)
42
15
43
diff --git a/include/block/aio.h b/include/block/aio.h
16
diff --git a/contrib/vhost-user-scsi/vhost-user-scsi.c b/contrib/vhost-user-scsi/vhost-user-scsi.c
44
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
45
--- a/include/block/aio.h
18
--- a/contrib/vhost-user-scsi/vhost-user-scsi.c
46
+++ b/include/block/aio.h
19
+++ b/contrib/vhost-user-scsi/vhost-user-scsi.c
47
@@ -XXX,XX +XXX,XX @@ static inline void aio_disable_external(AioContext *ctx)
20
@@ -XXX,XX +XXX,XX @@ fail:
48
*/
21
49
static inline void aio_enable_external(AioContext *ctx)
22
/** vhost-user-scsi **/
23
24
+static int opt_fdnum = -1;
25
+static char *opt_socket_path;
26
+static gboolean opt_print_caps;
27
+static char *iscsi_uri;
28
+
29
+static GOptionEntry entries[] = {
30
+ { "print-capabilities", 'c', 0, G_OPTION_ARG_NONE, &opt_print_caps,
31
+ "Print capabilities", NULL },
32
+ { "fd", 'f', 0, G_OPTION_ARG_INT, &opt_fdnum,
33
+ "Use inherited fd socket", "FDNUM" },
34
+ { "iscsi-uri", 'i', 0, G_OPTION_ARG_FILENAME, &iscsi_uri,
35
+ "iSCSI URI to connect to", "FDNUM" },
36
+ { "socket-path", 's', 0, G_OPTION_ARG_FILENAME, &opt_socket_path,
37
+ "Use UNIX socket path", "PATH" },
38
+ { NULL, }
39
+};
40
+
41
int main(int argc, char **argv)
50
{
42
{
51
- assert(ctx->external_disable_cnt > 0);
43
VusDev *vdev_scsi = NULL;
52
- atomic_dec(&ctx->external_disable_cnt);
44
- char *unix_fn = NULL;
53
+ int old;
45
- char *iscsi_uri = NULL;
46
- int lsock = -1, csock = -1, opt, err = EXIT_SUCCESS;
47
+ int lsock = -1, csock = -1, err = EXIT_SUCCESS;
48
49
- while ((opt = getopt(argc, argv, "u:i:")) != -1) {
50
- switch (opt) {
51
- case 'h':
52
- goto help;
53
- case 'u':
54
- unix_fn = g_strdup(optarg);
55
- break;
56
- case 'i':
57
- iscsi_uri = g_strdup(optarg);
58
- break;
59
- default:
60
- goto help;
61
- }
62
+ GError *error = NULL;
63
+ GOptionContext *context;
54
+
64
+
55
+ old = atomic_fetch_dec(&ctx->external_disable_cnt);
65
+ context = g_option_context_new(NULL);
56
+ assert(old > 0);
66
+ g_option_context_add_main_entries(context, entries, NULL);
57
+ if (old == 1) {
67
+ if (!g_option_context_parse(context, &argc, &argv, &error)) {
58
+ /* Kick event loop so it re-arms file descriptors */
68
+ g_printerr("Option parsing failed: %s\n", error->message);
59
+ aio_notify(ctx);
69
+ exit(EXIT_FAILURE);
60
+ }
70
+ }
61
}
71
+
62
72
+ if (opt_print_caps) {
63
/**
73
+ g_print("{\n");
74
+ g_print(" \"type\": \"scsi\"\n");
75
+ g_print("}\n");
76
+ goto out;
77
}
78
- if (!unix_fn || !iscsi_uri) {
79
+
80
+ if (!iscsi_uri) {
81
goto help;
82
}
83
84
- lsock = unix_sock_new(unix_fn);
85
- if (lsock < 0) {
86
- goto err;
87
+ if (opt_socket_path) {
88
+ lsock = unix_sock_new(opt_socket_path);
89
+ if (lsock < 0) {
90
+ exit(EXIT_FAILURE);
91
+ }
92
+ } else if (opt_fdnum < 0) {
93
+ g_print("%s\n", g_option_context_get_help(context, true, NULL));
94
+ exit(EXIT_FAILURE);
95
+ } else {
96
+ lsock = opt_fdnum;
97
}
98
99
csock = accept(lsock, NULL, NULL);
100
@@ -XXX,XX +XXX,XX @@ out:
101
if (vdev_scsi) {
102
g_main_loop_unref(vdev_scsi->loop);
103
g_free(vdev_scsi);
104
- unlink(unix_fn);
105
+ unlink(opt_socket_path);
106
}
107
if (csock >= 0) {
108
close(csock);
109
@@ -XXX,XX +XXX,XX @@ out:
110
if (lsock >= 0) {
111
close(lsock);
112
}
113
- g_free(unix_fn);
114
+ g_free(opt_socket_path);
115
g_free(iscsi_uri);
116
117
return err;
118
@@ -XXX,XX +XXX,XX @@ err:
119
goto out;
120
121
help:
122
- fprintf(stderr, "Usage: %s [ -u unix_sock_path -i iscsi_uri ] | [ -h ]\n",
123
+ fprintf(stderr, "Usage: %s [ -s socket-path -i iscsi-uri -f fd -p print-capabilities ] | [ -h ]\n",
124
argv[0]);
125
- fprintf(stderr, " -u path to unix socket\n");
126
- fprintf(stderr, " -i iscsi uri for lun 0\n");
127
+ fprintf(stderr, " -s, --socket-path=SOCKET_PATH path to unix socket\n");
128
+ fprintf(stderr, " -i, --iscsi-uri=ISCSI_URI iscsi uri for lun 0\n");
129
+ fprintf(stderr, " -f, --fd=FILE_DESCRIPTOR file-descriptor\n");
130
+ fprintf(stderr, " -p, --print-capabilities=PRINT_CAPABILITIES denotes print-capabilities\n");
131
fprintf(stderr, " -h print help and quit\n");
132
133
goto err;
64
--
134
--
65
2.9.3
135
2.35.1
66
67
diff view generated by jsdifflib
1
From: "Daniel P. Berrange" <berrange@redhat.com>
1
The GLib documentation says "a NULL-terminated array of GOptionEntrys"
2
so we'd better make sure there is a terminator that lets
3
g_option_context_add_main_entries() know when the end of the array has
4
been reached.
2
5
3
The GThread implementation is not functional enough to actually
6
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
4
run QEMU reliably. While it was potentially useful for debugging,
7
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
5
we have a scripts/qemugdb/coroutine.py to enable tracing of
8
Message-id: 20220411150057.3009667-1-stefanha@redhat.com
6
ucontext coroutines in GDB, so that removes the only reason for
7
GThread to exist.
8
9
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
10
Acked-by: Alex Bennée <alex.bennee@linaro.org>
11
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
9
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
12
---
10
---
13
configure | 19 ++---
11
contrib/vhost-user-blk/vhost-user-blk.c | 3 ++-
14
util/coroutine-gthread.c | 198 -----------------------------------------------
12
1 file changed, 2 insertions(+), 1 deletion(-)
15
.travis.yml | 5 +-
16
3 files changed, 6 insertions(+), 216 deletions(-)
17
delete mode 100644 util/coroutine-gthread.c
18
13
19
diff --git a/configure b/configure
14
diff --git a/contrib/vhost-user-blk/vhost-user-blk.c b/contrib/vhost-user-blk/vhost-user-blk.c
20
index XXXXXXX..XXXXXXX 100755
21
--- a/configure
22
+++ b/configure
23
@@ -XXX,XX +XXX,XX @@ Advanced options (experts only):
24
--oss-lib path to OSS library
25
--cpu=CPU Build for host CPU [$cpu]
26
--with-coroutine=BACKEND coroutine backend. Supported options:
27
- gthread, ucontext, sigaltstack, windows
28
+ ucontext, sigaltstack, windows
29
--enable-gcov enable test coverage analysis with gcov
30
--gcov=GCOV use specified gcov [$gcov_tool]
31
--disable-blobs disable installing provided firmware blobs
32
@@ -XXX,XX +XXX,XX @@ fi
33
# check and set a backend for coroutine
34
35
# We prefer ucontext, but it's not always possible. The fallback
36
-# is sigcontext. gthread is not selectable except explicitly, because
37
-# it is not functional enough to run QEMU proper. (It is occasionally
38
-# useful for debugging purposes.) On Windows the only valid backend
39
-# is the Windows-specific one.
40
+# is sigcontext. On Windows the only valid backend is the Windows
41
+# specific one.
42
43
ucontext_works=no
44
if test "$darwin" != "yes"; then
45
@@ -XXX,XX +XXX,XX @@ else
46
feature_not_found "ucontext"
47
fi
48
;;
49
- gthread|sigaltstack)
50
+ sigaltstack)
51
if test "$mingw32" = "yes"; then
52
error_exit "only the 'windows' coroutine backend is valid for Windows"
53
fi
54
@@ -XXX,XX +XXX,XX @@ else
55
fi
56
57
if test "$coroutine_pool" = ""; then
58
- if test "$coroutine" = "gthread"; then
59
- coroutine_pool=no
60
- else
61
- coroutine_pool=yes
62
- fi
63
-fi
64
-if test "$coroutine" = "gthread" -a "$coroutine_pool" = "yes"; then
65
- error_exit "'gthread' coroutine backend does not support pool (use --disable-coroutine-pool)"
66
+ coroutine_pool=yes
67
fi
68
69
if test "$debug_stack_usage" = "yes"; then
70
diff --git a/util/coroutine-gthread.c b/util/coroutine-gthread.c
71
deleted file mode 100644
72
index XXXXXXX..XXXXXXX
73
--- a/util/coroutine-gthread.c
74
+++ /dev/null
75
@@ -XXX,XX +XXX,XX @@
76
-/*
77
- * GThread coroutine initialization code
78
- *
79
- * Copyright (C) 2006 Anthony Liguori <anthony@codemonkey.ws>
80
- * Copyright (C) 2011 Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
81
- *
82
- * This library is free software; you can redistribute it and/or
83
- * modify it under the terms of the GNU Lesser General Public
84
- * License as published by the Free Software Foundation; either
85
- * version 2.0 of the License, or (at your option) any later version.
86
- *
87
- * This library is distributed in the hope that it will be useful,
88
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
89
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
90
- * Lesser General Public License for more details.
91
- *
92
- * You should have received a copy of the GNU Lesser General Public
93
- * License along with this library; if not, see <http://www.gnu.org/licenses/>.
94
- */
95
-
96
-#include "qemu/osdep.h"
97
-#include "qemu-common.h"
98
-#include "qemu/coroutine_int.h"
99
-
100
-typedef struct {
101
- Coroutine base;
102
- GThread *thread;
103
- bool runnable;
104
- bool free_on_thread_exit;
105
- CoroutineAction action;
106
-} CoroutineGThread;
107
-
108
-static CompatGMutex coroutine_lock;
109
-static CompatGCond coroutine_cond;
110
-
111
-/* GLib 2.31 and beyond deprecated various parts of the thread API,
112
- * but the new interfaces are not available in older GLib versions
113
- * so we have to cope with both.
114
- */
115
-#if GLIB_CHECK_VERSION(2, 31, 0)
116
-/* Awkwardly, the GPrivate API doesn't provide a way to update the
117
- * GDestroyNotify handler for the coroutine key dynamically. So instead
118
- * we track whether or not the CoroutineGThread should be freed on
119
- * thread exit / coroutine key update using the free_on_thread_exit
120
- * field.
121
- */
122
-static void coroutine_destroy_notify(gpointer data)
123
-{
124
- CoroutineGThread *co = data;
125
- if (co && co->free_on_thread_exit) {
126
- g_free(co);
127
- }
128
-}
129
-
130
-static GPrivate coroutine_key = G_PRIVATE_INIT(coroutine_destroy_notify);
131
-
132
-static inline CoroutineGThread *get_coroutine_key(void)
133
-{
134
- return g_private_get(&coroutine_key);
135
-}
136
-
137
-static inline void set_coroutine_key(CoroutineGThread *co,
138
- bool free_on_thread_exit)
139
-{
140
- /* Unlike g_static_private_set() this does not call the GDestroyNotify
141
- * if the previous value of the key was NULL. Fortunately we only need
142
- * the GDestroyNotify in the non-NULL key case.
143
- */
144
- co->free_on_thread_exit = free_on_thread_exit;
145
- g_private_replace(&coroutine_key, co);
146
-}
147
-
148
-static inline GThread *create_thread(GThreadFunc func, gpointer data)
149
-{
150
- return g_thread_new("coroutine", func, data);
151
-}
152
-
153
-#else
154
-
155
-/* Handle older GLib versions */
156
-
157
-static GStaticPrivate coroutine_key = G_STATIC_PRIVATE_INIT;
158
-
159
-static inline CoroutineGThread *get_coroutine_key(void)
160
-{
161
- return g_static_private_get(&coroutine_key);
162
-}
163
-
164
-static inline void set_coroutine_key(CoroutineGThread *co,
165
- bool free_on_thread_exit)
166
-{
167
- g_static_private_set(&coroutine_key, co,
168
- free_on_thread_exit ? (GDestroyNotify)g_free : NULL);
169
-}
170
-
171
-static inline GThread *create_thread(GThreadFunc func, gpointer data)
172
-{
173
- return g_thread_create_full(func, data, 0, TRUE, TRUE,
174
- G_THREAD_PRIORITY_NORMAL, NULL);
175
-}
176
-
177
-#endif
178
-
179
-
180
-static void __attribute__((constructor)) coroutine_init(void)
181
-{
182
-#if !GLIB_CHECK_VERSION(2, 31, 0)
183
- if (!g_thread_supported()) {
184
- g_thread_init(NULL);
185
- }
186
-#endif
187
-}
188
-
189
-static void coroutine_wait_runnable_locked(CoroutineGThread *co)
190
-{
191
- while (!co->runnable) {
192
- g_cond_wait(&coroutine_cond, &coroutine_lock);
193
- }
194
-}
195
-
196
-static void coroutine_wait_runnable(CoroutineGThread *co)
197
-{
198
- g_mutex_lock(&coroutine_lock);
199
- coroutine_wait_runnable_locked(co);
200
- g_mutex_unlock(&coroutine_lock);
201
-}
202
-
203
-static gpointer coroutine_thread(gpointer opaque)
204
-{
205
- CoroutineGThread *co = opaque;
206
-
207
- set_coroutine_key(co, false);
208
- coroutine_wait_runnable(co);
209
- co->base.entry(co->base.entry_arg);
210
- qemu_coroutine_switch(&co->base, co->base.caller, COROUTINE_TERMINATE);
211
- return NULL;
212
-}
213
-
214
-Coroutine *qemu_coroutine_new(void)
215
-{
216
- CoroutineGThread *co;
217
-
218
- co = g_malloc0(sizeof(*co));
219
- co->thread = create_thread(coroutine_thread, co);
220
- if (!co->thread) {
221
- g_free(co);
222
- return NULL;
223
- }
224
- return &co->base;
225
-}
226
-
227
-void qemu_coroutine_delete(Coroutine *co_)
228
-{
229
- CoroutineGThread *co = DO_UPCAST(CoroutineGThread, base, co_);
230
-
231
- g_thread_join(co->thread);
232
- g_free(co);
233
-}
234
-
235
-CoroutineAction qemu_coroutine_switch(Coroutine *from_,
236
- Coroutine *to_,
237
- CoroutineAction action)
238
-{
239
- CoroutineGThread *from = DO_UPCAST(CoroutineGThread, base, from_);
240
- CoroutineGThread *to = DO_UPCAST(CoroutineGThread, base, to_);
241
-
242
- g_mutex_lock(&coroutine_lock);
243
- from->runnable = false;
244
- from->action = action;
245
- to->runnable = true;
246
- to->action = action;
247
- g_cond_broadcast(&coroutine_cond);
248
-
249
- if (action != COROUTINE_TERMINATE) {
250
- coroutine_wait_runnable_locked(from);
251
- }
252
- g_mutex_unlock(&coroutine_lock);
253
- return from->action;
254
-}
255
-
256
-Coroutine *qemu_coroutine_self(void)
257
-{
258
- CoroutineGThread *co = get_coroutine_key();
259
- if (!co) {
260
- co = g_malloc0(sizeof(*co));
261
- co->runnable = true;
262
- set_coroutine_key(co, true);
263
- }
264
-
265
- return &co->base;
266
-}
267
-
268
-bool qemu_in_coroutine(void)
269
-{
270
- CoroutineGThread *co = get_coroutine_key();
271
-
272
- return co && co->base.caller;
273
-}
274
diff --git a/.travis.yml b/.travis.yml
275
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
276
--- a/.travis.yml
16
--- a/contrib/vhost-user-blk/vhost-user-blk.c
277
+++ b/.travis.yml
17
+++ b/contrib/vhost-user-blk/vhost-user-blk.c
278
@@ -XXX,XX +XXX,XX @@ matrix:
18
@@ -XXX,XX +XXX,XX @@ static GOptionEntry entries[] = {
279
- env: CONFIG="--enable-trace-backends=ust"
19
{"blk-file", 'b', 0, G_OPTION_ARG_FILENAME, &opt_blk_file,
280
TEST_CMD=""
20
"block device or file path", "PATH"},
281
compiler: gcc
21
{ "read-only", 'r', 0, G_OPTION_ARG_NONE, &opt_read_only,
282
- - env: CONFIG="--with-coroutine=gthread"
22
- "Enable read-only", NULL }
283
- TEST_CMD=""
23
+ "Enable read-only", NULL },
284
- compiler: gcc
24
+ { NULL, },
285
- env: CONFIG=""
25
};
286
os: osx
26
287
compiler: clang
27
int main(int argc, char **argv)
288
@@ -XXX,XX +XXX,XX @@ matrix:
289
compiler: none
290
env:
291
- COMPILER_NAME=gcc CXX=g++-5 CC=gcc-5
292
- - CONFIG="--cc=gcc-5 --cxx=g++-5 --disable-pie --disable-linux-user --with-coroutine=gthread"
293
+ - CONFIG="--cc=gcc-5 --cxx=g++-5 --disable-pie --disable-linux-user"
294
- TEST_CMD=""
295
before_script:
296
- ./configure ${CONFIG} --extra-cflags="-g3 -O0 -fsanitize=thread -fuse-ld=gold" || cat config.log
297
--
28
--
298
2.9.3
29
2.35.1
299
300
diff view generated by jsdifflib
1
From: Eric Blake <eblake@redhat.com>
1
From: Liu Yiding <liuyd.fnst@fujitsu.com>
2
2
3
Since we are already in coroutine context during the body of
3
virtiofsd has introduced killpriv_v2/no_killpriv_v2 for a while. Add
4
bdrv_co_get_block_status(), we can shave off a few layers of
4
description of it to docs/helper.
5
wrappers when recursing to query the protocol when a format driver
6
returned BDRV_BLOCK_RAW.
7
5
8
Note that we are already using the correct recursion later on in
6
Signed-off-by: Liu Yiding <liuyd.fnst@fujitsu.com>
9
the same function, when probing whether the protocol layer is sparse
7
Message-Id: <20220421095151.2231099-1-liuyd.fnst@fujitsu.com>
10
in order to find out if we can add BDRV_BLOCK_ZERO to an existing
11
BDRV_BLOCK_DATA|BDRV_BLOCK_OFFSET_VALID.
12
8
13
Signed-off-by: Eric Blake <eblake@redhat.com>
9
[Small documentation fixes: s/as client supports/as the client supports/
14
Reviewed-by: Max Reitz <mreitz@redhat.com>
10
and s/. /. /.
15
Reviewed-by: Fam Zheng <famz@redhat.com>
11
--Stefan]
16
Message-id: 20170504173745.27414-1-eblake@redhat.com
12
17
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
13
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
18
---
14
---
19
block/io.c | 4 ++--
15
docs/tools/virtiofsd.rst | 5 +++++
20
1 file changed, 2 insertions(+), 2 deletions(-)
16
tools/virtiofsd/helper.c | 3 +++
17
2 files changed, 8 insertions(+)
21
18
22
diff --git a/block/io.c b/block/io.c
19
diff --git a/docs/tools/virtiofsd.rst b/docs/tools/virtiofsd.rst
23
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
24
--- a/block/io.c
21
--- a/docs/tools/virtiofsd.rst
25
+++ b/block/io.c
22
+++ b/docs/tools/virtiofsd.rst
26
@@ -XXX,XX +XXX,XX @@ static int64_t coroutine_fn bdrv_co_get_block_status(BlockDriverState *bs,
23
@@ -XXX,XX +XXX,XX @@ Options
27
24
label. Server will try to set that label on newly created file
28
if (ret & BDRV_BLOCK_RAW) {
25
atomically wherever possible.
29
assert(ret & BDRV_BLOCK_OFFSET_VALID);
26
30
- ret = bdrv_get_block_status(*file, ret >> BDRV_SECTOR_BITS,
27
+ * killpriv_v2|no_killpriv_v2 -
31
- *pnum, pnum, file);
28
+ Enable/disable ``FUSE_HANDLE_KILLPRIV_V2`` support. KILLPRIV_V2 is enabled
32
+ ret = bdrv_co_get_block_status(*file, ret >> BDRV_SECTOR_BITS,
29
+ by default as long as the client supports it. Enabling this option helps
33
+ *pnum, pnum, file);
30
+ with performance in write path.
34
goto out;
31
+
35
}
32
.. option:: --socket-path=PATH
33
34
Listen on vhost-user UNIX domain socket at PATH.
35
diff --git a/tools/virtiofsd/helper.c b/tools/virtiofsd/helper.c
36
index XXXXXXX..XXXXXXX 100644
37
--- a/tools/virtiofsd/helper.c
38
+++ b/tools/virtiofsd/helper.c
39
@@ -XXX,XX +XXX,XX @@ void fuse_cmdline_help(void)
40
" -o announce_submounts Announce sub-mount points to the guest\n"
41
" -o posix_acl/no_posix_acl Enable/Disable posix_acl. (default: disabled)\n"
42
" -o security_label/no_security_label Enable/Disable security label. (default: disabled)\n"
43
+ " -o killpriv_v2/no_killpriv_v2\n"
44
+ " Enable/Disable FUSE_HANDLE_KILLPRIV_V2.\n"
45
+ " (default: enabled as long as client supports it)\n"
46
);
47
}
36
48
37
--
49
--
38
2.9.3
50
2.35.1
39
40
diff view generated by jsdifflib