From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:36951) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RMMWx-00026y-6a for qemu-devel@nongnu.org; Fri, 04 Nov 2011 12:22:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RMMWv-0007X4-PU for qemu-devel@nongnu.org; Fri, 04 Nov 2011 12:22:11 -0400 Received: from mail-gx0-f173.google.com ([209.85.161.173]:36497) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RMMWv-0007Wx-LE for qemu-devel@nongnu.org; Fri, 04 Nov 2011 12:22:09 -0400 Received: by ggnr5 with SMTP id r5so3080545ggn.4 for ; Fri, 04 Nov 2011 09:22:09 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Fri, 4 Nov 2011 17:21:53 +0100 Message-Id: <1320423713-22105-1-git-send-email-pbonzini@redhat.com> In-Reply-To: <1317798728-28938-7-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 6/6 v2] vvfat: reorganize computation of disk geometry List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com 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 --- v1->v2: do not change default 2.88MB format to FAT16 block/vvfat.c | 38 ++++++++++++++++++++++++---------------- 1 files changed, 24 insertions(+), 16 deletions(-) diff --git a/block/vvfat.c b/block/vvfat.c index faf2947..8511fe5 100644 --- a/block/vvfat.c +++ b/block/vvfat.c @@ -982,7 +982,6 @@ static int is_consistent(BDRVVVFATState *s); static int vvfat_open(BlockDriverState *bs, const char* dirname, int flags) { BDRVVVFATState *s = bs->opaque; - int floppy = 0; int i; #ifdef DEBUG @@ -996,11 +995,8 @@ DLOG(if (stderr == NULL) { s->bs = bs; - s->fat_type=16; /* LATER TODO: if FAT32, adjust */ s->sectors_per_cluster=0x10; - /* 504MB disk*/ - bs->cyls=1024; bs->heads=16; bs->secs=63; s->current_cluster=0xffffffff; @@ -1015,14 +1011,6 @@ DLOG(if (stderr == NULL) { if (!strstart(dirname, "fat:", NULL)) 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:")) { fprintf(stderr, "Big fat greek warning: FAT32 has not been tested. You are welcome to do so!\n"); s->fat_type = 32; @@ -1030,7 +1018,27 @@ DLOG(if (stderr == NULL) { s->fat_type = 16; } else if (strstr(dirname, ":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); @@ -1058,10 +1066,10 @@ DLOG(if (stderr == NULL) { if(s->first_sectors_number==0x40) init_mbr(s); - - /* for some reason or other, MS-DOS does not like to know about CHS... */ - if (floppy) + else { + /* MS-DOS does not like to know about CHS (?). */ bs->heads = bs->cyls = bs->secs = 0; + } // assert(is_consistent(s)); qemu_co_mutex_init(&s->lock); -- 1.7.6.4