Revision 99e8295c lib/bdev.py

b/lib/bdev.py
287 287
      raise ValueError("Invalid configuration data %s" % str(unique_id))
288 288
    self._vg_name, self._lv_name = unique_id
289 289
    self.dev_path = "/dev/%s/%s" % (self._vg_name, self._lv_name)
290
    self._degraded = True
291
    self.major = self.minor = None
290 292
    self.Attach()
291 293

  
292 294
  @classmethod
......
392 394
    recorded.
393 395

  
394 396
    """
395
    result = utils.RunCmd(["lvdisplay", self.dev_path])
397
    result = utils.RunCmd(["lvs", "--noheadings", "--separator=,",
398
                           "-olv_attr,lv_kernel_major,lv_kernel_minor",
399
                           self.dev_path])
396 400
    if result.failed:
397 401
      logger.Error("Can't find LV %s: %s, %s" %
398 402
                   (self.dev_path, result.fail_reason, result.output))
399 403
      return False
400
    match = re.compile("^ *Block device *([0-9]+):([0-9]+).*$")
401
    for line in result.stdout.splitlines():
402
      match_result = match.match(line)
403
      if match_result:
404
        self.major = int(match_result.group(1))
405
        self.minor = int(match_result.group(2))
406
        return True
407
    return False
404
    out = result.stdout.strip().rstrip(',')
405
    out = out.split(",")
406
    if len(out) != 3:
407
      logger.Error("Can't parse LVS output, len(%s) != 3" % str(out))
408
      return False
409

  
410
    status, major, minor = out[:3]
411
    if len(status) != 6:
412
      logger.Error("lvs lv_attr is not 6 characters (%s)" % status)
413
      return False
414

  
415
    try:
416
      major = int(major)
417
      minor = int(minor)
418
    except ValueError, err:
419
      logger.Error("lvs major/minor cannot be parsed: %s" % str(err))
420

  
421
    self.major = major
422
    self.minor = minor
423
    self._degraded = status[0] == 'v' # virtual volume, i.e. doesn't backing
424
                                      # storage
425
    return True
408 426

  
409 427
  def Assemble(self):
410 428
    """Assemble the device.
......
448 466
    physical disk failure and subsequent 'vgreduce --removemissing' on
449 467
    the volume group.
450 468

  
469
    The status was already read in Attach, so we just return it.
470

  
451 471
    """
452
    result = utils.RunCmd(["lvs", "--noheadings", "-olv_attr", self.dev_path])
453
    if result.failed:
454
      logger.Error("Can't display lv: %s - %s" %
455
                   (result.fail_reason, result.output))
456
      return None, None, True, True
457
    out = result.stdout.strip()
458
    # format: type/permissions/alloc/fixed_minor/state/open
459
    if len(out) != 6:
460
      logger.Debug("Error in lvs output: attrs=%s, len != 6" % out)
461
      return None, None, True, True
462
    ldisk = out[0] == 'v' # virtual volume, i.e. doesn't have
463
                          # backing storage
464
    return None, None, ldisk, ldisk
472
    return None, None, self._degraded, self._degraded
465 473

  
466 474
  def Open(self, force=False):
467 475
    """Make the device ready for I/O.

Also available in: Unified diff