Lines Matching refs:gpt
33 __FBSDID("$FreeBSD: src/sbin/gpt/recover.c,v 1.8 2005/08/31 01:47:19 marcel Exp $");
49 #include "gpt.h"
68 recover_gpt_hdr(gpt_t gpt, int type, off_t last)
74 if (gpt_add_hdr(gpt, type, last) == -1)
79 dgpt = &gpt->gpt;
80 dtbl = gpt->tbl;
81 sgpt = gpt->tpg;
82 stbl = gpt->lbt;
87 dgpt = &gpt->tpg;
88 dtbl = gpt->lbt;
89 sgpt = gpt->gpt;
90 stbl = gpt->tbl;
95 gpt_warn(gpt, "Bad table type %d", type);
99 memcpy((*dgpt)->map_data, sgpt->map_data, gpt->secsz);
106 if (gpt_write(gpt, *dgpt) == -1) {
107 gpt_warnx(gpt, "Writing %s GPT header failed", name);
110 gpt_msg(gpt, "Recovered %s GPT header from %s", name, origname);
115 recover_gpt_tbl(gpt_t gpt, int type, off_t start)
122 dtbl = &gpt->tbl;
123 stbl = gpt->lbt;
128 dtbl = &gpt->lbt;
129 stbl = gpt->tbl;
134 gpt_warn(gpt, "Bad table type %d", type);
138 *dtbl = map_add(gpt, start, stbl->map_size, type, stbl->map_data, 0);
140 gpt_warnx(gpt, "Adding %s GPT table failed", name);
143 if (gpt_write(gpt, *dtbl) == -1) {
144 gpt_warnx(gpt, "Writing %s GPT table failed", name);
147 gpt_msg(gpt, "Recovered %s GPT table from %s", name, origname);
152 recover(gpt_t gpt)
154 off_t last = gpt_last(gpt);
158 if (map_find(gpt, MAP_TYPE_MBR) != NULL) {
159 gpt_warnx(gpt, "Device contains an MBR");
163 gpt->gpt = map_find(gpt, MAP_TYPE_PRI_GPT_HDR);
164 gpt->tpg = map_find(gpt, MAP_TYPE_SEC_GPT_HDR);
165 gpt->tbl = map_find(gpt, MAP_TYPE_PRI_GPT_TBL);
166 gpt->lbt = map_find(gpt, MAP_TYPE_SEC_GPT_TBL);
168 if (gpt->gpt == NULL && gpt->tpg == NULL) {
169 gpt_warnx(gpt, "No primary or secondary GPT headers, "
173 if (gpt->tbl == NULL && gpt->lbt == NULL) {
174 gpt_warnx(gpt, "No primary or secondary GPT tables, "
179 if (gpt->gpt != NULL &&
180 le64toh(((struct gpt_hdr *)(gpt->gpt->map_data))->hdr_lba_alt) !=
182 gpt_warnx(gpt, "Media size has changed, please use "
187 if (gpt->tbl != NULL && gpt->lbt == NULL) {
188 if (recover_gpt_tbl(gpt, MAP_TYPE_SEC_GPT_TBL,
189 last - gpt->tbl->map_size) == -1)
191 } else if (gpt->tbl == NULL && gpt->lbt != NULL) {
192 if (recover_gpt_tbl(gpt, MAP_TYPE_PRI_GPT_TBL, 2LL) == -1)
196 if (gpt->gpt != NULL && gpt->tpg == NULL) {
197 if (recover_gpt_hdr(gpt, MAP_TYPE_SEC_GPT_HDR, last) == -1)
199 } else if (gpt->gpt == NULL && gpt->tpg != NULL) {
200 if (recover_gpt_hdr(gpt, MAP_TYPE_PRI_GPT_HDR, 1LL) == -1)
207 if (map_find(gpt, MAP_TYPE_PMBR) == NULL) {
208 if (map_free(gpt, 0LL, 1LL) == 0) {
209 gpt_warnx(gpt, "No room for the PMBR");
212 mbr = gpt_read(gpt, 0LL, 1);
214 gpt_warnx(gpt, "Error reading MBR");
221 map = map_add(gpt, 0LL, 1LL, MAP_TYPE_PMBR, mbr, 1);
222 if (gpt_write(gpt, map) == -1) {
223 gpt_warn(gpt, "Can't write PMBR");
226 gpt_msg(gpt,
227 "Recreated PMBR (you may need to rerun 'gpt biosboot'");
233 cmd_recover(gpt_t gpt, int argc, char *argv[])
238 return recover(gpt);