]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/ext4/inode.c
[PATCH] fix Data Acess error in dup_fd
[linux-2.6-omap-h63xx.git] / fs / ext4 / inode.c
index 2b81b1324a6f4972b9833cf7abc8c9b152e9205e..0a60ec5a16dbc4bb92645dfafcd644e895d05161 100644 (file)
@@ -2115,7 +2115,7 @@ static void ext4_free_branches(handle_t *handle, struct inode *inode,
                         */
                        if (!bh) {
                                ext4_error(inode->i_sb, "ext4_free_branches",
-                                          "Read failure, inode=%lu, block="E3FSBLK,
+                                          "Read failure, inode=%lu, block=%llu",
                                           inode->i_ino, nr);
                                continue;
                        }
@@ -2432,13 +2432,14 @@ static ext4_fsblk_t ext4_get_inode_block(struct super_block *sb,
                return 0;
        }
 
-       gdp = (struct ext4_group_desc *)bh->b_data;
+       gdp = (struct ext4_group_desc *)((__u8 *)bh->b_data +
+               desc * EXT4_DESC_SIZE(sb));
        /*
         * Figure out the offset within the block group inode table
         */
        offset = ((ino - 1) % EXT4_INODES_PER_GROUP(sb)) *
                EXT4_INODE_SIZE(sb);
-       block = le32_to_cpu(gdp[desc].bg_inode_table) +
+       block = ext4_inode_table(sb, gdp) +
                (offset >> EXT4_BLOCK_SIZE_BITS(sb));
 
        iloc->block_group = block_group;
@@ -2466,7 +2467,7 @@ static int __ext4_get_inode_loc(struct inode *inode,
        if (!bh) {
                ext4_error (inode->i_sb, "ext4_get_inode_loc",
                                "unable to read inode block - "
-                               "inode=%lu, block="E3FSBLK,
+                               "inode=%lu, block=%llu",
                                 inode->i_ino, block);
                return -EIO;
        }
@@ -2506,7 +2507,7 @@ static int __ext4_get_inode_loc(struct inode *inode,
                                goto make_io;
 
                        bitmap_bh = sb_getblk(inode->i_sb,
-                                       le32_to_cpu(desc->bg_inode_bitmap));
+                               ext4_inode_bitmap(inode->i_sb, desc));
                        if (!bitmap_bh)
                                goto make_io;
 
@@ -2548,7 +2549,7 @@ make_io:
                if (!buffer_uptodate(bh)) {
                        ext4_error(inode->i_sb, "ext4_get_inode_loc",
                                        "unable to read inode block - "
-                                       "inode=%lu, block="E3FSBLK,
+                                       "inode=%lu, block=%llu",
                                        inode->i_ino, block);
                        brelse(bh);
                        return -EIO;
@@ -2643,6 +2644,10 @@ void ext4_read_inode(struct inode * inode)
        ei->i_frag_size = raw_inode->i_fsize;
 #endif
        ei->i_file_acl = le32_to_cpu(raw_inode->i_file_acl);
+       if (EXT4_SB(inode->i_sb)->s_es->s_creator_os !=
+           cpu_to_le32(EXT4_OS_HURD))
+               ei->i_file_acl |=
+                       ((__u64)le16_to_cpu(raw_inode->i_file_acl_high)) << 32;
        if (!S_ISREG(inode->i_mode)) {
                ei->i_dir_acl = le32_to_cpu(raw_inode->i_dir_acl);
        } else {
@@ -2776,6 +2781,10 @@ static int ext4_do_update_inode(handle_t *handle,
        raw_inode->i_frag = ei->i_frag_no;
        raw_inode->i_fsize = ei->i_frag_size;
 #endif
+       if (EXT4_SB(inode->i_sb)->s_es->s_creator_os !=
+           cpu_to_le32(EXT4_OS_HURD))
+               raw_inode->i_file_acl_high =
+                       cpu_to_le16(ei->i_file_acl >> 32);
        raw_inode->i_file_acl = cpu_to_le32(ei->i_file_acl);
        if (!S_ISREG(inode->i_mode)) {
                raw_inode->i_dir_acl = cpu_to_le32(ei->i_dir_acl);