X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-xen-config.git/blobdiff_plain/a0ad482aa6f044632c66ce1fd7b550d0bbdea5b1..691d8c7afb03cbe8e7e241d50e5ea7f163099924:/files/usr/sbin/sipb-xen-losetup

diff --git a/files/usr/sbin/sipb-xen-losetup b/files/usr/sbin/sipb-xen-losetup
index 5776248..b876187 100755
--- a/files/usr/sbin/sipb-xen-losetup
+++ b/files/usr/sbin/sipb-xen-losetup
@@ -2,25 +2,17 @@
 
 import sys
 import os
-from subprocess import call
+from subprocess import call, Popen, PIPE
 
 def losetup(source, offset=0):
-  # XXX we avoid colliding with other instances of ourself,
-  #     but when it comes to other loop-device users we just
-  #     pick a range things don't seem to use and hope...
   lockfilename = '/tmp/losetup.lock'
   os.close(os.open(lockfilename, os.O_CREAT+os.O_EXCL)) #lock
   try:
-    loopdevice = None
-    for i in xrange(32,60): # totally arbitrary, just looks to be unused on black-mesa
-      filename = '/dev/loop%d'%i
-      if 0 == len(file(filename).read(1)):
-        loopdevice = filename # it's empty
-        break
-    if loopdevice is not None:
-      call(['losetup', '-o', str(offset), loopdevice, source])
-    else:
+    loopdevice = Popen(['losetup', '-f'], stdout=PIPE).communicate()[0].rstrip()
+    if loopdevice == '':
       raise RuntimeError('out of loop devices for copying VM image: too many at once?')
+    if call(['losetup', '-o', str(offset), loopdevice, source]) != 0:
+      raise RuntimeError('losetup failed')
   finally:
     os.unlink(lockfilename) #unlock
   return loopdevice