From: alex Date: Sun, 12 Oct 2003 12:49:50 +0000 (+0000) Subject: - xattr_sem protects block-stored EAs only. X-Git-Tag: v1_7_0_51~2^7~412 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=44a8a87b9da417214a38b4be14bc32fc6cdc0f15;p=fs%2Flustre-release.git - xattr_sem protects block-stored EAs only. fast EAs are protected by inode->i_sem only --- diff --git a/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.18-chaos.patch b/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.18-chaos.patch index 9daff50..bc6ee77 100644 --- a/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.18-chaos.patch +++ b/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.18-chaos.patch @@ -1,13 +1,13 @@ fs/ext3/ialloc.c | 6 fs/ext3/inode.c | 10 fs/ext3/super.c | 4 - fs/ext3/xattr.c | 600 +++++++++++++++++++++++++++++++++++++++++++++- + fs/ext3/xattr.c | 598 +++++++++++++++++++++++++++++++++++++++++++++- include/linux/ext3_fs.h | 2 include/linux/ext3_fs_i.h | 3 - 6 files changed, 613 insertions(+), 12 deletions(-) + 6 files changed, 613 insertions(+), 10 deletions(-) ---- linux-2.4.18-chaos-uml/fs/ext3/ialloc.c~ext3-ea-in-inode-2.4.18-chaos 2003-09-17 18:58:19.000000000 +0400 -+++ linux-2.4.18-chaos-uml-alexey/fs/ext3/ialloc.c 2003-09-17 18:58:39.000000000 +0400 +--- linux-2.4.18-chaos/fs/ext3/ialloc.c~ext3-ea-in-inode-2.4.18-chaos 2003-10-08 10:38:03.000000000 +0400 ++++ linux-2.4.18-chaos-alexey/fs/ext3/ialloc.c 2003-10-08 15:08:45.000000000 +0400 @@ -586,6 +586,12 @@ repeat: insert_inode_hash(inode); inode->i_generation = sbi->s_next_generation++; @@ -21,8 +21,8 @@ ei->i_state = EXT3_STATE_NEW; err = ext3_get_inode_loc_new(inode, &iloc, 1); if (err) goto fail; ---- linux-2.4.18-chaos-uml/fs/ext3/inode.c~ext3-ea-in-inode-2.4.18-chaos 2003-09-17 18:58:19.000000000 +0400 -+++ linux-2.4.18-chaos-uml-alexey/fs/ext3/inode.c 2003-09-17 19:34:47.000000000 +0400 +--- linux-2.4.18-chaos/fs/ext3/inode.c~ext3-ea-in-inode-2.4.18-chaos 2003-10-08 10:38:03.000000000 +0400 ++++ linux-2.4.18-chaos-alexey/fs/ext3/inode.c 2003-10-08 15:08:45.000000000 +0400 @@ -2459,6 +2459,11 @@ void ext3_read_inode(struct inode * inod ei->i_data[block] = iloc.raw_inode->i_block[block]; INIT_LIST_HEAD(&ei->i_orphan); @@ -54,8 +54,8 @@ BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); rc = ext3_journal_dirty_metadata(handle, bh); if (!err) ---- linux-2.4.18-chaos-uml/fs/ext3/xattr.c~ext3-ea-in-inode-2.4.18-chaos 2003-09-17 18:58:16.000000000 +0400 -+++ linux-2.4.18-chaos-uml-alexey/fs/ext3/xattr.c 2003-09-17 19:35:21.000000000 +0400 +--- linux-2.4.18-chaos/fs/ext3/xattr.c~ext3-ea-in-inode-2.4.18-chaos 2003-10-08 10:38:01.000000000 +0400 ++++ linux-2.4.18-chaos-alexey/fs/ext3/xattr.c 2003-10-12 16:16:44.000000000 +0400 @@ -102,6 +102,9 @@ static int ext3_xattr_set2(handle_t *, struct inode *, struct buffer_head *, struct ext3_xattr_header *); @@ -603,7 +603,7 @@ * ext3_xattr_set() * * Create, replace or remove an extended attribute for this inode. Buffer -@@ -583,6 +1067,102 @@ static void ext3_xattr_update_super_bloc +@@ -583,6 +1067,100 @@ static void ext3_xattr_update_super_bloc */ int ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index, @@ -628,7 +628,6 @@ + name_len = strlen(name); + if (name_len > 255 || value_len > inode->i_sb->s_blocksize) + return -ERANGE; -+ ext3_xattr_lock(); + + /* try to find attribute in inode body */ + err = ext3_xattr_ibody_find(inode, name_index, name, &entry, &free1); @@ -692,7 +691,6 @@ + } + +finish: -+ ext3_xattr_unlock(); + return err; +} + @@ -706,24 +704,24 @@ const char *name, void *value, size_t value_len, int flags) { struct super_block *sb = inode->i_sb; -@@ -619,7 +1199,6 @@ ext3_xattr_set(handle_t *handle, struct +@@ -619,6 +1197,7 @@ ext3_xattr_set(handle_t *handle, struct name_len = strlen(name); if (name_len > 255 || value_len > sb->s_blocksize) return -ERANGE; -- ext3_xattr_lock(); ++ + ext3_xattr_lock(); if (EXT3_I(inode)->i_file_acl) { - /* The inode already has an extended attribute block. */ -@@ -819,7 +1398,6 @@ cleanup: +@@ -819,6 +1398,7 @@ cleanup: brelse(bh); if (!(bh && header == HDR(bh))) kfree(header); -- ext3_xattr_unlock(); ++ + ext3_xattr_unlock(); return error; - } ---- linux-2.4.18-chaos-uml/include/linux/ext3_fs.h~ext3-ea-in-inode-2.4.18-chaos 2003-09-17 18:58:19.000000000 +0400 -+++ linux-2.4.18-chaos-uml-alexey/include/linux/ext3_fs.h 2003-09-17 18:58:39.000000000 +0400 +--- linux-2.4.18-chaos/include/linux/ext3_fs.h~ext3-ea-in-inode-2.4.18-chaos 2003-10-08 10:38:03.000000000 +0400 ++++ linux-2.4.18-chaos-alexey/include/linux/ext3_fs.h 2003-10-08 15:08:45.000000000 +0400 @@ -264,6 +264,8 @@ struct ext3_inode { __u32 m_i_reserved2[2]; } masix2; @@ -733,8 +731,8 @@ }; #define i_size_high i_dir_acl ---- linux-2.4.18-chaos-uml/include/linux/ext3_fs_i.h~ext3-ea-in-inode-2.4.18-chaos 2003-09-17 18:58:18.000000000 +0400 -+++ linux-2.4.18-chaos-uml-alexey/include/linux/ext3_fs_i.h 2003-09-17 18:58:39.000000000 +0400 +--- linux-2.4.18-chaos/include/linux/ext3_fs_i.h~ext3-ea-in-inode-2.4.18-chaos 2003-10-08 10:38:03.000000000 +0400 ++++ linux-2.4.18-chaos-alexey/include/linux/ext3_fs_i.h 2003-10-08 15:08:45.000000000 +0400 @@ -62,6 +62,9 @@ struct ext3_inode_info { */ loff_t i_disksize; @@ -745,8 +743,8 @@ /* * truncate_sem is for serialising ext3_truncate() against * ext3_getblock(). In the 2.4 ext2 design, great chunks of inode's ---- linux-2.4.18-chaos-uml/fs/ext3/super.c~ext3-ea-in-inode-2.4.18-chaos 2003-09-17 18:58:18.000000000 +0400 -+++ linux-2.4.18-chaos-uml-alexey/fs/ext3/super.c 2003-09-17 18:59:14.000000000 +0400 +--- linux-2.4.18-chaos/fs/ext3/super.c~ext3-ea-in-inode-2.4.18-chaos 2003-10-08 10:38:03.000000000 +0400 ++++ linux-2.4.18-chaos-alexey/fs/ext3/super.c 2003-10-08 15:08:45.000000000 +0400 @@ -1292,7 +1292,9 @@ struct super_block * ext3_read_super (st } else { sbi->s_inode_size = le16_to_cpu(es->s_inode_size); diff --git a/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.20.patch b/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.20.patch index f150020..0053d92 100644 --- a/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.20.patch +++ b/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.20.patch @@ -1,13 +1,13 @@ fs/ext3/ialloc.c | 6 fs/ext3/inode.c | 12 fs/ext3/super.c | 6 - fs/ext3/xattr.c | 600 +++++++++++++++++++++++++++++++++++++++++++++- + fs/ext3/xattr.c | 597 +++++++++++++++++++++++++++++++++++++++++++++- include/linux/ext3_fs.h | 2 include/linux/ext3_fs_i.h | 3 - 6 files changed, 616 insertions(+), 13 deletions(-) + 6 files changed, 615 insertions(+), 11 deletions(-) ---- linux-2.4.20-vanilla/fs/ext3/ialloc.c~ext3-ea-in-inode-2.4.20 2003-09-17 21:06:28.000000000 +0400 -+++ linux-2.4.20-vanilla-alexey/fs/ext3/ialloc.c 2003-09-17 21:16:16.000000000 +0400 +--- linux-2.4.20/fs/ext3/ialloc.c~ext3-ea-in-inode-2.4.20 2003-10-08 23:18:08.000000000 +0400 ++++ linux-2.4.20-alexey/fs/ext3/ialloc.c 2003-10-12 16:25:21.000000000 +0400 @@ -577,6 +577,12 @@ repeat: insert_inode_hash(inode); inode->i_generation = sb->u.ext3_sb.s_next_generation++; @@ -21,8 +21,8 @@ inode->u.ext3_i.i_state = EXT3_STATE_NEW; err = ext3_get_inode_loc_new(inode, &iloc, 1); if (err) goto fail; ---- linux-2.4.20-vanilla/fs/ext3/inode.c~ext3-ea-in-inode-2.4.20 2003-09-17 21:06:28.000000000 +0400 -+++ linux-2.4.20-vanilla-alexey/fs/ext3/inode.c 2003-09-17 21:16:16.000000000 +0400 +--- linux-2.4.20/fs/ext3/inode.c~ext3-ea-in-inode-2.4.20 2003-10-08 23:18:08.000000000 +0400 ++++ linux-2.4.20-alexey/fs/ext3/inode.c 2003-10-12 16:25:21.000000000 +0400 @@ -2209,6 +2209,12 @@ void ext3_read_inode(struct inode * inod inode->u.ext3_i.i_data[block] = iloc.raw_inode->i_block[block]; INIT_LIST_HEAD(&inode->u.ext3_i.i_orphan); @@ -56,8 +56,8 @@ BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); rc = ext3_journal_dirty_metadata(handle, bh); if (!err) ---- linux-2.4.20-vanilla/fs/ext3/xattr.c~ext3-ea-in-inode-2.4.20 2003-09-17 21:06:27.000000000 +0400 -+++ linux-2.4.20-vanilla-alexey/fs/ext3/xattr.c 2003-09-17 21:17:55.000000000 +0400 +--- linux-2.4.20/fs/ext3/xattr.c~ext3-ea-in-inode-2.4.20 2003-10-08 23:18:06.000000000 +0400 ++++ linux-2.4.20-alexey/fs/ext3/xattr.c 2003-10-12 16:26:31.000000000 +0400 @@ -100,6 +100,9 @@ static int ext3_xattr_set2(handle_t *, struct inode *, struct buffer_head *, struct ext3_xattr_header *); @@ -605,7 +605,7 @@ * ext3_xattr_set() * * Create, replace or remove an extended attribute for this inode. Buffer -@@ -566,6 +1050,102 @@ static void ext3_xattr_update_super_bloc +@@ -566,6 +1050,100 @@ static void ext3_xattr_update_super_bloc */ int ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index, @@ -630,7 +630,6 @@ + name_len = strlen(name); + if (name_len > 255 || value_len > inode->i_sb->s_blocksize) + return -ERANGE; -+ down(&ext3_xattr_sem); + + /* try to find attribute in inode body */ + err = ext3_xattr_ibody_find(inode, name_index, name, &entry, &free1); @@ -694,7 +693,6 @@ + } + +finish: -+ up(&ext3_xattr_sem); + return err; +} + @@ -708,24 +706,16 @@ const char *name, const void *value, size_t value_len, int flags) { struct super_block *sb = inode->i_sb; -@@ -603,7 +1183,6 @@ ext3_xattr_set(handle_t *handle, struct +@@ -603,6 +1181,7 @@ ext3_xattr_set(handle_t *handle, struct name_len = strlen(name); if (name_len > 255 || value_len > sb->s_blocksize) return -ERANGE; -- down(&ext3_xattr_sem); ++ + down(&ext3_xattr_sem); if (block) { - /* The inode already has an extended attribute block. */ -@@ -801,7 +1380,6 @@ cleanup: - brelse(bh); - if (!(bh && header == HDR(bh))) - kfree(header); -- up(&ext3_xattr_sem); - - return error; - } ---- linux-2.4.20-vanilla/include/linux/ext3_fs.h~ext3-ea-in-inode-2.4.20 2003-09-17 21:16:09.000000000 +0400 -+++ linux-2.4.20-vanilla-alexey/include/linux/ext3_fs.h 2003-09-17 21:16:16.000000000 +0400 +--- linux-2.4.20/include/linux/ext3_fs.h~ext3-ea-in-inode-2.4.20 2003-10-08 23:18:08.000000000 +0400 ++++ linux-2.4.20-alexey/include/linux/ext3_fs.h 2003-10-12 16:35:46.000000000 +0400 @@ -264,6 +264,8 @@ struct ext3_inode { __u32 m_i_reserved2[2]; } masix2; @@ -735,8 +725,8 @@ }; #define i_size_high i_dir_acl ---- linux-2.4.20-vanilla/include/linux/ext3_fs_i.h~ext3-ea-in-inode-2.4.20 2003-09-17 21:14:55.000000000 +0400 -+++ linux-2.4.20-vanilla-alexey/include/linux/ext3_fs_i.h 2003-09-17 21:16:16.000000000 +0400 +--- linux-2.4.20/include/linux/ext3_fs_i.h~ext3-ea-in-inode-2.4.20 2001-11-22 22:46:19.000000000 +0300 ++++ linux-2.4.20-alexey/include/linux/ext3_fs_i.h 2003-10-12 16:34:14.000000000 +0400 @@ -62,6 +62,9 @@ struct ext3_inode_info { */ loff_t i_disksize; @@ -747,8 +737,8 @@ /* * truncate_sem is for serialising ext3_truncate() against * ext3_getblock(). In the 2.4 ext2 design, great chunks of inode's ---- linux-2.4.20-vanilla/fs/ext3/super.c~ext3-ea-in-inode-2.4.20 2003-09-17 21:06:29.000000000 +0400 -+++ linux-2.4.20-vanilla-alexey/fs/ext3/super.c 2003-09-17 21:34:13.000000000 +0400 +--- linux-2.4.20/fs/ext3/super.c~ext3-ea-in-inode-2.4.20 2003-10-08 23:18:09.000000000 +0400 ++++ linux-2.4.20-alexey/fs/ext3/super.c 2003-10-12 16:25:21.000000000 +0400 @@ -1292,8 +1292,10 @@ struct super_block * ext3_read_super (st } else { sbi->s_inode_size = le16_to_cpu(es->s_inode_size); diff --git a/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.22-rh.patch b/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.22-rh.patch index d48fbd2..5800fe0 100644 --- a/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.22-rh.patch +++ b/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.22-rh.patch @@ -1,10 +1,10 @@ fs/ext3/ialloc.c | 6 fs/ext3/inode.c | 12 fs/ext3/super.c | 6 - fs/ext3/xattr.c | 600 +++++++++++++++++++++++++++++++++++++++++++++- + fs/ext3/xattr.c | 597 +++++++++++++++++++++++++++++++++++++++++++++- include/linux/ext3_fs.h | 2 include/linux/ext3_fs_i.h | 3 - 6 files changed, 616 insertions(+), 13 deletions(-) + 6 files changed, 615 insertions(+), 11 deletions(-) --- linux-2.4.22-ac1/fs/ext3/ialloc.c~ext3-ea-in-inode-2.4.22-rh 2003-10-08 13:57:56.000000000 +0400 +++ linux-2.4.22-ac1-alexey/fs/ext3/ialloc.c 2003-10-08 15:13:31.000000000 +0400 @@ -72,7 +72,7 @@ sbi->s_inode_size); goto failed_mount; --- linux-2.4.22-ac1/fs/ext3/xattr.c~ext3-ea-in-inode-2.4.22-rh 2003-10-08 13:57:56.000000000 +0400 -+++ linux-2.4.22-ac1-alexey/fs/ext3/xattr.c 2003-10-08 15:13:31.000000000 +0400 ++++ linux-2.4.22-ac1-alexey/fs/ext3/xattr.c 2003-10-12 16:36:07.000000000 +0400 @@ -100,6 +100,9 @@ static int ext3_xattr_set2(handle_t *, struct inode *, struct buffer_head *, struct ext3_xattr_header *); @@ -620,7 +620,7 @@ * ext3_xattr_set() * * Create, replace or remove an extended attribute for this inode. Buffer -@@ -566,6 +1050,102 @@ static void ext3_xattr_update_super_bloc +@@ -566,6 +1050,100 @@ static void ext3_xattr_update_super_bloc */ int ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index, @@ -645,7 +645,6 @@ + name_len = strlen(name); + if (name_len > 255 || value_len > inode->i_sb->s_blocksize) + return -ERANGE; -+ down(&ext3_xattr_sem); + + /* try to find attribute in inode body */ + err = ext3_xattr_ibody_find(inode, name_index, name, &entry, &free1); @@ -709,7 +708,6 @@ + } + +finish: -+ up(&ext3_xattr_sem); + return err; +} + @@ -723,22 +721,14 @@ const char *name, const void *value, size_t value_len, int flags) { struct super_block *sb = inode->i_sb; -@@ -603,7 +1183,6 @@ ext3_xattr_set(handle_t *handle, struct +@@ -603,6 +1181,7 @@ ext3_xattr_set(handle_t *handle, struct name_len = strlen(name); if (name_len > 255 || value_len > sb->s_blocksize) return -ERANGE; -- down(&ext3_xattr_sem); ++ + down(&ext3_xattr_sem); if (block) { - /* The inode already has an extended attribute block. */ -@@ -801,7 +1380,6 @@ cleanup: - brelse(bh); - if (!(bh && header == HDR(bh))) - kfree(header); -- up(&ext3_xattr_sem); - - return error; - } --- linux-2.4.22-ac1/include/linux/ext3_fs.h~ext3-ea-in-inode-2.4.22-rh 2003-10-08 13:57:57.000000000 +0400 +++ linux-2.4.22-ac1-alexey/include/linux/ext3_fs.h 2003-10-08 15:13:31.000000000 +0400 @@ -265,6 +265,8 @@ struct ext3_inode {