[PATCH] Use partially corrupt gpt disklabels.

Brian C. Lane bcl at redhat.com
Mon Jun 15 16:11:35 UTC 2015


On Mon, Jun 15, 2015 at 09:50:44AM +0200, Vratislav Podzimek wrote:
> On Fri, 2015-06-12 at 12:16 -0700, Brian C. Lane wrote:
> > Tell pyparted to answer "yes" when libparted asks if we want to proceed
> > using the secondary gpt disklabel in the event of a corrupt primary (or
> > use the primary in spite of a corrupt secondary label). We only do this
> > while populating the devicetree.
> > 
> > We only do this if udev/blkid has identified the disk as containing a
> > disklabel. This means we are going with the system's consensus as to
> > which formatting to acknowledge in the event there are multiple
> > signatures on the disk.
> > 
> > Based on commit e8b5e4b0058946b77ac472b466087196f4c6810b
> > 
> > Resolves: rhbz#1188163
> > ---
> >  blivet/devicetree.py | 15 +++++++++++++++
> >  1 file changed, 15 insertions(+)
> > 
> > diff --git a/blivet/devicetree.py b/blivet/devicetree.py
> > index ebdb44e..dd2fc59 100644
> > --- a/blivet/devicetree.py
> > +++ b/blivet/devicetree.py
> > @@ -26,6 +26,7 @@ import re
> >  import shutil
> >  import pprint
> >  import copy
> > +import parted
> >  
> >  from .errors import CryptoError, DeviceError, DeviceTreeError, DiskLabelCommitError, DMError, FSError, InvalidDiskLabelError, LUKSError, MDRaidError, StorageError, UnusableConfigurationError
> >  from .devices import BTRFSDevice, BTRFSSubVolumeDevice, BTRFSVolumeDevice, BTRFSSnapShotDevice
> > @@ -61,6 +62,18 @@ log = logging.getLogger("blivet")
> >  
> >  _LVM_DEVICE_CLASSES = (LVMLogicalVolumeDevice, LVMVolumeGroupDevice)
> >  
> > +def parted_exn_handler(exn_type, exn_options, exn_msg):
> > +    """ Answer any of parted's yes/no questions in the affirmative.
> > +
> > +        This allows us to proceed with partially corrupt gpt disklabels.
> > +    """
> > +    log.info("parted exception: %s", exn_msg)
> > +    ret = parted.EXCEPTION_RESOLVE_UNHANDLED
> > +    if exn_type == parted.EXCEPTION_TYPE_ERROR and \
> > +       exn_options == parted.EXCEPTION_OPT_YES_NO:
> > +        ret = parted.EXCEPTION_RESOLVE_YES
> > +    return ret
> > +
> >  class DeviceTree(object):
> >      """ A quasi-tree that represents the devices in the system.
> >  
> > @@ -2139,11 +2152,13 @@ class DeviceTree(object):
> >          if cleanupOnly:
> >              self._cleanup = True
> >  
> > +        parted.register_exn_handler(parted_exn_handler)
> >          try:
> >              self._populate()
> >          except Exception:
> >              raise
> >          finally:
> > +            parted.clear_exn_handler()
> >              self._hideIgnoredDisks()
> >              self.restoreConfigs()
> >  
> Would be nice if pyparted also provided
> 'exn_handler(parted_exn_handler)' context manager, so this would look
> like:
> with parted.exn_handler(parted_exn_handler):
>     ....
> 
> But that's more an agenda for master not as part of backporting stuff to
> rhel7-branch.

Correct, that's a good idea though.

-- 
Brian C. Lane | Anaconda Team | IRC: bcl #anaconda | Port Orchard, WA (PST8PDT)


More information about the anaconda-patches mailing list