[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 19/50] block/export/fuse.c: allow writable exports to take RESIZE
From: |
Kevin Wolf |
Subject: |
[PULL 19/50] block/export/fuse.c: allow writable exports to take RESIZE permission |
Date: |
Fri, 4 Mar 2022 17:46:40 +0100 |
From: Emanuele Giuseppe Esposito <eesposit@redhat.com>
Allow writable exports to get BLK_PERM_RESIZE permission
from creation, in fuse_export_create().
In this way, there is no need to give the permission in
fuse_do_truncate(), which might be run in an iothread.
Permissions should be set only in the main thread, so
in any case if an iothread tries to set RESIZE, it will
be blocked.
Also assert in fuse_do_truncate that if we give the
RESIZE permission we can then restore the original ones.
Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
Reviewed-by: Hanna Reitz <hreitz@redhat.com>
Message-Id: <20220303151616.325444-7-eesposit@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
block/export/fuse.c | 25 ++++++++++++++++++-------
1 file changed, 18 insertions(+), 7 deletions(-)
diff --git a/block/export/fuse.c b/block/export/fuse.c
index fdda8e3c81..5029e70f84 100644
--- a/block/export/fuse.c
+++ b/block/export/fuse.c
@@ -86,8 +86,8 @@ static int fuse_export_create(BlockExport *blk_exp,
assert(blk_exp_args->type == BLOCK_EXPORT_TYPE_FUSE);
- /* For growable exports, take the RESIZE permission */
- if (args->growable) {
+ /* For growable and writable exports, take the RESIZE permission */
+ if (args->growable || blk_exp_args->writable) {
uint64_t blk_perm, blk_shared_perm;
blk_get_perm(exp->common.blk, &blk_perm, &blk_shared_perm);
@@ -392,14 +392,23 @@ static int fuse_do_truncate(const FuseExport *exp,
int64_t size,
{
uint64_t blk_perm, blk_shared_perm;
BdrvRequestFlags truncate_flags = 0;
- int ret;
+ bool add_resize_perm;
+ int ret, ret_check;
+
+ /* Growable and writable exports have a permanent RESIZE permission */
+ add_resize_perm = !exp->growable && !exp->writable;
if (req_zero_write) {
truncate_flags |= BDRV_REQ_ZERO_WRITE;
}
- /* Growable exports have a permanent RESIZE permission */
- if (!exp->growable) {
+ if (add_resize_perm) {
+
+ if (!qemu_in_main_thread()) {
+ /* Changing permissions like below only works in the main thread */
+ return -EPERM;
+ }
+
blk_get_perm(exp->common.blk, &blk_perm, &blk_shared_perm);
ret = blk_set_perm(exp->common.blk, blk_perm | BLK_PERM_RESIZE,
@@ -412,9 +421,11 @@ static int fuse_do_truncate(const FuseExport *exp, int64_t
size,
ret = blk_truncate(exp->common.blk, size, true, prealloc,
truncate_flags, NULL);
- if (!exp->growable) {
+ if (add_resize_perm) {
/* Must succeed, because we are only giving up the RESIZE permission */
- blk_set_perm(exp->common.blk, blk_perm, blk_shared_perm, &error_abort);
+ ret_check = blk_set_perm(exp->common.blk, blk_perm,
+ blk_shared_perm, &error_abort);
+ assert(ret_check == 0);
}
return ret;
--
2.35.1
- [PULL 20/50] include/sysemu/block-backend: split header into I/O and global state (GS) API, (continued)
- [PULL 20/50] include/sysemu/block-backend: split header into I/O and global state (GS) API, Kevin Wolf, 2022/03/04
- [PULL 16/50] include/block/block: split header into I/O and global state API, Kevin Wolf, 2022/03/04
- [PULL 29/50] GS and IO CODE macros for blockjob_int.h, Kevin Wolf, 2022/03/04
- [PULL 27/50] block: introduce assert_bdrv_graph_writable, Kevin Wolf, 2022/03/04
- [PULL 26/50] IO_CODE and IO_OR_GS_CODE for block_int I/O API, Kevin Wolf, 2022/03/04
- [PULL 31/50] include/block/blockjob.h: global state API, Kevin Wolf, 2022/03/04
- [PULL 32/50] assertions for blockjob.h global state API, Kevin Wolf, 2022/03/04
- [PULL 33/50] include/sysemu/blockdev.h: global state API, Kevin Wolf, 2022/03/04
- [PULL 03/50] block: introduce bdrv_activate, Kevin Wolf, 2022/03/04
- [PULL 23/50] block.c: assertions to the block layer permissions API, Kevin Wolf, 2022/03/04
- [PULL 19/50] block/export/fuse.c: allow writable exports to take RESIZE permission,
Kevin Wolf <=
- [PULL 25/50] assertions for block_int global state API, Kevin Wolf, 2022/03/04
- [PULL 17/50] assertions for block global state API, Kevin Wolf, 2022/03/04
- [PULL 02/50] crypto: distinguish between main loop and I/O in block_crypto_amend_options_generic_luks, Kevin Wolf, 2022/03/04
- [PULL 22/50] IO_CODE and IO_OR_GS_CODE for block-backend I/O API, Kevin Wolf, 2022/03/04
- [PULL 24/50] include/block/block_int: split header into I/O and global state API, Kevin Wolf, 2022/03/04
- [PULL 28/50] include/block/blockjob_int.h: split header into I/O and GS API, Kevin Wolf, 2022/03/04
- [PULL 30/50] block.c: add assertions to static functions, Kevin Wolf, 2022/03/04
- [PULL 36/50] block/copy-before-write.h: global state API + assertions, Kevin Wolf, 2022/03/04
- [PULL 34/50] assertions for blockdev.h global state API, Kevin Wolf, 2022/03/04
- [PULL 35/50] include/block/snapshot: global state API + assertions, Kevin Wolf, 2022/03/04