Ditto for ext3.


 25-akpm/fs/ext3/inode.c |   30 +++++++++++++++++++++++-------
 1 files changed, 23 insertions(+), 7 deletions(-)

diff -puN fs/ext3/inode.c~ext3-64-bit-special-inodes fs/ext3/inode.c
--- 25/fs/ext3/inode.c~ext3-64-bit-special-inodes	Fri Aug  1 12:52:49 2003
+++ 25-akpm/fs/ext3/inode.c	Fri Aug  1 12:52:49 2003
@@ -2564,9 +2564,15 @@ void ext3_read_inode(struct inode * inod
 			ext3_set_aops(inode);
 		}
 	} else {
+		dev_t devno = le32_to_cpu(raw_inode->i_block[0]);
+		if (devno == 0) {
+			unsigned int lo = le32_to_cpu(raw_inode->i_block[1]);
+			unsigned int hi = le32_to_cpu(raw_inode->i_block[2]);
+			devno = ((unsigned long long) hi << 32) | lo;
+		}
+
 		inode->i_op = &ext3_special_inode_operations;
-		init_special_inode(inode, inode->i_mode,
-				   le32_to_cpu(raw_inode->i_block[0]));
+		init_special_inode(inode, inode->i_mode, devno);
 	}
 	brelse (iloc.bh);
 	ext3_set_inode_flags(inode);
@@ -2666,12 +2672,22 @@ static int ext3_do_update_inode(handle_t
 		}
 	}
 	raw_inode->i_generation = cpu_to_le32(inode->i_generation);
-	if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
-		raw_inode->i_block[0] =
-			cpu_to_le32(kdev_t_to_nr(inode->i_rdev));
-	else for (block = 0; block < EXT3_N_BLOCKS; block++)
-		raw_inode->i_block[block] = ei->i_data[block];
+	if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
+		dev_t devno = kdev_t_to_nr(inode->i_rdev);
+		unsigned int hi = (sizeof(dev_t) > 4) ? (devno >> 32) : 0;
+		unsigned int lo = (devno & 0xffffffff);
 
+		if (hi == 0 && lo != 0) {
+			raw_inode->i_block[0] = cpu_to_le32(lo);
+		} else {
+			raw_inode->i_block[0] = 0;
+			raw_inode->i_block[1] = cpu_to_le32(lo);
+			raw_inode->i_block[2] = cpu_to_le32(hi);
+		}
+	} else {
+		for (block = 0; block < EXT3_N_BLOCKS; block++)
+			raw_inode->i_block[block] = ei->i_data[block];
+	}
 	BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");
 	rc = ext3_journal_dirty_metadata(handle, bh);
 	if (!err)

_