From af2e57713dc686cf6d25bd993f7f4cc9be167a5d Mon Sep 17 00:00:00 2001 From: Julian Schindel Date: Tue, 7 Jul 2026 12:08:58 +0200 Subject: [PATCH] vmm: add resize permission to qemu-compatible locking Also lock the resize permission lock for read-write opened disks. Cloud-hypervisor can resize disks, so we should lock the byte. On-behalf-of: SAP julian.schindel@sap.com Signed-off-by: Julian Schindel --- block/src/fcntl.rs | 22 ++++++++++++++++++++++ docs/disk_locking.md | 3 ++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/block/src/fcntl.rs b/block/src/fcntl.rs index f5cb626c00..7c35cf9326 100644 --- a/block/src/fcntl.rs +++ b/block/src/fcntl.rs @@ -114,6 +114,8 @@ const QEMU_UNSHARE_LOCK_OFFSET: u64 = 200; const QEMU_READ_BYTE: u64 = 0; /// Write permission lock index for QEMU. const QEMU_WRITE_BYTE: u64 = 1; +/// Resize permission lock index for QEMU. +const QEMU_RESIZE_BYTE: u64 = 3; /// The granularity of the advisory lock. /// @@ -176,15 +178,23 @@ impl LockGranularity { .flock(libc::F_UNLCK, QEMU_LOCK_OFFSET + QEMU_READ_BYTE), LockGranularity::QemuCompatible .flock(libc::F_UNLCK, QEMU_LOCK_OFFSET + QEMU_WRITE_BYTE), + LockGranularity::QemuCompatible + .flock(libc::F_UNLCK, QEMU_LOCK_OFFSET + QEMU_RESIZE_BYTE), LockGranularity::QemuCompatible .flock(libc::F_UNLCK, QEMU_UNSHARE_LOCK_OFFSET + QEMU_READ_BYTE), LockGranularity::QemuCompatible .flock(libc::F_UNLCK, QEMU_UNSHARE_LOCK_OFFSET + QEMU_WRITE_BYTE), + LockGranularity::QemuCompatible + .flock(libc::F_UNLCK, QEMU_UNSHARE_LOCK_OFFSET + QEMU_RESIZE_BYTE), ], LockType::Write => vec![], LockType::Read => vec![ LockGranularity::QemuCompatible .flock(libc::F_UNLCK, QEMU_LOCK_OFFSET + QEMU_WRITE_BYTE), + LockGranularity::QemuCompatible + .flock(libc::F_UNLCK, QEMU_LOCK_OFFSET + QEMU_RESIZE_BYTE), + LockGranularity::QemuCompatible + .flock(libc::F_UNLCK, QEMU_UNSHARE_LOCK_OFFSET + QEMU_RESIZE_BYTE), ], }; @@ -213,18 +223,26 @@ impl LockGranularity { .flock(libc::F_UNLCK, QEMU_LOCK_OFFSET + QEMU_READ_BYTE), LockGranularity::QemuCompatible .flock(libc::F_UNLCK, QEMU_LOCK_OFFSET + QEMU_WRITE_BYTE), + LockGranularity::QemuCompatible + .flock(libc::F_UNLCK, QEMU_LOCK_OFFSET + QEMU_RESIZE_BYTE), LockGranularity::QemuCompatible .flock(libc::F_UNLCK, QEMU_UNSHARE_LOCK_OFFSET + QEMU_READ_BYTE), LockGranularity::QemuCompatible .flock(libc::F_UNLCK, QEMU_UNSHARE_LOCK_OFFSET + QEMU_WRITE_BYTE), + LockGranularity::QemuCompatible + .flock(libc::F_UNLCK, QEMU_UNSHARE_LOCK_OFFSET + QEMU_RESIZE_BYTE), ], LockType::Write => vec![ LockGranularity::QemuCompatible .flock(libc::F_RDLCK, QEMU_LOCK_OFFSET + QEMU_READ_BYTE), LockGranularity::QemuCompatible .flock(libc::F_RDLCK, QEMU_LOCK_OFFSET + QEMU_WRITE_BYTE), + LockGranularity::QemuCompatible + .flock(libc::F_RDLCK, QEMU_LOCK_OFFSET + QEMU_RESIZE_BYTE), LockGranularity::QemuCompatible .flock(libc::F_RDLCK, QEMU_UNSHARE_LOCK_OFFSET + QEMU_WRITE_BYTE), + LockGranularity::QemuCompatible + .flock(libc::F_RDLCK, QEMU_UNSHARE_LOCK_OFFSET + QEMU_RESIZE_BYTE), ], LockType::Read => vec![ LockGranularity::QemuCompatible @@ -303,8 +321,12 @@ impl LockGranularity { .flock(libc::F_WRLCK, QEMU_UNSHARE_LOCK_OFFSET + QEMU_READ_BYTE), LockGranularity::QemuCompatible .flock(libc::F_WRLCK, QEMU_UNSHARE_LOCK_OFFSET + QEMU_WRITE_BYTE), + LockGranularity::QemuCompatible + .flock(libc::F_WRLCK, QEMU_UNSHARE_LOCK_OFFSET + QEMU_RESIZE_BYTE), LockGranularity::QemuCompatible .flock(libc::F_WRLCK, QEMU_LOCK_OFFSET + QEMU_WRITE_BYTE), + LockGranularity::QemuCompatible + .flock(libc::F_WRLCK, QEMU_LOCK_OFFSET + QEMU_RESIZE_BYTE), ], LockType::Read => vec![ LockGranularity::QemuCompatible diff --git a/docs/disk_locking.md b/docs/disk_locking.md index e205031e3a..8231686fae 100644 --- a/docs/disk_locking.md +++ b/docs/disk_locking.md @@ -37,7 +37,8 @@ QEMU's file locking semantics. For read-only disks, this translates to QEMU's `BLK_PERM_CONSISTENT_READ` with `BLK_PERM_WRITE` unshared. For read-write disks, this translates to QEMU's `BLK_PERM_CONSISTENT_READ` -and `BLK_PERM_WRITE` with `BLK_PERM_WRITE` unshared. +`BLK_PERM_WRITE` and `BLK_PERM_RESIZE` with `BLK_PERM_WRITE` and +`BLK_PERM_RESIZE` unshared. ### `byte-range`