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`