From: Eva Kurchatova <eva.kurchatova@virtuozzo.com>
To: khorenko@virtuozzo.com
Cc: devel@openvz.org
Subject: [Devel] [PATCH hci-8.1 v2 1/1] block: let container root set the block size of and flush its device
Date: Thu, 22 Oct 2026 05:25:20 +0300 [thread overview]
Message-ID: <20261022022554.2427456-2-eva.kurchatova@virtuozzo.com> (raw)
In-Reply-To: <20261022022554.2427456-1-eva.kurchatova@virtuozzo.com>
BLKBSZSET and BLKFLSBUF check CAP_SYS_ADMIN in the initial user
namespace, so root in a container cannot set the block size of a block
device it has been given, nor flush its buffers, and mkfs.xfs on a loop
device there stops with "cannot set blocksize 512 on block device
/dev/loopN: Permission denied", or with "Flushing the data device
failed, err=13" once it gets past the first.
Check the capability relative to the container, as the other block
code adapted for containers does, and let container root through only
where its device cgroup grants write access to the device: a device
handed to a container read-only may be held by a filesystem outside
it, and neither its cache nor its block size should be touched from
inside. Device with mounted filesystem denies flush from a container
with EBUSY, as block size change does, and a container syncs its own
mounts through filesystem.
https://virtuozzo.atlassian.net/browse/VSTOR-137668
Feature: ve: allow various syscalls in CT root userns
Signed-off-by: Eva Kurchatova <eva.kurchatova@virtuozzo.com>
---
block/ioctl.c | 27 ++++++++++++++++++++++-----
1 file changed, 22 insertions(+), 5 deletions(-)
diff --git a/block/ioctl.c b/block/ioctl.c
index a3c53b04e1e3..def89aa19904 100644
--- a/block/ioctl.c
+++ b/block/ioctl.c
@@ -9,6 +9,7 @@
#include <linux/backing-dev.h>
#include <linux/fs.h>
#include <linux/blktrace_api.h>
+#include <linux/ve.h>
#include <linux/pr.h>
#include <linux/uaccess.h>
#include <linux/pagemap.h>
@@ -416,16 +417,31 @@ static int blkdev_pr_clear(struct block_device *bdev, blk_mode_t mode,
return ops->pr_clear(bdev, c.key);
}
+/* Container root may administer only a device its device cgroup lets it write */
+static bool blkdev_admin_capable(struct block_device *bdev)
+{
+ if (!ve_capable(CAP_SYS_ADMIN))
+ return false;
+
+ return ve_is_super(get_exec_env()) ||
+ !bdev_permission(bdev->bd_dev, BLK_OPEN_WRITE, NULL);
+}
+
static int blkdev_flushbuf(struct block_device *bdev, unsigned cmd,
unsigned long arg)
{
- if (!capable(CAP_SYS_ADMIN))
+ if (!blkdev_admin_capable(bdev))
return -EACCES;
mutex_lock(&bdev->bd_holder_lock);
- if (bdev->bd_holder_ops && bdev->bd_holder_ops->sync)
+ if (bdev->bd_holder_ops && bdev->bd_holder_ops->sync) {
+ /* A filesystem on the device is synced by its own mount, not from a container */
+ if (!ve_is_super(get_exec_env())) {
+ mutex_unlock(&bdev->bd_holder_lock);
+ return -EBUSY;
+ }
bdev->bd_holder_ops->sync(bdev);
- else {
+ } else {
mutex_unlock(&bdev->bd_holder_lock);
sync_blockdev(bdev);
}
@@ -527,11 +543,12 @@ static int blkdev_bszset(struct file *file, blk_mode_t mode,
{
// this one might be file_inode(file)->i_rdev - a rare valid
// use of file_inode() for those.
- dev_t dev = I_BDEV(file->f_mapping->host)->bd_dev;
+ struct block_device *bdev = I_BDEV(file->f_mapping->host);
+ dev_t dev = bdev->bd_dev;
struct file *excl_file;
int ret, n;
- if (!capable(CAP_SYS_ADMIN))
+ if (!blkdev_admin_capable(bdev))
return -EACCES;
if (!argp)
return -EINVAL;
--
2.56.0
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel
next prev parent reply other threads:[~2026-10-22 2:27 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-22 2:25 [Devel] [PATCH hci-8.1 v2 0/1] " Eva Kurchatova
2026-10-22 2:25 ` Eva Kurchatova [this message]
2026-10-22 2:29 ` [Devel] [PATCH hci-8.1 v2 1/1] " no-reply
2026-10-23 10:52 ` Pavel Tikhomirov
2026-10-29 15:49 ` Konstantin Khorenko
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=20261022022554.2427456-2-eva.kurchatova@virtuozzo.com \
--to=eva.kurchatova@virtuozzo.com \
--cc=devel@openvz.org \
--cc=khorenko@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.