diff -ruN upload/fs/ext3/inode.c l1/linux-2.6.17/fs/ext3/inode.c --- upload/fs/ext3/inode.c 2006-08-24 00:16:33 +0300 +++ linux-2.6.17/fs/ext3/inode.c 2006-09-06 16:22:17 +0300 @@ -2576,6 +2576,17 @@ inode->i_flags |= S_DIRSYNC; } +void ext3_check_uuid_inode(struct ext3_inode *rinode, struct inode *vinode) +{ + struct ext3_sb_info* sbi = (struct ext3_sb_info*)(vinode->i_sb)->s_fs_info; + int length = sizeof(u8)*16; + + if(memcmp(rinode->i_uuid,sbi->s_uuid, length)) { + memset(rinode,0,sizeof(struct ext3_inode)); + memcpy(rinode->i_uuid,sbi->s_uuid, length); + } +} + void ext3_read_inode(struct inode * inode) { struct ext3_iloc iloc; @@ -2594,6 +2605,9 @@ goto bad_inode; bh = iloc.bh; raw_inode = ext3_raw_inode(&iloc); + + ext3_check_uuid_inode(raw_inode,inode); + inode->i_mode = le16_to_cpu(raw_inode->i_mode); inode->i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low); inode->i_gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low); @@ -2713,6 +2727,8 @@ return; } + + /* * Post the struct inode info into an on-disk inode location in the * buffer-cache. This gobbles the caller's reference to the @@ -2725,6 +2741,7 @@ struct ext3_iloc *iloc) { struct ext3_inode *raw_inode = ext3_raw_inode(iloc); + struct ext3_sb_info* sbi = (struct ext3_sb_info*)(inode->i_sb)->s_fs_info; struct ext3_inode_info *ei = EXT3_I(inode); struct buffer_head *bh = iloc->bh; int err = 0, rc, block; @@ -2773,6 +2790,8 @@ raw_inode->i_fsize = ei->i_frag_size; #endif raw_inode->i_file_acl = cpu_to_le32(ei->i_file_acl); + memcpy(raw_inode->i_uuid, sbi->s_uuid, sizeof(u8)*16); + if (!S_ISREG(inode->i_mode)) { raw_inode->i_dir_acl = cpu_to_le32(ei->i_dir_acl); } else { @@ -2832,7 +2851,7 @@ } /* - * ext3_write_inode() + * ext3_write_inode * * We are called from a few places: * diff -ruN upload/fs/ext3/super.c l1/linux-2.6.17/fs/ext3/super.c --- upload/fs/ext3/super.c 2006-08-24 00:16:33 +0300 +++ linux-2.6.17/fs/ext3/super.c 2006-09-06 16:03:25 +0300 @@ -1464,6 +1425,8 @@ sbi->s_resuid = le16_to_cpu(es->s_def_resuid); sbi->s_resgid = le16_to_cpu(es->s_def_resgid); + memcpy(sbi->s_uuid,es->s_uuid, sizeof(u8)*16); + set_opt(sbi->s_mount_opt, RESERVATION); if (!parse_options ((char *) data, sb, &journal_inum, &journal_devnum, diff -ruN upload/include/linux/ext3_fs.h l1/linux-2.6.17/include/linux/ext3_fs.h --- upload/include/linux/ext3_fs.h 2006-08-24 00:16:33 +0300 +++ l1/linux-2.6.17/include/linux/ext3_fs.h 2006-09-06 16:20:53 +0300 @@ -284,6 +284,7 @@ __le32 i_file_acl; /* File ACL */ __le32 i_dir_acl; /* Directory ACL */ __le32 i_faddr; /* Fragment address */ + __le16 i_uuid[8]; union { struct { __u8 l_i_frag; /* Fragment number */ @@ -531,7 +532,7 @@ #define EXT3_CURRENT_REV EXT3_GOOD_OLD_REV #define EXT3_MAX_SUPP_REV EXT3_DYNAMIC_REV -#define EXT3_GOOD_OLD_INODE_SIZE 128 +#define EXT3_GOOD_OLD_INODE_SIZE (128+(8*16)) /* * Feature set definitions diff -ruN upload/include/linux/ext3_fs_sb.h l1/linux-2.6.17/include/linux/ext3_fs_sb.h --- upload/include/linux/ext3_fs_sb.h 2006-08-24 00:16:33 +0300 +++ l1/linux-2.6.17/include/linux/ext3_fs_sb.h 2006-09-06 15:59:35 +0300 @@ -78,6 +78,7 @@ char *s_qf_names[MAXQUOTAS]; /* Names of quota files with journalled quota */ int s_jquota_fmt; /* Format of quota to use */ #endif + u8 s_uuid[16]; }; #endif /* _LINUX_EXT3_FS_SB */