From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1IZClK-0002rW-2g for qemu-devel@nongnu.org; Sat, 22 Sep 2007 17:43:42 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1IZClI-0002rD-Ha for qemu-devel@nongnu.org; Sat, 22 Sep 2007 17:43:41 -0400 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1IZClI-0002r8-Er for qemu-devel@nongnu.org; Sat, 22 Sep 2007 17:43:40 -0400 Received: from wa-out-1112.google.com ([209.85.146.182]) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1IZClH-00057L-PS for qemu-devel@nongnu.org; Sat, 22 Sep 2007 17:43:40 -0400 Received: by wa-out-1112.google.com with SMTP id k22so1589697waf for ; Sat, 22 Sep 2007 14:43:38 -0700 (PDT) Message-ID: <219e947f0709221443l494e4c46w6efafce989dbb867@mail.gmail.com> Date: Sun, 23 Sep 2007 00:43:37 +0300 From: "Ivan Kalvachev" MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_50885_1174242.1190497418004" Subject: [Qemu-devel] [PATCH] vvfat mbr fixes Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org ------=_Part_50885_1174242.1190497418004 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Hello, I've been having problems using vvfat virtual block device. Even linux fdisk was able to find problems with it. The reason turned out to be simple, MBR have bogus parameters. 1. Partition size in sectors is threated as partition end, causing the partition to have the same size as the device, while starting 63 sectors inside it. 2. The disk CHS geometry was set to maximum allowed values, not the maximum sizes of parameters. Cylinders = 1024 -> 0 .. 1023 Heads = 16 -> 0 .. 15 Sectors = 63 -> 1 .. 63 By historical reasons sectors maximum allowed value and size match. I've changed it to correct values. Now disks are at 504MB limit. 3. The size of partition was fixed with pre-calculated value based on the wrong geometry. I've implemented dynamic calculation. 4. The size of partition have been precalculated to fill the maximum geometry. However usually this means that there is incomplete cluster at the end of it. I've implemented proper shrinking of the partition after init_directories(). 5. WinNT clones refuse to mount disk that doesn't have NT-ID. I set it to 'qemu'. :) As a bonus I reworked the rest of init_mbr code, so it can handle disk outside the CHS limits in a way that all modern systems do, using LBA. Because I couldn't find sector->CHS function I wrote one and to simplify its calling I changed the 3 separate bytes for CHS into an array of 3. Also when LBA mode is detected it sets the proper FAT partition types. I haven't touched any of the directory/boot_record/etc code. (I haven't done automatic fat/partition/disk growing, so far it all have to fit into the maximum CHS geometry). I also moved the ":rw:" handling after other option parsing, as some of them change the sector_count that is used to initialize the snapshot device. However in qemu-0.9.0 and qemu-cvs RW mode doesn't work for me, it fails at bdrv_open() in enable_write_target(). I'll try to debug that and if I find solution I would send additional patch. The attached patch is to the current CVS, it should apply to qemu-0.9.0 with `patch -l`, as there have been only whitespace changes. Here is some simple table of the virtual disk, that would help you understand the code changes. ==== MBR - 0 --- partition_start boot - first_sectors_number-1 FAT1 - first_sectors_number FAT2 - first_sectors_number+sectors_per_fat DIR_ROOT - first_sectors_number+2*sectors_per_fat = faked_sectors ...data... partition_end - cluster_count*sectors_per_cluster + faked_sectors = sector_count ==== P.S. Maybe it is good idea to use 80/2/18 CHS for 1.44MB floppy, instead of 80/2/36 CHS for 2.88MB. Linux doesn't seem to autodetect them. The problem is noticed first by Thomas Schwinge in mail to qemu-dev at 28 Mart. ------=_Part_50885_1174242.1190497418004 Content-Type: application/octet-stream; name="qemu_vvfat_mbr.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="qemu_vvfat_mbr.patch" X-Attachment-Id: f_f6wn4w7q LS0tIG9sZHFlbXUvYmxvY2stdnZmYXQuYwkyMDA3LTA5LTE3IDExOjA5OjQzLjAwMDAwMDAwMCAr MDMwMAorKysgbmV3cWVtdS9ibG9jay12dmZhdC5jCTIwMDctMDktMjIgMjI6NTg6MTcuMDQ0MzMz MDE3ICswMzAwCkBAIC0yNDQsMTUgKzI0NCwxMSBAQCB0eXBlZGVmIHN0cnVjdCBib290c2VjdG9y X3QgewogCiB0eXBlZGVmIHN0cnVjdCBwYXJ0aXRpb25fdCB7CiAgICAgdWludDhfdCBhdHRyaWJ1 dGVzOyAvKiAweDgwID0gYm9vdGFibGUgKi8KLSAgICB1aW50OF90IHN0YXJ0X2hlYWQ7Ci0gICAg dWludDhfdCBzdGFydF9zZWN0b3I7Ci0gICAgdWludDhfdCBzdGFydF9jeWxpbmRlcjsKLSAgICB1 aW50OF90IGZzX3R5cGU7IC8qIDB4MSA9IEZBVDEyLCAweDYgPSBGQVQxNiwgMHhiID0gRkFUMzIg Ki8KLSAgICB1aW50OF90IGVuZF9oZWFkOwotICAgIHVpbnQ4X3QgZW5kX3NlY3RvcjsKLSAgICB1 aW50OF90IGVuZF9jeWxpbmRlcjsKKyAgICB1aW50OF90IHN0YXJ0X0NIU1szXTsKKyAgICB1aW50 OF90IGZzX3R5cGU7IC8qIDB4MSA9IEZBVDEyLCAweDYgPSBGQVQxNiwgMHhlID0gRkFUMTZfTEJB LCAweGIgPSBGQVQzMiwgMHhjID0gRkFUMzJfTEJBICovCisgICAgdWludDhfdCBlbmRfQ0hTWzNd OwogICAgIHVpbnQzMl90IHN0YXJ0X3NlY3Rvcl9sb25nOwotICAgIHVpbnQzMl90IGVuZF9zZWN0 b3JfbG9uZzsKKyAgICB1aW50MzJfdCBsZW5ndGhfc2VjdG9yX2xvbmc7CiB9IF9fYXR0cmlidXRl X18oKHBhY2tlZCkpIHBhcnRpdGlvbl90OwogCiB0eXBlZGVmIHN0cnVjdCBtYnJfdCB7CkBAIC0z NTAsMjYgKzM0Niw1MiBAQCB0eXBlZGVmIHN0cnVjdCBCRFJWVlZGQVRTdGF0ZSB7CiAgICAgaW50 IGRvd25jYXNlX3Nob3J0X25hbWVzOwogfSBCRFJWVlZGQVRTdGF0ZTsKIAorc3RhdGljIGludCBj b252ZXJ0X3NlY3RvcjJDSFMoQmxvY2tEcml2ZXJTdGF0ZSogYnMsIHVpbnQ4X3QgKiBDSFMsIGlu dCBzcG9zKXsKKyAgICBpbnQgaGVhZCxzZWN0b3I7CisgICAgc2VjdG9yICAgPSBzcG9zICUgKGJz LT5zZWNzKTsgIHNwb3MvPSBicy0+c2VjczsKKyAgICBoZWFkICAgICA9IHNwb3MgJSAoYnMtPmhl YWRzKTsgc3Bvcy89IGJzLT5oZWFkczsKKyAgICBpZihzcG9zID49IGJzLT5jeWxzKXsKKyAgICAg ICAgLyogV2luZG93cy9Eb3MgaXMgc2VpZCB0byB0YWtlIDEwMjMvMjU1LzYzIGFzIG5vbnJlcHJl c2VudGFibGUgQ0hTICovCisgICAgICAgIENIU1swXSA9IDB4RkY7CisgICAgICAgIENIU1sxXSA9 IDB4RkY7CisgICAgICAgIENIU1syXSA9IDB4RkY7CisgICAgICAgIHJldHVybiAxOworICAgIH0K KyAgICBDSFNbMF0gPSAodWludDhfdCloZWFkOy8vaGVhZAorICAgIENIU1sxXSA9ICh1aW50OF90 KSggKHNlY3RvcisxKSB8ICgoc3Bvcz4+OCk8PDYpICk7IC8vc2VjdG9yK2hpKGN5bGluZGVyKQor ICAgIENIU1syXSA9ICh1aW50OF90KXNwb3M7Ly9jeWxpbmRlcgorICAgIHJldHVybiAwOworfQog CiBzdGF0aWMgdm9pZCBpbml0X21icihCRFJWVlZGQVRTdGF0ZSogcykKIHsKICAgICAvKiBUT0RP OiBpZiB0aGUgZmlsZXMgbWJyLmltZyBhbmQgYm9vdHNlY3QuaW1nIGV4aXN0LCB1c2UgdGhlbSAq LwogICAgIG1icl90KiByZWFsX21icj0obWJyX3QqKXMtPmZpcnN0X3NlY3RvcnM7CiAgICAgcGFy dGl0aW9uX3QqIHBhcnRpdGlvbj0mKHJlYWxfbWJyLT5wYXJ0aXRpb25bMF0pOworICAgIGludCBs YmE7CiAKICAgICBtZW1zZXQocy0+Zmlyc3Rfc2VjdG9ycywwLDUxMik7CiAKKyAgICAvKiBXaW4g TlQgRGlzayBTaWduYXR1cmUgKi8KKyAgICByZWFsX21ici0+aWdub3JlZFsweDFiOF09J3EnOwor ICAgIHJlYWxfbWJyLT5pZ25vcmVkWzB4MWI5XT0nZSc7CisgICAgcmVhbF9tYnItPmlnbm9yZWRb MHgxYmFdPSdtJzsKKyAgICByZWFsX21ici0+aWdub3JlZFsweDFiYl09J3UnOworICAgCiAgICAg cGFydGl0aW9uLT5hdHRyaWJ1dGVzPTB4ODA7IC8qIGJvb3RhYmxlICovCi0gICAgcGFydGl0aW9u LT5zdGFydF9oZWFkPTE7Ci0gICAgcGFydGl0aW9uLT5zdGFydF9zZWN0b3I9MTsKLSAgICBwYXJ0 aXRpb24tPnN0YXJ0X2N5bGluZGVyPTA7CisgICAgCisgICAgbGJhID1jb252ZXJ0X3NlY3RvcjJD SFMocy0+YnMsIHBhcnRpdGlvbi0+c3RhcnRfQ0hTLCBzLT5maXJzdF9zZWN0b3JzX251bWJlci0x KTsKKyAgICBsYmF8PWNvbnZlcnRfc2VjdG9yMkNIUyhzLT5icywgcGFydGl0aW9uLT5lbmRfQ0hT LCBzLT5zZWN0b3JfY291bnQpOworCisgICAgcGFydGl0aW9uLT5zdGFydF9zZWN0b3JfbG9uZyA9 Y3B1X3RvX2xlMzIocy0+Zmlyc3Rfc2VjdG9yc19udW1iZXItMSk7CisgICAgcGFydGl0aW9uLT5s ZW5ndGhfc2VjdG9yX2xvbmc9Y3B1X3RvX2xlMzIocy0+c2VjdG9yX2NvdW50IC0gcy0+Zmlyc3Rf c2VjdG9yc19udW1iZXIrMSk7CisKICAgICAvKiBGQVQxMi9GQVQxNi9GQVQzMiAqLwotICAgIHBh cnRpdGlvbi0+ZnNfdHlwZT0ocy0+ZmF0X3R5cGU9PTEyPzB4MTpzLT5mYXRfdHlwZT09MTY/MHg2 OjB4Yik7Ci0gICAgcGFydGl0aW9uLT5lbmRfaGVhZD1zLT5icy0+aGVhZHMtMTsKLSAgICBwYXJ0 aXRpb24tPmVuZF9zZWN0b3I9MHhmZjsgLyogZW5kIHNlY3RvciAmIHVwcGVyIDIgYml0cyBvZiBj eWxpbmRlciAqLzsKLSAgICBwYXJ0aXRpb24tPmVuZF9jeWxpbmRlcj0weGZmOyAvKiBsb3dlciA4 IGJpdHMgb2YgZW5kIGN5bGluZGVyICovOwotICAgIHBhcnRpdGlvbi0+c3RhcnRfc2VjdG9yX2xv bmc9Y3B1X3RvX2xlMzIocy0+YnMtPnNlY3MpOwotICAgIHBhcnRpdGlvbi0+ZW5kX3NlY3Rvcl9s b25nPWNwdV90b19sZTMyKHMtPnNlY3Rvcl9jb3VudCk7CisgICAgaWYobGJhKQorICAgICAgICAv KkxCQSBwYXJ0aXRpb25zIGFyZSBpZGVudGlmaWVkIGJ5IHN0YXJ0L2VuZ3RoX3NlY3Rvcl9sb25n IG5vdCBieSBDSFMqLworICAgICAgICBwYXJ0aXRpb24tPmZzX3R5cGU9KHMtPmZhdF90eXBlPT0x Mj8weDE6cy0+ZmF0X3R5cGU9PTE2PzB4ZToweGMpOworICAgIGVsc2UKKyAgICAgICAgcGFydGl0 aW9uLT5mc190eXBlPShzLT5mYXRfdHlwZT09MTI/MHgxOnMtPmZhdF90eXBlPT0xNj8weDY6MHhi KTsKIAogICAgIHJlYWxfbWJyLT5tYWdpY1swXT0weDU1OyByZWFsX21ici0+bWFnaWNbMV09MHhh YTsKIH0KQEAgLTk3MywxMCArOTk1LDEwIEBAIERMT0coaWYgKHN0ZGVyciA9PSBOVUxMKSB7CiAK ICAgICBzLT5mYXRfdHlwZT0xNjsKICAgICAvKiBMQVRFUiBUT0RPOiBpZiBGQVQzMiwgYWRqdXN0 ICovCi0gICAgcy0+c2VjdG9yX2NvdW50PTB4ZWMwNGY7CiAgICAgcy0+c2VjdG9yc19wZXJfY2x1 c3Rlcj0weDEwOwotICAgIC8qIExBVEVSIFRPRE86IHRoaXMgY291bGQgYmUgd3JvbmcgZm9yIEZB VDMyICovCi0gICAgYnMtPmN5bHM9MTAyMzsgYnMtPmhlYWRzPTE1OyBicy0+c2Vjcz02MzsKKyAg ICAvKiBLZWVwIHRoaXMgZ2VvbWV0cnkgZm9yIGRpc2sgKzUxMk1CIGFuZCB1c2UgTEJBIG1vZGVs Ki8KKyAgICBicy0+Y3lscz0xMDI0OyBicy0+aGVhZHM9MTY7IGJzLT5zZWNzPTYzOworCiAKICAg ICBzLT5jdXJyZW50X2NsdXN0ZXI9MHhmZmZmZmZmZjsKIApAQCAtOTkxLDExICsxMDEzLDYgQEAg RExPRyhpZiAoc3RkZXJyID09IE5VTEwpIHsKICAgICBpZiAoIXN0cnN0YXJ0KGRpcm5hbWUsICJm YXQ6IiwgTlVMTCkpCiAJcmV0dXJuIC0xOwogCi0gICAgaWYgKHN0cnN0cihkaXJuYW1lLCAiOnJ3 OiIpKSB7Ci0JaWYgKGVuYWJsZV93cml0ZV90YXJnZXQocykpCi0JICAgIHJldHVybiAtMTsKLQli cy0+cmVhZF9vbmx5ID0gMDsKLSAgICB9CiAKICAgICBpZiAoc3Ryc3RyKGRpcm5hbWUsICI6Zmxv cHB5OiIpKSB7CiAJZmxvcHB5ID0gMTsKQEAgLTEwMDUsNiArMTAyMiw4IEBAIERMT0coaWYgKHN0 ZGVyciA9PSBOVUxMKSB7CiAJYnMtPmN5bHMgPSA4MDsgYnMtPmhlYWRzID0gMjsgYnMtPnNlY3Mg PSAzNjsKICAgICB9CiAKKyAgICBzLT5zZWN0b3JfY291bnQ9YnMtPmN5bHMqYnMtPmhlYWRzKmJz LT5zZWNzOworCiAgICAgaWYgKHN0cnN0cihkaXJuYW1lLCAiOjMyOiIpKSB7CiAJZnByaW50Zihz dGRlcnIsICJCaWcgZmF0IGdyZWVrIHdhcm5pbmc6IEZBVDMyIGhhcyBub3QgYmVlbiB0ZXN0ZWQu IFlvdSBhcmUgd2VsY29tZSB0byBkbyBzbyFcbiIpOwogCXMtPmZhdF90eXBlID0gMzI7CkBAIC0x MDE1LDYgKzEwMzQsMTIgQEAgRExPRyhpZiAoc3RkZXJyID09IE5VTEwpIHsKIAlzLT5zZWN0b3Jf Y291bnQ9Mjg4MDsKICAgICB9CiAKKyAgICBpZiAoc3Ryc3RyKGRpcm5hbWUsICI6cnc6IikpIHsK KwlpZiAoZW5hYmxlX3dyaXRlX3RhcmdldChzKSkKKwkgICAgcmV0dXJuIC0xOworCWJzLT5yZWFk X29ubHkgPSAwOworICAgIH0KKwogICAgIGkgPSBzdHJyY2hyKGRpcm5hbWUsICc6JykgLSBkaXJu YW1lOwogICAgIGFzc2VydChpID49IDMpOwogICAgIGlmIChkaXJuYW1lW2ktMl0gPT0gJzonICYm IGlzYWxwaGEoZGlybmFtZVtpLTFdKSkKQEAgLTEwMjQsMTEgKzEwNDksMTIgQEAgRExPRyhpZiAo c3RkZXJyID09IE5VTEwpIHsKIAlkaXJuYW1lICs9IGkrMTsKIAogICAgIGJzLT50b3RhbF9zZWN0 b3JzPWJzLT5jeWxzKmJzLT5oZWFkcypicy0+c2VjczsKLSAgICBpZiAocy0+c2VjdG9yX2NvdW50 ID4gYnMtPnRvdGFsX3NlY3RvcnMpCi0Jcy0+c2VjdG9yX2NvdW50ID0gYnMtPnRvdGFsX3NlY3Rv cnM7CisKICAgICBpZihpbml0X2RpcmVjdG9yaWVzKHMsIGRpcm5hbWUpKQogCXJldHVybiAtMTsK IAorICAgIHMtPnNlY3Rvcl9jb3VudCA9IHMtPmZha2VkX3NlY3RvcnMgKyBzLT5zZWN0b3JzX3Bl cl9jbHVzdGVyKnMtPmNsdXN0ZXJfY291bnQ7CisKICAgICBpZihzLT5maXJzdF9zZWN0b3JzX251 bWJlcj09MHg0MCkKIAlpbml0X21icihzKTsKIAo= ------=_Part_50885_1174242.1190497418004--