diff --git a/utils/uvol/files/autopart.defaults b/utils/uvol/files/autopart.defaults index c35b238adc..b6a3cdd603 100644 --- a/utils/uvol/files/autopart.defaults +++ b/utils/uvol/files/autopart.defaults @@ -2,9 +2,29 @@ . /lib/functions.sh . /lib/upgrade/common.sh +. /usr/share/libubox/jshn.sh OWRT_VOLUMES=owrt-volumes + +get_partition_by_name_gpt() { + local dev="$1" + local part parts node name + json_load "$(sfdisk -J "/dev/$dev" 2>/dev/null)" + json_select "partitiontable" || return + json_select "partitions" || return + json_get_keys parts + for part in $parts; do + json_select "$part" + json_get_vars node name + if [ "$2" = "$name" ]; then + echo "$node" + break + fi + json_select .. + done +} + part_fixup() { echo "write" | sfdisk --force -q -w never $1 } @@ -57,20 +77,22 @@ lvm_init() { autopart_init() { local diskdev local lvmpart - local diskserial + local diskserial diskhash export_bootdevice && export_partdevice diskdev 0 [ "$diskdev" ] || return - [ -e "/sys/class/block/$diskdev/device/serial" ] && diskserial=$(cat /sys/class/block/$diskdev/device/serial) - + [ -e "/sys/class/block/$diskdev/device/serial" ] && diskserial="$(cat /sys/class/block/$diskdev/device/serial)" + [ -e "/sys/class/block/$diskdev/device/cid" ] && diskserial="$diskserial$(cat /sys/class/block/$diskdev/device/cid)" + [ "$diskserial" ] || diskserial="$(cat /proc/sys/kernel/random/uuid)" + diskhash="$(echo $diskserial | sha256sum | cut -d' ' -f1)" part_fixup /dev/$diskdev create_lvm_part /dev/$diskdev || return - lvmpart=$(get_partition_by_name $diskdev $OWRT_VOLUMES) + lvmpart=$(get_partition_by_name_gpt $diskdev $OWRT_VOLUMES) [ "$lvmpart" ] || return - lvm_init /dev/$lvmpart "${OWRT_VOLUMES}${diskserial:+-${diskserial:2}}" + lvm_init $lvmpart "${OWRT_VOLUMES}-${diskhash:0:16}" } autopart_init diff --git a/utils/uvol/files/lvm.sh b/utils/uvol/files/lvm.sh index 4a20f628d1..c250be534b 100644 --- a/utils/uvol/files/lvm.sh +++ b/utils/uvol/files/lvm.sh @@ -231,7 +231,9 @@ createvol() { [ "$lv_full_name" ] || return 22 lvm_cmd lvchange -a y "$lv_full_name" || return 1 if [ $lv_size -gt $(( 100 * 1024 * 1024 )) ]; then - mkfs.f2fs -f -l "$1" "$lv_path" || return 1 + mkfs.f2fs -f -l "$1" "$lv_path" + ret=$? + [ $ret != 0 ] && [ $ret != 134 ] && return 1 else mke2fs -F -L "$1" "$lv_path" || return 1 fi @@ -271,7 +273,7 @@ listvols() { local reports rep lv lvs lv_name lv_size lv_mode volname volname=${1:-.*} json_init - json_load "$(lvs -o lv_name,lv_size -S "lv_name=~^[rw][ow]_$volname\$ && vg_name=$vg_name")" + json_load "$(lvs -o lv_name,lv_size -S "lv_name=~^[rw][owp]_$volname\$ && vg_name=$vg_name")" json_select report json_get_keys reports for rep in $reports; do