From: Andries.Brouwer@cwi.nl ext2 used a 32-bit field for dev_t, with possibly undefined storage following; thus, no action was required to go to 32-bit dev_t, but going to 64-bit dev_t required some subtlety: 0 was written in the first word and the 64 bits in the following two. Al truncated my 64-bit stuff to 32 bits but did not understand why there was this split, and wrote 0 followed by a single word. We should at least zero the word following to have well-defined storage later. fs/ext2/inode.c | 1 + fs/ext3/inode.c | 1 + 2 files changed, 2 insertions(+) diff -puN fs/ext2/inode.c~dev_t-forward-compatibility fs/ext2/inode.c --- 25/fs/ext2/inode.c~dev_t-forward-compatibility 2003-09-28 15:51:51.000000000 -0700 +++ 25-akpm/fs/ext2/inode.c 2003-09-28 15:51:51.000000000 -0700 @@ -1228,6 +1228,7 @@ static int ext2_update_inode(struct inod raw_inode->i_block[0] = 0; raw_inode->i_block[1] = cpu_to_le32(new_encode_dev(inode->i_rdev)); + raw_inode->i_block[2] = 0; } } else for (n = 0; n < EXT2_N_BLOCKS; n++) raw_inode->i_block[n] = ei->i_data[n]; diff -puN fs/ext3/inode.c~dev_t-forward-compatibility fs/ext3/inode.c --- 25/fs/ext3/inode.c~dev_t-forward-compatibility 2003-09-28 15:51:51.000000000 -0700 +++ 25-akpm/fs/ext3/inode.c 2003-09-28 15:51:51.000000000 -0700 @@ -2679,6 +2679,7 @@ static int ext3_do_update_inode(handle_t raw_inode->i_block[0] = 0; raw_inode->i_block[1] = cpu_to_le32(new_encode_dev(inode->i_rdev)); + raw_inode->i_block[2] = 0; } } else for (block = 0; block < EXT3_N_BLOCKS; block++) raw_inode->i_block[block] = ei->i_data[block]; _