Pārlūkot izejas kodu

Finalized of the day

aroz 1 gadu atpakaļ
vecāks
revīzija
9ea6551c2f
2 mainītis faili ar 26 papildinājumiem un 0 dzēšanām
  1. 10 0
      mod/disk/raid/handler.go
  2. 16 0
      mod/disk/raid/raidutils.go

+ 10 - 0
mod/disk/raid/handler.go

@@ -116,6 +116,16 @@ func (m *Manager) HandleAddDiskToRAIDVol(w http.ResponseWriter, r *http.Request)
 		return
 	}
 
+	isOSDisk, err := m.DiskIsRoot(sdXDev)
+	if err != nil {
+		utils.SendErrorResponse(w, err.Error())
+	}
+
+	if isOSDisk {
+		utils.SendErrorResponse(w, "OS disk cannot be used as RAID member")
+		return
+	}
+
 	//OK! Clear the disk
 	err = m.ClearSuperblock(sdXDev)
 	if err != nil {

+ 16 - 0
mod/disk/raid/raidutils.go

@@ -76,6 +76,22 @@ func (m *Manager) DiskIsUsedInAnotherRAIDVol(sdXDev string) (bool, error) {
 	return false, nil
 }
 
+// Check if the given disk (sdX) is root drive (the disk that install the OS, aka /)
+func (m *Manager) DiskIsRoot(sdXDev string) (bool, error) {
+	bdMeta, err := diskfs.GetBlockDeviceMeta(sdXDev)
+	if err != nil {
+		return false, err
+	}
+
+	for _, partition := range bdMeta.Children {
+		if partition.Mountpoint == "/" {
+			//Root
+			return true, nil
+		}
+	}
+	return false, nil
+}
+
 // ClearSuperblock clears the superblock of the specified disk so it can be used safely
 func (m *Manager) ClearSuperblock(devicePath string) error {
 	isMounted, err := diskfs.DeviceIsMounted(devicePath)