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>