Revision ae26a287

b/lib/bdev.py
1017 1017
      self.minor = minor
1018 1018
      self.dev_path = self._DevPath(minor)
1019 1019

  
1020
  @staticmethod
1021
  def _CheckMetaSize(meta_device):
1022
    """Check if the given meta device looks like a valid one.
1023

  
1024
    This currently only check the size, which must be around
1025
    128MiB.
1026

  
1027
    """
1028
    result = utils.RunCmd(["blockdev", "--getsize", meta_device])
1029
    if result.failed:
1030
      logger.Error("Failed to get device size: %s" % result.fail_reason)
1031
      return False
1032
    try:
1033
      sectors = int(result.stdout)
1034
    except ValueError:
1035
      logger.Error("Invalid output from blockdev: '%s'" % result.stdout)
1036
      return False
1037
    bytes = sectors * 512
1038
    if bytes < 128 * 1024 * 1024: # less than 128MiB
1039
      logger.Error("Meta device too small (%.2fMib)" % (bytes / 1024 / 1024))
1040
      return False
1041
    if bytes > (128 + 32) * 1024 * 1024: # account for an extra (big) PE on LVM
1042
      logger.Error("Meta device too big (%.2fMiB)" % (bytes / 1024 / 1024))
1043
      return False
1044
    return True
1045

  
1020 1046

  
1021 1047
class DRBDev(BaseDRBD):
1022 1048
  """DRBD block device.
......
1168 1194
    return retval
1169 1195

  
1170 1196

  
1171
  @staticmethod
1172
  def _IsValidMeta(meta_device):
1173
    """Check if the given meta device looks like a valid one.
1174

  
1175
    This currently only check the size, which must be around
1176
    128MiB.
1177

  
1178
    """
1179
    result = utils.RunCmd(["blockdev", "--getsize", meta_device])
1180
    if result.failed:
1181
      logger.Error("Failed to get device size: %s" % result.fail_reason)
1182
      return False
1183
    try:
1184
      sectors = int(result.stdout)
1185
    except ValueError:
1186
      logger.Error("Invalid output from blockdev: '%s'" % result.stdout)
1187
      return False
1188
    bytes = sectors * 512
1189
    if bytes < 128*1024*1024: # less than 128MiB
1190
      logger.Error("Meta device too small (%.2fMib)" % (bytes/1024/1024))
1191
      return False
1192
    if bytes > (128+32)*1024*1024: # account for an extra (big) PE on LVM
1193
      logger.Error("Meta device too big (%.2fMiB)" % (bytes/1024/1024))
1194
      return False
1195
    return True
1196

  
1197

  
1198 1197
  @classmethod
1199 1198
  def _AssembleLocal(cls, minor, backend, meta):
1200 1199
    """Configure the local part of a DRBD device.
......
1203 1202
    device. And it must be done only once.
1204 1203

  
1205 1204
    """
1206
    if not cls._IsValidMeta(meta):
1205
    if not cls._CheckMetaSize(meta):
1207 1206
      return False
1208 1207
    result = utils.RunCmd(["drbdsetup", cls._DevPath(minor), "disk",
1209 1208
                           backend, meta, "0", "-e", "detach"])
......
1536 1535
    meta.Assemble()
1537 1536
    if not meta.Attach():
1538 1537
      raise errors.BlockDeviceError("Can't attach to meta device")
1539
    if not cls._IsValidMeta(meta.dev_path):
1538
    if not cls._CheckMetaSize(meta.dev_path):
1540 1539
      raise errors.BlockDeviceError("Invalid meta device")
1541 1540
    logger.Info("Started zeroing device %s" % meta.dev_path)
1542 1541
    cls._ZeroDevice(meta.dev_path)

Also available in: Unified diff