blkdev: cgroup whitelist permission fix
PATCH 1/1 blkdev: cgroup whitelist permission fix
The cgroup device whitelist code gets confused when trying to grant permission to a disk partition that is not currently open. Part of blkdev_open() includes __blkdev_get() on the whole disk. This simply avoids the cgroup check for the whole disk case when opening a partition. This bug describes the details.
https://bugzilla.redhat.com/show_bug.cgi?id=589662
Basically, the only ways to reliably allow a cgroup access to a partition on a block device when using the whitelist are to 1) also give it access to the whole block device or 2) make sure the partition is already open in a different context.
Seems valid for 2.6.35 and -stable to me, as it's currently broken and causes libvirt's container support to fail.
--- fs/block_dev.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-)
fs/block_dev.c +6 -4
@@ -1315,10 +1315,12 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)/* * hooks: /n/, see "layering violations". */ - ret =devcgroup_inode_permission (bdev->bd_inode, perm); -if (ret !=0 ) { -bdput (bdev); -return ret; +if (!for_part) { + ret =devcgroup_inode_permission (bdev->bd_inode, perm); +if (ret !=0 ) { +bdput (bdev); +return ret; + } }lock_kernel ();