why XOR ext2_set_bit?

2 messages, 2 authors, 2001-03-15 · open the first message on its own page

why XOR ext2_set_bit?

From: Sébastien Côté <hidden>
Date: 2001-03-14 22:28:36

Hi,

I just had a problem writing to a file on a ext2 filesystem with my port
of kernel 2.4 on powerpc (G4) running in little-endian.  When the
function ext2_set_bit was called by ext2_new_block, it returned
something so I got the warning :

"ext2_new_block bit already set for block 161"

and I was stuck in an infinite loop.  I found the definition for the
function in include/asm-ppc/bitops.h as follow:

#define ext2_set_bit(nr, addr)		test_and_set_bit((nr) ^ 0x18, addr)

Now my question:  Why is "nr" XORed with 0x18 ???  I tried to do this
function on paper and with this XOR, they were always trying to change
the wrong bit.  Now, since nobody's been reporting this problem before,
I guess this XOR is ok but I'd really like to understand it's utility to
correct things on my side (for now, I just removed it and everything
appears to be fine).

Could someone give me an explanation?

Thanks,

Sébastien Côté

** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/

Re: why XOR ext2_set_bit?

From: Geert Uytterhoeven <geert@linux-m68k.org>
Date: 2001-03-15 08:30:45

On Wed, 14 Mar 2001, Sébastien Côté wrote:
I just had a problem writing to a file on a ext2 filesystem with my port
of kernel 2.4 on powerpc (G4) running in little-endian.  When the
function ext2_set_bit was called by ext2_new_block, it returned
something so I got the warning :

"ext2_new_block bit already set for block 161"

and I was stuck in an infinite loop.  I found the definition for the
function in include/asm-ppc/bitops.h as follow:

#define ext2_set_bit(nr, addr)		test_and_set_bit((nr) ^ 0x18, addr)

Now my question:  Why is "nr" XORed with 0x18 ???  I tried to do this
function on paper and with this XOR, they were always trying to change
the wrong bit.  Now, since nobody's been reporting this problem before,
I guess this XOR is ok but I'd really like to understand it's utility to
correct things on my side (for now, I just removed it and everything
appears to be fine).

Could someone give me an explanation?
Ext2 metadata is little endian. The XOR converts from big endian to little
endian bit numbering inside a 32-bit word in native format.

Gr{oetje,eeting}s,

						Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
							    -- Linus Torvalds


** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help