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