From: viro@www.linux.org.uk

HPFS code that uses EAs for storing i_rdev/i_mode/i_uid/i_gid sanitized.




 fs/hpfs/inode.c |   36 +++++++++++++++---------------------
 1 files changed, 15 insertions(+), 21 deletions(-)

diff -puN fs/hpfs/inode.c~large-dev_t-2nd-13 fs/hpfs/inode.c
--- 25/fs/hpfs/inode.c~large-dev_t-2nd-13	2003-09-05 00:50:11.000000000 -0700
+++ 25-akpm/fs/hpfs/inode.c	2003-09-05 00:50:11.000000000 -0700
@@ -114,14 +114,14 @@ void hpfs_read_inode(struct inode *i)
 	if (hpfs_sb(i->i_sb)->sb_eas) {
 		if ((ea = hpfs_get_ea(i->i_sb, fnode, "UID", &ea_size))) {
 			if (ea_size == 2) {
-				i->i_uid = ea[0] + (ea[1] << 8);
+				i->i_uid = le16_to_cpu(*(u16*)ea);
 				hpfs_inode->i_ea_uid = 1;
 			}
 			kfree(ea);
 		}
 		if ((ea = hpfs_get_ea(i->i_sb, fnode, "GID", &ea_size))) {
 			if (ea_size == 2) {
-				i->i_gid = ea[0] + (ea[1] << 8);
+				i->i_gid = le16_to_cpu(*(u16*)ea);
 				hpfs_inode->i_ea_gid = 1;
 			}
 			kfree(ea);
@@ -141,7 +141,7 @@ void hpfs_read_inode(struct inode *i)
 			int rdev = 0;
 			umode_t mode = hpfs_sb(sb)->sb_mode;
 			if (ea_size == 2) {
-				mode = ea[0] + (ea[1] << 8);
+				mode = le16_to_cpu(*(u16*)ea);
 				hpfs_inode->i_ea_mode = 1;
 			}
 			kfree(ea);
@@ -149,7 +149,7 @@ void hpfs_read_inode(struct inode *i)
 			if (S_ISBLK(mode) || S_ISCHR(mode)) {
 				if ((ea = hpfs_get_ea(i->i_sb, fnode, "DEV", &ea_size))) {
 					if (ea_size == 4)
-						rdev = ea[0] + (ea[1] << 8) + (ea[2] << 16) + (ea[3] << 24);
+						rdev = le32_to_cpu(*(u32*)ea);
 					kfree(ea);
 				}
 			}
@@ -158,7 +158,8 @@ void hpfs_read_inode(struct inode *i)
 				i->i_nlink = 1;
 				i->i_size = 0;
 				i->i_blocks = 1;
-				init_special_inode(i, mode, rdev);
+				init_special_inode(i, mode,
+					old_decode_dev(rdev));
 				return;
 			}
 		}
@@ -201,17 +202,15 @@ void hpfs_write_inode_ea(struct inode *i
 		   we'd better not overwrite them */
 		hpfs_error(i->i_sb, "fnode %08x has some unknown HPFS386 stuctures", i->i_ino);
 	} else if (hpfs_sb(i->i_sb)->sb_eas >= 2) {
-		unsigned char ea[4];
+		u32 ea;
 		if ((i->i_uid != hpfs_sb(i->i_sb)->sb_uid) || hpfs_inode->i_ea_uid) {
-			ea[0] = i->i_uid & 0xff;
-			ea[1] = i->i_uid >> 8;
-			hpfs_set_ea(i, fnode, "UID", ea, 2);
+			ea = cpu_to_le32(i->i_uid);
+			hpfs_set_ea(i, fnode, "UID", (char*)&ea, 2);
 			hpfs_inode->i_ea_uid = 1;
 		}
 		if ((i->i_gid != hpfs_sb(i->i_sb)->sb_gid) || hpfs_inode->i_ea_gid) {
-			ea[0] = i->i_gid & 0xff;
-			ea[1] = i->i_gid >> 8;
-			hpfs_set_ea(i, fnode, "GID", ea, 2);
+			ea = cpu_to_le32(i->i_gid);
+			hpfs_set_ea(i, fnode, "GID", (char *)&ea, 2);
 			hpfs_inode->i_ea_gid = 1;
 		}
 		if (!S_ISLNK(i->i_mode))
@@ -219,18 +218,13 @@ void hpfs_write_inode_ea(struct inode *i
 			  | (S_ISDIR(i->i_mode) ? S_IFDIR : S_IFREG))
 			  && i->i_mode != ((hpfs_sb(i->i_sb)->sb_mode & ~(S_ISDIR(i->i_mode) ? 0222 : 0333))
 			  | (S_ISDIR(i->i_mode) ? S_IFDIR : S_IFREG))) || hpfs_inode->i_ea_mode) {
-				ea[0] = i->i_mode & 0xff;
-				ea[1] = i->i_mode >> 8;
-				hpfs_set_ea(i, fnode, "MODE", ea, 2);
+				ea = cpu_to_le32(i->i_mode);
+				hpfs_set_ea(i, fnode, "MODE", (char *)&ea, 2);
 				hpfs_inode->i_ea_mode = 1;
 			}
 		if (S_ISBLK(i->i_mode) || S_ISCHR(i->i_mode)) {
-			dev_t d = i->i_rdev;
-			ea[0] = d & 0xff;
-			ea[1] = (d >> 8) & 0xff;
-			ea[2] = (d >> 16) & 0xff;
-			ea[3] = d >> 24;
-			hpfs_set_ea(i, fnode, "DEV", ea, 4);
+			ea = cpu_to_le32(old_encode_dev(i->i_rdev));
+			hpfs_set_ea(i, fnode, "DEV", (char *)&ea, 4);
 		}
 	}
 }

_