Comment 4 for bug 1745155

Revision history for this message
Rafael David Tinoco (rafaeldtinoco) wrote :

Weird,

We have:

https://docs.oracle.com/cd/E37670_01/E37355/html/ol_about_ocfs2.html

Saying: "Support for heterogeneous clusters of nodes with a mixture of 32-bit and 64-bit, little-endian (x86, x86_64, ia64) and big-endian (ppc64) architectures."

But we have it passing for all little endian arches (including ppc64el)... and not for s390x (the only current big-endian arch we have support for).

Despite what Oracle docs say, this function looks suspicious:

int ocfs2_set_bit(int nr,void * addr)
{
        int mask, retval;
        unsigned char *ADDR = (unsigned char *) addr;

        ADDR += nr >> 3;
        mask = 1 << (nr & 0x07);
        retval = (mask & *ADDR) != 0;
        *ADDR |= mask;
        return retval;
}

So, despite using single *u8 for ADDR, we have:

*u8 ADR = (u8 *) (u32 *) addr;

and that might explain why addr is 0;

Also, we have:

(mask & *ADDR) -> a dereference without a cast (specially important if we are differentiating little and big endian).