[OpenWrt-Devel] [PATCH v3 1/2] base-files: improve lib/upgrade/common.sh

Petr Štetiar ynezz at true.cz
Tue May 7 06:51:17 PDT 2019


Klaus Kudielka <klaus.kudielka at gmail.com> [2019-05-07 07:07:07]:

Hi,

as you seem passionate working on this improvements, I've changed status of
your v2 from Accepted to Superseded. FYI, patch 2/2 is having some issue to
reach the list and patchwork, maybe you need to resend it?

BTW it's a common practice to put the patch changelog after your commit
message, below the --- line, but above the diffstat, so it would be removed
during the merging process and won't be part of the final commit message, also
we don't put the newline between the tags, so it should probably be like this
(don't worry about this cosmetic change, it could be adjusted during merging,
so no need for v4 just because of this).

-- ynezz

> Fixes: 4e8345ff68 ("mvebu: base-files: autodetect upgrade device")
> Signed-off-by: Klaus Kudielka <klaus.kudielka at gmail.com>
> ---
> v2:
> 
>   Remove workarounds for the old, inconsistent behaviour from the following
>   targets: apm821xx, brcm2708, omap, sunxi.  The targets affected were easy
>   to spot with find & grep.
> 
> v3:
> 
>   Make export_bootdevice more generic. It now accepts
>   root=PARTUUID=<pseudo PARTUUID for MBR> (any partition) and
>   root=/dev/* (any partition).
>
>  .../base-files/files/lib/upgrade/common.sh    | 32 +++++++++++--------
>  .../apm821xx/base-files/lib/upgrade/wdbook.sh | 11 ++-----
>  .../base-files/lib/upgrade/platform.sh        | 11 ++-----
>  .../base-files/lib/preinit/79_move_config     |  2 +-
>  .../omap/base-files/lib/upgrade/platform.sh   |  7 ++--
>  .../base-files/lib/preinit/79_move_config     |  2 +-
>  .../sunxi/base-files/lib/upgrade/platform.sh  |  7 ++--
>  7 files changed, 33 insertions(+), 39 deletions(-)
> 
> diff --git a/package/base-files/files/lib/upgrade/common.sh b/package/base-files/files/lib/upgrade/common.sh
> index b3a29fb32..bbedeefd2 100644
> --- a/package/base-files/files/lib/upgrade/common.sh
> +++ b/package/base-files/files/lib/upgrade/common.sh
> @@ -101,35 +101,41 @@ get_magic_long() {
>  }
>  
>  export_bootdevice() {
> -	local cmdline uuid disk uevent line
> +	local cmdline bootdisk rootpart uuid blockdev uevent line
>  	local MAJOR MINOR DEVNAME DEVTYPE
>  
>  	if read cmdline < /proc/cmdline; then
>  		case "$cmdline" in
>  			*block2mtd=*)
> -				disk="${cmdline##*block2mtd=}"
> -				disk="${disk%%,*}"
> +				bootdisk="${cmdline##*block2mtd=}"
> +				bootdisk="${bootdisk%%,*}"
>  			;;
>  			*root=*)
> -				disk="${cmdline##*root=}"
> -				disk="${disk%% *}"
> +				rootpart="${cmdline##*root=}"
> +				rootpart="${rootpart%% *}"
>  			;;
>  		esac
>  
> -		case "$disk" in
> -			PARTUUID=[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]-02)
> -				uuid="${disk#PARTUUID=}"
> -				uuid="${uuid%-02}"
> -				for disk in $(find /dev -type b); do
> -					set -- $(dd if=$disk bs=1 skip=440 count=4 2>/dev/null | hexdump -v -e '4/1 "%02x "')
> +		case "$bootdisk" in
> +			/dev/*)
> +				uevent="/sys/class/block/${bootdisk##*/}/uevent"
> +			;;
> +		esac
> +
> +		case "$rootpart" in
> +			PARTUUID=[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]-[a-f0-9][a-f0-9])
> +				uuid="${rootpart#PARTUUID=}"
> +				uuid="${uuid%-[a-f0-9][a-f0-9]}"
> +				for blockdev in $(find /dev -type b); do
> +					set -- $(dd if=$blockdev bs=1 skip=440 count=4 2>/dev/null | hexdump -v -e '4/1 "%02x "')
>  					if [ "$4$3$2$1" = "$uuid" ]; then
> -						uevent="/sys/class/block/${disk##*/}/uevent"
> +						uevent="/sys/class/block/${blockdev##*/}/uevent"
>  						break
>  					fi
>  				done
>  			;;
>  			/dev/*)
> -				uevent="/sys/class/block/${disk##*/}/uevent"
> +				uevent="/sys/class/block/${rootpart##*/}/../uevent"
>  			;;
>  		esac
>  
> diff --git a/target/linux/apm821xx/base-files/lib/upgrade/wdbook.sh b/target/linux/apm821xx/base-files/lib/upgrade/wdbook.sh
> index 2287e0619..c19127114 100644
> --- a/target/linux/apm821xx/base-files/lib/upgrade/wdbook.sh
> +++ b/target/linux/apm821xx/base-files/lib/upgrade/wdbook.sh
> @@ -7,7 +7,7 @@ mbl_do_platform_check() {
>  
>  	[ "$#" -gt 1 ] && return 1
>  
> -	export_bootdevice && export_partdevice diskdev -2 || {
> +	export_bootdevice && export_partdevice diskdev 0 || {
>  		echo "Unable to determine upgrade device"
>  		return 1
>  	}
> @@ -36,7 +36,7 @@ mbl_do_platform_check() {
>  mbl_do_upgrade() {
>  	local diskdev partdev diff
>  
> -	export_bootdevice && export_partdevice diskdev -2 || {
> +	export_bootdevice && export_partdevice diskdev 0 || {
>  		echo "Unable to determine upgrade device"
>  		return 1
>  	}
> @@ -70,10 +70,6 @@ mbl_do_upgrade() {
>  
>  	#iterate over each partition from the image and write it to the boot disk
>  	while read part start size; do
> -		# root is /dev/sd[a|b]2 and not /dev/sd[a|b] this causes some problem
> -		# one of which is this offset, I'm not sure what's the best fix, so
> -		# here's a WA.
> -		let part=$((part - 2))
>  		if export_partdevice partdev $part; then
>  			echo "Writing image to /dev/$partdev..."
>  			get_image "$@" | dd of="/dev/$partdev" ibs="512" obs=1M skip="$start" count="$size" conv=fsync
> @@ -90,8 +86,7 @@ mbl_do_upgrade() {
>  mbl_copy_config() {
>  	local partdev
>  
> -	# Same as above /dev/sd[a|b]2 is root, so /boot is -1
> -	if export_partdevice partdev -1; then
> +	if export_partdevice partdev 1; then
>  		mount -t ext4 -o rw,noatime "/dev/$partdev" /mnt
>  		cp -af "$CONF_TAR" /mnt/
>  		umount /mnt
> diff --git a/target/linux/brcm2708/base-files/lib/upgrade/platform.sh b/target/linux/brcm2708/base-files/lib/upgrade/platform.sh
> index 62eede53d..37e479272 100644
> --- a/target/linux/brcm2708/base-files/lib/upgrade/platform.sh
> +++ b/target/linux/brcm2708/base-files/lib/upgrade/platform.sh
> @@ -9,7 +9,7 @@ platform_check_image() {
>  
>  	[ "$#" -gt 1 ] && return 1
>  
> -	export_bootdevice && export_partdevice diskdev -2 || {
> +	export_bootdevice && export_partdevice diskdev 0 || {
>  		echo "Unable to determine upgrade device"
>  		return 1
>  	}
> @@ -38,7 +38,7 @@ platform_check_image() {
>  platform_do_upgrade() {
>  	local diskdev partdev diff
>  
> -	export_bootdevice && export_partdevice diskdev -2 || {
> +	export_bootdevice && export_partdevice diskdev 0 || {
>  		echo "Unable to determine upgrade device"
>  		return 1
>  	}
> @@ -72,10 +72,6 @@ platform_do_upgrade() {
>  
>  	#iterate over each partition from the image and write it to the boot disk
>  	while read part start size; do
> -		# root is /dev/sd[a|b]2 and not /dev/sd[a|b] this causes some problem
> -		# one of which is this offset, I'm not sure what's the best fix, so
> -		# here's a WA.
> -		let part=$((part - 2))
>  		if export_partdevice partdev $part; then
>  			echo "Writing image to /dev/$partdev..."
>  			get_image "$@" | dd of="/dev/$partdev" ibs="512" obs=1M skip="$start" count="$size" conv=fsync
> @@ -92,8 +88,7 @@ platform_do_upgrade() {
>  platform_copy_config() {
>  	local partdev
>  
> -	# Same as above /dev/sd[a|b]2 is root, so /boot is -1
> -	if export_partdevice partdev -1; then
> +	if export_partdevice partdev 1; then
>  		mkdir -p /boot
>  		[ -f /boot/kernel.img ] || mount -t vfat -o rw,noatime "/dev/$partdev" /boot
>  		cp -af "$CONF_TAR" /boot/
> diff --git a/target/linux/omap/base-files/lib/preinit/79_move_config b/target/linux/omap/base-files/lib/preinit/79_move_config
> index c11258868..83171b3ba 100644
> --- a/target/linux/omap/base-files/lib/preinit/79_move_config
> +++ b/target/linux/omap/base-files/lib/preinit/79_move_config
> @@ -6,7 +6,7 @@ move_config() {
>  
>  	. /lib/upgrade/common.sh
>  
> -	if export_bootdevice && export_partdevice partdev -1; then
> +	if export_bootdevice && export_partdevice partdev 1; then
>  		if mount -t vfat -o rw,noatime "/dev/$partdev" /mnt; then
>  			if [ -f /mnt/sysupgrade.tgz ]; then
>  				mv -f /mnt/sysupgrade.tgz /
> diff --git a/target/linux/omap/base-files/lib/upgrade/platform.sh b/target/linux/omap/base-files/lib/upgrade/platform.sh
> index 88ef4790e..abe910b15 100644
> --- a/target/linux/omap/base-files/lib/upgrade/platform.sh
> +++ b/target/linux/omap/base-files/lib/upgrade/platform.sh
> @@ -1,7 +1,7 @@
>  platform_check_image() {
>  	local diskdev partdev diff
>  
> -	export_bootdevice && export_partdevice diskdev -2 || {
> +	export_bootdevice && export_partdevice diskdev 0 || {
>  		echo "Unable to determine upgrade device"
>  		return 1
>  	}
> @@ -28,7 +28,7 @@ platform_check_image() {
>  platform_copy_config() {
>  	local partdev
>  
> -	if export_partdevice partdev -1; then
> +	if export_partdevice partdev 1; then
>  		mount -t vfat -o rw,noatime "/dev/$partdev" /mnt
>  		cp -af "$CONF_TAR" /mnt/
>  		umount /mnt
> @@ -38,7 +38,7 @@ platform_copy_config() {
>  platform_do_upgrade() {
>  	local diskdev partdev diff
>  
> -	export_bootdevice && export_partdevice diskdev -2 || {
> +	export_bootdevice && export_partdevice diskdev 0 || {
>  		echo "Unable to determine upgrade device"
>  		return 1
>  	}
> @@ -74,7 +74,6 @@ platform_do_upgrade() {
>  	get_image "$@" | dd of="$diskdev" bs=1024 skip=8 seek=8 count=1016 conv=fsync
>  	#iterate over each partition from the image and write it to the boot disk
>  	while read part start size; do
> -		part="$(($part - 2))"
>  		if export_partdevice partdev $part; then
>  			echo "Writing image to /dev/$partdev..."
>  			get_image "$@" | dd of="/dev/$partdev" ibs="512" obs=1M skip="$start" count="$size" conv=fsync
> diff --git a/target/linux/sunxi/base-files/lib/preinit/79_move_config b/target/linux/sunxi/base-files/lib/preinit/79_move_config
> index c11258868..83171b3ba 100644
> --- a/target/linux/sunxi/base-files/lib/preinit/79_move_config
> +++ b/target/linux/sunxi/base-files/lib/preinit/79_move_config
> @@ -6,7 +6,7 @@ move_config() {
>  
>  	. /lib/upgrade/common.sh
>  
> -	if export_bootdevice && export_partdevice partdev -1; then
> +	if export_bootdevice && export_partdevice partdev 1; then
>  		if mount -t vfat -o rw,noatime "/dev/$partdev" /mnt; then
>  			if [ -f /mnt/sysupgrade.tgz ]; then
>  				mv -f /mnt/sysupgrade.tgz /
> diff --git a/target/linux/sunxi/base-files/lib/upgrade/platform.sh b/target/linux/sunxi/base-files/lib/upgrade/platform.sh
> index 88ef4790e..abe910b15 100644
> --- a/target/linux/sunxi/base-files/lib/upgrade/platform.sh
> +++ b/target/linux/sunxi/base-files/lib/upgrade/platform.sh
> @@ -1,7 +1,7 @@
>  platform_check_image() {
>  	local diskdev partdev diff
>  
> -	export_bootdevice && export_partdevice diskdev -2 || {
> +	export_bootdevice && export_partdevice diskdev 0 || {
>  		echo "Unable to determine upgrade device"
>  		return 1
>  	}
> @@ -28,7 +28,7 @@ platform_check_image() {
>  platform_copy_config() {
>  	local partdev
>  
> -	if export_partdevice partdev -1; then
> +	if export_partdevice partdev 1; then
>  		mount -t vfat -o rw,noatime "/dev/$partdev" /mnt
>  		cp -af "$CONF_TAR" /mnt/
>  		umount /mnt
> @@ -38,7 +38,7 @@ platform_copy_config() {
>  platform_do_upgrade() {
>  	local diskdev partdev diff
>  
> -	export_bootdevice && export_partdevice diskdev -2 || {
> +	export_bootdevice && export_partdevice diskdev 0 || {
>  		echo "Unable to determine upgrade device"
>  		return 1
>  	}
> @@ -74,7 +74,6 @@ platform_do_upgrade() {
>  	get_image "$@" | dd of="$diskdev" bs=1024 skip=8 seek=8 count=1016 conv=fsync
>  	#iterate over each partition from the image and write it to the boot disk
>  	while read part start size; do
> -		part="$(($part - 2))"
>  		if export_partdevice partdev $part; then
>  			echo "Writing image to /dev/$partdev..."
>  			get_image "$@" | dd of="/dev/$partdev" ibs="512" obs=1M skip="$start" count="$size" conv=fsync
> -- 
> 2.17.1



More information about the openwrt-devel mailing list