svn commit: r215086 - user/ae/usr.sbin/sade
Andrey V. Elsukov
ae at FreeBSD.org
Wed Nov 10 13:58:24 UTC 2010
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);
More information about the svn-src-user
mailing list