qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Emanuele Giuseppe Esposito <eesposit@redhat.com>
To: qemu-block@nongnu.org
Cc: "Kevin Wolf" <kwolf@redhat.com>, "Fam Zheng" <fam@euphon.net>,
	"Vladimir Sementsov-Ogievskiy" <vsementsov@virtuozzo.com>,
	"Daniel P. Berrangé" <berrange@redhat.com>,
	"Juan Quintela" <quintela@redhat.com>,
	qemu-devel@nongnu.org, "John Snow" <jsnow@redhat.com>,
	"Emanuele Giuseppe Esposito" <eesposit@redhat.com>,
	"Richard Henderson" <richard.henderson@linaro.org>,
	"Markus Armbruster" <armbru@redhat.com>,
	"Dr. David Alan Gilbert" <dgilbert@redhat.com>,
	"Eduardo Habkost" <eduardo@habkost.net>,
	"Hanna Reitz" <hreitz@redhat.com>,
	"Stefan Hajnoczi" <stefanha@redhat.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Eric Blake" <eblake@redhat.com>
Subject: [PATCH v8 06/31] block/export/fuse.c: allow writable exports to take RESIZE permission
Date: Thu,  3 Mar 2022 10:15:51 -0500	[thread overview]
Message-ID: <20220303151616.325444-7-eesposit@redhat.com> (raw)
In-Reply-To: <20220303151616.325444-1-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>
---
 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.31.1



  parent reply	other threads:[~2022-03-03 15:34 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-03 15:15 [PATCH v8 00/31] block layer: split block APIs in global state and I/O Emanuele Giuseppe Esposito
2022-03-03 15:15 ` [PATCH v8 01/31] main-loop.h: introduce qemu_in_main_thread() Emanuele Giuseppe Esposito
2022-03-03 15:15 ` [PATCH v8 02/31] main loop: macros to mark GS and I/O functions Emanuele Giuseppe Esposito
2022-03-03 15:15 ` [PATCH v8 03/31] include/block/block: split header into I/O and global state API Emanuele Giuseppe Esposito
2022-03-03 15:15 ` [PATCH v8 04/31] assertions for block " Emanuele Giuseppe Esposito
2022-03-03 15:15 ` [PATCH v8 05/31] IO_CODE and IO_OR_GS_CODE for block I/O API Emanuele Giuseppe Esposito
2022-03-03 15:15 ` Emanuele Giuseppe Esposito [this message]
2022-03-03 15:15 ` [PATCH v8 07/31] include/sysemu/block-backend: split header into I/O and global state (GS) API Emanuele Giuseppe Esposito
2022-03-03 15:15 ` [PATCH v8 08/31] block/block-backend.c: assertions for block-backend Emanuele Giuseppe Esposito
2022-03-03 15:15 ` [PATCH v8 09/31] IO_CODE and IO_OR_GS_CODE for block-backend I/O API Emanuele Giuseppe Esposito
2022-03-03 15:15 ` [PATCH v8 10/31] block.c: assertions to the block layer permissions API Emanuele Giuseppe Esposito
2022-03-03 15:15 ` [PATCH v8 11/31] include/block/block_int: split header into I/O and global state API Emanuele Giuseppe Esposito
2022-03-03 15:15 ` [PATCH v8 12/31] assertions for block_int " Emanuele Giuseppe Esposito
2022-03-03 15:15 ` [PATCH v8 13/31] IO_CODE and IO_OR_GS_CODE for block_int I/O API Emanuele Giuseppe Esposito
2022-03-03 15:15 ` [PATCH v8 14/31] block: introduce assert_bdrv_graph_writable Emanuele Giuseppe Esposito
2022-03-03 15:16 ` [PATCH v8 15/31] include/block/blockjob_int.h: split header into I/O and GS API Emanuele Giuseppe Esposito
2022-03-03 15:16 ` [PATCH v8 16/31] GS and IO CODE macros for blockjob_int.h Emanuele Giuseppe Esposito
2022-03-03 15:16 ` [PATCH v8 17/31] block.c: add assertions to static functions Emanuele Giuseppe Esposito
2022-03-03 15:16 ` [PATCH v8 18/31] include/block/blockjob.h: global state API Emanuele Giuseppe Esposito
2022-03-03 15:16 ` [PATCH v8 19/31] assertions for blockjob.h " Emanuele Giuseppe Esposito
2022-03-03 15:16 ` [PATCH v8 20/31] include/sysemu/blockdev.h: " Emanuele Giuseppe Esposito
2022-03-03 15:16 ` [PATCH v8 21/31] assertions for blockdev.h " Emanuele Giuseppe Esposito
2022-03-03 15:16 ` [PATCH v8 22/31] include/block/snapshot: global state API + assertions Emanuele Giuseppe Esposito
2022-03-03 15:16 ` [PATCH v8 23/31] block/copy-before-write.h: " Emanuele Giuseppe Esposito
2022-03-03 15:16 ` [PATCH v8 24/31] block/coroutines: I/O and "I/O or GS" API Emanuele Giuseppe Esposito
2022-03-03 15:16 ` [PATCH v8 25/31] block_int-common.h: split function pointers in BlockDriver Emanuele Giuseppe Esposito
2022-03-03 15:16 ` [PATCH v8 26/31] block_int-common.h: assertions in the callers of BlockDriver function pointers Emanuele Giuseppe Esposito
2022-03-03 15:16 ` [PATCH v8 27/31] block_int-common.h: split function pointers in BdrvChildClass Emanuele Giuseppe Esposito
2022-03-03 15:16 ` [PATCH v8 28/31] block_int-common.h: assertions in the callers of BdrvChildClass function pointers Emanuele Giuseppe Esposito
2022-03-03 15:16 ` [PATCH v8 29/31] block-backend-common.h: split function pointers in BlockDevOps Emanuele Giuseppe Esposito
2022-03-03 15:16 ` [PATCH v8 30/31] job.h: split function pointers in JobDriver Emanuele Giuseppe Esposito
2022-03-03 15:16 ` [PATCH v8 31/31] job.h: assertions in the callers of JobDriver function pointers Emanuele Giuseppe Esposito
2022-03-04 10:51 ` [PATCH v8 00/31] block layer: split block APIs in global state and I/O Kevin Wolf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220303151616.325444-7-eesposit@redhat.com \
    --to=eesposit@redhat.com \
    --cc=armbru@redhat.com \
    --cc=berrange@redhat.com \
    --cc=dgilbert@redhat.com \
    --cc=eblake@redhat.com \
    --cc=eduardo@habkost.net \
    --cc=fam@euphon.net \
    --cc=hreitz@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=richard.henderson@linaro.org \
    --cc=stefanha@redhat.com \
    --cc=vsementsov@virtuozzo.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).