On 26.07.21 14:28, Stefan Hajnoczi wrote:
The following command-line fails due to a permissions conflict:

   $ qemu-storage-daemon \
       --blockdev driver=nvme,node-name=nvme0,device=0000:08:00.0,namespace=1 \
       --blockdev driver=raw,node-name=l1-1,file=nvme0,offset=0,size=1073741824 
\
       --blockdev 
driver=raw,node-name=l1-2,file=nvme0,offset=1073741824,size=1073741824 \
       --nbd-server addr.type=unix,addr.path=/tmp/nbd.sock,max-connections=2 \
       --export type=nbd,id=nbd-l1-1,node-name=l1-1,name=l1-1,writable=on \
       --export type=nbd,id=nbd-l1-2,node-name=l1-2,name=l1-2,writable=on

   qemu-storage-daemon: --export 
type=nbd,id=nbd-l1-1,node-name=l1-1,name=l1-1,writable=on: Permission conflict 
on node 'nvme0': permissions 'resize' are both required by node 'l1-1' (uses 
node 'nvme0' as 'file' child) and unshared by node 'l1-2' (uses node 'nvme0' as 
'file' child).

The problem is that block/raw-format.c relies on bdrv_default_perms() to
set permissions on the nvme node. The default permissions add RESIZE in
anticipation of a format driver like qcow2 that needs to grow the image
file. This fails because RESIZE is unshared, so we cannot get the RESIZE
permission.

Max Reitz pointed out that block/crypto.c already handles this case by
implementing a custom ->bdrv_child_perm() function that adjusts the
result of bdrv_default_perms().

This patch takes the same approach in block/raw-format.c so that RESIZE
is only required if it's actually necessary (e.g. the parent is qcow2).

Cc: Max Reitz <mre...@redhat.com>
Cc: Kevin Wolf <kw...@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefa...@redhat.com>
---
This is not a bug fix, so I didn't mark it for QEMU 6.1. It's new
behavior that hasn't been supported before. I want to split an NVMe
drive using the raw format's offset=/size= feature.
---
  block/raw-format.c | 21 ++++++++++++++++++++-
  1 file changed, 20 insertions(+), 1 deletion(-)

Thanks, applied to my block-next branch:

https://github.com/XanClic/qemu/commits/block-next

Hanna


Reply via email to