Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 10 Nov 2010 13:58:24 +0000 (UTC)
From:      "Andrey V. Elsukov" <ae@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r215086 - user/ae/usr.sbin/sade
Message-ID:  <201011101358.oAADwOEn020013@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ae
Date: Wed Nov 10 13:58:24 2010
New Revision: 215086
URL: http://svn.freebsd.org/changeset/base/215086

Log:
  Add ability to destroy and recover corrupt GPT.

Modified:
  user/ae/usr.sbin/sade/devices.c
  user/ae/usr.sbin/sade/libsade.h
  user/ae/usr.sbin/sade/parted.c
  user/ae/usr.sbin/sade/parts.c

Modified: user/ae/usr.sbin/sade/devices.c
==============================================================================
--- user/ae/usr.sbin/sade/devices.c	Wed Nov 10 10:23:39 2010	(r215085)
+++ user/ae/usr.sbin/sade/devices.c	Wed Nov 10 13:58:24 2010	(r215086)
@@ -59,6 +59,7 @@ de_device_add(struct de_devlist *pd, str
     const char *classname, const char *classdesc)
 {
 	struct de_device *pdev;
+	const char *s;
 
 	pdev = malloc(sizeof(struct de_device));
 	if (pdev == NULL)

Modified: user/ae/usr.sbin/sade/libsade.h
==============================================================================
--- user/ae/usr.sbin/sade/libsade.h	Wed Nov 10 10:23:39 2010	(r215085)
+++ user/ae/usr.sbin/sade/libsade.h	Wed Nov 10 13:58:24 2010	(r215086)
@@ -78,6 +78,7 @@ struct de_device *
 	de_dev_find(struct de_devlist *pd, const char *name);
 int	de_dev_scheme_create(struct de_device *pdev, const char *scheme);
 int	de_dev_scheme_destroy(struct de_device *pdev);
+int	de_dev_scheme_recover(struct de_device *pdev);
 int	de_dev_bootcode(struct de_device *pdev, const char *path);
 int	de_dev_undo(struct de_device *pdev);
 int	de_dev_commit(struct de_device *pdev);

Modified: user/ae/usr.sbin/sade/parted.c
==============================================================================
--- user/ae/usr.sbin/sade/parted.c	Wed Nov 10 10:23:39 2010	(r215085)
+++ user/ae/usr.sbin/sade/parted.c	Wed Nov 10 13:58:24 2010	(r215086)
@@ -108,6 +108,12 @@ static char *mbr_bootmgr_msg =
 	"Press \"YES\" to install boot manager or \"NO\" to use standard MBR.";
 static char *gpt_bootcode_msg =
 	"Would you like to use a ZFS aware bootstrap code?";
+static char *corrupt_scheme_msg =
+	"WARNING: This partition table marked as corrupt. Any changes are\n"
+	"prohibited until it will be recovered. Would you like to recover it?";
+static char *destroy_corrupt_scheme_msg =
+	"WARNING: This partition table marked as corrupt. You can not\n"
+	"modify it. Would you like to destroy it?";
 
 static char *add_slice_title =
 	"Please specify the slice type (or select it from the list),\n"
@@ -620,6 +626,18 @@ reload:
 				error = de_dev_commit(pdev);
 			ret = 1; /* any way we are exiting */
 		}
+	} else if (pdev->de_state != 0) {
+		if (dmenu_open_yesno(corrupt_scheme_msg) == 0) {
+			error = de_dev_scheme_recover(pdev);
+			if (error == 0) {
+				changed = 1;
+				pdev->de_state = 0;
+			} else {
+				dmenu_open_errormsg((error < 0) ? de_error():
+				    strerror(error));
+				error = 0;
+			}
+		}
 	}
 	if (ret == 0 && error == 0) {
 		WINDOW *win;
@@ -808,8 +826,14 @@ resize:
 				}
 				break;
 			case 'D':
-				if (count == 1 && selected->de_type == NULL) {
-					if (dmenu_open_noyes(
+				/* Ask to destroy partition scheme when:
+				 * 1. Partition table is corrupt;
+				 * 2. Partition table is empty;
+				 */
+				if (pdev->de_state != 0 || (count == 1 &&
+				    selected->de_type == NULL)) {
+					if (dmenu_open_noyes(pdev->de_state ?
+					    destroy_corrupt_scheme_msg:
 					    destroy_scheme_msg))
 						break;
 					error = de_dev_scheme_destroy(pdev);

Modified: user/ae/usr.sbin/sade/parts.c
==============================================================================
--- user/ae/usr.sbin/sade/parts.c	Wed Nov 10 10:23:39 2010	(r215085)
+++ user/ae/usr.sbin/sade/parts.c	Wed Nov 10 13:58:24 2010	(r215086)
@@ -133,7 +133,8 @@ de_partlist_get(struct de_device *pdev)
 	}
 	s = find_geomcfg(gp, "scheme");
 	pdev->de_scheme = strdup(s);
-
+	s = find_geomcfg(gp, "state");
+	pdev->de_state = (strcmp(s, "OK") != 0);
         s = find_geomcfg(gp, "first");
         first = (off_t)strtoimax(s, NULL, 0);
         s = find_geomcfg(gp, "last");
@@ -270,6 +271,31 @@ de_dev_scheme_destroy(struct de_device *
 	gctl_ro_param(req, "class", -1, class_name);
 	gctl_ro_param(req, arg0_name, -1, pdev->de_name);
 	gctl_ro_param(req, "flags", -1, sade_flags);
+	error = 1;
+	gctl_ro_param(req, "force", sizeof(int), &error);
+
+	error = de_gpart_issue(req);
+	gctl_free(req);
+	return (error);
+}
+
+int
+de_dev_scheme_recover(struct de_device *pdev)
+{
+	int error;
+	struct gctl_req *req;
+
+	assert(pdev != NULL);
+	assert(pdev->de_name != NULL);
+
+	req = gctl_get_handle();
+	if (req == NULL)
+		return (ENOMEM);
+
+	gctl_ro_param(req, "verb", -1, "recover");
+	gctl_ro_param(req, "class", -1, class_name);
+	gctl_ro_param(req, arg0_name, -1, pdev->de_name);
+	gctl_ro_param(req, "flags", -1, sade_flags);
 
 	error = de_gpart_issue(req);
 	gctl_free(req);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201011101358.oAADwOEn020013>