Browse code

Merge pull request #13896 from rhvgoyal/verify-base-uuid

devicemapper: Compare uuid of base device on startup

David Calavera authored on 2015/06/18 03:30:04
Showing 1 changed files
... ...
@@ -105,7 +105,8 @@ type DeviceSet struct {
105 105
 	thinPoolDevice        string
106 106
 	Transaction           `json:"-"`
107 107
 	overrideUdevSyncCheck bool
108
-	deferredRemove        bool // use deferred removal
108
+	deferredRemove        bool   // use deferred removal
109
+	BaseDeviceUUID        string //save UUID of base device
109 110
 }
110 111
 
111 112
 type DiskUsage struct {
... ...
@@ -676,9 +677,70 @@ func (devices *DeviceSet) loadMetadata(hash string) *DevInfo {
676 676
 	return info
677 677
 }
678 678
 
679
+func getDeviceUUID(device string) (string, error) {
680
+	out, err := exec.Command("blkid", "-s", "UUID", "-o", "value", device).Output()
681
+	if err != nil {
682
+		logrus.Debugf("Failed to find uuid for device %s:%v", device, err)
683
+		return "", err
684
+	}
685
+
686
+	uuid := strings.TrimSuffix(string(out), "\n")
687
+	uuid = strings.TrimSpace(uuid)
688
+	logrus.Debugf("UUID for device: %s is:%s", device, uuid)
689
+	return uuid, nil
690
+}
691
+
692
+func (devices *DeviceSet) verifyBaseDeviceUUID(baseInfo *DevInfo) error {
693
+	if err := devices.activateDeviceIfNeeded(baseInfo); err != nil {
694
+		return err
695
+	}
696
+
697
+	defer devices.deactivateDevice(baseInfo)
698
+
699
+	uuid, err := getDeviceUUID(baseInfo.DevName())
700
+	if err != nil {
701
+		return err
702
+	}
703
+
704
+	if devices.BaseDeviceUUID != uuid {
705
+		return fmt.Errorf("Current Base Device UUID:%s does not match with stored UUID:%s", uuid, devices.BaseDeviceUUID)
706
+	}
707
+
708
+	return nil
709
+}
710
+
711
+func (devices *DeviceSet) saveBaseDeviceUUID(baseInfo *DevInfo) error {
712
+	if err := devices.activateDeviceIfNeeded(baseInfo); err != nil {
713
+		return err
714
+	}
715
+
716
+	defer devices.deactivateDevice(baseInfo)
717
+
718
+	uuid, err := getDeviceUUID(baseInfo.DevName())
719
+	if err != nil {
720
+		return err
721
+	}
722
+
723
+	devices.BaseDeviceUUID = uuid
724
+	devices.saveDeviceSetMetaData()
725
+	return nil
726
+}
727
+
679 728
 func (devices *DeviceSet) setupBaseImage() error {
680 729
 	oldInfo, _ := devices.lookupDevice("")
681 730
 	if oldInfo != nil && oldInfo.Initialized {
731
+		// If BaseDeviceUUID is nil (upgrade case), save it and
732
+		// return success.
733
+		if devices.BaseDeviceUUID == "" {
734
+			if err := devices.saveBaseDeviceUUID(oldInfo); err != nil {
735
+				return fmt.Errorf("Could not query and save base device UUID:%v", err)
736
+			}
737
+			return nil
738
+		}
739
+
740
+		if err := devices.verifyBaseDeviceUUID(oldInfo); err != nil {
741
+			return fmt.Errorf("Base Device UUID verification failed. Possibly using a different thin pool then last invocation:%v", err)
742
+		}
682 743
 		return nil
683 744
 	}
684 745
 
... ...
@@ -728,6 +790,10 @@ func (devices *DeviceSet) setupBaseImage() error {
728 728
 		return err
729 729
 	}
730 730
 
731
+	if err := devices.saveBaseDeviceUUID(info); err != nil {
732
+		return fmt.Errorf("Could not query and save base device UUID:%v", err)
733
+	}
734
+
731 735
 	return nil
732 736
 }
733 737