From f9031db67dc6a64cd1f0190144550a393ca3bcc6 Mon Sep 17 00:00:00 2001 From: msuhanov Date: Sat, 30 Jan 2016 23:51:33 +0300 Subject: [PATCH] Improve the handling of block devices with '/' in their names. --- userspace/initramfs/01wrtblk_all | 2 +- userspace/tools/wrtblk | 2 ++ userspace/tools/wrtblk-disable | 2 ++ userspace/tools/wrtblk-ioerr | 2 ++ 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/userspace/initramfs/01wrtblk_all b/userspace/initramfs/01wrtblk_all index b7d8a38..7f5db32 100755 --- a/userspace/initramfs/01wrtblk_all +++ b/userspace/initramfs/01wrtblk_all @@ -1,7 +1,7 @@ #!/bin/sh # Mark all available block devices as read-only (except loop devices) -for device in /dev/*; do +for device in /dev/* /dev/*/*; do if [ ! -h "$device" ] && [ -b "$device" ] && [ ! -z ${device##/dev/loop*} ]; then # Check if medium is present if blockdev --getsz "$device" > /dev/null 2>&1; then diff --git a/userspace/tools/wrtblk b/userspace/tools/wrtblk index 7bf386c..918f0c0 100755 --- a/userspace/tools/wrtblk +++ b/userspace/tools/wrtblk @@ -9,9 +9,11 @@ bdev="$1" blockdev --setro "/dev/$bdev" || logger "wrtblk: blockdev --setro /dev/$bdev failed!" # Mark a parent block device as read-only +bdev=$(echo "$bdev" | sed 's/\//!/g') syspath=$(echo /sys/block/*/"$bdev") [ "$syspath" = "/sys/block/*/$bdev" ] && exit dir=${syspath%/*} parent=${dir##*/} +parent=$(echo "$parent" | sed 's/!/\//g') [ -b "/dev/$parent" ] || exit blockdev --setro "/dev/$parent" || logger "wrtblk: blockdev --setro /dev/$parent failed!" diff --git a/userspace/tools/wrtblk-disable b/userspace/tools/wrtblk-disable index aa97009..18fc5cb 100755 --- a/userspace/tools/wrtblk-disable +++ b/userspace/tools/wrtblk-disable @@ -9,9 +9,11 @@ bdev="$1" blockdev --setrw "/dev/$bdev" || logger "wrtblk: blockdev --setrw /dev/$bdev failed!" # Mark a parent block device as read-write +bdev=$(echo "$bdev" | sed 's/\//!/g') syspath=$(echo /sys/block/*/"$bdev") [ "$syspath" = "/sys/block/*/$bdev" ] && exit dir=${syspath%/*} parent=${dir##*/} +parent=$(echo "$parent" | sed 's/!/\//g') [ -b "/dev/$parent" ] || exit blockdev --setrw "/dev/$parent" || logger "wrtblk: blockdev --setrw /dev/$parent failed!" diff --git a/userspace/tools/wrtblk-ioerr b/userspace/tools/wrtblk-ioerr index 4fa3d6c..a85bbba 100755 --- a/userspace/tools/wrtblk-ioerr +++ b/userspace/tools/wrtblk-ioerr @@ -9,10 +9,12 @@ bdev="$1" blockdev --setro "/dev/$bdev" || logger "wrtblk: blockdev --setro /dev/$bdev failed!" # Mark all child block devices as read-only +bdev=$(echo "$bdev" | sed 's/\//!/g') for child in /sys/block/"$bdev"/*/dev; do dir=${child%/*} partition=${dir##*/} [ "$partition" = '*' ] && break + partition=$(echo "$partition" | sed 's/!/\//g') [ -b "/dev/$partition" ] || continue blockdev --setro "/dev/$partition" || logger "wrtblk: blockdev --setro /dev/$partition failed!" done