X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=ldiskfs%2Fkernel_patches%2Fpatches%2Fext3-ea-in-inode-2.6-suse.patch;h=dcd87eddee1feb8a1a6bea7f11599e741249d998;hb=b9ebd968a2417176183ac77502f472029eff1899;hp=39fa9ce943dee5017b5aea1836bf9be516d06420;hpb=2dc9c16e770415d56839e1996015fec5fab93f29;p=fs%2Flustre-release.git diff --git a/ldiskfs/kernel_patches/patches/ext3-ea-in-inode-2.6-suse.patch b/ldiskfs/kernel_patches/patches/ext3-ea-in-inode-2.6-suse.patch index 39fa9ce..dcd87ed 100644 --- a/ldiskfs/kernel_patches/patches/ext3-ea-in-inode-2.6-suse.patch +++ b/ldiskfs/kernel_patches/patches/ext3-ea-in-inode-2.6-suse.patch @@ -1,25 +1,23 @@ %patch -Index: linux-2.6.0/fs/ext3/ialloc.c +Index: linux-2.6.5-7.311/fs/ext3/ialloc.c =================================================================== ---- linux-2.6.0.orig/fs/ext3/ialloc.c 2004-01-14 18:54:11.000000000 +0300 -+++ linux-2.6.0/fs/ext3/ialloc.c 2004-01-14 18:54:12.000000000 +0300 -@@ -627,6 +627,11 @@ - inode->i_generation = EXT3_SB(sb)->s_next_generation++; +--- linux-2.6.5-7.311.orig/fs/ext3/ialloc.c ++++ linux-2.6.5-7.311/fs/ext3/ialloc.c +@@ -633,6 +633,9 @@ got: + spin_unlock(&sbi->s_next_gen_lock); ei->i_state = EXT3_STATE_NEW; -+ if (EXT3_INODE_SIZE(inode->i_sb) > EXT3_GOOD_OLD_INODE_SIZE) { -+ ei->i_extra_isize = sizeof(__u16) /* i_extra_isize */ -+ + sizeof(__u16); /* i_pad1 */ -+ } else -+ ei->i_extra_isize = 0; ++ ei->i_extra_isize = ++ (EXT3_INODE_SIZE(inode->i_sb) > EXT3_GOOD_OLD_INODE_SIZE) ? ++ sizeof(struct ext3_inode) - EXT3_GOOD_OLD_INODE_SIZE : 0; ret = inode; if(DQUOT_ALLOC_INODE(inode)) { -Index: linux-2.6.0/fs/ext3/inode.c +Index: linux-2.6.5-7.311/fs/ext3/inode.c =================================================================== ---- linux-2.6.0.orig/fs/ext3/inode.c 2004-01-14 18:54:12.000000000 +0300 -+++ linux-2.6.0/fs/ext3/inode.c 2004-01-14 19:09:46.000000000 +0300 -@@ -2339,7 +2339,7 @@ +--- linux-2.6.5-7.311.orig/fs/ext3/inode.c ++++ linux-2.6.5-7.311/fs/ext3/inode.c +@@ -2284,7 +2284,7 @@ static unsigned long ext3_get_inode_bloc * trying to determine the inode's location on-disk and no read need be * performed. */ @@ -28,7 +26,7 @@ Index: linux-2.6.0/fs/ext3/inode.c struct ext3_iloc *iloc, int in_mem) { unsigned long block; -@@ -2547,6 +2547,11 @@ +@@ -2495,6 +2495,11 @@ void ext3_read_inode(struct inode * inod ei->i_data[block] = raw_inode->i_block[block]; INIT_LIST_HEAD(&ei->i_orphan); @@ -40,7 +38,7 @@ Index: linux-2.6.0/fs/ext3/inode.c if (S_ISREG(inode->i_mode)) { inode->i_op = &ext3_file_inode_operations; inode->i_fop = &ext3_file_operations; -@@ -2682,6 +2687,9 @@ +@@ -2630,6 +2635,9 @@ static int ext3_do_update_inode(handle_t } else for (block = 0; block < EXT3_N_BLOCKS; block++) raw_inode->i_block[block] = ei->i_data[block]; @@ -50,11 +48,21 @@ Index: linux-2.6.0/fs/ext3/inode.c BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); rc = ext3_journal_dirty_metadata(handle, bh); if (!err) -Index: linux-2.6.0/fs/ext3/xattr.c +@@ -2839,7 +2847,8 @@ ext3_reserve_inode_write(handle_t *handl + { + int err = 0; + if (handle) { +- err = ext3_get_inode_loc(inode, iloc, 1); ++ err = ext3_get_inode_loc(inode, iloc, EXT3_I(inode)->i_state & ++ EXT3_STATE_NEW); + if (!err) { + BUFFER_TRACE(iloc->bh, "get_write_access"); + err = ext3_journal_get_write_access(handle, iloc->bh); +Index: linux-2.6.5-7.311/fs/ext3/xattr.c =================================================================== ---- linux-2.6.0.orig/fs/ext3/xattr.c 2003-12-30 08:33:13.000000000 +0300 -+++ linux-2.6.0/fs/ext3/xattr.c 2004-01-14 18:54:12.000000000 +0300 -@@ -246,17 +246,12 @@ +--- linux-2.6.5-7.311.orig/fs/ext3/xattr.c ++++ linux-2.6.5-7.311/fs/ext3/xattr.c +@@ -245,17 +245,12 @@ ext3_removexattr(struct dentry *dentry, } /* @@ -75,7 +83,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c void *buffer, size_t buffer_size) { struct buffer_head *bh = NULL; -@@ -270,7 +265,6 @@ +@@ -269,7 +264,6 @@ ext3_xattr_get(struct inode *inode, int if (name == NULL) return -EINVAL; @@ -83,7 +91,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c error = -ENODATA; if (!EXT3_I(inode)->i_file_acl) goto cleanup; -@@ -343,15 +337,87 @@ +@@ -342,15 +336,87 @@ found: cleanup: brelse(bh); @@ -94,7 +102,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c /* - * ext3_xattr_list() -+ * ext3_xattr_ibode_get() ++ * ext3_xattr_ibody_get() * - * Copy a list of attribute names into the buffer + * routine looks for attribute in inode body and returns it's value and size @@ -113,7 +121,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c + if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) + return -ENOENT; + -+ ret = ext3_get_inode_loc(inode, &iloc); ++ ret = ext3_get_inode_loc(inode, &iloc, 0); + if (ret) + return ret; + raw_inode = ext3_raw_inode(&iloc); @@ -174,7 +182,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c * provided, or compute the buffer size required. * Buffer is NULL to compute the size of the buffer required. * -@@ -359,7 +425,31 @@ +@@ -358,7 +424,31 @@ cleanup: * used / required on success. */ int @@ -207,7 +215,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c { struct buffer_head *bh = NULL; struct ext3_xattr_entry *entry; -@@ -370,7 +460,6 @@ +@@ -369,7 +459,6 @@ ext3_xattr_list(struct inode *inode, cha ea_idebug(inode, "buffer=%p, buffer_size=%ld", buffer, (long)buffer_size); @@ -215,16 +223,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c error = 0; if (!EXT3_I(inode)->i_file_acl) goto cleanup; -@@ -380,7 +469,7 @@ - if (!bh) - goto cleanup; - ea_bdebug(bh, "b_count=%d, refcount=%d", -- atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ (int) atomic_read(&(bh->b_count)), (int) le32_to_cpu(HDR(bh)->h_refcount)); - end = bh->b_data + bh->b_size; - if (HDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || - HDR(bh)->h_blocks != cpu_to_le32(1)) { -@@ -431,11 +520,138 @@ +@@ -430,11 +519,138 @@ bad_block: ext3_error(inode->i_sb, "ext3 cleanup: brelse(bh); @@ -251,7 +250,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c + if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) + return 0; + -+ ret = ext3_get_inode_loc(inode, &iloc); ++ ret = ext3_get_inode_loc(inode, &iloc, 0); + if (ret) + return ret; + raw_inode = ext3_raw_inode(&iloc); @@ -364,7 +363,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c /* * If the EXT3_FEATURE_COMPAT_EXT_ATTR feature of this file system is * not set, set it. -@@ -457,6 +673,279 @@ +@@ -456,6 +672,279 @@ static void ext3_xattr_update_super_bloc } /* @@ -388,7 +387,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c + if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) + return ret; + -+ err = ext3_get_inode_loc(inode, &iloc); ++ err = ext3_get_inode_loc(inode, &iloc, 0); + if (err) + return -EIO; + raw_inode = ext3_raw_inode(&iloc); @@ -519,7 +518,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c + if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) + return -ENOSPC; + -+ err = ext3_get_inode_loc(inode, &iloc); ++ err = ext3_get_inode_loc(inode, &iloc, 0); + if (err) + return err; + raw_inode = ext3_raw_inode(&iloc); @@ -618,17 +617,17 @@ Index: linux-2.6.0/fs/ext3/xattr.c + if (value) { + int offs = min_offs - value_len; + /* use last to create new entry */ ++ memset(last, 0, esize); + last->e_name_len = strlen(name); + last->e_name_index = name_index; + last->e_value_offs = cpu_to_le16(offs); + last->e_value_size = cpu_to_le32(value_len); + last->e_hash = last->e_value_block = 0; -+ memset(last->e_name, 0, esize); + memcpy(last->e_name, name, last->e_name_len); + if (start + offs + value_len > end) -+ printk("ALERT at %s:%d: 0x%p + %d + %d > 0x%p\n", -+ __FILE__, __LINE__, start, offs, -+ value_len, end); ++ printk("ALERT at %s:%d: 0x%p + %d + %zd > 0x%p\n", ++ __FILE__, __LINE__, start, offs, ++ value_len, end); + memcpy(start + offs, value, value_len); + last = EXT3_XATTR_NEXT(last); + *((__u32 *) last) = 0; @@ -644,7 +643,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c * ext3_xattr_set_handle() * * Create, replace or remove an extended attribute for this inode. Buffer -@@ -470,6 +959,104 @@ +@@ -469,6 +958,110 @@ static void ext3_xattr_update_super_bloc */ int ext3_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index, @@ -701,6 +700,9 @@ Index: linux-2.6.0/fs/ext3/xattr.c + } else if (!found && (flags & XATTR_REPLACE)) { + err = -ENODATA; + goto finish; ++ } else if (!found && !value) { ++ err = 0; ++ goto finish; + } + + /* check if we have enough space to store attribute */ @@ -724,14 +726,17 @@ Index: linux-2.6.0/fs/ext3/xattr.c + } + } + -+ /* try to store EA in inode body */ -+ err = ext3_xattr_ibody_set(handle, inode, name_index, name, -+ value, value_len, flags); -+ if (err) { -+ /* can't store EA in inode body */ -+ /* try to store in block */ -+ err = ext3_xattr_block_set(handle, inode, name_index, -+ name, value, value_len, flags); ++ /* Add entry if value is provided */ ++ if (value != NULL) { ++ /* try to store EA in inode body */ ++ err = ext3_xattr_ibody_set(handle, inode, name_index, name, ++ value, value_len, flags); ++ if (err) { ++ /* can't store EA in inode body */ ++ /* try to store in block */ ++ err = ext3_xattr_block_set(handle, inode, name_index, ++ name, value, value_len, flags); ++ } + } + +finish: @@ -749,7 +754,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c const char *name, const void *value, size_t value_len, int flags) { -@@ -492,22 +1078,7 @@ +@@ -491,22 +1084,7 @@ ext3_xattr_set_handle(handle_t *handle, * towards the end of the block). * end -- Points right after the block pointed to by header. */ @@ -772,7 +777,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c if (EXT3_I(inode)->i_file_acl) { /* The inode already has an extended attribute block. */ bh = sb_bread(sb, EXT3_I(inode)->i_file_acl); -@@ -733,7 +1304,6 @@ +@@ -730,7 +1308,6 @@ cleanup: brelse(bh); if (!(bh && header == HDR(bh))) kfree(header); @@ -780,11 +785,11 @@ Index: linux-2.6.0/fs/ext3/xattr.c return error; } -Index: linux-2.6.0/fs/ext3/xattr.h +Index: linux-2.6.5-7.311/fs/ext3/xattr.h =================================================================== ---- linux-2.6.0.orig/fs/ext3/xattr.h 2003-06-24 18:04:43.000000000 +0400 -+++ linux-2.6.0/fs/ext3/xattr.h 2004-01-14 18:54:12.000000000 +0300 -@@ -77,7 +77,8 @@ +--- linux-2.6.5-7.311.orig/fs/ext3/xattr.h ++++ linux-2.6.5-7.311/fs/ext3/xattr.h +@@ -77,7 +77,8 @@ extern int ext3_removexattr(struct dentr extern int ext3_xattr_get(struct inode *, int, const char *, void *, size_t); extern int ext3_xattr_list(struct inode *, char *, size_t); extern int ext3_xattr_set(struct inode *, int, const char *, const void *, size_t, int); @@ -794,11 +799,11 @@ Index: linux-2.6.0/fs/ext3/xattr.h extern void ext3_xattr_delete_inode(handle_t *, struct inode *); extern void ext3_xattr_put_super(struct super_block *); -Index: linux-2.6.0/include/linux/ext3_fs.h +Index: linux-2.6.5-7.311/include/linux/ext3_fs.h =================================================================== ---- linux-2.6.0.orig/include/linux/ext3_fs.h 2004-01-14 18:54:11.000000000 +0300 -+++ linux-2.6.0/include/linux/ext3_fs.h 2004-01-14 18:54:12.000000000 +0300 -@@ -265,6 +265,8 @@ +--- linux-2.6.5-7.311.orig/include/linux/ext3_fs.h ++++ linux-2.6.5-7.311/include/linux/ext3_fs.h +@@ -267,6 +267,8 @@ struct ext3_inode { __u32 m_i_reserved2[2]; } masix2; } osd2; /* OS dependent 2 */ @@ -807,11 +812,19 @@ Index: linux-2.6.0/include/linux/ext3_fs.h }; #define i_size_high i_dir_acl -Index: linux-2.6.0/include/linux/ext3_fs_i.h +@@ -729,6 +731,7 @@ extern unsigned long ext3_count_free (st + extern int ext3_forget(handle_t *, int, struct inode *, struct buffer_head *, int); + extern struct buffer_head * ext3_getblk (handle_t *, struct inode *, long, int, int *); + extern struct buffer_head * ext3_bread (handle_t *, struct inode *, int, int, int *); ++int ext3_get_inode_loc(struct inode *inode, struct ext3_iloc *iloc, int in_mem); + + extern void ext3_read_inode (struct inode *); + extern void ext3_write_inode (struct inode *, int); +Index: linux-2.6.5-7.311/include/linux/ext3_fs_i.h =================================================================== ---- linux-2.6.0.orig/include/linux/ext3_fs_i.h 2003-12-30 08:32:44.000000000 +0300 -+++ linux-2.6.0/include/linux/ext3_fs_i.h 2004-01-14 18:54:12.000000000 +0300 -@@ -96,6 +96,9 @@ +--- linux-2.6.5-7.311.orig/include/linux/ext3_fs_i.h ++++ linux-2.6.5-7.311/include/linux/ext3_fs_i.h +@@ -113,6 +113,9 @@ struct ext3_inode_info { */ loff_t i_disksize; @@ -821,13 +834,3 @@ Index: linux-2.6.0/include/linux/ext3_fs_i.h /* * truncate_sem is for serialising ext3_truncate() against * ext3_getblock(). In the 2.4 ext2 design, great chunks of inode's - -%diffstat - fs/ext3/ialloc.c | 5 - fs/ext3/inode.c | 10 - fs/ext3/xattr.c | 634 +++++++++++++++++++++++++++++++++++++++++++--- - fs/ext3/xattr.h | 3 - include/linux/ext3_fs.h | 2 - include/linux/ext3_fs_i.h | 3 - 6 files changed, 623 insertions(+), 34 deletions(-) -