Skip to contentSkip to conversation

NFS: set_bit on an 'int' variable OK for 64-bit?

DISCUSSION [email protected] 4 participants 4 messages Dec 11, 2000 – Dec 17, 2000 NFS client

lore
Share & tools
lore
#0 lore raw

Hello,

since test11, the NFS code uses the set_bit and related routines to manipulate the wb_flags member of the nfs_page struct (nfs_page.h). Unfortunately, wb_flags has still data type 'int'.

This is a problem (at least) on the 64-bit S/390 architecture, as our ..._bit macros assume bit 0 is the least significant bit of a 'long', which means due to big-endian byte order that bit 0 resides in the 7th byte of the variable. As an int occupies only 4 bytes, however, set_bit(0, int) clobbers memory.

Now the question is, who's correct?

At all other places (I found, at least), the ..._bit macros are indeed used only on 'long' variables (or arrays).

However, on the Alpha, the ..._bit routines assume bit 0 to be the least significant bit of an 'int'. Sparc64 on the other hand also uses 'long' :-/

What do you suggest we should do? Fix nfs_page to use a 'long'
variable, or change our bitops macros to use ints?

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: [email protected]

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
Please read the FAQ at http://www.tux.org/lkml/

#1 lore raw
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

"Ulrich" == Ulrich Weigand <[email protected]> writes:

Ulrich> Hello,

Ulrich> since test11, the NFS code uses the set_bit and related Ulrich> routines to manipulate the wb_flags member of the nfs_page Ulrich> struct (nfs_page.h). Unfortunately, wb_flags has still data Ulrich> type 'int'.

Ulrich> This is a problem (at least) on the 64-bit S/390 architecture, Ulrich> as our ..._bit macros assume bit 0 is the least significant Ulrich> bit of a 'long', which means due to big-endian byte order that Ulrich> bit 0 resides in the 7th byte of the variable. As an int Ulrich> occupies only 4 bytes, however, set_bit(0, int) clobbers Ulrich> memory.

Ulrich> Now the question is, who's correct?

You are, the bit macros should only be used on long's. It happens to work on little endian bitfield machines like the Alpha but thats the same as when we had the problem with bit operations on char * in the file system code a couple of years ago.

The NFS code needs to be fixed for this then.

Jes
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
Please read the FAQ at http://www.tux.org/lkml/

#2 lore raw
In reply to [email protected]
Quoted 3 lines

since test11, the NFS code uses the set_bit and related routines to manipulate the wb_flags member of the nfs_page struct (nfs_page.h). Unfortunately, wb_flags has still data type 'int'.

NFS is wrong. Rusty did a complete audit of the code and I've been feeding some stuff to Linus. That one may have been missed

Quoted 2 lines

What do you suggest we should do? Fix nfs_page to use a 'long'
variable, or change our bitops macros to use ints?

Fix NFS

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
Please read the FAQ at http://www.tux.org/lkml/

#3 lore raw

In message <[email protected]> you write:

Quoted 6 lines
Quoted 3 lines

since test11, the NFS code uses the set_bit and related routines to manipulate the wb_flags member of the nfs_page struct (nfs_page.h). Unfortunately, wb_flags has still data type 'int'.

NFS is wrong. Rusty did a complete audit of the code and I've been feeding some stuff to Linus. That one may have been missed

Yes, didn't grep the headers. Hmm... that's the only one in include/linux/*.h though.

Quoted 4 lines
Quoted 2 lines

What do you suggest we should do? Fix nfs_page to use a 'long'
variable, or change our bitops macros to use ints?

Fix NFS

Yep, it's trivial.

Cheers,
Rusty.
--
Hacking time.

include/linux/nfs_page.h renamed from include/linux/nfs_page.h.~1~ +2 -3
@@ -31,10 +31,10 @@
 	struct page		*wb_page;	/* page to read in/write out */
 	wait_queue_head_t	wb_wait;	/* wait queue */
 	unsigned long		wb_timeout;	/* when to read/write/commit */
+	unsigned long		wb_flags;	/* long req'd for set_bit */
 	unsigned int		wb_offset,	/* Offset of read/write */
 				wb_bytes,	/* Length of request */
-				wb_count,	/* reference count */
-				wb_flags;
+				wb_count;	/* reference count */
 	struct nfs_writeverf	wb_verf;	/* Commit cookie */
 };
-

To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
Please read the FAQ at http://www.tux.org/lkml/