summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/src/cmd/disk/prep/edisk.c47
1 files changed, 41 insertions, 6 deletions
diff --git a/sys/src/cmd/disk/prep/edisk.c b/sys/src/cmd/disk/prep/edisk.c
index d8edc846a..cd2800815 100644
--- a/sys/src/cmd/disk/prep/edisk.c
+++ b/sys/src/cmd/disk/prep/edisk.c
@@ -610,6 +610,33 @@ readtab(Edit *edit, Header *hdr)
return 0;
}
+static char*
+checkhdr(Header *a, Header *b)
+{
+ if(memcmp(a->sig, b->sig, sizeof(a->sig)) != 0)
+ return "signature";
+ if(memcmp(a->rev, b->rev, sizeof(a->rev)) != 0)
+ return "revision";
+ if(memcmp(a->hdrsiz, b->hdrsiz, sizeof(a->hdrsiz)) != 0)
+ return "header size";
+ if(memcmp(a->selflba, b->backlba, sizeof(a->selflba)) != 0
+ || memcmp(a->backlba, b->selflba, sizeof(a->backlba)) != 0)
+ return "backup lba/self lba";
+ if(memcmp(a->firstlba, b->firstlba, sizeof(a->firstlba)) != 0)
+ return "first lba";
+ if(memcmp(a->lastlba, b->lastlba, sizeof(a->lastlba)) != 0)
+ return "last lba";
+ if(memcmp(a->devid, b->devid, sizeof(a->devid)) != 0)
+ return "device guid";
+ if(memcmp(a->entrycount, b->entrycount, sizeof(a->entrycount)) != 0)
+ return "entry count";
+ if(memcmp(a->entrysize, b->entrysize, sizeof(a->entrysize)) != 0)
+ return "entry size";
+ if(memcmp(a->tabcrc, b->tabcrc, sizeof(a->tabcrc)) != 0)
+ return "table checksum";
+ return nil;
+}
+
static Header*
getbakhdr(Edit *edit, Header *bhdr)
{
@@ -619,9 +646,17 @@ getbakhdr(Edit *edit, Header *bhdr)
siz = getle32(bhdr->hdrsiz);
lba = getle64(bhdr->backlba);
- hdr = readhdr(edit->disk, lba);
- if(hdr != nil)
- return hdr;
+
+ if(!blank){
+ char *mismatch;
+
+ mismatch = "data";
+ hdr = readhdr(edit->disk, lba);
+ if(hdr != nil && (mismatch = checkhdr(bhdr, hdr)) == nil)
+ return hdr;
+ fprint(2, "backup header at lba %lld has mismatching %s, restoring.\n",
+ lba, mismatch);
+ }
hdr = getblock(edit->disk, lba);
memmove(hdr, bhdr, siz);
@@ -756,13 +791,13 @@ initmbr(Disk *disk)
t->type = 0xEE;
t->active = 0;
- size = disk->secs > 0xFFFFFFFF ? 0xFFFFFFFF : disk->secs;
- putle32(t->lba, 0);
+ size = (disk->secs - 1) > 0xFFFFFFFF ? 0xFFFFFFFF : (disk->secs - 1);
+ putle32(t->lba, 1);
putle32(t->size, size);
t->starth = 0;
t->startc = 0;
- t->starts = 0;
+ t->starts = 1;
t->endh = disk->h-1;
t->ends = (disk->s & 0x3F) | (((disk->c-1)>>2) & 0xC0);
t->endc = disk->c-1;