Whamcloud - gitweb
b=20581 MDS returns full hash for readdir to decrease hash collision
[fs/lustre-release.git] / ldiskfs / kernel_patches / patches / ext3-pdir-fix.patch
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
4 @@ -51,19 +51,25 @@
5  #define NAMEI_RA_SIZE        (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS)
6  #define NAMEI_RA_INDEX(c,b)  (((c) * NAMEI_RA_BLOCKS) + (b))
7  
8 -static struct buffer_head *ext3_append(handle_t *handle,
9 +struct buffer_head *ext3_append(handle_t *handle,
10                                         struct inode *inode,
11                                         u32 *block, int *err)
12  {
13         struct buffer_head *bh;
14 +       struct ext3_inode_info *ei = EXT3_I(inode);
15
16 +       /* with parallel dir operations all appends
17 +        * have to be serialized -bzzz */
18 +       down(&ei->i_append_sem);
19  
20         *block = inode->i_size >> inode->i_sb->s_blocksize_bits;
21  
22 -       if ((bh = ext3_bread(handle, inode, *block, 1, err))) {
23 +       bh = ext3_bread(handle, inode, *block, 1, err);
24 +       if (bh != NULL) {
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;
29         }
30 +       up(&ei->i_append_sem);
31         return bh;
32  }
33  
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;
40  #endif
41 +       dynlock_init(&ei->i_htree_lock);
42 +       sema_init(&ei->i_append_sem, 1);
43 +
44         ei->i_block_alloc_info = NULL;
45         ei->vfs_inode.i_version = 1;
46  
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
50 @@ -16,6 +16,7 @@
51  #ifndef _LINUX_EXT3_FS_I
52  #define _LINUX_EXT3_FS_I
53  
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;
61  
62 +       /* following fields for parallel directory operations -bzzz */
63 +       struct dynlock   i_htree_lock;
64 +       struct semaphore i_append_sem;
65 +
66         __u32   i_dir_start_lookup;
67  #ifdef CONFIG_EXT3_FS_XATTR
68         /*