On Wed, Dec 06, 2006 at 04:44:32AM +, Mikolaj Kucharski wrote:
On Tue, Dec 05, 2006 at 09:27:39PM -0700, Chris Kuethe wrote:
On 12/5/06, Mikolaj Kucharski [EMAIL PROTECTED] wrote:
sd0 at scsibus1 targ 1 lun 0: Apple, iPod, 1.62 SCSI0 0/direct removable
sd0: 76319MB, 19079 cyl, 64 head, 32 sec, 2048 bytes/sec, 39075372 sec
total
80GB. Maybe it's one of the ipods with 2K sectors. Look in the
archives for an experimental patch to possibly make this work.
It looks like perfect answer. Thanks.
http://marc.theaimsgroup.com/?t=11634568114r=1w=2
I used all patches from thread above (sd, msdosfs, and fdisk patch) and
iPod and fdisk are working like a charm. Thanks!
$ sysctl -n kern.version
OpenBSD 4.0-current (ACPI) #8: Wed Dec 6 03:34:00 MST 2006
[EMAIL PROTECTED]:/usr/src/sys/arch/i386/compile/ACPI
Patches attached in this mail too.
--
best regards
q#
Index: sbin/fdisk/cmd.c
===
RCS file: /cvs/src/sbin/fdisk/cmd.c,v
retrieving revision 1.42
diff -u -r1.42 cmd.c
--- sbin/fdisk/cmd.c2006/07/27 04:06:13 1.42
+++ sbin/fdisk/cmd.c2006/12/06 18:34:36
@@ -46,7 +46,7 @@
char buf[DEV_BSIZE];
/* Copy template MBR */
- MBR_make(tt, buf);
+ MBR_make(tt, buf, disk-real-sec_size);
MBR_parse(disk, buf, mbr-offset, mbr-reloffset, mbr);
MBR_init(disk, mbr);
@@ -321,8 +321,8 @@
printf(Writing MBR at offset %d.\n, offset);
fd = DISK_open(disk-name, O_RDWR);
- MBR_make(mbr, mbr_buf);
- if (MBR_write(fd, offset, mbr_buf) != -1)
+ MBR_make(mbr, mbr_buf, disk-real-sec_size);
+ if (MBR_write(fd, offset, mbr_buf, disk-real-sec_size) != -1)
ret = CMD_CLEAN;
close(fd);
return (ret);
Index: sbin/fdisk/disk.c
===
RCS file: /cvs/src/sbin/fdisk/disk.c,v
retrieving revision 1.25
diff -u -r1.25 disk.c
--- sbin/fdisk/disk.c 2006/11/19 20:17:12 1.25
+++ sbin/fdisk/disk.c 2006/12/06 18:34:36
@@ -99,11 +99,21 @@
lm-heads = dl.d_ntracks;
lm-sectors = dl.d_nsectors;
lm-size = dl.d_secperunit;
+ lm-sec_size = dl.d_secsize;
unit_types[SECTORS].conversion = dl.d_secsize;
}
DISK_close(fd);
}
+ if (lm lm-sec_size != 512 lm-sec_size != 1024
+ lm-sec_size != 2048 lm-sec_size != 4096
+ lm-sec_size != 8192) {
+
+ warnx(Invalid sector size %d, setting to %d, lm-sec_size,
+ DEV_BSIZE);
+ lm-sec_size = DEV_BSIZE;
+ }
+
return (lm);
}
@@ -157,6 +167,7 @@
bm-heads = di.bios_heads;
bm-sectors = di.bios_sectors;
bm-size = di.bios_cylinders * di.bios_heads * di.bios_sectors;
+ bm-sec_size = DEV_BSIZE;
return (bm);
}
#else
@@ -187,6 +198,13 @@
disk-label = DISK_getlabelmetrics(disk-name);
disk-bios = DISK_getbiosmetrics(disk-name);
+ /*
+* If we have a disklabel, the kernel tells us what size sector
+* this raw device has. As such, use it. Yes, not pretty.
+*/
+ if (disk-label disk-bios)
+ disk-bios-sec_size = disk-label-sec_size;
+
/* If user supplied, use that */
if (user) {
disk-real = user;
@@ -236,11 +254,12 @@
size = ((double)disk-real-size * unit_types[SECTORS].conversion) /
unit_types[i].conversion;
printf(Disk: %s\t, disk-name);
- if (disk-real)
- printf(geometry: %d/%d/%d [%.0f %s]\n, disk-real-cylinders,
+ if (disk-real) {
+ printf(geometry: %d/%d/%d [%.0f %s] , disk-real-cylinders,
disk-real-heads, disk-real-sectors, size,
unit_types[i].lname);
- else
+ printf((%d byte sectors)\n, disk-real-sec_size);
+ } else
printf(geometry: none\n);
return (0);
Index: sbin/fdisk/disk.h
===
RCS file: /cvs/src/sbin/fdisk/disk.h,v
retrieving revision 1.8
diff -u -r1.8 disk.h
--- sbin/fdisk/disk.h 2004/08/03 09:22:03 1.8
+++ sbin/fdisk/disk.h 2006/12/06 18:34:36
@@ -34,6 +34,7 @@
u_int32_t heads;
u_int32_t sectors;
u_int32_t size;
+ u_int32_t sec_size;
} DISK_metrics;
typedef struct _disk_t {
Index: sbin/fdisk/fdisk.c
===
RCS file: /cvs/src/sbin/fdisk/fdisk.c,v
retrieving revision 1.46
diff -u -r1.46 fdisk.c
--- sbin/fdisk/fdisk.c 2006/11/09 00:01:10 1.46
+++ sbin/fdisk/fdisk.c 2006/12/06 18:34:43
@@ -78,8 +78,10 @@
char *mbrfile = NULL;
#endif
mbr_t mbr;
- char mbr_buf[DEV_BSIZE];
+ char mbr_buf[MBR_MAX_SIZE];
+