Revision b98bb41e

b/tools/lvmstrap
44 44
import sys
45 45
import optparse
46 46
import time
47
import errno
47 48

  
48 49
from ganeti.utils import RunCmd, ReadFile
49 50
from ganeti import constants
......
425 426

  
426 427
    dev = ReadDev("/sys/block/%s" % name)
427 428
    CheckSysDev(name, dev)
428
    inuse = not CheckReread(name)
429
    inuse = InUse(name)
429 430
    # Enumerate partitions of the block device
430 431
    partitions = []
431 432
    for partname in os.listdir("/sys/block/%s" % name):
......
561 562
    print line
562 563

  
563 564

  
565
def CheckSysfsHolders(name):
566
  """Check to see if a device is 'hold' at sysfs level.
567

  
568
  This is usually the case for Physical Volumes under LVM.
569

  
570
  @rtype: boolean
571
  @return: true if the device is available according to sysfs
572

  
573
  """
574
  try:
575
    contents = os.listdir("/sys/block/%s/holders/" % name)
576
  except OSError, err:
577
    if err.errno == errno.ENOENT:
578
      contents = []
579
    else:
580
      raise
581
  return not bool(contents)
582

  
583

  
564 584
def CheckReread(name):
565 585
  """Check to see if a block device is in use.
566 586

  
......
593 613
    return result.failed
594 614

  
595 615

  
616
def InUse(name):
617
  """Returns if a disk is in use or not.
618

  
619
  """
620
  return not (CheckSysfsHolders(name) and CheckReread(name))
621

  
622

  
596 623
def WipeDisk(name):
597 624
  """Wipes a block device.
598 625

  
......
604 631

  
605 632
  """
606 633

  
607
  if not CheckReread(name):
634
  if InUse(name):
608 635
    raise OperationalError("CRITICAL: disk %s you selected seems to be in"
609 636
                           " use. ABORTING!" % name)
610 637

  
......
624 651
                           " %d. I don't know how to cleanup. Sorry." %
625 652
                           (name, bytes_written))
626 653

  
627
  if not CheckReread(name):
654
  if InUse(name):
655
    # try to restore the data
628 656
    fd = os.open("/dev/%s" % name, os.O_RDWR | os.O_SYNC)
629 657
    os.write(fd, olddata)
630 658
    os.close(fd)

Also available in: Unified diff