 fb36ce40d6
			
		
	
	
		fb36ce40d6
		
	
	
	
	
		
			
			This apparently causes deadlocks when many xenstore-write (one for each block device) called at the same time.
		
			
				
	
	
		
			62 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| 
 | |
| NAME=${DEVNAME#/dev/}
 | |
| DESC="${ID_MODEL} (${ID_FS_LABEL})"
 | |
| SIZE=$[ $(cat /sys/$DEVPATH/size) * 512 ]
 | |
| MODE=w
 | |
| XS_KEY="qubes-block-devices/$NAME"
 | |
| 
 | |
| xs_remove() {
 | |
|     if [ "$QUBES_EXPOSED" == "1" ]; then
 | |
|         xenstore-rm "$XS_KEY"
 | |
|     fi
 | |
|     echo QUBES_EXPOSED=0
 | |
| }
 | |
| 
 | |
| # Ignore mounted...
 | |
| if fgrep -q $DEVNAME /proc/mounts; then
 | |
|     xs_remove
 | |
|     exit 0
 | |
| fi
 | |
| # ... and used by device-mapper
 | |
| if [ -n "`ls -A /sys/$DEVPATH/holders 2> /dev/null`" ]; then
 | |
|     xs_remove
 | |
|     exit 0
 | |
| fi
 | |
| # ... and "empty" loop devices
 | |
| if [ "$MAJOR" -eq 7 -a ! -d /sys/$DEVPATH/loop ]; then
 | |
|     xs_remove
 | |
|     exit 0
 | |
| fi
 | |
| 
 | |
| # Special case for CD
 | |
| if [ "$ID_TYPE" = "cd" ]; then
 | |
|     if [ "$ID_CDROM_MEDIA" != "1" ]; then
 | |
|         # Hide empty cdrom drive
 | |
|         xs_remove
 | |
|         exit 0
 | |
|     fi
 | |
|     MODE=r
 | |
| fi
 | |
| 
 | |
| # Special description for loop devices
 | |
| if [ -d /sys/$DEVPATH/loop ]; then
 | |
|     DESC=$(cat /sys/$DEVPATH/loop/backing_file)
 | |
| fi
 | |
| 
 | |
| # Get lock only in dom0 - there are so many block devices so it causes xenstore
 | |
| # deadlocks sometimes.
 | |
| if [ -f /etc/qubes-release ]; then
 | |
|     # Skip xenstore-write if cannot obtain lock. This can mean very early system startup
 | |
|     # stage without /run mounted (or populated). Devices will be rediscovered later
 | |
|     # by qubes-core startup script.
 | |
|     exec 9>>/var/run/qubes/block-xenstore.lock || exit 0
 | |
|     flock 9
 | |
| fi
 | |
| 
 | |
| xenstore-write "$XS_KEY/desc" "$DESC" "$XS_KEY/size" "$SIZE" "$XS_KEY/mode" "$MODE"
 | |
| echo QUBES_EXPOSED=1
 | |
| 
 | |
| # Make sure that block backend is loaded
 | |
| /sbin/modprobe xen-blkback 2> /dev/null || /sbin/modprobe blkbk
 |