1 diff -rupN linux-2.6.18-128.1.6_1/fs/ext3/namei.c linux-2.6.18-128.1.6_2/fs/ext3/namei.c
2 --- linux-2.6.18-128.1.6_1/fs/ext3/namei.c 2009-08-13 19:27:12.000000000 +0530
3 +++ linux-2.6.18-128.1.6_2/fs/ext3/namei.c 2009-08-13 19:33:34.000000000 +0530
5 #define NAMEI_RA_SIZE (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS)
6 #define NAMEI_RA_INDEX(c,b) (((c) * NAMEI_RA_BLOCKS) + (b))
8 -static struct buffer_head *ext3_append(handle_t *handle,
9 +struct buffer_head *ext3_append(handle_t *handle,
13 struct buffer_head *bh;
14 + struct ext3_inode_info *ei = EXT3_I(inode);
16 + /* with parallel dir operations all appends
17 + * have to be serialized -bzzz */
18 + down(&ei->i_append_sem);
20 *block = inode->i_size >> inode->i_sb->s_blocksize_bits;
22 - if ((bh = ext3_bread(handle, inode, *block, 1, err))) {
23 + bh = ext3_bread(handle, inode, *block, 1, err);
25 inode->i_size += inode->i_sb->s_blocksize;
26 - EXT3_I(inode)->i_disksize = inode->i_size;
27 - ext3_journal_get_write_access(handle,bh);
28 + ei->i_disksize = inode->i_size;
30 + up(&ei->i_append_sem);
34 diff -rupN linux-2.6.18-128.1.6_1/fs/ext3/super.c linux-2.6.18-128.1.6_2/fs/ext3/super.c
35 --- linux-2.6.18-128.1.6_1/fs/ext3/super.c 2009-08-13 19:27:12.000000000 +0530
36 +++ linux-2.6.18-128.1.6_2/fs/ext3/super.c 2009-08-13 19:27:40.000000000 +0530
37 @@ -481,6 +481,9 @@ static struct inode *ext3_alloc_inode(st
38 ei->i_acl = EXT3_ACL_NOT_CACHED;
39 ei->i_default_acl = EXT3_ACL_NOT_CACHED;
41 + dynlock_init(&ei->i_htree_lock);
42 + sema_init(&ei->i_append_sem, 1);
44 ei->i_block_alloc_info = NULL;
45 ei->vfs_inode.i_version = 1;
47 diff -rupN linux-2.6.18-128.1.6_1/include/linux/ext3_fs_i.h linux-2.6.18-128.1.6_2/include/linux/ext3_fs_i.h
48 --- linux-2.6.18-128.1.6_1/include/linux/ext3_fs_i.h 2009-08-13 19:27:12.000000000 +0530
49 +++ linux-2.6.18-128.1.6_2/include/linux/ext3_fs_i.h 2009-08-13 19:31:22.000000000 +0530
51 #ifndef _LINUX_EXT3_FS_I
52 #define _LINUX_EXT3_FS_I
54 +#include <linux/dynlocks.h>
55 #include <linux/rwsem.h>
56 #include <linux/rbtree.h>
57 #include <linux/seqlock.h>
58 @@ -104,6 +105,10 @@ struct ext3_inode_info {
59 /* block reservation info */
60 struct ext3_block_alloc_info *i_block_alloc_info;
62 + /* following fields for parallel directory operations -bzzz */
63 + struct dynlock i_htree_lock;
64 + struct semaphore i_append_sem;
66 __u32 i_dir_start_lookup;
67 #ifdef CONFIG_EXT3_FS_XATTR