Ditto for ext3. 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 2003-06-02 21:10:49.000000000 -0700 +++ 25-akpm/fs/ext3/inode.c 2003-06-02 21:10:49.000000000 -0700 @@ -2356,9 +2356,15 @@ void ext3_read_inode(struct inode * inod inode->i_mapping->a_ops = &ext3_aops; } } 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(iloc.raw_inode->i_block[0])); + init_special_inode(inode, inode->i_mode, devno); } ext3_set_inode_flags(inode); return; @@ -2457,12 +2463,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) _