public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* documented Oops running big-endian reiserfs on parisc architecture
@ 2001-09-02  8:55 thunder7
  2001-09-02 14:00 ` [parisc-linux] " Matthew Wilcox
  2001-09-03 10:25 ` Hans Reiser
  0 siblings, 2 replies; 28+ messages in thread
From: thunder7 @ 2001-09-02  8:55 UTC (permalink / raw)
  To: parisc-linux; +Cc: linux-kernel

Well, I watched the number of files in /lost+found grow every time I
had to pull the plug from my HP C200, so I added a 'sync' option in
/etc/fstab and tried to get reiserfs working.

I patched my 2.4.9-pa13 kernel with

endian-safe-reiserfs-for-2.4.8.patch

which went without warnings or errors. A patched
reiserfs-progs-3.x.0k-pre9 also built well (despite what the configure
scripts says, you _need_ automake).

Creating a reiserfs-partition went without a hitch.

running bonnie -s 128 on it did this:

Adding Swap: 1041400k swap-space (priority -1)
eth0: Setting half-duplex based on MII#1 link partner capability of 0021.
reiserfs: checking transaction log (device 08:03) ...
Using r5 hash to sort names
ReiserFS version 3.6.25
bonnie[163]: Unaligned data reference 28

     YZrvWESTHLNXBCVMcbcbcbcbOGFRQPDI
PSW: 00000000000001001111111100001110
r0-3     00000000 102ec550 10197d0c 26f24838
r4-7     26f24848 27054e40 00000011 00000020
r8-11    0000000a 26f06580 00000020 26f247a0
r12-15   27088d1c ffffffff 26f24838 00000001
r16-19   26f24708 faf02c68 0006a248 26f24852
r20-23   0000000f 00000003 03000000 00000002
r24-27   0000000a 0000000a 26f24848 102d4010
r28-31   26f24848 01000000 26f24b40 10196fc8
sr0-3    00000000 00000004 00000000 00000004
sr4-7    00000000 00000000 00000000 00000000

IASQ: 00000000 00000000 IAOQ: 10197d10 10197d14
 IIR: 0c7c1093    ISR: 00000000  IOR: 26f24846
 ORIG_R28: 00000000
pa8200:/var/log#

After reading in the archives about ksymoops, I looked up this part of
my System.map:

101979e0 T reiserfs_lookup
101979e0 t .L1432
10197ad4 t reiserfs_add_entry
10197e50 t .L1512
10197f28 t .L1510
10198068 T reiserfs_create

objdump -d /boot/linux-2.4.9-pa13 revealed:

10197cbc:       d6 d6 0b 18     depw,z r22,7,8,r22
10197cc0:       d6 b5 0a 10     depw,z r21,15,16,r21
10197cc4:       41 33 01 fe     ldb ff(sr0,r9),r19
10197cc8:       0a d5 02 75     or r21,r22,r21
10197ccc:       d6 94 09 08     depw,z r20,23,24,r20
10197cd0:       0a b4 02 74     or r20,r21,r20
10197cd4:       0a 93 02 73     or r19,r20,r19
10197cd8:       d2 75 18 f8     extrw,u r19,7,8,r21
10197cdc:       d2 74 19 f8     extrw,u r19,15,8,r20
10197ce0:       0c 73 12 16     stb  r19,b(sr0,r3)
10197ce4:       d2 73 1a f8     extrw,u r19,23,8,r19
10197ce8:       0c 75 12 10     stb  r21,8(sr0,r3)
10197cec:       0c 74 12 12     stb  r20,9(sr0,r3)
10197cf0:       e8 86 a9 e4     b,l 102a51e8 <memcpy>,%r2
10197cf4:       0c 73 12 14     stb  r19,a(sr0,r3)
10197cf8:       08 06 02 59     copy r6,r25
10197cfc:       08 04 02 5a     copy r4,r26
10197d00:       d7 20 1c 1d     depwi 0,31,3,r25
10197d04:       e8 0d a5 d8     call 101b1ff8 <padd_item>
10197d08:       08 08 02 58     copy r8,r24
10197d0c:       00 01 0e 74     rsm 1,r20
10197d10:       0c 7c 10 93     ldw  e(sr0,r3),r19
10197d14:       d6 60 1f 1f     depwi 0,7,1,r19
10197d18:       0c 73 12 9c     stw  r19,e(sr0,r3)
10197d1c:       00 14 18 60     mtsm r20
10197d20:       85 e0 26 32     cmpib,=,n 0,r15,10198040 <.L1510+0x118>
10197d24:       00 01 0e 74     rsm 1,r20
10197d28:       0c 7c 10 93     ldw  e(sr0,r3),r19
10197d2c:       d6 7f 1f 5f     depwi -1,5,1,r19
10197d30:       0c 73 12 9c     stw  r19,e(sr0,r3)
10197d34:       00 14 18 60     mtsm r20
10197d38:       08 00 02 54     copy r0,r20
10197d3c:       08 00 02 55     copy r0,r21
10197d40:       37 c6 3e 51     ldo -d8(sp),r6
10197d44:       37 cd 3d c1     ldo -120(sp),r13
10197d48:       6b d4 3e 51     stw r20,-d8(sr0,sp)
10197d4c:       6b d5 3e 59     stw r21,-d4(sr0,sp)
10197d50:       6b d4 3e 61     stw r20,-d0(sr0,sp)
10197d54:       6b d5 3e 69     stw r21,-cc(sr0,sp)
10197d58:       08 0c 02 59     copy r12,r25
10197d5c:       6b c6 3e 01     stw r6,-100(sr0,sp)
10197d60:       6b cd 3f 99     stw r13,-34(sr0,sp)
10197d64:       08 08 02 58     copy r8,r24
10197d68:       08 05 02 5a     copy r5,r26
10197d6c:       eb ff b4 4d     b,l 10197798 <reiserfs_find_entry>,%r2

which makes the error somewhere around here in 
fs/reiserfs/namei.c, function reiserfs_add_entry, after call to
padd_item, before call to reiserfs_find_entry:

    /* copy name */
    memcpy ((char *)(deh + 1), name, namelen);
    /* padd by 0s to the 4 byte boundary */
    padd_item ((char *)(deh + 1), ROUND_UP (namelen), namelen);

    /* entry is ready to be pasted into tree, set 'visibility' and 'stat data in entry' attributes */
    mark_de_without_sd (deh);
    visible ? mark_de_visible (deh) : mark_de_hidden (deh);

    /* find the proper place for the new entry */
    memset (bit_string, 0, sizeof (bit_string));
    de.de_gen_number_bit_string = (char *)bit_string;
    retval = reiserfs_find_entry (dir, name, namelen, &path, &de);


And there I'm stuck. I'm sending this to the parisc-list to document the
failure, and to linux-kernel to reach some reiserfs-experts, perhaps.

I'm willing to test anything!

Good luck,
Jurriaan
-- 
"I have seen her. That is enough, perhaps."
Pug smiled. "You are a rare man."
	Raymond E Feist - The King's Buccaneer
GNU/Linux 2.4.9-ac5 SMP/ReiserFS 2x1402 bogomips load av: 0.04 0.01 0.06

^ permalink raw reply	[flat|nested] 28+ messages in thread
* Re: [SOLVED + PATCH]: documented Oops running big-endian reiserfs on parisc architecture
@ 2001-09-03 12:08 Ulrich Weigand
  2001-09-03 13:14 ` Ralf Baechle
  2001-09-03 22:24 ` David S. Miller
  0 siblings, 2 replies; 28+ messages in thread
From: Ulrich Weigand @ 2001-09-03 12:08 UTC (permalink / raw)
  To: David S. Miller; +Cc: Richard.Zidlicky, thunder7, parisc-linux, linux-kernel


David Miller wrote:

>   From: Richard Zidlicky
<Richard.Zidlicky@stud.informatik.uni-erlangen.de>
>   Date: Mon, 3 Sep 2001 00:34:37 +0200
>
>   On Sun, Sep 02, 2001 at 07:57:17PM +0200, thunder7@xs4all.nl wrote:
>   >  /* 64 bit systems (and the S/390) need to be aligned explicitly -jdm
*/
>   > -#if BITS_PER_LONG == 64 || defined(__s390__)
>   > +#if BITS_PER_LONG == 64 || defined(__s390__) || defined(__hppa__)
>   >  #   define ADDR_UNALIGNED_BITS  (3)
>   >  #endif
>
>   couldn't reiserfs use asm/unaligned.h like anyone else?
>   Seems at least sparc and mips may need the same treatment.
>
>Sparc will act correctly for unaliagned accesses.
>
>It will trap and run very slowly, but it wont' OOPS and
>it will give correct results.
>
>This is actually required behavior, I don't know why parisc
>is acting differently.

>From what I recall when we were looking into reiserfs on S/390,
the core problem was that reiserfs tried to do *atomic* operations
on non-aligned words.  This isn't supported by the hardware on
S/390 (normal non-aligned accesses just work).

I don't really see how this can be fixed in a trap handler; how
would the handler guarantee atomicity?



Mit freundlichen Gruessen / Best Regards

Ulrich Weigand

--
  Dr. Ulrich Weigand
  Linux for S/390 Design & Development
  IBM Deutschland Entwicklung GmbH, Schoenaicher Str. 220, 71032 Boeblingen
  Phone: +49-7031/16-3727   ---   Email: Ulrich.Weigand@de.ibm.com


^ permalink raw reply	[flat|nested] 28+ messages in thread
[parent not found: <20010902105538.A15344@middle.of.nowhere.suse.lists.linux.kernel>]
* Re: [SOLVED + PATCH]: documented Oops running big-endian reiserfs on parisc architecture
@ 2001-09-04 14:34 Ulrich Weigand
  2001-09-04 15:02 ` Richard B. Johnson
  2001-09-04 16:09 ` John Alvord
  0 siblings, 2 replies; 28+ messages in thread
From: Ulrich Weigand @ 2001-09-04 14:34 UTC (permalink / raw)
  To: Jeff Mahoney; +Cc: Andi Kleen, linux-kernel


Jeff Mahoney wrote:

>    Are the S/390 asm/unaligned.h versions broken, or is the ReiserFS code
doing
>    something not planned for? It's a 16-bit member, at a 16-bit alignment
>    in the structure.  The structure itself need not be aligned in any
>    particular manner as it is read directly from disk, and is a packed
structure.

The S/390 unaligned.h macros are just direct assignments because the
S/390 hardware normally *allows* unaligned accesses just fine.

It is only *atomic* accesses (those implemented using the S/390
compare-and-swap instruction) that need to be word aligned; this includes
the atomic bit operations that reiserfs appears to be using.

If these instructions really *need* to be atomic, then reiserfs should
ensure they are performed on properly aligned data, or else there might
be subtle bugs even on Intel, because the operations will not actually
be atomic (even though they don't trap).

If you say that reiserfs doesn't really need these operations to be
atomic because they run under other locks anyway, then they should not
be using atomic operations in the first place; this will only cause
unnecessary slowdown even on Intel.


Mit freundlichen Gruessen / Best Regards

Ulrich Weigand

--
  Dr. Ulrich Weigand
  Linux for S/390 Design & Development
  IBM Deutschland Entwicklung GmbH, Schoenaicher Str. 220, 71032 Boeblingen
  Phone: +49-7031/16-3727   ---   Email: Ulrich.Weigand@de.ibm.com


^ permalink raw reply	[flat|nested] 28+ messages in thread
* Re: [SOLVED + PATCH]: documented Oops running big-endian reiserfs on parisc architecture
@ 2001-09-04 17:04 Ulrich Weigand
  0 siblings, 0 replies; 28+ messages in thread
From: Ulrich Weigand @ 2001-09-04 17:04 UTC (permalink / raw)
  To: John Alvord; +Cc: Jeff Mahoney, Andi Kleen, linux-kernel

John Alvord wrote:

>> It is only *atomic* accesses (those implemented using the S/390
>> compare-and-swap instruction) that need to be word aligned; this
includes
>> the atomic bit operations that reiserfs appears to be using.
>
>Aren't their some other "must align" instructions like CVB? Or have they
>all been relaxed...

CVB doesn't have any alignment requirement (I'm not sure it ever had one).
Execpt for the 'atomic' operations (CS, CSG, CDS, CDSG, LPQ, STPQ, PLO)
I know only of two general-purpose instructions with operand alignment
requirement, and that's LAM and STAM.  As access registers are not
normally used in Linux this shouldn't be a problem.

There *is* a whole bunch of privileged system instructions that have
various aligment requirements; but here I'd say it's fair to require the
user to provide correct aligment in these special cases.


Mit freundlichen Gruessen / Best Regards

Ulrich Weigand

--
  Dr. Ulrich Weigand
  Linux for S/390 Design & Development
  IBM Deutschland Entwicklung GmbH, Schoenaicher Str. 220, 71032 Boeblingen
  Phone: +49-7031/16-3727   ---   Email: Ulrich.Weigand@de.ibm.com


^ permalink raw reply	[flat|nested] 28+ messages in thread
* Re: [SOLVED + PATCH]: documented Oops running big-endian reiserfs on parisc architecture
@ 2001-09-04 22:55 Ulrich Weigand
  0 siblings, 0 replies; 28+ messages in thread
From: Ulrich Weigand @ 2001-09-04 22:55 UTC (permalink / raw)
  To: jeffm, ak, linux-kernel


Jeff Mahoney wrote:

> Are the S/390 asm/unaligned.h versions broken, or is the ReiserFS code doing 
> something not planned for? It's a 16-bit member, at a 16-bit alignment 
> in the structure. The structure itself need not be aligned in any 
> particular manner as it is read directly from disk, and is a packed structure.

One other point I overlooked before: using set_bit etc on a *16-bit* 
member is fundamentally broken on S/390 anyway (and I far as I know all 
other bigendian architectures as well).  set_bit assumes to operate on
a long (or an array of longs); if you use set_bit to set bit number 0
in the bitfield starting at address X, it will actually modify the byte 
located at address X+3 (or X+7 on 64-bit bigendian machines), because
this is where the bit with value 2^0 is located in a long.

If your bitfield is only 2 bytes long, this will obviously clobber
random memory after the field ...  (Note that the _unaligned variants
do not fix this problem, they will just cause it to clobber memory
*before* the field instead, if I interpret them correctly.)

Bye,
Ulrich

-- 
  Dr. Ulrich Weigand
  weigand@informatik.uni-erlangen.de

^ permalink raw reply	[flat|nested] 28+ messages in thread

end of thread, other threads:[~2001-09-08  1:45 UTC | newest]

Thread overview: 28+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2001-09-02  8:55 documented Oops running big-endian reiserfs on parisc architecture thunder7
2001-09-02 14:00 ` [parisc-linux] " Matthew Wilcox
2001-09-02 17:57   ` [SOLVED + PATCH]: " thunder7
2001-09-02 22:34     ` Richard Zidlicky
2001-09-02 23:08       ` David S. Miller
2001-09-02 23:29         ` [parisc-linux] Re: [SOLVED + PATCH]: documented Oops running big-endian reiserfs Alan Cox
2001-09-04  1:38       ` [SOLVED + PATCH]: documented Oops running big-endian reiserfs on parisc architecture Jeff Mahoney
2001-09-02 23:04   ` [parisc-linux] " David S. Miller
2001-09-02 23:25     ` Matthew Wilcox
2001-09-02 23:26       ` David S. Miller
2001-09-02 23:31       ` Alan Cox
2001-09-03 10:52       ` thunder7
2001-09-03 10:25 ` Hans Reiser
2001-09-03 14:30   ` [parisc-linux] " Matthew Wilcox
  -- strict thread matches above, loose matches on Subject: below --
2001-09-03 12:08 [SOLVED + PATCH]: " Ulrich Weigand
2001-09-03 13:14 ` Ralf Baechle
2001-09-03 22:24 ` David S. Miller
2001-09-08  1:41   ` Linus Torvalds
     [not found] <20010902105538.A15344@middle.of.nowhere.suse.lists.linux.kernel>
     [not found] ` <20010902150023.U5126@parcelfarce.linux.theplanet.co.uk.suse.lists.linux.kernel>
     [not found]   ` <20010902195717.A21209@middle.of.nowhere.suse.lists.linux.kernel>
     [not found]     ` <20010903003437.A385@linux-m68k.org.suse.lists.linux.kernel>
     [not found]       ` <20010903213835.A13887@fury.csh.rit.edu.suse.lists.linux.kernel>
2001-09-04  9:44         ` Andi Kleen
2001-09-04 10:04           ` David S. Miller
2001-09-04 10:25             ` Andi Kleen
2001-09-04 10:29               ` David S. Miller
2001-09-04 12:50           ` Jeff Mahoney
2001-09-04 14:34 Ulrich Weigand
2001-09-04 15:02 ` Richard B. Johnson
2001-09-04 16:09 ` John Alvord
2001-09-04 17:04 Ulrich Weigand
2001-09-04 22:55 Ulrich Weigand

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox