Hi,

I am blindly testing gmirror, just for fun. I got an old 8G drive and did some tests. Maybe I did find a bug in gmirror. This is a long message, but please read it to the end if you are a gmirror or GEOM hacker.

First, I partioned (fdisk) for a full FreeBSD system, with sysinstall, which got me this:

******* Working on device /dev/ad1 *******
parameters extracted from in-core disklabel are:
cylinders=16368 heads=16 sectors/track=63 (1008 blks/cyl)

Figures below won't work with BIOS for partitions not in cyl 1
parameters to be used for BIOS calculations are:
cylinders=16368 heads=16 sectors/track=63 (1008 blks/cyl)

Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
    start 63, size 16498881 (8056 Meg), flag 80 (active)
   beg: cyl 0/ head 1/ sector 1;
   end: cyl 1023/ head 15/ sector 63
The data for partition 2 is:
<UNUSED>
The data for partition 3 is:
<UNUSED>
The data for partition 4 is:
<UNUSED>

    Then I tried to compose a single disk gmirror with the whole ad1 disk:

sigesc::root jcmendes [531] gmirror list
sigesc::root jcmendes [532] gmirror label -b load -v vol0 ad1
Metadata value stored on ad1.
Done.
sigesc::root jcmendes [533] gmirror list
Geom name: vol0
State: COMPLETE
Components: 1
Balance: load
Slice: 4096
Flags: NONE
SyncID: 1
ID: 1397575407
Providers:
1. Name: mirror/vol0
   Mediasize: 8447458816 (7.9G)
   Sectorsize: 512
   Mode: r0w0e0
Consumers:
1. Name: ad1
   Mediasize: 8447459328 (7.9G)
   Sectorsize: 512
   Mode: r0w0e0
   State: ACTIVE
   Priority: 0
   Flags: NONE
   SyncID: 1
   ID: 3966559351

Geom name: vol0.sync

sigesc::root jcmendes [534] ls -l /dev/mirror/
total 1
dr-xr-xr-x  2 root  wheel          512 Nov 24 18:45 .
dr-xr-xr-x  5 root  wheel          512 Nov 24 18:45 ..
crw-r-----  1 root  operator    4,  50 Nov 24 18:45 vol0
crw-r-----  1 root  operator    4,  51 Nov 24 18:45 vol0s1
crw-r-----  1 root  operator    4,  52 Nov 24 18:45 vol0s1a
crw-r-----  1 root  operator    4,  53 Nov 24 18:45 vol0s1b
crw-r-----  1 root  operator    4,  54 Nov 24 18:45 vol0s1c
crw-r-----  1 root  operator    4,  55 Nov 24 18:45 vol0s1d
sigesc::root jcmendes [535] fdisk /dev/mirror/vol0
******* Working on device /dev/mirror/vol0 *******
parameters extracted from in-core disklabel are:
cylinders=1027 heads=255 sectors/track=63 (16065 blks/cyl)

Figures below won't work with BIOS for partitions not in cyl 1
parameters to be used for BIOS calculations are:
cylinders=1027 heads=255 sectors/track=63 (16065 blks/cyl)

Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
    start 63, size 16498881 (8056 Meg), flag 80 (active)
   beg: cyl 0/ head 1/ sector 1;
   end: cyl 1023/ head 15/ sector 63
The data for partition 2 is:
<UNUSED>
The data for partition 3 is:
<UNUSED>
The data for partition 4 is:
<UNUSED>
sigesc::root jcmendes [536]

Aparently, everything is fine until here.  But now:

sigesc::root jcmendes [536] disklabel /dev/mirror/vol0s1
# /dev/mirror/vol0s1:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 1048576 63 4.2BSD 2048 16384 8
b: 1048576 1048639 swap
c: 16498881 63 unused 0 0 # "raw" part, don't edit
d: 14401729 2097215 4.2BSD 2048 16384 28552
partition c: partition extends past end of unit
disklabel: partition c doesn't start at 0!
disklabel: An incorrect partition c may cause problems for standard system utilities
partition d: partition extends past end of unit
sigesc::root jcmendes [537]


    Obviously, this must not be correct.

    I try to check the base disk, but:

sigesc::root jcmendes [542] disklabel /dev/ad1s1
disklabel: /dev/ad1s1: No such file or directory
sigesc::root jcmendes [543] ls -l /dev/ad1*
crw-r-----  1 root  operator    4,  16 Nov 24 18:58 /dev/ad1
sigesc::root jcmendes [544]

    Hey, where are the base partition slices?

Now, lets reboot. I could not unload geom_mirror, since it was preloaded during boot, is this expected? The device could not be unloaded, but the volume disapeared (gmirror list, ls /dev/mirror). This is surely not good. Thats why I did reboot. Bug #1.

After the reboot, the device is back (gmirror list). And, surprise, the disklabel is magically corrected:

sigesc::root jcmendes [504] disklabel mirror/vol0s1
# /dev/mirror/vol0s1:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 1048576 0 4.2BSD 2048 16384 8
b: 1048576 1048576 swap
c: 16498881 0 unused 0 0 # "raw" part, don't edit
d: 14401729 2097152 4.2BSD 2048 16384 28552
sigesc::root jcmendes [505]



Ok, now let's try something diferent. Let's suppose that I only want one slice mirrored. Maybe the other slices could be standalone, or striped, this is not important now. Let's just say I do want to mirror ad1s1, instead of the whole ad1.


sigesc::root jcmendes [506] gmirror remove vol0 ad1
sigesc::root jcmendes [507] gmirror label -b load -v vol0 ad1s1
Metadata value stored on ad1s1.
Done.
sigesc::root jcmendes [508] gmirror list
Geom name: vol0
State: COMPLETE
Components: 1
Balance: load
Slice: 4096
Flags: NONE
SyncID: 1
ID: 3056186377
Providers:
1. Name: mirror/vol0
   Mediasize: 8447426560 (7.9G)
   Sectorsize: 512
   Mode: r0w0e0
Consumers:
1. Name: ad1
   Mediasize: 8447459328 (7.9G)
   Sectorsize: 512
   Mode: r0w0e0
   State: ACTIVE
   Priority: 0
   Flags: NONE
   SyncID: 1
   ID: 4157180820

Geom name: vol0.sync

sigesc::root jcmendes [509]

Note that the volume size now is different: 8447426560, instead of
8447458816, for the previous config. This means 32256 bytes, or 63 sectors. It's apparently ok.


    But the consumer name is still ad1, and not ad1s1.  Hey, let's check:

sigesc::root jcmendes [510] dd count=1 if=/dev/ad1 of=/tmp/1
1+0 records in
1+0 records out
512 bytes transferred in 0.038226 secs (13394 bytes/sec)
sigesc::root jcmendes [511] dd count=1 if=/dev/mirror/vol0 of=/tmp/2
1+0 records in
1+0 records out
512 bytes transferred in 0.000713 secs (717982 bytes/sec)
sigesc::root jcmendes [512] cmp /tmp/1 /tmp/2
sigesc::root jcmendes [513] dd count=1 if=/dev/ad1 skip=63 of=/tmp/1
1+0 records in
1+0 records out
512 bytes transferred in 0.000655 secs (781471 bytes/sec)
sigesc::root jcmendes [514] cmp /tmp/1 /tmp/2
/tmp/1 /tmp/2 differ: char 1, line 1
sigesc::root jcmendes [515]

Oops. It seens that gmirror got the right size and the wrong offset. And I did not need to do all this. I could simply use ls:

sigesc::root jcmendes [516] ls -l /dev/mirror/
total 1
dr-xr-xr-x  2 root  wheel          512 Nov 24 19:06 .
dr-xr-xr-x  5 root  wheel          512 Nov 24 19:06 ..
crw-r-----  1 root  operator    4,  33 Nov 24 19:06 vol0
crw-r-----  1 root  operator    4,  34 Nov 24 19:06 vol0s1
crw-r-----  1 root  operator    4,  35 Nov 24 19:06 vol0s1a
crw-r-----  1 root  operator    4,  36 Nov 24 19:06 vol0s1b
crw-r-----  1 root  operator    4,  37 Nov 24 19:06 vol0s1c
crw-r-----  1 root  operator    4,  38 Nov 24 19:06 vol0s1d
sigesc::root jcmendes [517]

If gmirror was only mirroring the ad1s1 slice, it should not see new slices inside. I would expect to find vol0 and vol0[abcd] only...

    Disklabel is still crazy, and fdisk detects the slices it should'nt:

sigesc::root jcmendes [518] disklabel /dev/mirror/vol0s1
# /dev/mirror/vol0s1:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 1048576 63 4.2BSD 2048 16384 8
b: 1048576 1048639 swap
c: 16498881 63 unused 0 0 # "raw" part, don't edit
d: 14401729 2097215 4.2BSD 2048 16384 28552
partition c: partition extends past end of unit
disklabel: partition c doesn't start at 0!
disklabel: An incorrect partition c may cause problems for standard system utilities
partition d: partition extends past end of unit
sigesc::root jcmendes [519] fdisk /dev/mirror/vol0
******* Working on device /dev/mirror/vol0 *******
parameters extracted from in-core disklabel are:
cylinders=1027 heads=255 sectors/track=63 (16065 blks/cyl)


Figures below won't work with BIOS for partitions not in cyl 1
parameters to be used for BIOS calculations are:
cylinders=1027 heads=255 sectors/track=63 (16065 blks/cyl)

Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
    start 63, size 16498881 (8056 Meg), flag 80 (active)
        beg: cyl 0/ head 1/ sector 1;
        end: cyl 1023/ head 15/ sector 63
The data for partition 2 is:
<UNUSED>
The data for partition 3 is:
<UNUSED>
The data for partition 4 is:
<UNUSED>
sigesc::root jcmendes [520]

    Now let's reboot again.

sigesc::root jcmendes [503] disklabel /dev/mirror/vol0s1a
# /dev/mirror/vol0s1a:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 1048576 63 4.2BSD 2048 16384 8
b: 1048576 1048639 swap
c: 16498881 63 unused 0 0 # "raw" part, don't edit
d: 14401729 2097215 4.2BSD 2048 16384 28552
partition a: partition extends past end of unit
partition b: offset past end of unit
partition b: partition extends past end of unit
partition c: partition extends past end of unit
disklabel: partition c doesn't start at 0!
disklabel: partition c doesn't cover the whole unit!
disklabel: An incorrect partition c may cause problems for standard system utilities
partition d: offset past end of unit
partition d: partition extends past end of unit
sigesc::root jcmendes [504]


This time, the disklabel did not return to its "good" state. And the offset bug is repeatable:

sigesc::root jcmendes [507] dd count=1 if=/dev/ad1 of=/tmp/1
1+0 records in
1+0 records out
512 bytes transferred in 0.000647 secs (791553 bytes/sec)
sigesc::root jcmendes [508] dd count=1 if=/dev/mirror/vol0 of=/tmp/2
1+0 records in
1+0 records out
512 bytes transferred in 0.000777 secs (658939 bytes/sec)
sigesc::root jcmendes [509] cmp /tmp/1 /tmp/2
sigesc::root jcmendes [510]

At least, the behaviour of the slice detection on main disk ad1 seems to be ok. The slices reappear if I remove the mirror partition.

sigesc::root jcmendes [513] ls -l /dev/ad1*
crw-r-----  1 root  operator    4,  16 Nov 24 19:20 /dev/ad1
sigesc::root jcmendes [514] gmirror remove -v vol0 ad1
Done.
sigesc::root jcmendes [515] gmirror list
sigesc::root jcmendes [516] ls -l /dev/ad1*
crw-r-----  1 root  operator    4,  16 Nov 24 19:20 /dev/ad1
crw-r-----  1 root  operator    4,  24 Nov 24 19:20 /dev/ad1s1
crw-r-----  1 root  operator    4,  25 Nov 24 19:20 /dev/ad1s1a
crw-r-----  1 root  operator    4,  26 Nov 24 19:20 /dev/ad1s1b
crw-r-----  1 root  operator    4,  27 Nov 24 19:20 /dev/ad1s1c
crw-r-----  1 root  operator    4,  28 Nov 24 19:20 /dev/ad1s1d
sigesc::root jcmendes [517]

Now the big question: Which is the expected behaviour of mirroring a slice? Whichever answer you give me, I'm sure the current behaviour is right. So, this must be a bug. Bug #2.

    Is there any gmirror hacker around to fix these?
_______________________________________________
[EMAIL PROTECTED] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to