Whamcloud - gitweb
b=18649 set wait_recovery_complete() MAX value to max recovery time estimated
[fs/lustre-release.git] / lustre / kernel_patches / patches / ext3-extents-multiblock-directio-2.6.5-suse.patch
1 Index: linux-2.6.5-7.283-full/include/linux/ext3_fs.h
2 ===================================================================
3 --- linux-2.6.5-7.283-full.orig/include/linux/ext3_fs.h 2007-03-28 02:13:37.000000000 +0400
4 +++ linux-2.6.5-7.283-full/include/linux/ext3_fs.h      2007-03-28 02:21:37.000000000 +0400
5 @@ -815,7 +815,7 @@ extern struct inode_operations ext3_fast
6  
7  /* extents.c */
8  extern int ext3_ext_writepage_trans_blocks(struct inode *, int);
9 -extern int ext3_ext_get_block(handle_t *, struct inode *, long,
10 +extern int ext3_ext_get_block(handle_t *, struct inode *, long, int,
11                               struct buffer_head *, int, int);
12  extern void ext3_ext_truncate(struct inode *, struct page *);
13  extern void ext3_ext_init(struct super_block *);
14 Index: linux-2.6.5-7.283-full/fs/ext3/extents.c
15 ===================================================================
16 --- linux-2.6.5-7.283-full.orig/fs/ext3/extents.c       2007-03-28 02:14:25.000000000 +0400
17 +++ linux-2.6.5-7.283-full/fs/ext3/extents.c    2007-03-28 02:21:37.000000000 +0400
18 @@ -2024,7 +2024,8 @@ void ext3_init_tree_desc(struct ext3_ext
19  }
20  
21  int ext3_ext_get_block(handle_t *handle, struct inode *inode,
22 -                      long iblock, struct buffer_head *bh_result,
23 +                      long iblock, int max_blocks, 
24 +                      struct buffer_head *bh_result,
25                        int create, int extend_disksize)
26  {
27         struct ext3_ext_path *path = NULL;
28 @@ -2032,6 +2033,11 @@ int ext3_ext_get_block(handle_t *handle,
29         struct ext3_extent *ex;
30         int goal, newblock, err = 0, depth;
31         struct ext3_extents_tree tree;
32 +       unsigned long next;
33 +       int allocated = 0;
34 +
35 +       /* until we have multiblock allocation */
36 +       max_blocks = 1;
37  
38         __clear_bit(BH_New, &bh_result->b_state);
39         ext3_init_tree_desc(&tree, inode);
40 @@ -2051,6 +2057,9 @@ int ext3_ext_get_block(handle_t *handle,
41                 } else if (goal == EXT3_EXT_CACHE_EXTENT) {
42                         /* block is already allocated */
43                         newblock = iblock - newex.ee_block + newex.ee_start;
44 +                       /* number of remaining blocks in the extent */
45 +                       EXT_ASSERT(iblock >= newex.ee_block);
46 +                       allocated = newex.ee_len - (iblock - newex.ee_block);
47                         goto out;
48                 } else {
49                         EXT_ASSERT(0);
50 @@ -2078,6 +2087,8 @@ int ext3_ext_get_block(handle_t *handle,
51                 /* if found exent covers block, simple return it */
52                 if (iblock >= ex->ee_block && iblock < ex->ee_block + ex->ee_len) {
53                         newblock = iblock - ex->ee_block + ex->ee_start;
54 +                       /* number of remaining blocks in the extent */
55 +                       allocated = ex->ee_len - (iblock - ex->ee_block);
56                         ext_debug(&tree, "%d fit into %d:%d -> %d\n",
57                                   (int) iblock, ex->ee_block, ex->ee_len,
58                                   newblock);
59 @@ -2098,6 +2109,15 @@ int ext3_ext_get_block(handle_t *handle,
60                 goto out2;
61         }
62  
63 +       /* find next allocated block so that we know how many
64 +        * blocks we can allocate without ovelapping next extent */
65 +       EXT_ASSERT(iblock >= ex->ee_block + ex->ee_len);
66 +       next = ext3_ext_next_allocated_block(path);
67 +       EXT_ASSERT(next > iblock);
68 +       allocated = next - iblock;
69 +       if (allocated > max_blocks)
70 +               allocated = max_blocks;
71 +
72         /* allocate new block */
73         goal = ext3_ext_find_goal(inode, path, iblock);
74         newblock = ext3_new_block(handle, inode, goal, &err);
75 @@ -2112,8 +2132,11 @@ int ext3_ext_get_block(handle_t *handle,
76         newex.ee_start_hi = 0;
77         newex.ee_len = 1;
78         err = ext3_ext_insert_extent(handle, &tree, path, &newex);
79 -       if (err)
80 +       if (err) {
81 +               /* free data blocks we just allocated */
82 +               ext3_free_blocks(handle, inode, newex.ee_start, newex.ee_len);
83                 goto out2;
84 +       }
85         
86         if (extend_disksize && inode->i_size > EXT3_I(inode)->i_disksize)
87                 EXT3_I(inode)->i_disksize = inode->i_size;
88 @@ -2125,10 +2148,13 @@ int ext3_ext_get_block(handle_t *handle,
89         ext3_ext_put_in_cache(&tree, newex.ee_block, newex.ee_len,
90                               newex.ee_start, EXT3_EXT_CACHE_EXTENT);
91  out:
92 +       if (allocated > max_blocks)
93 +               allocated = max_blocks;
94         ext3_ext_show_leaf(&tree, path);
95         __set_bit(BH_Mapped, &bh_result->b_state);
96         bh_result->b_bdev = inode->i_sb->s_bdev;
97         bh_result->b_blocknr = newblock;
98 +       bh_result->b_size = (allocated << inode->i_blkbits);
99  out2:
100         if (path) {
101                 ext3_ext_drop_refs(path);
102 Index: linux-2.6.5-7.283-full/fs/ext3/inode.c
103 ===================================================================
104 --- linux-2.6.5-7.283-full.orig/fs/ext3/inode.c 2007-03-28 02:13:37.000000000 +0400
105 +++ linux-2.6.5-7.283-full/fs/ext3/inode.c      2007-03-28 02:50:19.000000000 +0400
106 @@ -800,13 +800,17 @@ changed:
107  
108  static inline int
109  ext3_get_block_wrap(handle_t *handle, struct inode *inode, long block,
110 -                   struct buffer_head *bh, int create, int extend_disksize)
111 +                       int max_blocks, struct buffer_head *bh, int create,
112 +                       int extend_disksize)
113  {
114 +       int ret;
115         if (EXT3_I(inode)->i_flags & EXT3_EXTENTS_FL)
116 -               return ext3_ext_get_block(handle, inode, block, bh, create,
117 -                                         extend_disksize);
118 -       return ext3_get_block_handle(handle, inode, block, bh, create,
119 +               return ext3_ext_get_block(handle, inode, block, max_blocks,
120 +                                       bh, create, extend_disksize);
121 +       ret = ext3_get_block_handle(handle, inode, block, bh, create,
122                                      extend_disksize);
123 +       bh->b_size = (1 << inode->i_blkbits);
124 +       return ret;
125  }
126  
127  static int ext3_get_block(struct inode *inode, sector_t iblock,
128 @@ -819,7 +823,7 @@ static int ext3_get_block(struct inode *
129                 handle = ext3_journal_current_handle();
130                 J_ASSERT(handle != 0);
131         }
132 -       ret = ext3_get_block_wrap(handle, inode, iblock,
133 +       ret = ext3_get_block_wrap(handle, inode, iblock, 1,
134                                   bh_result, create, 1);
135         return ret;
136  }
137 @@ -847,10 +851,8 @@ ext3_direct_io_get_blocks(struct inode *
138                 }
139         }
140         if (ret == 0)
141 -               ret = ext3_get_block_wrap(handle, inode, iblock,
142 +               ret = ext3_get_block_wrap(handle, inode, iblock, max_blocks,
143                                           bh_result, create, 0);
144 -       if (ret == 0)
145 -               bh_result->b_size = (1 << inode->i_blkbits);
146         return ret;
147  }
148  
149 @@ -869,7 +871,7 @@ struct buffer_head *ext3_getblk(handle_t
150         dummy.b_state = 0;
151         dummy.b_blocknr = -1000;
152         buffer_trace_init(&dummy.b_history);
153 -       *errp = ext3_get_block_wrap(handle, inode, block, &dummy, create, 1);
154 +       *errp = ext3_get_block_wrap(handle, inode, block, 1, &dummy, create, 1);
155         if (!*errp && buffer_mapped(&dummy)) {
156                 struct buffer_head *bh;
157                 bh = sb_getblk(inode->i_sb, dummy.b_blocknr);