-major=$((0x$(stat -L -c '%t' "$realdev"))) || exit $?
-minor=$((0x$(stat -L -c '%T' "$realdev"))) || exit $?
-disk_size=$(($(<"/sys/dev/block/$major:$minor/size")*512))
-# When the target is a partition device, get basename of its holder device to
-# access sysfs path of the holder device
-if [[ -r "/sys/dev/block/$major:$minor/partition" ]]; then
- realsysfs=$(readlink "/sys/dev/block/$major:$minor")
- basename=$(basename "${realsysfs%/*}")
-fi
-logical_block_size=$(<"/sys/block/$basename/queue/logical_block_size")
-case "$(<"/sys/class/block/$basename/queue/zoned")" in
- host-managed|host-aware)
+
+if [[ -b "$realdev" ]]; then
+ major=$((0x$(stat -L -c '%t' "$realdev"))) || exit $?
+ minor=$((0x$(stat -L -c '%T' "$realdev"))) || exit $?
+ disk_size=$(($(<"/sys/dev/block/$major:$minor/size")*512))
+
+ # When the target is a partition device, get basename of its
+ # holder device to access sysfs path of the holder device
+ if [[ -r "/sys/dev/block/$major:$minor/partition" ]]; then
+ realsysfs=$(readlink "/sys/dev/block/$major:$minor")
+ basename=$(basename "${realsysfs%/*}")
+ fi
+ logical_block_size=$(<"/sys/block/$basename/queue/logical_block_size")
+ case "$(<"/sys/class/block/$basename/queue/zoned")" in
+ host-managed|host-aware)
+ is_zbd=true
+ if ! result=($(first_sequential_zone "$dev")); then
+ echo "Failed to determine first sequential zone"
+ exit 1
+ fi
+ first_sequential_zone_sector=${result[0]}
+ sectors_per_zone=${result[1]}
+ zone_size=$((sectors_per_zone * 512))
+ if ! max_open_zones=$(max_open_zones "$dev"); then
+ echo "Failed to determine maximum number of open zones"
+ exit 1
+ fi
+ set_io_scheduler "$basename" deadline || exit $?
+ if [ -n "$reset_all_zones" ]; then
+ reset_zone "$dev" -1
+ fi
+ ;;
+ *)
+ first_sequential_zone_sector=$(((disk_size / 2) &
+ (logical_block_size - 1)))
+ zone_size=$(max 65536 "$logical_block_size")
+ sectors_per_zone=$((zone_size / 512))
+ max_open_zones=128
+ set_io_scheduler "$basename" none || exit $?
+ ;;
+ esac
+elif [[ -c "$realdev" ]]; then
+ # For an SG node, we must have libzbc option specified
+ if [[ ! -n "$use_libzbc" ]]; then
+ echo "Character device files can only be used with -l (libzbc) option"
+ exit 1
+ fi
+
+ if ! $(is_zbc "$dev"); then
+ echo "Device is not a ZBC disk"
+ exit 1
+ fi