patch-2.1.120 linux/fs/ufs/swab.h

Next file: linux/fs/ufs/symlink.c
Previous file: linux/fs/ufs/super.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.119/linux/fs/ufs/swab.h linux/fs/ufs/swab.h
@@ -1,7 +1,7 @@
 /*
- *  linux/fs/ufs/ufs_swab.h
+ *  linux/fs/ufs/swab.h
  *
- * Copyright (C) 1997 Francois-Rene Rideau <rideau@ens.fr>
+ * Copyright (C) 1997, 1998 Francois-Rene Rideau <fare@tunes.org>
  * Copyright (C) 1998 Jakub Jelinek <jj@ultra.linux.cz>
  */
 
@@ -14,6 +14,29 @@
  *    in case there are ufs implementations that have strange bytesexes,
  *    you'll need to modify code here as well as in ufs_super.c and ufs_fs.h
  *    to support them.
+ *
+ *    WE ALSO ASSUME A REMOTELY SANE ARCHITECTURE BYTESEX.
+ *    We are not ready to confront insane bytesexual perversions where
+ *    conversion to/from little/big-endian is not an involution.
+ *    That is, we require that XeYZ_to_cpu(x) == cpu_to_XeYZ(x)
+ *
+ *    NOTE that swab macros depend on a variable (or macro) swab being in
+ *    scope and properly initialized (usually from sb->u.ufs_sb.s_swab).
+ *    Its meaning depends on whether the architecture is sane-endian or not.
+ *    For sane architectures, it's a flag taking values UFS_NATIVE_ENDIAN (0)
+ *    or UFS_SWABBED_ENDIAN (1), indicating whether to swab or not.
+ *    For pervert architectures, it's either UFS_LITTLE_ENDIAN or
+ *    UFS_BIG_ENDIAN whose meaning you'll have to guess.
+ *
+ *    It is important to keep these conventions in synch with ufs_fs.h
+ *    and super.c. Failure to do so (initializing swab to 0 both for
+ *    NATIVE_ENDIAN and LITTLE_ENDIAN) led to nasty crashes on big endian
+ *    machines reading little endian UFSes. Search for "swab =" in super.c.
+ *
+ *    I also suspect the whole UFS code to trust the on-disk structures
+ *    much too much, which might lead to losing badly when mounting
+ *    inconsistent partitions as UFS filesystems. fsck required (but of
+ *    course, no fsck.ufs has yet to be ported from BSD to Linux as of 199808).
  */
 
 #include <linux/ufs_fs.h>
@@ -28,23 +51,23 @@
 #define SWAB64(x) ufs_swab64(swab,x)
 
 /*
- * We often use swabing, when we want to increment/decrement some value, so these
- * macros might become handy and increase readability. (Daniel)
+ * We often use swabing, when we want to increment/decrement some value,
+ * so these macros might become handy and increase readability. (Daniel)
  */
-#define INC_SWAB16(x)	x=ufs_swab16_add(swab,x,1)
-#define INC_SWAB32(x)	x=ufs_swab32_add(swab,x,1)
-#define INC_SWAB64(x)	x=ufs_swab64_add(swab,x,1)
-#define DEC_SWAB16(x)	x=ufs_swab16_add(swab,x,-1)
-#define DEC_SWAB32(x)	x=ufs_swab32_add(swab,x,-1)
-#define DEC_SWAB64(x)	x=ufs_swab64_add(swab,x,-1)
-#define ADD_SWAB16(x,y)	x=ufs_swab16_add(swab,x,y)
-#define ADD_SWAB32(x,y)	x=ufs_swab32_add(swab,x,y)
-#define ADD_SWAB64(x,y)	x=ufs_swab64_add(swab,x,y)
-#define SUB_SWAB16(x,y)	x=ufs_swab16_add(swab,x,-(y))
-#define SUB_SWAB32(x,y)	x=ufs_swab32_add(swab,x,-(y))
-#define SUB_SWAB64(x,y)	x=ufs_swab64_add(swab,x,-(y))
+#define INC_SWAB16(x)	((x)=ufs_swab16_add(swab,x,1))
+#define INC_SWAB32(x)	((x)=ufs_swab32_add(swab,x,1))
+#define INC_SWAB64(x)	((x)=ufs_swab64_add(swab,x,1))
+#define DEC_SWAB16(x)	((x)=ufs_swab16_add(swab,x,-1))
+#define DEC_SWAB32(x)	((x)=ufs_swab32_add(swab,x,-1))
+#define DEC_SWAB64(x)	((x)=ufs_swab64_add(swab,x,-1))
+#define ADD_SWAB16(x,y)	((x)=ufs_swab16_add(swab,x,y))
+#define ADD_SWAB32(x,y)	((x)=ufs_swab32_add(swab,x,y))
+#define ADD_SWAB64(x,y)	((x)=ufs_swab64_add(swab,x,y))
+#define SUB_SWAB16(x,y)	((x)=ufs_swab16_add(swab,x,-(y)))
+#define SUB_SWAB32(x,y)	((x)=ufs_swab32_add(swab,x,-(y)))
+#define SUB_SWAB64(x,y)	((x)=ufs_swab64_add(swab,x,-(y)))
 
-#ifndef __PDP_ENDIAN
+#if defined(__LITTLE_ENDIAN) || defined(__BIG_ENDIAN) /* sane bytesex */
 extern __inline__ __const__ __u16 ufs_swab16(unsigned swab, __u16 x) {
 	if (swab)
 		return swab16(x);
@@ -81,21 +104,21 @@
 	else
 		return x + y;
 }
-#else /* __PDP_ENDIAN */
+#else /* bytesexual perversion -- BEWARE! Read note at top of file! */
 extern __inline__ __const__ __u16 ufs_swab16(unsigned swab, __u16 x) {
-	if (swab & UFS_LITTLE_ENDIAN)
+	if (swab == UFS_LITTLE_ENDIAN)
 		return le16_to_cpu(x);
 	else
 		return be16_to_cpu(x);
 }
 extern __inline__ __const__ __u32 ufs_swab32(unsigned swab, __u32 x) {
-	if (swab & UFS_LITTLE_ENDIAN)
+	if (swab == UFS_LITTLE_ENDIAN)
 		return le32_to_cpu(x);
 	else
 		return be32_to_cpu(x);
 }
 extern __inline__ __const__ __u64 ufs_swab64(unsigned swab, __u64 x) {
-	if (swab & UFS_LITTLE_ENDIAN)
+	if (swab == UFS_LITTLE_ENDIAN)
 		return le64_to_cpu(x);
 	else
 		return be64_to_cpu(x);
@@ -109,6 +132,6 @@
 extern __inline__ __const__ __u64 ufs_swab64_add(unsigned swab, __u64 x, __u64 y) {
 	return ufs_swab64(swab, ufs_swab64(swab, x) + y);
 }
-#endif /* __PDP_ENDIAN */
+#endif /* byte sexuality */
 
 #endif /* _UFS_SWAB_H */

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov