vvfat: reorganize computation of disk geometry

First determine FAT12/16/32, then compute geometry from that for both
FDD and HDD.  For 1.44MB floppies, and 2.88MB floppies using FAT16,
change to 1 sector/cluster.  The default remains 2.88MB with FAT12
and 2 sectors/cluster.  Both DOS and mkdosfs by default format a 2.88MB
floppy as FAT12.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Paolo Bonzini 2011-11-04 17:21:53 +01:00 committed by Kevin Wolf
parent d71cff42e4
commit 273e4e03b3

View File

@ -982,7 +982,6 @@ static int is_consistent(BDRVVVFATState *s);
static int vvfat_open(BlockDriverState *bs, const char* dirname, int flags) static int vvfat_open(BlockDriverState *bs, const char* dirname, int flags)
{ {
BDRVVVFATState *s = bs->opaque; BDRVVVFATState *s = bs->opaque;
int floppy = 0;
int i; int i;
#ifdef DEBUG #ifdef DEBUG
@ -996,11 +995,8 @@ DLOG(if (stderr == NULL) {
s->bs = bs; s->bs = bs;
s->fat_type=16;
/* LATER TODO: if FAT32, adjust */ /* LATER TODO: if FAT32, adjust */
s->sectors_per_cluster=0x10; s->sectors_per_cluster=0x10;
/* 504MB disk*/
bs->cyls=1024; bs->heads=16; bs->secs=63;
s->current_cluster=0xffffffff; s->current_cluster=0xffffffff;
@ -1015,14 +1011,6 @@ DLOG(if (stderr == NULL) {
if (!strstart(dirname, "fat:", NULL)) if (!strstart(dirname, "fat:", NULL))
return -1; return -1;
if (strstr(dirname, ":floppy:")) {
floppy = 1;
s->fat_type = 12;
s->first_sectors_number = 1;
s->sectors_per_cluster=2;
bs->cyls = 80; bs->heads = 2; bs->secs = 36;
}
if (strstr(dirname, ":32:")) { if (strstr(dirname, ":32:")) {
fprintf(stderr, "Big fat greek warning: FAT32 has not been tested. You are welcome to do so!\n"); fprintf(stderr, "Big fat greek warning: FAT32 has not been tested. You are welcome to do so!\n");
s->fat_type = 32; s->fat_type = 32;
@ -1030,7 +1018,27 @@ DLOG(if (stderr == NULL) {
s->fat_type = 16; s->fat_type = 16;
} else if (strstr(dirname, ":12:")) { } else if (strstr(dirname, ":12:")) {
s->fat_type = 12; s->fat_type = 12;
bs->secs = 18; }
if (strstr(dirname, ":floppy:")) {
/* 1.44MB or 2.88MB floppy. 2.88MB can be FAT12 (default) or FAT16. */
if (!s->fat_type) {
s->fat_type = 12;
bs->secs = 36;
s->sectors_per_cluster=2;
} else {
bs->secs=(s->fat_type == 12 ? 18 : 36);
s->sectors_per_cluster=1;
}
s->first_sectors_number = 1;
bs->cyls=80; bs->heads=2;
} else {
/* 32MB or 504MB disk*/
if (!s->fat_type) {
s->fat_type = 16;
}
bs->cyls=(s->fat_type == 12 ? 64 : 1024);
bs->heads=16; bs->secs=63;
} }
s->sector_count=bs->cyls*bs->heads*bs->secs-(s->first_sectors_number-1); s->sector_count=bs->cyls*bs->heads*bs->secs-(s->first_sectors_number-1);
@ -1058,10 +1066,10 @@ DLOG(if (stderr == NULL) {
if(s->first_sectors_number==0x40) if(s->first_sectors_number==0x40)
init_mbr(s); init_mbr(s);
else {
/* for some reason or other, MS-DOS does not like to know about CHS... */ /* MS-DOS does not like to know about CHS (?). */
if (floppy)
bs->heads = bs->cyls = bs->secs = 0; bs->heads = bs->cyls = bs->secs = 0;
}
// assert(is_consistent(s)); // assert(is_consistent(s));
qemu_co_mutex_init(&s->lock); qemu_co_mutex_init(&s->lock);