partitioning: fix race condition on loop device allocation
This commit is contained in:
parent
db187a8a0f
commit
bbd5699e13
@ -216,25 +216,9 @@ function prepare_partitions() {
|
|||||||
flock -x $FD
|
flock -x $FD
|
||||||
|
|
||||||
declare -g LOOP
|
declare -g LOOP
|
||||||
# replace losetup --find with own function and do 10 cycles
|
#--partscan is using to force the kernel for scaning partition table in preventing of partprobe errors
|
||||||
# losetup always return 1st free loop device and in parallel build,
|
LOOP=$(losetup --show --partscan --find "${SDCARD}".raw) || exit_with_error "Unable to find free loop device"
|
||||||
# it often happens that same is found which resoults in:
|
display_alert "Allocated loop device" "LOOP=${LOOP}"
|
||||||
# "failed to set up loop device: Device or resource busy"
|
|
||||||
# If we seek random way, chanches of allocating the same are significantly smaller.
|
|
||||||
FIND_LOOP_CYCLES=1
|
|
||||||
while : ; do
|
|
||||||
LOOP=$(find /dev/loop* | grep -Po "(\/dev\/loop\d|\/dev\/loop\d\d)$" | sort -R | head -1)
|
|
||||||
LOOP_COMPARE=$(losetup -l --noheadings --raw --output=NAME | grep $LOOP || true)
|
|
||||||
[[ -z $LOOP_COMPARE ]] && break
|
|
||||||
[[ $FIND_LOOP_CYCLES -gt 10 ]] && exit_with_error "Unable to find free loop device"
|
|
||||||
FIND_LOOP_CYCLES=$(( FIND_LOOP_CYCLES + 1 ))
|
|
||||||
done
|
|
||||||
display_alert "Allocated loop device" "LOOP=${LOOP} in cycle $FIND_LOOP_CYCLES"
|
|
||||||
|
|
||||||
CHECK_LOOP_FOR_SIZE="no" check_loop_device "$LOOP" # initially loop is zero sized, ignore it.
|
|
||||||
|
|
||||||
#--partscan is using to force the kernel for scaning partition table in preventing of partprobe errors
|
|
||||||
run_host_command_logged losetup --partscan "${LOOP}" "${SDCARD}".raw
|
|
||||||
|
|
||||||
# loop device was grabbed here, unlock
|
# loop device was grabbed here, unlock
|
||||||
flock -u $FD
|
flock -u $FD
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user