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];

_