diff options
Diffstat (limited to 'fs/reiserfs/inode.c')
-rw-r--r-- | fs/reiserfs/inode.c | 1206 |
1 files changed, 707 insertions, 499 deletions
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index bc8b8009897d..e3ca04894919 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c | |||
@@ -25,7 +25,10 @@ int reiserfs_commit_write(struct file *f, struct page *page, | |||
25 | 25 | ||
26 | void reiserfs_evict_inode(struct inode *inode) | 26 | void reiserfs_evict_inode(struct inode *inode) |
27 | { | 27 | { |
28 | /* We need blocks for transaction + (user+group) quota update (possibly delete) */ | 28 | /* |
29 | * We need blocks for transaction + (user+group) quota | ||
30 | * update (possibly delete) | ||
31 | */ | ||
29 | int jbegin_count = | 32 | int jbegin_count = |
30 | JOURNAL_PER_BALANCE_CNT * 2 + | 33 | JOURNAL_PER_BALANCE_CNT * 2 + |
31 | 2 * REISERFS_QUOTA_INIT_BLOCKS(inode->i_sb); | 34 | 2 * REISERFS_QUOTA_INIT_BLOCKS(inode->i_sb); |
@@ -39,8 +42,12 @@ void reiserfs_evict_inode(struct inode *inode) | |||
39 | if (inode->i_nlink) | 42 | if (inode->i_nlink) |
40 | goto no_delete; | 43 | goto no_delete; |
41 | 44 | ||
42 | /* The = 0 happens when we abort creating a new inode for some reason like lack of space.. */ | 45 | /* |
43 | if (!(inode->i_state & I_NEW) && INODE_PKEY(inode)->k_objectid != 0) { /* also handles bad_inode case */ | 46 | * The = 0 happens when we abort creating a new inode |
47 | * for some reason like lack of space.. | ||
48 | * also handles bad_inode case | ||
49 | */ | ||
50 | if (!(inode->i_state & I_NEW) && INODE_PKEY(inode)->k_objectid != 0) { | ||
44 | 51 | ||
45 | reiserfs_delete_xattrs(inode); | 52 | reiserfs_delete_xattrs(inode); |
46 | 53 | ||
@@ -54,34 +61,43 @@ void reiserfs_evict_inode(struct inode *inode) | |||
54 | 61 | ||
55 | err = reiserfs_delete_object(&th, inode); | 62 | err = reiserfs_delete_object(&th, inode); |
56 | 63 | ||
57 | /* Do quota update inside a transaction for journaled quotas. We must do that | 64 | /* |
58 | * after delete_object so that quota updates go into the same transaction as | 65 | * Do quota update inside a transaction for journaled quotas. |
59 | * stat data deletion */ | 66 | * We must do that after delete_object so that quota updates |
67 | * go into the same transaction as stat data deletion | ||
68 | */ | ||
60 | if (!err) { | 69 | if (!err) { |
61 | int depth = reiserfs_write_unlock_nested(inode->i_sb); | 70 | int depth = reiserfs_write_unlock_nested(inode->i_sb); |
62 | dquot_free_inode(inode); | 71 | dquot_free_inode(inode); |
63 | reiserfs_write_lock_nested(inode->i_sb, depth); | 72 | reiserfs_write_lock_nested(inode->i_sb, depth); |
64 | } | 73 | } |
65 | 74 | ||
66 | if (journal_end(&th, inode->i_sb, jbegin_count)) | 75 | if (journal_end(&th)) |
67 | goto out; | 76 | goto out; |
68 | 77 | ||
69 | /* check return value from reiserfs_delete_object after | 78 | /* |
79 | * check return value from reiserfs_delete_object after | ||
70 | * ending the transaction | 80 | * ending the transaction |
71 | */ | 81 | */ |
72 | if (err) | 82 | if (err) |
73 | goto out; | 83 | goto out; |
74 | 84 | ||
75 | /* all items of file are deleted, so we can remove "save" link */ | 85 | /* |
76 | remove_save_link(inode, 0 /* not truncate */ ); /* we can't do anything | 86 | * all items of file are deleted, so we can remove |
77 | * about an error here */ | 87 | * "save" link |
88 | * we can't do anything about an error here | ||
89 | */ | ||
90 | remove_save_link(inode, 0 /* not truncate */); | ||
78 | out: | 91 | out: |
79 | reiserfs_write_unlock(inode->i_sb); | 92 | reiserfs_write_unlock(inode->i_sb); |
80 | } else { | 93 | } else { |
81 | /* no object items are in the tree */ | 94 | /* no object items are in the tree */ |
82 | ; | 95 | ; |
83 | } | 96 | } |
84 | clear_inode(inode); /* note this must go after the journal_end to prevent deadlock */ | 97 | |
98 | /* note this must go after the journal_end to prevent deadlock */ | ||
99 | clear_inode(inode); | ||
100 | |||
85 | dquot_drop(inode); | 101 | dquot_drop(inode); |
86 | inode->i_blocks = 0; | 102 | inode->i_blocks = 0; |
87 | return; | 103 | return; |
@@ -103,8 +119,10 @@ static void _make_cpu_key(struct cpu_key *key, int version, __u32 dirid, | |||
103 | key->key_length = length; | 119 | key->key_length = length; |
104 | } | 120 | } |
105 | 121 | ||
106 | /* take base of inode_key (it comes from inode always) (dirid, objectid) and version from an inode, set | 122 | /* |
107 | offset and type of key */ | 123 | * take base of inode_key (it comes from inode always) (dirid, objectid) |
124 | * and version from an inode, set offset and type of key | ||
125 | */ | ||
108 | void make_cpu_key(struct cpu_key *key, struct inode *inode, loff_t offset, | 126 | void make_cpu_key(struct cpu_key *key, struct inode *inode, loff_t offset, |
109 | int type, int length) | 127 | int type, int length) |
110 | { | 128 | { |
@@ -114,9 +132,7 @@ void make_cpu_key(struct cpu_key *key, struct inode *inode, loff_t offset, | |||
114 | length); | 132 | length); |
115 | } | 133 | } |
116 | 134 | ||
117 | // | 135 | /* when key is 0, do not set version and short key */ |
118 | // when key is 0, do not set version and short key | ||
119 | // | ||
120 | inline void make_le_item_head(struct item_head *ih, const struct cpu_key *key, | 136 | inline void make_le_item_head(struct item_head *ih, const struct cpu_key *key, |
121 | int version, | 137 | int version, |
122 | loff_t offset, int type, int length, | 138 | loff_t offset, int type, int length, |
@@ -132,43 +148,47 @@ inline void make_le_item_head(struct item_head *ih, const struct cpu_key *key, | |||
132 | set_le_ih_k_type(ih, type); | 148 | set_le_ih_k_type(ih, type); |
133 | put_ih_item_len(ih, length); | 149 | put_ih_item_len(ih, length); |
134 | /* set_ih_free_space (ih, 0); */ | 150 | /* set_ih_free_space (ih, 0); */ |
135 | // for directory items it is entry count, for directs and stat | 151 | /* |
136 | // datas - 0xffff, for indirects - 0 | 152 | * for directory items it is entry count, for directs and stat |
153 | * datas - 0xffff, for indirects - 0 | ||
154 | */ | ||
137 | put_ih_entry_count(ih, entry_count); | 155 | put_ih_entry_count(ih, entry_count); |
138 | } | 156 | } |
139 | 157 | ||
140 | // | 158 | /* |
141 | // FIXME: we might cache recently accessed indirect item | 159 | * FIXME: we might cache recently accessed indirect item |
142 | 160 | * Ugh. Not too eager for that.... | |
143 | // Ugh. Not too eager for that.... | 161 | * I cut the code until such time as I see a convincing argument (benchmark). |
144 | // I cut the code until such time as I see a convincing argument (benchmark). | 162 | * I don't want a bloated inode struct..., and I don't like code complexity.... |
145 | // I don't want a bloated inode struct..., and I don't like code complexity.... | 163 | */ |
146 | |||
147 | /* cutting the code is fine, since it really isn't in use yet and is easy | ||
148 | ** to add back in. But, Vladimir has a really good idea here. Think | ||
149 | ** about what happens for reading a file. For each page, | ||
150 | ** The VFS layer calls reiserfs_readpage, who searches the tree to find | ||
151 | ** an indirect item. This indirect item has X number of pointers, where | ||
152 | ** X is a big number if we've done the block allocation right. But, | ||
153 | ** we only use one or two of these pointers during each call to readpage, | ||
154 | ** needlessly researching again later on. | ||
155 | ** | ||
156 | ** The size of the cache could be dynamic based on the size of the file. | ||
157 | ** | ||
158 | ** I'd also like to see us cache the location the stat data item, since | ||
159 | ** we are needlessly researching for that frequently. | ||
160 | ** | ||
161 | ** --chris | ||
162 | */ | ||
163 | 164 | ||
164 | /* If this page has a file tail in it, and | 165 | /* |
165 | ** it was read in by get_block_create_0, the page data is valid, | 166 | * cutting the code is fine, since it really isn't in use yet and is easy |
166 | ** but tail is still sitting in a direct item, and we can't write to | 167 | * to add back in. But, Vladimir has a really good idea here. Think |
167 | ** it. So, look through this page, and check all the mapped buffers | 168 | * about what happens for reading a file. For each page, |
168 | ** to make sure they have valid block numbers. Any that don't need | 169 | * The VFS layer calls reiserfs_readpage, who searches the tree to find |
169 | ** to be unmapped, so that __block_write_begin will correctly call | 170 | * an indirect item. This indirect item has X number of pointers, where |
170 | ** reiserfs_get_block to convert the tail into an unformatted node | 171 | * X is a big number if we've done the block allocation right. But, |
171 | */ | 172 | * we only use one or two of these pointers during each call to readpage, |
173 | * needlessly researching again later on. | ||
174 | * | ||
175 | * The size of the cache could be dynamic based on the size of the file. | ||
176 | * | ||
177 | * I'd also like to see us cache the location the stat data item, since | ||
178 | * we are needlessly researching for that frequently. | ||
179 | * | ||
180 | * --chris | ||
181 | */ | ||
182 | |||
183 | /* | ||
184 | * If this page has a file tail in it, and | ||
185 | * it was read in by get_block_create_0, the page data is valid, | ||
186 | * but tail is still sitting in a direct item, and we can't write to | ||
187 | * it. So, look through this page, and check all the mapped buffers | ||
188 | * to make sure they have valid block numbers. Any that don't need | ||
189 | * to be unmapped, so that __block_write_begin will correctly call | ||
190 | * reiserfs_get_block to convert the tail into an unformatted node | ||
191 | */ | ||
172 | static inline void fix_tail_page_for_writing(struct page *page) | 192 | static inline void fix_tail_page_for_writing(struct page *page) |
173 | { | 193 | { |
174 | struct buffer_head *head, *next, *bh; | 194 | struct buffer_head *head, *next, *bh; |
@@ -186,8 +206,10 @@ static inline void fix_tail_page_for_writing(struct page *page) | |||
186 | } | 206 | } |
187 | } | 207 | } |
188 | 208 | ||
189 | /* reiserfs_get_block does not need to allocate a block only if it has been | 209 | /* |
190 | done already or non-hole position has been found in the indirect item */ | 210 | * reiserfs_get_block does not need to allocate a block only if it has been |
211 | * done already or non-hole position has been found in the indirect item | ||
212 | */ | ||
191 | static inline int allocation_needed(int retval, b_blocknr_t allocated, | 213 | static inline int allocation_needed(int retval, b_blocknr_t allocated, |
192 | struct item_head *ih, | 214 | struct item_head *ih, |
193 | __le32 * item, int pos_in_item) | 215 | __le32 * item, int pos_in_item) |
@@ -211,14 +233,16 @@ static inline void set_block_dev_mapped(struct buffer_head *bh, | |||
211 | map_bh(bh, inode->i_sb, block); | 233 | map_bh(bh, inode->i_sb, block); |
212 | } | 234 | } |
213 | 235 | ||
214 | // | 236 | /* |
215 | // files which were created in the earlier version can not be longer, | 237 | * files which were created in the earlier version can not be longer, |
216 | // than 2 gb | 238 | * than 2 gb |
217 | // | 239 | */ |
218 | static int file_capable(struct inode *inode, sector_t block) | 240 | static int file_capable(struct inode *inode, sector_t block) |
219 | { | 241 | { |
220 | if (get_inode_item_key_version(inode) != KEY_FORMAT_3_5 || // it is new file. | 242 | /* it is new file. */ |
221 | block < (1 << (31 - inode->i_sb->s_blocksize_bits))) // old file, but 'block' is inside of 2gb | 243 | if (get_inode_item_key_version(inode) != KEY_FORMAT_3_5 || |
244 | /* old file, but 'block' is inside of 2gb */ | ||
245 | block < (1 << (31 - inode->i_sb->s_blocksize_bits))) | ||
222 | return 1; | 246 | return 1; |
223 | 247 | ||
224 | return 0; | 248 | return 0; |
@@ -228,7 +252,6 @@ static int restart_transaction(struct reiserfs_transaction_handle *th, | |||
228 | struct inode *inode, struct treepath *path) | 252 | struct inode *inode, struct treepath *path) |
229 | { | 253 | { |
230 | struct super_block *s = th->t_super; | 254 | struct super_block *s = th->t_super; |
231 | int len = th->t_blocks_allocated; | ||
232 | int err; | 255 | int err; |
233 | 256 | ||
234 | BUG_ON(!th->t_trans_id); | 257 | BUG_ON(!th->t_trans_id); |
@@ -241,7 +264,7 @@ static int restart_transaction(struct reiserfs_transaction_handle *th, | |||
241 | return 0; | 264 | return 0; |
242 | } | 265 | } |
243 | reiserfs_update_sd(th, inode); | 266 | reiserfs_update_sd(th, inode); |
244 | err = journal_end(th, s, len); | 267 | err = journal_end(th); |
245 | if (!err) { | 268 | if (!err) { |
246 | err = journal_begin(th, s, JOURNAL_PER_BALANCE_CNT * 6); | 269 | err = journal_begin(th, s, JOURNAL_PER_BALANCE_CNT * 6); |
247 | if (!err) | 270 | if (!err) |
@@ -250,14 +273,14 @@ static int restart_transaction(struct reiserfs_transaction_handle *th, | |||
250 | return err; | 273 | return err; |
251 | } | 274 | } |
252 | 275 | ||
253 | // it is called by get_block when create == 0. Returns block number | 276 | /* |
254 | // for 'block'-th logical block of file. When it hits direct item it | 277 | * it is called by get_block when create == 0. Returns block number |
255 | // returns 0 (being called from bmap) or read direct item into piece | 278 | * for 'block'-th logical block of file. When it hits direct item it |
256 | // of page (bh_result) | 279 | * returns 0 (being called from bmap) or read direct item into piece |
257 | 280 | * of page (bh_result) | |
258 | // Please improve the english/clarity in the comment above, as it is | 281 | * Please improve the english/clarity in the comment above, as it is |
259 | // hard to understand. | 282 | * hard to understand. |
260 | 283 | */ | |
261 | static int _get_block_create_0(struct inode *inode, sector_t block, | 284 | static int _get_block_create_0(struct inode *inode, sector_t block, |
262 | struct buffer_head *bh_result, int args) | 285 | struct buffer_head *bh_result, int args) |
263 | { | 286 | { |
@@ -273,7 +296,7 @@ static int _get_block_create_0(struct inode *inode, sector_t block, | |||
273 | int done = 0; | 296 | int done = 0; |
274 | unsigned long offset; | 297 | unsigned long offset; |
275 | 298 | ||
276 | // prepare the key to look for the 'block'-th block of file | 299 | /* prepare the key to look for the 'block'-th block of file */ |
277 | make_cpu_key(&key, inode, | 300 | make_cpu_key(&key, inode, |
278 | (loff_t) block * inode->i_sb->s_blocksize + 1, TYPE_ANY, | 301 | (loff_t) block * inode->i_sb->s_blocksize + 1, TYPE_ANY, |
279 | 3); | 302 | 3); |
@@ -285,23 +308,28 @@ static int _get_block_create_0(struct inode *inode, sector_t block, | |||
285 | kunmap(bh_result->b_page); | 308 | kunmap(bh_result->b_page); |
286 | if (result == IO_ERROR) | 309 | if (result == IO_ERROR) |
287 | return -EIO; | 310 | return -EIO; |
288 | // We do not return -ENOENT if there is a hole but page is uptodate, because it means | 311 | /* |
289 | // That there is some MMAPED data associated with it that is yet to be written to disk. | 312 | * We do not return -ENOENT if there is a hole but page is |
313 | * uptodate, because it means that there is some MMAPED data | ||
314 | * associated with it that is yet to be written to disk. | ||
315 | */ | ||
290 | if ((args & GET_BLOCK_NO_HOLE) | 316 | if ((args & GET_BLOCK_NO_HOLE) |
291 | && !PageUptodate(bh_result->b_page)) { | 317 | && !PageUptodate(bh_result->b_page)) { |
292 | return -ENOENT; | 318 | return -ENOENT; |
293 | } | 319 | } |
294 | return 0; | 320 | return 0; |
295 | } | 321 | } |
296 | // | 322 | |
297 | bh = get_last_bh(&path); | 323 | bh = get_last_bh(&path); |
298 | ih = get_ih(&path); | 324 | ih = tp_item_head(&path); |
299 | if (is_indirect_le_ih(ih)) { | 325 | if (is_indirect_le_ih(ih)) { |
300 | __le32 *ind_item = (__le32 *) B_I_PITEM(bh, ih); | 326 | __le32 *ind_item = (__le32 *) ih_item_body(bh, ih); |
301 | 327 | ||
302 | /* FIXME: here we could cache indirect item or part of it in | 328 | /* |
303 | the inode to avoid search_by_key in case of subsequent | 329 | * FIXME: here we could cache indirect item or part of it in |
304 | access to file */ | 330 | * the inode to avoid search_by_key in case of subsequent |
331 | * access to file | ||
332 | */ | ||
305 | blocknr = get_block_num(ind_item, path.pos_in_item); | 333 | blocknr = get_block_num(ind_item, path.pos_in_item); |
306 | ret = 0; | 334 | ret = 0; |
307 | if (blocknr) { | 335 | if (blocknr) { |
@@ -311,8 +339,12 @@ static int _get_block_create_0(struct inode *inode, sector_t block, | |||
311 | set_buffer_boundary(bh_result); | 339 | set_buffer_boundary(bh_result); |
312 | } | 340 | } |
313 | } else | 341 | } else |
314 | // We do not return -ENOENT if there is a hole but page is uptodate, because it means | 342 | /* |
315 | // That there is some MMAPED data associated with it that is yet to be written to disk. | 343 | * We do not return -ENOENT if there is a hole but |
344 | * page is uptodate, because it means that there is | ||
345 | * some MMAPED data associated with it that is | ||
346 | * yet to be written to disk. | ||
347 | */ | ||
316 | if ((args & GET_BLOCK_NO_HOLE) | 348 | if ((args & GET_BLOCK_NO_HOLE) |
317 | && !PageUptodate(bh_result->b_page)) { | 349 | && !PageUptodate(bh_result->b_page)) { |
318 | ret = -ENOENT; | 350 | ret = -ENOENT; |
@@ -323,41 +355,45 @@ static int _get_block_create_0(struct inode *inode, sector_t block, | |||
323 | kunmap(bh_result->b_page); | 355 | kunmap(bh_result->b_page); |
324 | return ret; | 356 | return ret; |
325 | } | 357 | } |
326 | // requested data are in direct item(s) | 358 | /* requested data are in direct item(s) */ |
327 | if (!(args & GET_BLOCK_READ_DIRECT)) { | 359 | if (!(args & GET_BLOCK_READ_DIRECT)) { |
328 | // we are called by bmap. FIXME: we can not map block of file | 360 | /* |
329 | // when it is stored in direct item(s) | 361 | * we are called by bmap. FIXME: we can not map block of file |
362 | * when it is stored in direct item(s) | ||
363 | */ | ||
330 | pathrelse(&path); | 364 | pathrelse(&path); |
331 | if (p) | 365 | if (p) |
332 | kunmap(bh_result->b_page); | 366 | kunmap(bh_result->b_page); |
333 | return -ENOENT; | 367 | return -ENOENT; |
334 | } | 368 | } |
335 | 369 | ||
336 | /* if we've got a direct item, and the buffer or page was uptodate, | 370 | /* |
337 | ** we don't want to pull data off disk again. skip to the | 371 | * if we've got a direct item, and the buffer or page was uptodate, |
338 | ** end, where we map the buffer and return | 372 | * we don't want to pull data off disk again. skip to the |
373 | * end, where we map the buffer and return | ||
339 | */ | 374 | */ |
340 | if (buffer_uptodate(bh_result)) { | 375 | if (buffer_uptodate(bh_result)) { |
341 | goto finished; | 376 | goto finished; |
342 | } else | 377 | } else |
343 | /* | 378 | /* |
344 | ** grab_tail_page can trigger calls to reiserfs_get_block on up to date | 379 | * grab_tail_page can trigger calls to reiserfs_get_block on |
345 | ** pages without any buffers. If the page is up to date, we don't want | 380 | * up to date pages without any buffers. If the page is up |
346 | ** read old data off disk. Set the up to date bit on the buffer instead | 381 | * to date, we don't want read old data off disk. Set the up |
347 | ** and jump to the end | 382 | * to date bit on the buffer instead and jump to the end |
348 | */ | 383 | */ |
349 | if (!bh_result->b_page || PageUptodate(bh_result->b_page)) { | 384 | if (!bh_result->b_page || PageUptodate(bh_result->b_page)) { |
350 | set_buffer_uptodate(bh_result); | 385 | set_buffer_uptodate(bh_result); |
351 | goto finished; | 386 | goto finished; |
352 | } | 387 | } |
353 | // read file tail into part of page | 388 | /* read file tail into part of page */ |
354 | offset = (cpu_key_k_offset(&key) - 1) & (PAGE_CACHE_SIZE - 1); | 389 | offset = (cpu_key_k_offset(&key) - 1) & (PAGE_CACHE_SIZE - 1); |
355 | copy_item_head(&tmp_ih, ih); | 390 | copy_item_head(&tmp_ih, ih); |
356 | 391 | ||
357 | /* we only want to kmap if we are reading the tail into the page. | 392 | /* |
358 | ** this is not the common case, so we don't kmap until we are | 393 | * we only want to kmap if we are reading the tail into the page. |
359 | ** sure we need to. But, this means the item might move if | 394 | * this is not the common case, so we don't kmap until we are |
360 | ** kmap schedules | 395 | * sure we need to. But, this means the item might move if |
396 | * kmap schedules | ||
361 | */ | 397 | */ |
362 | if (!p) | 398 | if (!p) |
363 | p = (char *)kmap(bh_result->b_page); | 399 | p = (char *)kmap(bh_result->b_page); |
@@ -368,10 +404,11 @@ static int _get_block_create_0(struct inode *inode, sector_t block, | |||
368 | if (!is_direct_le_ih(ih)) { | 404 | if (!is_direct_le_ih(ih)) { |
369 | BUG(); | 405 | BUG(); |
370 | } | 406 | } |
371 | /* make sure we don't read more bytes than actually exist in | 407 | /* |
372 | ** the file. This can happen in odd cases where i_size isn't | 408 | * make sure we don't read more bytes than actually exist in |
373 | ** correct, and when direct item padding results in a few | 409 | * the file. This can happen in odd cases where i_size isn't |
374 | ** extra bytes at the end of the direct item | 410 | * correct, and when direct item padding results in a few |
411 | * extra bytes at the end of the direct item | ||
375 | */ | 412 | */ |
376 | if ((le_ih_k_offset(ih) + path.pos_in_item) > inode->i_size) | 413 | if ((le_ih_k_offset(ih) + path.pos_in_item) > inode->i_size) |
377 | break; | 414 | break; |
@@ -383,40 +420,43 @@ static int _get_block_create_0(struct inode *inode, sector_t block, | |||
383 | } else { | 420 | } else { |
384 | chars = ih_item_len(ih) - path.pos_in_item; | 421 | chars = ih_item_len(ih) - path.pos_in_item; |
385 | } | 422 | } |
386 | memcpy(p, B_I_PITEM(bh, ih) + path.pos_in_item, chars); | 423 | memcpy(p, ih_item_body(bh, ih) + path.pos_in_item, chars); |
387 | 424 | ||
388 | if (done) | 425 | if (done) |
389 | break; | 426 | break; |
390 | 427 | ||
391 | p += chars; | 428 | p += chars; |
392 | 429 | ||
430 | /* | ||
431 | * we done, if read direct item is not the last item of | ||
432 | * node FIXME: we could try to check right delimiting key | ||
433 | * to see whether direct item continues in the right | ||
434 | * neighbor or rely on i_size | ||
435 | */ | ||
393 | if (PATH_LAST_POSITION(&path) != (B_NR_ITEMS(bh) - 1)) | 436 | if (PATH_LAST_POSITION(&path) != (B_NR_ITEMS(bh) - 1)) |
394 | // we done, if read direct item is not the last item of | ||
395 | // node FIXME: we could try to check right delimiting key | ||
396 | // to see whether direct item continues in the right | ||
397 | // neighbor or rely on i_size | ||
398 | break; | 437 | break; |
399 | 438 | ||
400 | // update key to look for the next piece | 439 | /* update key to look for the next piece */ |
401 | set_cpu_key_k_offset(&key, cpu_key_k_offset(&key) + chars); | 440 | set_cpu_key_k_offset(&key, cpu_key_k_offset(&key) + chars); |
402 | result = search_for_position_by_key(inode->i_sb, &key, &path); | 441 | result = search_for_position_by_key(inode->i_sb, &key, &path); |
403 | if (result != POSITION_FOUND) | 442 | if (result != POSITION_FOUND) |
404 | // i/o error most likely | 443 | /* i/o error most likely */ |
405 | break; | 444 | break; |
406 | bh = get_last_bh(&path); | 445 | bh = get_last_bh(&path); |
407 | ih = get_ih(&path); | 446 | ih = tp_item_head(&path); |
408 | } while (1); | 447 | } while (1); |
409 | 448 | ||
410 | flush_dcache_page(bh_result->b_page); | 449 | flush_dcache_page(bh_result->b_page); |
411 | kunmap(bh_result->b_page); | 450 | kunmap(bh_result->b_page); |
412 | 451 | ||
413 | finished: | 452 | finished: |
414 | pathrelse(&path); | 453 | pathrelse(&path); |
415 | 454 | ||
416 | if (result == IO_ERROR) | 455 | if (result == IO_ERROR) |
417 | return -EIO; | 456 | return -EIO; |
418 | 457 | ||
419 | /* this buffer has valid data, but isn't valid for io. mapping it to | 458 | /* |
459 | * this buffer has valid data, but isn't valid for io. mapping it to | ||
420 | * block #0 tells the rest of reiserfs it just has a tail in it | 460 | * block #0 tells the rest of reiserfs it just has a tail in it |
421 | */ | 461 | */ |
422 | map_bh(bh_result, inode->i_sb, 0); | 462 | map_bh(bh_result, inode->i_sb, 0); |
@@ -424,8 +464,10 @@ static int _get_block_create_0(struct inode *inode, sector_t block, | |||
424 | return 0; | 464 | return 0; |
425 | } | 465 | } |
426 | 466 | ||
427 | // this is called to create file map. So, _get_block_create_0 will not | 467 | /* |
428 | // read direct item | 468 | * this is called to create file map. So, _get_block_create_0 will not |
469 | * read direct item | ||
470 | */ | ||
429 | static int reiserfs_bmap(struct inode *inode, sector_t block, | 471 | static int reiserfs_bmap(struct inode *inode, sector_t block, |
430 | struct buffer_head *bh_result, int create) | 472 | struct buffer_head *bh_result, int create) |
431 | { | 473 | { |
@@ -439,22 +481,23 @@ static int reiserfs_bmap(struct inode *inode, sector_t block, | |||
439 | return 0; | 481 | return 0; |
440 | } | 482 | } |
441 | 483 | ||
442 | /* special version of get_block that is only used by grab_tail_page right | 484 | /* |
443 | ** now. It is sent to __block_write_begin, and when you try to get a | 485 | * special version of get_block that is only used by grab_tail_page right |
444 | ** block past the end of the file (or a block from a hole) it returns | 486 | * now. It is sent to __block_write_begin, and when you try to get a |
445 | ** -ENOENT instead of a valid buffer. __block_write_begin expects to | 487 | * block past the end of the file (or a block from a hole) it returns |
446 | ** be able to do i/o on the buffers returned, unless an error value | 488 | * -ENOENT instead of a valid buffer. __block_write_begin expects to |
447 | ** is also returned. | 489 | * be able to do i/o on the buffers returned, unless an error value |
448 | ** | 490 | * is also returned. |
449 | ** So, this allows __block_write_begin to be used for reading a single block | 491 | * |
450 | ** in a page. Where it does not produce a valid page for holes, or past the | 492 | * So, this allows __block_write_begin to be used for reading a single block |
451 | ** end of the file. This turns out to be exactly what we need for reading | 493 | * in a page. Where it does not produce a valid page for holes, or past the |
452 | ** tails for conversion. | 494 | * end of the file. This turns out to be exactly what we need for reading |
453 | ** | 495 | * tails for conversion. |
454 | ** The point of the wrapper is forcing a certain value for create, even | 496 | * |
455 | ** though the VFS layer is calling this function with create==1. If you | 497 | * The point of the wrapper is forcing a certain value for create, even |
456 | ** don't want to send create == GET_BLOCK_NO_HOLE to reiserfs_get_block, | 498 | * though the VFS layer is calling this function with create==1. If you |
457 | ** don't use this function. | 499 | * don't want to send create == GET_BLOCK_NO_HOLE to reiserfs_get_block, |
500 | * don't use this function. | ||
458 | */ | 501 | */ |
459 | static int reiserfs_get_block_create_0(struct inode *inode, sector_t block, | 502 | static int reiserfs_get_block_create_0(struct inode *inode, sector_t block, |
460 | struct buffer_head *bh_result, | 503 | struct buffer_head *bh_result, |
@@ -463,8 +506,10 @@ static int reiserfs_get_block_create_0(struct inode *inode, sector_t block, | |||
463 | return reiserfs_get_block(inode, block, bh_result, GET_BLOCK_NO_HOLE); | 506 | return reiserfs_get_block(inode, block, bh_result, GET_BLOCK_NO_HOLE); |
464 | } | 507 | } |
465 | 508 | ||
466 | /* This is special helper for reiserfs_get_block in case we are executing | 509 | /* |
467 | direct_IO request. */ | 510 | * This is special helper for reiserfs_get_block in case we are executing |
511 | * direct_IO request. | ||
512 | */ | ||
468 | static int reiserfs_get_blocks_direct_io(struct inode *inode, | 513 | static int reiserfs_get_blocks_direct_io(struct inode *inode, |
469 | sector_t iblock, | 514 | sector_t iblock, |
470 | struct buffer_head *bh_result, | 515 | struct buffer_head *bh_result, |
@@ -474,9 +519,11 @@ static int reiserfs_get_blocks_direct_io(struct inode *inode, | |||
474 | 519 | ||
475 | bh_result->b_page = NULL; | 520 | bh_result->b_page = NULL; |
476 | 521 | ||
477 | /* We set the b_size before reiserfs_get_block call since it is | 522 | /* |
478 | referenced in convert_tail_for_hole() that may be called from | 523 | * We set the b_size before reiserfs_get_block call since it is |
479 | reiserfs_get_block() */ | 524 | * referenced in convert_tail_for_hole() that may be called from |
525 | * reiserfs_get_block() | ||
526 | */ | ||
480 | bh_result->b_size = (1 << inode->i_blkbits); | 527 | bh_result->b_size = (1 << inode->i_blkbits); |
481 | 528 | ||
482 | ret = reiserfs_get_block(inode, iblock, bh_result, | 529 | ret = reiserfs_get_block(inode, iblock, bh_result, |
@@ -486,14 +533,18 @@ static int reiserfs_get_blocks_direct_io(struct inode *inode, | |||
486 | 533 | ||
487 | /* don't allow direct io onto tail pages */ | 534 | /* don't allow direct io onto tail pages */ |
488 | if (buffer_mapped(bh_result) && bh_result->b_blocknr == 0) { | 535 | if (buffer_mapped(bh_result) && bh_result->b_blocknr == 0) { |
489 | /* make sure future calls to the direct io funcs for this offset | 536 | /* |
490 | ** in the file fail by unmapping the buffer | 537 | * make sure future calls to the direct io funcs for this |
538 | * offset in the file fail by unmapping the buffer | ||
491 | */ | 539 | */ |
492 | clear_buffer_mapped(bh_result); | 540 | clear_buffer_mapped(bh_result); |
493 | ret = -EINVAL; | 541 | ret = -EINVAL; |
494 | } | 542 | } |
495 | /* Possible unpacked tail. Flush the data before pages have | 543 | |
496 | disappeared */ | 544 | /* |
545 | * Possible unpacked tail. Flush the data before pages have | ||
546 | * disappeared | ||
547 | */ | ||
497 | if (REISERFS_I(inode)->i_flags & i_pack_on_close_mask) { | 548 | if (REISERFS_I(inode)->i_flags & i_pack_on_close_mask) { |
498 | int err; | 549 | int err; |
499 | 550 | ||
@@ -507,20 +558,20 @@ static int reiserfs_get_blocks_direct_io(struct inode *inode, | |||
507 | if (err < 0) | 558 | if (err < 0) |
508 | ret = err; | 559 | ret = err; |
509 | } | 560 | } |
510 | out: | 561 | out: |
511 | return ret; | 562 | return ret; |
512 | } | 563 | } |
513 | 564 | ||
514 | /* | 565 | /* |
515 | ** helper function for when reiserfs_get_block is called for a hole | 566 | * helper function for when reiserfs_get_block is called for a hole |
516 | ** but the file tail is still in a direct item | 567 | * but the file tail is still in a direct item |
517 | ** bh_result is the buffer head for the hole | 568 | * bh_result is the buffer head for the hole |
518 | ** tail_offset is the offset of the start of the tail in the file | 569 | * tail_offset is the offset of the start of the tail in the file |
519 | ** | 570 | * |
520 | ** This calls prepare_write, which will start a new transaction | 571 | * This calls prepare_write, which will start a new transaction |
521 | ** you should not be in a transaction, or have any paths held when you | 572 | * you should not be in a transaction, or have any paths held when you |
522 | ** call this. | 573 | * call this. |
523 | */ | 574 | */ |
524 | static int convert_tail_for_hole(struct inode *inode, | 575 | static int convert_tail_for_hole(struct inode *inode, |
525 | struct buffer_head *bh_result, | 576 | struct buffer_head *bh_result, |
526 | loff_t tail_offset) | 577 | loff_t tail_offset) |
@@ -540,9 +591,10 @@ static int convert_tail_for_hole(struct inode *inode, | |||
540 | tail_end = (tail_start | (bh_result->b_size - 1)) + 1; | 591 | tail_end = (tail_start | (bh_result->b_size - 1)) + 1; |
541 | 592 | ||
542 | index = tail_offset >> PAGE_CACHE_SHIFT; | 593 | index = tail_offset >> PAGE_CACHE_SHIFT; |
543 | /* hole_page can be zero in case of direct_io, we are sure | 594 | /* |
544 | that we cannot get here if we write with O_DIRECT into | 595 | * hole_page can be zero in case of direct_io, we are sure |
545 | tail page */ | 596 | * that we cannot get here if we write with O_DIRECT into tail page |
597 | */ | ||
546 | if (!hole_page || index != hole_page->index) { | 598 | if (!hole_page || index != hole_page->index) { |
547 | tail_page = grab_cache_page(inode->i_mapping, index); | 599 | tail_page = grab_cache_page(inode->i_mapping, index); |
548 | retval = -ENOMEM; | 600 | retval = -ENOMEM; |
@@ -553,14 +605,15 @@ static int convert_tail_for_hole(struct inode *inode, | |||
553 | tail_page = hole_page; | 605 | tail_page = hole_page; |
554 | } | 606 | } |
555 | 607 | ||
556 | /* we don't have to make sure the conversion did not happen while | 608 | /* |
557 | ** we were locking the page because anyone that could convert | 609 | * we don't have to make sure the conversion did not happen while |
558 | ** must first take i_mutex. | 610 | * we were locking the page because anyone that could convert |
559 | ** | 611 | * must first take i_mutex. |
560 | ** We must fix the tail page for writing because it might have buffers | 612 | * |
561 | ** that are mapped, but have a block number of 0. This indicates tail | 613 | * We must fix the tail page for writing because it might have buffers |
562 | ** data that has been read directly into the page, and | 614 | * that are mapped, but have a block number of 0. This indicates tail |
563 | ** __block_write_begin won't trigger a get_block in this case. | 615 | * data that has been read directly into the page, and |
616 | * __block_write_begin won't trigger a get_block in this case. | ||
564 | */ | 617 | */ |
565 | fix_tail_page_for_writing(tail_page); | 618 | fix_tail_page_for_writing(tail_page); |
566 | retval = __reiserfs_write_begin(tail_page, tail_start, | 619 | retval = __reiserfs_write_begin(tail_page, tail_start, |
@@ -573,12 +626,12 @@ static int convert_tail_for_hole(struct inode *inode, | |||
573 | 626 | ||
574 | retval = reiserfs_commit_write(NULL, tail_page, tail_start, tail_end); | 627 | retval = reiserfs_commit_write(NULL, tail_page, tail_start, tail_end); |
575 | 628 | ||
576 | unlock: | 629 | unlock: |
577 | if (tail_page != hole_page) { | 630 | if (tail_page != hole_page) { |
578 | unlock_page(tail_page); | 631 | unlock_page(tail_page); |
579 | page_cache_release(tail_page); | 632 | page_cache_release(tail_page); |
580 | } | 633 | } |
581 | out: | 634 | out: |
582 | return retval; | 635 | return retval; |
583 | } | 636 | } |
584 | 637 | ||
@@ -604,7 +657,8 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
604 | struct buffer_head *bh_result, int create) | 657 | struct buffer_head *bh_result, int create) |
605 | { | 658 | { |
606 | int repeat, retval = 0; | 659 | int repeat, retval = 0; |
607 | b_blocknr_t allocated_block_nr = 0; // b_blocknr_t is (unsigned) 32 bit int | 660 | /* b_blocknr_t is (unsigned) 32 bit int*/ |
661 | b_blocknr_t allocated_block_nr = 0; | ||
608 | INITIALIZE_PATH(path); | 662 | INITIALIZE_PATH(path); |
609 | int pos_in_item; | 663 | int pos_in_item; |
610 | struct cpu_key key; | 664 | struct cpu_key key; |
@@ -614,12 +668,14 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
614 | int done; | 668 | int done; |
615 | int fs_gen; | 669 | int fs_gen; |
616 | struct reiserfs_transaction_handle *th = NULL; | 670 | struct reiserfs_transaction_handle *th = NULL; |
617 | /* space reserved in transaction batch: | 671 | /* |
618 | . 3 balancings in direct->indirect conversion | 672 | * space reserved in transaction batch: |
619 | . 1 block involved into reiserfs_update_sd() | 673 | * . 3 balancings in direct->indirect conversion |
620 | XXX in practically impossible worst case direct2indirect() | 674 | * . 1 block involved into reiserfs_update_sd() |
621 | can incur (much) more than 3 balancings. | 675 | * XXX in practically impossible worst case direct2indirect() |
622 | quota update for user, group */ | 676 | * can incur (much) more than 3 balancings. |
677 | * quota update for user, group | ||
678 | */ | ||
623 | int jbegin_count = | 679 | int jbegin_count = |
624 | JOURNAL_PER_BALANCE_CNT * 3 + 1 + | 680 | JOURNAL_PER_BALANCE_CNT * 3 + 1 + |
625 | 2 * REISERFS_QUOTA_TRANS_BLOCKS(inode->i_sb); | 681 | 2 * REISERFS_QUOTA_TRANS_BLOCKS(inode->i_sb); |
@@ -636,8 +692,9 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
636 | return -EFBIG; | 692 | return -EFBIG; |
637 | } | 693 | } |
638 | 694 | ||
639 | /* if !create, we aren't changing the FS, so we don't need to | 695 | /* |
640 | ** log anything, so we don't need to start a transaction | 696 | * if !create, we aren't changing the FS, so we don't need to |
697 | * log anything, so we don't need to start a transaction | ||
641 | */ | 698 | */ |
642 | if (!(create & GET_BLOCK_CREATE)) { | 699 | if (!(create & GET_BLOCK_CREATE)) { |
643 | int ret; | 700 | int ret; |
@@ -647,6 +704,7 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
647 | reiserfs_write_unlock(inode->i_sb); | 704 | reiserfs_write_unlock(inode->i_sb); |
648 | return ret; | 705 | return ret; |
649 | } | 706 | } |
707 | |||
650 | /* | 708 | /* |
651 | * if we're already in a transaction, make sure to close | 709 | * if we're already in a transaction, make sure to close |
652 | * any new transactions we start in this func | 710 | * any new transactions we start in this func |
@@ -655,8 +713,10 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
655 | reiserfs_transaction_running(inode->i_sb)) | 713 | reiserfs_transaction_running(inode->i_sb)) |
656 | dangle = 0; | 714 | dangle = 0; |
657 | 715 | ||
658 | /* If file is of such a size, that it might have a tail and tails are enabled | 716 | /* |
659 | ** we should mark it as possibly needing tail packing on close | 717 | * If file is of such a size, that it might have a tail and |
718 | * tails are enabled we should mark it as possibly needing | ||
719 | * tail packing on close | ||
660 | */ | 720 | */ |
661 | if ((have_large_tails(inode->i_sb) | 721 | if ((have_large_tails(inode->i_sb) |
662 | && inode->i_size < i_block_size(inode) * 4) | 722 | && inode->i_size < i_block_size(inode) * 4) |
@@ -667,7 +727,7 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
667 | /* set the key of the first byte in the 'block'-th block of file */ | 727 | /* set the key of the first byte in the 'block'-th block of file */ |
668 | make_cpu_key(&key, inode, new_offset, TYPE_ANY, 3 /*key length */ ); | 728 | make_cpu_key(&key, inode, new_offset, TYPE_ANY, 3 /*key length */ ); |
669 | if ((new_offset + inode->i_sb->s_blocksize - 1) > inode->i_size) { | 729 | if ((new_offset + inode->i_sb->s_blocksize - 1) > inode->i_size) { |
670 | start_trans: | 730 | start_trans: |
671 | th = reiserfs_persistent_transaction(inode->i_sb, jbegin_count); | 731 | th = reiserfs_persistent_transaction(inode->i_sb, jbegin_count); |
672 | if (!th) { | 732 | if (!th) { |
673 | retval = -ENOMEM; | 733 | retval = -ENOMEM; |
@@ -675,7 +735,7 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
675 | } | 735 | } |
676 | reiserfs_update_inode_transaction(inode); | 736 | reiserfs_update_inode_transaction(inode); |
677 | } | 737 | } |
678 | research: | 738 | research: |
679 | 739 | ||
680 | retval = search_for_position_by_key(inode->i_sb, &key, &path); | 740 | retval = search_for_position_by_key(inode->i_sb, &key, &path); |
681 | if (retval == IO_ERROR) { | 741 | if (retval == IO_ERROR) { |
@@ -684,8 +744,8 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
684 | } | 744 | } |
685 | 745 | ||
686 | bh = get_last_bh(&path); | 746 | bh = get_last_bh(&path); |
687 | ih = get_ih(&path); | 747 | ih = tp_item_head(&path); |
688 | item = get_item(&path); | 748 | item = tp_item_body(&path); |
689 | pos_in_item = path.pos_in_item; | 749 | pos_in_item = path.pos_in_item; |
690 | 750 | ||
691 | fs_gen = get_generation(inode->i_sb); | 751 | fs_gen = get_generation(inode->i_sb); |
@@ -703,11 +763,12 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
703 | _allocate_block(th, block, inode, &allocated_block_nr, | 763 | _allocate_block(th, block, inode, &allocated_block_nr, |
704 | &path, create); | 764 | &path, create); |
705 | 765 | ||
766 | /* | ||
767 | * restart the transaction to give the journal a chance to free | ||
768 | * some blocks. releases the path, so we have to go back to | ||
769 | * research if we succeed on the second try | ||
770 | */ | ||
706 | if (repeat == NO_DISK_SPACE || repeat == QUOTA_EXCEEDED) { | 771 | if (repeat == NO_DISK_SPACE || repeat == QUOTA_EXCEEDED) { |
707 | /* restart the transaction to give the journal a chance to free | ||
708 | ** some blocks. releases the path, so we have to go back to | ||
709 | ** research if we succeed on the second try | ||
710 | */ | ||
711 | SB_JOURNAL(inode->i_sb)->j_next_async_flush = 1; | 772 | SB_JOURNAL(inode->i_sb)->j_next_async_flush = 1; |
712 | retval = restart_transaction(th, inode, &path); | 773 | retval = restart_transaction(th, inode, &path); |
713 | if (retval) | 774 | if (retval) |
@@ -734,9 +795,11 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
734 | 795 | ||
735 | if (indirect_item_found(retval, ih)) { | 796 | if (indirect_item_found(retval, ih)) { |
736 | b_blocknr_t unfm_ptr; | 797 | b_blocknr_t unfm_ptr; |
737 | /* 'block'-th block is in the file already (there is | 798 | /* |
738 | corresponding cell in some indirect item). But it may be | 799 | * 'block'-th block is in the file already (there is |
739 | zero unformatted node pointer (hole) */ | 800 | * corresponding cell in some indirect item). But it may be |
801 | * zero unformatted node pointer (hole) | ||
802 | */ | ||
740 | unfm_ptr = get_block_num(item, pos_in_item); | 803 | unfm_ptr = get_block_num(item, pos_in_item); |
741 | if (unfm_ptr == 0) { | 804 | if (unfm_ptr == 0) { |
742 | /* use allocated block to plug the hole */ | 805 | /* use allocated block to plug the hole */ |
@@ -753,7 +816,7 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
753 | reiserfs_add_ordered_list(inode, bh_result); | 816 | reiserfs_add_ordered_list(inode, bh_result); |
754 | put_block_num(item, pos_in_item, allocated_block_nr); | 817 | put_block_num(item, pos_in_item, allocated_block_nr); |
755 | unfm_ptr = allocated_block_nr; | 818 | unfm_ptr = allocated_block_nr; |
756 | journal_mark_dirty(th, inode->i_sb, bh); | 819 | journal_mark_dirty(th, bh); |
757 | reiserfs_update_sd(th, inode); | 820 | reiserfs_update_sd(th, inode); |
758 | } | 821 | } |
759 | set_block_dev_mapped(bh_result, unfm_ptr, inode); | 822 | set_block_dev_mapped(bh_result, unfm_ptr, inode); |
@@ -764,9 +827,10 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
764 | 827 | ||
765 | reiserfs_write_unlock(inode->i_sb); | 828 | reiserfs_write_unlock(inode->i_sb); |
766 | 829 | ||
767 | /* the item was found, so new blocks were not added to the file | 830 | /* |
768 | ** there is no need to make sure the inode is updated with this | 831 | * the item was found, so new blocks were not added to the file |
769 | ** transaction | 832 | * there is no need to make sure the inode is updated with this |
833 | * transaction | ||
770 | */ | 834 | */ |
771 | return retval; | 835 | return retval; |
772 | } | 836 | } |
@@ -776,9 +840,11 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
776 | goto start_trans; | 840 | goto start_trans; |
777 | } | 841 | } |
778 | 842 | ||
779 | /* desired position is not found or is in the direct item. We have | 843 | /* |
780 | to append file with holes up to 'block'-th block converting | 844 | * desired position is not found or is in the direct item. We have |
781 | direct items to indirect one if necessary */ | 845 | * to append file with holes up to 'block'-th block converting |
846 | * direct items to indirect one if necessary | ||
847 | */ | ||
782 | done = 0; | 848 | done = 0; |
783 | do { | 849 | do { |
784 | if (is_statdata_le_ih(ih)) { | 850 | if (is_statdata_le_ih(ih)) { |
@@ -790,16 +856,18 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
790 | TYPE_INDIRECT, UNFM_P_SIZE, | 856 | TYPE_INDIRECT, UNFM_P_SIZE, |
791 | 0 /* free_space */ ); | 857 | 0 /* free_space */ ); |
792 | 858 | ||
859 | /* | ||
860 | * we are going to add 'block'-th block to the file. | ||
861 | * Use allocated block for that | ||
862 | */ | ||
793 | if (cpu_key_k_offset(&key) == 1) { | 863 | if (cpu_key_k_offset(&key) == 1) { |
794 | /* we are going to add 'block'-th block to the file. Use | ||
795 | allocated block for that */ | ||
796 | unp = cpu_to_le32(allocated_block_nr); | 864 | unp = cpu_to_le32(allocated_block_nr); |
797 | set_block_dev_mapped(bh_result, | 865 | set_block_dev_mapped(bh_result, |
798 | allocated_block_nr, inode); | 866 | allocated_block_nr, inode); |
799 | set_buffer_new(bh_result); | 867 | set_buffer_new(bh_result); |
800 | done = 1; | 868 | done = 1; |
801 | } | 869 | } |
802 | tmp_key = key; // ;) | 870 | tmp_key = key; /* ;) */ |
803 | set_cpu_key_k_offset(&tmp_key, 1); | 871 | set_cpu_key_k_offset(&tmp_key, 1); |
804 | PATH_LAST_POSITION(&path)++; | 872 | PATH_LAST_POSITION(&path)++; |
805 | 873 | ||
@@ -809,9 +877,12 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
809 | if (retval) { | 877 | if (retval) { |
810 | reiserfs_free_block(th, inode, | 878 | reiserfs_free_block(th, inode, |
811 | allocated_block_nr, 1); | 879 | allocated_block_nr, 1); |
812 | goto failure; // retval == -ENOSPC, -EDQUOT or -EIO or -EEXIST | 880 | /* |
881 | * retval == -ENOSPC, -EDQUOT or -EIO | ||
882 | * or -EEXIST | ||
883 | */ | ||
884 | goto failure; | ||
813 | } | 885 | } |
814 | //mark_tail_converted (inode); | ||
815 | } else if (is_direct_le_ih(ih)) { | 886 | } else if (is_direct_le_ih(ih)) { |
816 | /* direct item has to be converted */ | 887 | /* direct item has to be converted */ |
817 | loff_t tail_offset; | 888 | loff_t tail_offset; |
@@ -819,18 +890,24 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
819 | tail_offset = | 890 | tail_offset = |
820 | ((le_ih_k_offset(ih) - | 891 | ((le_ih_k_offset(ih) - |
821 | 1) & ~(inode->i_sb->s_blocksize - 1)) + 1; | 892 | 1) & ~(inode->i_sb->s_blocksize - 1)) + 1; |
893 | |||
894 | /* | ||
895 | * direct item we just found fits into block we have | ||
896 | * to map. Convert it into unformatted node: use | ||
897 | * bh_result for the conversion | ||
898 | */ | ||
822 | if (tail_offset == cpu_key_k_offset(&key)) { | 899 | if (tail_offset == cpu_key_k_offset(&key)) { |
823 | /* direct item we just found fits into block we have | ||
824 | to map. Convert it into unformatted node: use | ||
825 | bh_result for the conversion */ | ||
826 | set_block_dev_mapped(bh_result, | 900 | set_block_dev_mapped(bh_result, |
827 | allocated_block_nr, inode); | 901 | allocated_block_nr, inode); |
828 | unbh = bh_result; | 902 | unbh = bh_result; |
829 | done = 1; | 903 | done = 1; |
830 | } else { | 904 | } else { |
831 | /* we have to padd file tail stored in direct item(s) | 905 | /* |
832 | up to block size and convert it to unformatted | 906 | * we have to pad file tail stored in direct |
833 | node. FIXME: this should also get into page cache */ | 907 | * item(s) up to block size and convert it |
908 | * to unformatted node. FIXME: this should | ||
909 | * also get into page cache | ||
910 | */ | ||
834 | 911 | ||
835 | pathrelse(&path); | 912 | pathrelse(&path); |
836 | /* | 913 | /* |
@@ -859,7 +936,10 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
859 | inode->i_ino, | 936 | inode->i_ino, |
860 | retval); | 937 | retval); |
861 | if (allocated_block_nr) { | 938 | if (allocated_block_nr) { |
862 | /* the bitmap, the super, and the stat data == 3 */ | 939 | /* |
940 | * the bitmap, the super, | ||
941 | * and the stat data == 3 | ||
942 | */ | ||
863 | if (!th) | 943 | if (!th) |
864 | th = reiserfs_persistent_transaction(inode->i_sb, 3); | 944 | th = reiserfs_persistent_transaction(inode->i_sb, 3); |
865 | if (th) | 945 | if (th) |
@@ -881,43 +961,57 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
881 | allocated_block_nr, 1); | 961 | allocated_block_nr, 1); |
882 | goto failure; | 962 | goto failure; |
883 | } | 963 | } |
884 | /* it is important the set_buffer_uptodate is done after | 964 | /* |
885 | ** the direct2indirect. The buffer might contain valid | 965 | * it is important the set_buffer_uptodate is done |
886 | ** data newer than the data on disk (read by readpage, changed, | 966 | * after the direct2indirect. The buffer might |
887 | ** and then sent here by writepage). direct2indirect needs | 967 | * contain valid data newer than the data on disk |
888 | ** to know if unbh was already up to date, so it can decide | 968 | * (read by readpage, changed, and then sent here by |
889 | ** if the data in unbh needs to be replaced with data from | 969 | * writepage). direct2indirect needs to know if unbh |
890 | ** the disk | 970 | * was already up to date, so it can decide if the |
971 | * data in unbh needs to be replaced with data from | ||
972 | * the disk | ||
891 | */ | 973 | */ |
892 | set_buffer_uptodate(unbh); | 974 | set_buffer_uptodate(unbh); |
893 | 975 | ||
894 | /* unbh->b_page == NULL in case of DIRECT_IO request, this means | 976 | /* |
895 | buffer will disappear shortly, so it should not be added to | 977 | * unbh->b_page == NULL in case of DIRECT_IO request, |
978 | * this means buffer will disappear shortly, so it | ||
979 | * should not be added to | ||
896 | */ | 980 | */ |
897 | if (unbh->b_page) { | 981 | if (unbh->b_page) { |
898 | /* we've converted the tail, so we must | 982 | /* |
899 | ** flush unbh before the transaction commits | 983 | * we've converted the tail, so we must |
984 | * flush unbh before the transaction commits | ||
900 | */ | 985 | */ |
901 | reiserfs_add_tail_list(inode, unbh); | 986 | reiserfs_add_tail_list(inode, unbh); |
902 | 987 | ||
903 | /* mark it dirty now to prevent commit_write from adding | 988 | /* |
904 | ** this buffer to the inode's dirty buffer list | 989 | * mark it dirty now to prevent commit_write |
990 | * from adding this buffer to the inode's | ||
991 | * dirty buffer list | ||
905 | */ | 992 | */ |
906 | /* | 993 | /* |
907 | * AKPM: changed __mark_buffer_dirty to mark_buffer_dirty(). | 994 | * AKPM: changed __mark_buffer_dirty to |
908 | * It's still atomic, but it sets the page dirty too, | 995 | * mark_buffer_dirty(). It's still atomic, |
909 | * which makes it eligible for writeback at any time by the | 996 | * but it sets the page dirty too, which makes |
910 | * VM (which was also the case with __mark_buffer_dirty()) | 997 | * it eligible for writeback at any time by the |
998 | * VM (which was also the case with | ||
999 | * __mark_buffer_dirty()) | ||
911 | */ | 1000 | */ |
912 | mark_buffer_dirty(unbh); | 1001 | mark_buffer_dirty(unbh); |
913 | } | 1002 | } |
914 | } else { | 1003 | } else { |
915 | /* append indirect item with holes if needed, when appending | 1004 | /* |
916 | pointer to 'block'-th block use block, which is already | 1005 | * append indirect item with holes if needed, when |
917 | allocated */ | 1006 | * appending pointer to 'block'-th block use block, |
1007 | * which is already allocated | ||
1008 | */ | ||
918 | struct cpu_key tmp_key; | 1009 | struct cpu_key tmp_key; |
919 | unp_t unf_single = 0; // We use this in case we need to allocate only | 1010 | /* |
920 | // one block which is a fastpath | 1011 | * We use this in case we need to allocate |
1012 | * only one block which is a fastpath | ||
1013 | */ | ||
1014 | unp_t unf_single = 0; | ||
921 | unp_t *un; | 1015 | unp_t *un; |
922 | __u64 max_to_insert = | 1016 | __u64 max_to_insert = |
923 | MAX_ITEM_LEN(inode->i_sb->s_blocksize) / | 1017 | MAX_ITEM_LEN(inode->i_sb->s_blocksize) / |
@@ -926,14 +1020,17 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
926 | 1020 | ||
927 | RFALSE(pos_in_item != ih_item_len(ih) / UNFM_P_SIZE, | 1021 | RFALSE(pos_in_item != ih_item_len(ih) / UNFM_P_SIZE, |
928 | "vs-804: invalid position for append"); | 1022 | "vs-804: invalid position for append"); |
929 | /* indirect item has to be appended, set up key of that position */ | 1023 | /* |
1024 | * indirect item has to be appended, | ||
1025 | * set up key of that position | ||
1026 | * (key type is unimportant) | ||
1027 | */ | ||
930 | make_cpu_key(&tmp_key, inode, | 1028 | make_cpu_key(&tmp_key, inode, |
931 | le_key_k_offset(version, | 1029 | le_key_k_offset(version, |
932 | &(ih->ih_key)) + | 1030 | &ih->ih_key) + |
933 | op_bytes_number(ih, | 1031 | op_bytes_number(ih, |
934 | inode->i_sb->s_blocksize), | 1032 | inode->i_sb->s_blocksize), |
935 | //pos_in_item * inode->i_sb->s_blocksize, | 1033 | TYPE_INDIRECT, 3); |
936 | TYPE_INDIRECT, 3); // key type is unimportant | ||
937 | 1034 | ||
938 | RFALSE(cpu_key_k_offset(&tmp_key) > cpu_key_k_offset(&key), | 1035 | RFALSE(cpu_key_k_offset(&tmp_key) > cpu_key_k_offset(&key), |
939 | "green-805: invalid offset"); | 1036 | "green-805: invalid offset"); |
@@ -954,8 +1051,10 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
954 | } | 1051 | } |
955 | } | 1052 | } |
956 | if (blocks_needed <= max_to_insert) { | 1053 | if (blocks_needed <= max_to_insert) { |
957 | /* we are going to add target block to the file. Use allocated | 1054 | /* |
958 | block for that */ | 1055 | * we are going to add target block to |
1056 | * the file. Use allocated block for that | ||
1057 | */ | ||
959 | un[blocks_needed - 1] = | 1058 | un[blocks_needed - 1] = |
960 | cpu_to_le32(allocated_block_nr); | 1059 | cpu_to_le32(allocated_block_nr); |
961 | set_block_dev_mapped(bh_result, | 1060 | set_block_dev_mapped(bh_result, |
@@ -964,8 +1063,11 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
964 | done = 1; | 1063 | done = 1; |
965 | } else { | 1064 | } else { |
966 | /* paste hole to the indirect item */ | 1065 | /* paste hole to the indirect item */ |
967 | /* If kmalloc failed, max_to_insert becomes zero and it means we | 1066 | /* |
968 | only have space for one block */ | 1067 | * If kmalloc failed, max_to_insert becomes |
1068 | * zero and it means we only have space for | ||
1069 | * one block | ||
1070 | */ | ||
969 | blocks_needed = | 1071 | blocks_needed = |
970 | max_to_insert ? max_to_insert : 1; | 1072 | max_to_insert ? max_to_insert : 1; |
971 | } | 1073 | } |
@@ -984,9 +1086,12 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
984 | goto failure; | 1086 | goto failure; |
985 | } | 1087 | } |
986 | if (!done) { | 1088 | if (!done) { |
987 | /* We need to mark new file size in case this function will be | 1089 | /* |
988 | interrupted/aborted later on. And we may do this only for | 1090 | * We need to mark new file size in case |
989 | holes. */ | 1091 | * this function will be interrupted/aborted |
1092 | * later on. And we may do this only for | ||
1093 | * holes. | ||
1094 | */ | ||
990 | inode->i_size += | 1095 | inode->i_size += |
991 | inode->i_sb->s_blocksize * blocks_needed; | 1096 | inode->i_sb->s_blocksize * blocks_needed; |
992 | } | 1097 | } |
@@ -995,13 +1100,13 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
995 | if (done == 1) | 1100 | if (done == 1) |
996 | break; | 1101 | break; |
997 | 1102 | ||
998 | /* this loop could log more blocks than we had originally asked | 1103 | /* |
999 | ** for. So, we have to allow the transaction to end if it is | 1104 | * this loop could log more blocks than we had originally |
1000 | ** too big or too full. Update the inode so things are | 1105 | * asked for. So, we have to allow the transaction to end |
1001 | ** consistent if we crash before the function returns | 1106 | * if it is too big or too full. Update the inode so things |
1002 | ** | 1107 | * are consistent if we crash before the function returns |
1003 | ** release the path so that anybody waiting on the path before | 1108 | * release the path so that anybody waiting on the path before |
1004 | ** ending their transaction will be able to continue. | 1109 | * ending their transaction will be able to continue. |
1005 | */ | 1110 | */ |
1006 | if (journal_transaction_should_end(th, th->t_blocks_allocated)) { | 1111 | if (journal_transaction_should_end(th, th->t_blocks_allocated)) { |
1007 | retval = restart_transaction(th, inode, &path); | 1112 | retval = restart_transaction(th, inode, &path); |
@@ -1031,14 +1136,14 @@ int reiserfs_get_block(struct inode *inode, sector_t block, | |||
1031 | goto failure; | 1136 | goto failure; |
1032 | } | 1137 | } |
1033 | bh = get_last_bh(&path); | 1138 | bh = get_last_bh(&path); |
1034 | ih = get_ih(&path); | 1139 | ih = tp_item_head(&path); |
1035 | item = get_item(&path); | 1140 | item = tp_item_body(&path); |
1036 | pos_in_item = path.pos_in_item; | 1141 | pos_in_item = path.pos_in_item; |
1037 | } while (1); | 1142 | } while (1); |
1038 | 1143 | ||
1039 | retval = 0; | 1144 | retval = 0; |
1040 | 1145 | ||
1041 | failure: | 1146 | failure: |
1042 | if (th && (!dangle || (retval && !th->t_trans_id))) { | 1147 | if (th && (!dangle || (retval && !th->t_trans_id))) { |
1043 | int err; | 1148 | int err; |
1044 | if (th->t_trans_id) | 1149 | if (th->t_trans_id) |
@@ -1060,8 +1165,10 @@ reiserfs_readpages(struct file *file, struct address_space *mapping, | |||
1060 | return mpage_readpages(mapping, pages, nr_pages, reiserfs_get_block); | 1165 | return mpage_readpages(mapping, pages, nr_pages, reiserfs_get_block); |
1061 | } | 1166 | } |
1062 | 1167 | ||
1063 | /* Compute real number of used bytes by file | 1168 | /* |
1064 | * Following three functions can go away when we'll have enough space in stat item | 1169 | * Compute real number of used bytes by file |
1170 | * Following three functions can go away when we'll have enough space in | ||
1171 | * stat item | ||
1065 | */ | 1172 | */ |
1066 | static int real_space_diff(struct inode *inode, int sd_size) | 1173 | static int real_space_diff(struct inode *inode, int sd_size) |
1067 | { | 1174 | { |
@@ -1071,13 +1178,14 @@ static int real_space_diff(struct inode *inode, int sd_size) | |||
1071 | if (S_ISLNK(inode->i_mode) || S_ISDIR(inode->i_mode)) | 1178 | if (S_ISLNK(inode->i_mode) || S_ISDIR(inode->i_mode)) |
1072 | return sd_size; | 1179 | return sd_size; |
1073 | 1180 | ||
1074 | /* End of file is also in full block with indirect reference, so round | 1181 | /* |
1075 | ** up to the next block. | 1182 | * End of file is also in full block with indirect reference, so round |
1076 | ** | 1183 | * up to the next block. |
1077 | ** there is just no way to know if the tail is actually packed | 1184 | * |
1078 | ** on the file, so we have to assume it isn't. When we pack the | 1185 | * there is just no way to know if the tail is actually packed |
1079 | ** tail, we add 4 bytes to pretend there really is an unformatted | 1186 | * on the file, so we have to assume it isn't. When we pack the |
1080 | ** node pointer | 1187 | * tail, we add 4 bytes to pretend there really is an unformatted |
1188 | * node pointer | ||
1081 | */ | 1189 | */ |
1082 | bytes = | 1190 | bytes = |
1083 | ((inode->i_size + | 1191 | ((inode->i_size + |
@@ -1108,36 +1216,36 @@ static inline ulong to_fake_used_blocks(struct inode *inode, int sd_size) | |||
1108 | bytes += (loff_t) 511; | 1216 | bytes += (loff_t) 511; |
1109 | } | 1217 | } |
1110 | 1218 | ||
1111 | /* files from before the quota patch might i_blocks such that | 1219 | /* |
1112 | ** bytes < real_space. Deal with that here to prevent it from | 1220 | * files from before the quota patch might i_blocks such that |
1113 | ** going negative. | 1221 | * bytes < real_space. Deal with that here to prevent it from |
1222 | * going negative. | ||
1114 | */ | 1223 | */ |
1115 | if (bytes < real_space) | 1224 | if (bytes < real_space) |
1116 | return 0; | 1225 | return 0; |
1117 | return (bytes - real_space) >> 9; | 1226 | return (bytes - real_space) >> 9; |
1118 | } | 1227 | } |
1119 | 1228 | ||
1120 | // | 1229 | /* |
1121 | // BAD: new directories have stat data of new type and all other items | 1230 | * BAD: new directories have stat data of new type and all other items |
1122 | // of old type. Version stored in the inode says about body items, so | 1231 | * of old type. Version stored in the inode says about body items, so |
1123 | // in update_stat_data we can not rely on inode, but have to check | 1232 | * in update_stat_data we can not rely on inode, but have to check |
1124 | // item version directly | 1233 | * item version directly |
1125 | // | 1234 | */ |
1126 | 1235 | ||
1127 | // called by read_locked_inode | 1236 | /* called by read_locked_inode */ |
1128 | static void init_inode(struct inode *inode, struct treepath *path) | 1237 | static void init_inode(struct inode *inode, struct treepath *path) |
1129 | { | 1238 | { |
1130 | struct buffer_head *bh; | 1239 | struct buffer_head *bh; |
1131 | struct item_head *ih; | 1240 | struct item_head *ih; |
1132 | __u32 rdev; | 1241 | __u32 rdev; |
1133 | //int version = ITEM_VERSION_1; | ||
1134 | 1242 | ||
1135 | bh = PATH_PLAST_BUFFER(path); | 1243 | bh = PATH_PLAST_BUFFER(path); |
1136 | ih = PATH_PITEM_HEAD(path); | 1244 | ih = tp_item_head(path); |
1137 | 1245 | ||
1138 | copy_key(INODE_PKEY(inode), &(ih->ih_key)); | 1246 | copy_key(INODE_PKEY(inode), &ih->ih_key); |
1139 | 1247 | ||
1140 | INIT_LIST_HEAD(&(REISERFS_I(inode)->i_prealloc_list)); | 1248 | INIT_LIST_HEAD(&REISERFS_I(inode)->i_prealloc_list); |
1141 | REISERFS_I(inode)->i_flags = 0; | 1249 | REISERFS_I(inode)->i_flags = 0; |
1142 | REISERFS_I(inode)->i_prealloc_block = 0; | 1250 | REISERFS_I(inode)->i_prealloc_block = 0; |
1143 | REISERFS_I(inode)->i_prealloc_count = 0; | 1251 | REISERFS_I(inode)->i_prealloc_count = 0; |
@@ -1147,7 +1255,7 @@ static void init_inode(struct inode *inode, struct treepath *path) | |||
1147 | 1255 | ||
1148 | if (stat_data_v1(ih)) { | 1256 | if (stat_data_v1(ih)) { |
1149 | struct stat_data_v1 *sd = | 1257 | struct stat_data_v1 *sd = |
1150 | (struct stat_data_v1 *)B_I_PITEM(bh, ih); | 1258 | (struct stat_data_v1 *)ih_item_body(bh, ih); |
1151 | unsigned long blocks; | 1259 | unsigned long blocks; |
1152 | 1260 | ||
1153 | set_inode_item_key_version(inode, KEY_FORMAT_3_5); | 1261 | set_inode_item_key_version(inode, KEY_FORMAT_3_5); |
@@ -1168,20 +1276,26 @@ static void init_inode(struct inode *inode, struct treepath *path) | |||
1168 | inode->i_generation = le32_to_cpu(INODE_PKEY(inode)->k_dir_id); | 1276 | inode->i_generation = le32_to_cpu(INODE_PKEY(inode)->k_dir_id); |
1169 | blocks = (inode->i_size + 511) >> 9; | 1277 | blocks = (inode->i_size + 511) >> 9; |
1170 | blocks = _ROUND_UP(blocks, inode->i_sb->s_blocksize >> 9); | 1278 | blocks = _ROUND_UP(blocks, inode->i_sb->s_blocksize >> 9); |
1279 | |||
1280 | /* | ||
1281 | * there was a bug in <=3.5.23 when i_blocks could take | ||
1282 | * negative values. Starting from 3.5.17 this value could | ||
1283 | * even be stored in stat data. For such files we set | ||
1284 | * i_blocks based on file size. Just 2 notes: this can be | ||
1285 | * wrong for sparse files. On-disk value will be only | ||
1286 | * updated if file's inode will ever change | ||
1287 | */ | ||
1171 | if (inode->i_blocks > blocks) { | 1288 | if (inode->i_blocks > blocks) { |
1172 | // there was a bug in <=3.5.23 when i_blocks could take negative | ||
1173 | // values. Starting from 3.5.17 this value could even be stored in | ||
1174 | // stat data. For such files we set i_blocks based on file | ||
1175 | // size. Just 2 notes: this can be wrong for sparce files. On-disk value will be | ||
1176 | // only updated if file's inode will ever change | ||
1177 | inode->i_blocks = blocks; | 1289 | inode->i_blocks = blocks; |
1178 | } | 1290 | } |
1179 | 1291 | ||
1180 | rdev = sd_v1_rdev(sd); | 1292 | rdev = sd_v1_rdev(sd); |
1181 | REISERFS_I(inode)->i_first_direct_byte = | 1293 | REISERFS_I(inode)->i_first_direct_byte = |
1182 | sd_v1_first_direct_byte(sd); | 1294 | sd_v1_first_direct_byte(sd); |
1183 | /* an early bug in the quota code can give us an odd number for the | 1295 | |
1184 | ** block count. This is incorrect, fix it here. | 1296 | /* |
1297 | * an early bug in the quota code can give us an odd | ||
1298 | * number for the block count. This is incorrect, fix it here. | ||
1185 | */ | 1299 | */ |
1186 | if (inode->i_blocks & 1) { | 1300 | if (inode->i_blocks & 1) { |
1187 | inode->i_blocks++; | 1301 | inode->i_blocks++; |
@@ -1189,13 +1303,17 @@ static void init_inode(struct inode *inode, struct treepath *path) | |||
1189 | inode_set_bytes(inode, | 1303 | inode_set_bytes(inode, |
1190 | to_real_used_space(inode, inode->i_blocks, | 1304 | to_real_used_space(inode, inode->i_blocks, |
1191 | SD_V1_SIZE)); | 1305 | SD_V1_SIZE)); |
1192 | /* nopack is initially zero for v1 objects. For v2 objects, | 1306 | /* |
1193 | nopack is initialised from sd_attrs */ | 1307 | * nopack is initially zero for v1 objects. For v2 objects, |
1308 | * nopack is initialised from sd_attrs | ||
1309 | */ | ||
1194 | REISERFS_I(inode)->i_flags &= ~i_nopack_mask; | 1310 | REISERFS_I(inode)->i_flags &= ~i_nopack_mask; |
1195 | } else { | 1311 | } else { |
1196 | // new stat data found, but object may have old items | 1312 | /* |
1197 | // (directories and symlinks) | 1313 | * new stat data found, but object may have old items |
1198 | struct stat_data *sd = (struct stat_data *)B_I_PITEM(bh, ih); | 1314 | * (directories and symlinks) |
1315 | */ | ||
1316 | struct stat_data *sd = (struct stat_data *)ih_item_body(bh, ih); | ||
1199 | 1317 | ||
1200 | inode->i_mode = sd_v2_mode(sd); | 1318 | inode->i_mode = sd_v2_mode(sd); |
1201 | set_nlink(inode, sd_v2_nlink(sd)); | 1319 | set_nlink(inode, sd_v2_nlink(sd)); |
@@ -1225,8 +1343,10 @@ static void init_inode(struct inode *inode, struct treepath *path) | |||
1225 | inode_set_bytes(inode, | 1343 | inode_set_bytes(inode, |
1226 | to_real_used_space(inode, inode->i_blocks, | 1344 | to_real_used_space(inode, inode->i_blocks, |
1227 | SD_V2_SIZE)); | 1345 | SD_V2_SIZE)); |
1228 | /* read persistent inode attributes from sd and initialise | 1346 | /* |
1229 | generic inode flags from them */ | 1347 | * read persistent inode attributes from sd and initialise |
1348 | * generic inode flags from them | ||
1349 | */ | ||
1230 | REISERFS_I(inode)->i_attrs = sd_v2_attrs(sd); | 1350 | REISERFS_I(inode)->i_attrs = sd_v2_attrs(sd); |
1231 | sd_attrs_to_i_attrs(sd_v2_attrs(sd), inode); | 1351 | sd_attrs_to_i_attrs(sd_v2_attrs(sd), inode); |
1232 | } | 1352 | } |
@@ -1249,7 +1369,7 @@ static void init_inode(struct inode *inode, struct treepath *path) | |||
1249 | } | 1369 | } |
1250 | } | 1370 | } |
1251 | 1371 | ||
1252 | // update new stat data with inode fields | 1372 | /* update new stat data with inode fields */ |
1253 | static void inode2sd(void *sd, struct inode *inode, loff_t size) | 1373 | static void inode2sd(void *sd, struct inode *inode, loff_t size) |
1254 | { | 1374 | { |
1255 | struct stat_data *sd_v2 = (struct stat_data *)sd; | 1375 | struct stat_data *sd_v2 = (struct stat_data *)sd; |
@@ -1273,7 +1393,7 @@ static void inode2sd(void *sd, struct inode *inode, loff_t size) | |||
1273 | set_sd_v2_attrs(sd_v2, flags); | 1393 | set_sd_v2_attrs(sd_v2, flags); |
1274 | } | 1394 | } |
1275 | 1395 | ||
1276 | // used to copy inode's fields to old stat data | 1396 | /* used to copy inode's fields to old stat data */ |
1277 | static void inode2sd_v1(void *sd, struct inode *inode, loff_t size) | 1397 | static void inode2sd_v1(void *sd, struct inode *inode, loff_t size) |
1278 | { | 1398 | { |
1279 | struct stat_data_v1 *sd_v1 = (struct stat_data_v1 *)sd; | 1399 | struct stat_data_v1 *sd_v1 = (struct stat_data_v1 *)sd; |
@@ -1292,14 +1412,15 @@ static void inode2sd_v1(void *sd, struct inode *inode, loff_t size) | |||
1292 | else | 1412 | else |
1293 | set_sd_v1_blocks(sd_v1, to_fake_used_blocks(inode, SD_V1_SIZE)); | 1413 | set_sd_v1_blocks(sd_v1, to_fake_used_blocks(inode, SD_V1_SIZE)); |
1294 | 1414 | ||
1295 | // Sigh. i_first_direct_byte is back | 1415 | /* Sigh. i_first_direct_byte is back */ |
1296 | set_sd_v1_first_direct_byte(sd_v1, | 1416 | set_sd_v1_first_direct_byte(sd_v1, |
1297 | REISERFS_I(inode)->i_first_direct_byte); | 1417 | REISERFS_I(inode)->i_first_direct_byte); |
1298 | } | 1418 | } |
1299 | 1419 | ||
1300 | /* NOTE, you must prepare the buffer head before sending it here, | 1420 | /* |
1301 | ** and then log it after the call | 1421 | * NOTE, you must prepare the buffer head before sending it here, |
1302 | */ | 1422 | * and then log it after the call |
1423 | */ | ||
1303 | static void update_stat_data(struct treepath *path, struct inode *inode, | 1424 | static void update_stat_data(struct treepath *path, struct inode *inode, |
1304 | loff_t size) | 1425 | loff_t size) |
1305 | { | 1426 | { |
@@ -1307,17 +1428,17 @@ static void update_stat_data(struct treepath *path, struct inode *inode, | |||
1307 | struct item_head *ih; | 1428 | struct item_head *ih; |
1308 | 1429 | ||
1309 | bh = PATH_PLAST_BUFFER(path); | 1430 | bh = PATH_PLAST_BUFFER(path); |
1310 | ih = PATH_PITEM_HEAD(path); | 1431 | ih = tp_item_head(path); |
1311 | 1432 | ||
1312 | if (!is_statdata_le_ih(ih)) | 1433 | if (!is_statdata_le_ih(ih)) |
1313 | reiserfs_panic(inode->i_sb, "vs-13065", "key %k, found item %h", | 1434 | reiserfs_panic(inode->i_sb, "vs-13065", "key %k, found item %h", |
1314 | INODE_PKEY(inode), ih); | 1435 | INODE_PKEY(inode), ih); |
1315 | 1436 | ||
1437 | /* path points to old stat data */ | ||
1316 | if (stat_data_v1(ih)) { | 1438 | if (stat_data_v1(ih)) { |
1317 | // path points to old stat data | 1439 | inode2sd_v1(ih_item_body(bh, ih), inode, size); |
1318 | inode2sd_v1(B_I_PITEM(bh, ih), inode, size); | ||
1319 | } else { | 1440 | } else { |
1320 | inode2sd(B_I_PITEM(bh, ih), inode, size); | 1441 | inode2sd(ih_item_body(bh, ih), inode, size); |
1321 | } | 1442 | } |
1322 | 1443 | ||
1323 | return; | 1444 | return; |
@@ -1335,7 +1456,8 @@ void reiserfs_update_sd_size(struct reiserfs_transaction_handle *th, | |||
1335 | 1456 | ||
1336 | BUG_ON(!th->t_trans_id); | 1457 | BUG_ON(!th->t_trans_id); |
1337 | 1458 | ||
1338 | make_cpu_key(&key, inode, SD_OFFSET, TYPE_STAT_DATA, 3); //key type is unimportant | 1459 | /* key type is unimportant */ |
1460 | make_cpu_key(&key, inode, SD_OFFSET, TYPE_STAT_DATA, 3); | ||
1339 | 1461 | ||
1340 | for (;;) { | 1462 | for (;;) { |
1341 | int pos; | 1463 | int pos; |
@@ -1363,45 +1485,48 @@ void reiserfs_update_sd_size(struct reiserfs_transaction_handle *th, | |||
1363 | return; | 1485 | return; |
1364 | } | 1486 | } |
1365 | 1487 | ||
1366 | /* sigh, prepare_for_journal might schedule. When it schedules the | 1488 | /* |
1367 | ** FS might change. We have to detect that, and loop back to the | 1489 | * sigh, prepare_for_journal might schedule. When it |
1368 | ** search if the stat data item has moved | 1490 | * schedules the FS might change. We have to detect that, |
1491 | * and loop back to the search if the stat data item has moved | ||
1369 | */ | 1492 | */ |
1370 | bh = get_last_bh(&path); | 1493 | bh = get_last_bh(&path); |
1371 | ih = get_ih(&path); | 1494 | ih = tp_item_head(&path); |
1372 | copy_item_head(&tmp_ih, ih); | 1495 | copy_item_head(&tmp_ih, ih); |
1373 | fs_gen = get_generation(inode->i_sb); | 1496 | fs_gen = get_generation(inode->i_sb); |
1374 | reiserfs_prepare_for_journal(inode->i_sb, bh, 1); | 1497 | reiserfs_prepare_for_journal(inode->i_sb, bh, 1); |
1498 | |||
1499 | /* Stat_data item has been moved after scheduling. */ | ||
1375 | if (fs_changed(fs_gen, inode->i_sb) | 1500 | if (fs_changed(fs_gen, inode->i_sb) |
1376 | && item_moved(&tmp_ih, &path)) { | 1501 | && item_moved(&tmp_ih, &path)) { |
1377 | reiserfs_restore_prepared_buffer(inode->i_sb, bh); | 1502 | reiserfs_restore_prepared_buffer(inode->i_sb, bh); |
1378 | continue; /* Stat_data item has been moved after scheduling. */ | 1503 | continue; |
1379 | } | 1504 | } |
1380 | break; | 1505 | break; |
1381 | } | 1506 | } |
1382 | update_stat_data(&path, inode, size); | 1507 | update_stat_data(&path, inode, size); |
1383 | journal_mark_dirty(th, th->t_super, bh); | 1508 | journal_mark_dirty(th, bh); |
1384 | pathrelse(&path); | 1509 | pathrelse(&path); |
1385 | return; | 1510 | return; |
1386 | } | 1511 | } |
1387 | 1512 | ||
1388 | /* reiserfs_read_locked_inode is called to read the inode off disk, and it | 1513 | /* |
1389 | ** does a make_bad_inode when things go wrong. But, we need to make sure | 1514 | * reiserfs_read_locked_inode is called to read the inode off disk, and it |
1390 | ** and clear the key in the private portion of the inode, otherwise a | 1515 | * does a make_bad_inode when things go wrong. But, we need to make sure |
1391 | ** corresponding iput might try to delete whatever object the inode last | 1516 | * and clear the key in the private portion of the inode, otherwise a |
1392 | ** represented. | 1517 | * corresponding iput might try to delete whatever object the inode last |
1393 | */ | 1518 | * represented. |
1519 | */ | ||
1394 | static void reiserfs_make_bad_inode(struct inode *inode) | 1520 | static void reiserfs_make_bad_inode(struct inode *inode) |
1395 | { | 1521 | { |
1396 | memset(INODE_PKEY(inode), 0, KEY_SIZE); | 1522 | memset(INODE_PKEY(inode), 0, KEY_SIZE); |
1397 | make_bad_inode(inode); | 1523 | make_bad_inode(inode); |
1398 | } | 1524 | } |
1399 | 1525 | ||
1400 | // | 1526 | /* |
1401 | // initially this function was derived from minix or ext2's analog and | 1527 | * initially this function was derived from minix or ext2's analog and |
1402 | // evolved as the prototype did | 1528 | * evolved as the prototype did |
1403 | // | 1529 | */ |
1404 | |||
1405 | int reiserfs_init_locked_inode(struct inode *inode, void *p) | 1530 | int reiserfs_init_locked_inode(struct inode *inode, void *p) |
1406 | { | 1531 | { |
1407 | struct reiserfs_iget_args *args = (struct reiserfs_iget_args *)p; | 1532 | struct reiserfs_iget_args *args = (struct reiserfs_iget_args *)p; |
@@ -1410,8 +1535,10 @@ int reiserfs_init_locked_inode(struct inode *inode, void *p) | |||
1410 | return 0; | 1535 | return 0; |
1411 | } | 1536 | } |
1412 | 1537 | ||
1413 | /* looks for stat data in the tree, and fills up the fields of in-core | 1538 | /* |
1414 | inode stat data fields */ | 1539 | * looks for stat data in the tree, and fills up the fields of in-core |
1540 | * inode stat data fields | ||
1541 | */ | ||
1415 | void reiserfs_read_locked_inode(struct inode *inode, | 1542 | void reiserfs_read_locked_inode(struct inode *inode, |
1416 | struct reiserfs_iget_args *args) | 1543 | struct reiserfs_iget_args *args) |
1417 | { | 1544 | { |
@@ -1422,8 +1549,10 @@ void reiserfs_read_locked_inode(struct inode *inode, | |||
1422 | 1549 | ||
1423 | dirino = args->dirid; | 1550 | dirino = args->dirid; |
1424 | 1551 | ||
1425 | /* set version 1, version 2 could be used too, because stat data | 1552 | /* |
1426 | key is the same in both versions */ | 1553 | * set version 1, version 2 could be used too, because stat data |
1554 | * key is the same in both versions | ||
1555 | */ | ||
1427 | key.version = KEY_FORMAT_3_5; | 1556 | key.version = KEY_FORMAT_3_5; |
1428 | key.on_disk_key.k_dir_id = dirino; | 1557 | key.on_disk_key.k_dir_id = dirino; |
1429 | key.on_disk_key.k_objectid = inode->i_ino; | 1558 | key.on_disk_key.k_objectid = inode->i_ino; |
@@ -1439,8 +1568,9 @@ void reiserfs_read_locked_inode(struct inode *inode, | |||
1439 | reiserfs_make_bad_inode(inode); | 1568 | reiserfs_make_bad_inode(inode); |
1440 | return; | 1569 | return; |
1441 | } | 1570 | } |
1571 | |||
1572 | /* a stale NFS handle can trigger this without it being an error */ | ||
1442 | if (retval != ITEM_FOUND) { | 1573 | if (retval != ITEM_FOUND) { |
1443 | /* a stale NFS handle can trigger this without it being an error */ | ||
1444 | pathrelse(&path_to_sd); | 1574 | pathrelse(&path_to_sd); |
1445 | reiserfs_make_bad_inode(inode); | 1575 | reiserfs_make_bad_inode(inode); |
1446 | clear_nlink(inode); | 1576 | clear_nlink(inode); |
@@ -1449,20 +1579,25 @@ void reiserfs_read_locked_inode(struct inode *inode, | |||
1449 | 1579 | ||
1450 | init_inode(inode, &path_to_sd); | 1580 | init_inode(inode, &path_to_sd); |
1451 | 1581 | ||
1452 | /* It is possible that knfsd is trying to access inode of a file | 1582 | /* |
1453 | that is being removed from the disk by some other thread. As we | 1583 | * It is possible that knfsd is trying to access inode of a file |
1454 | update sd on unlink all that is required is to check for nlink | 1584 | * that is being removed from the disk by some other thread. As we |
1455 | here. This bug was first found by Sizif when debugging | 1585 | * update sd on unlink all that is required is to check for nlink |
1456 | SquidNG/Butterfly, forgotten, and found again after Philippe | 1586 | * here. This bug was first found by Sizif when debugging |
1457 | Gramoulle <philippe.gramoulle@mmania.com> reproduced it. | 1587 | * SquidNG/Butterfly, forgotten, and found again after Philippe |
1458 | 1588 | * Gramoulle <philippe.gramoulle@mmania.com> reproduced it. | |
1459 | More logical fix would require changes in fs/inode.c:iput() to | 1589 | |
1460 | remove inode from hash-table _after_ fs cleaned disk stuff up and | 1590 | * More logical fix would require changes in fs/inode.c:iput() to |
1461 | in iget() to return NULL if I_FREEING inode is found in | 1591 | * remove inode from hash-table _after_ fs cleaned disk stuff up and |
1462 | hash-table. */ | 1592 | * in iget() to return NULL if I_FREEING inode is found in |
1463 | /* Currently there is one place where it's ok to meet inode with | 1593 | * hash-table. |
1464 | nlink==0: processing of open-unlinked and half-truncated files | 1594 | */ |
1465 | during mount (fs/reiserfs/super.c:finish_unfinished()). */ | 1595 | |
1596 | /* | ||
1597 | * Currently there is one place where it's ok to meet inode with | ||
1598 | * nlink==0: processing of open-unlinked and half-truncated files | ||
1599 | * during mount (fs/reiserfs/super.c:finish_unfinished()). | ||
1600 | */ | ||
1466 | if ((inode->i_nlink == 0) && | 1601 | if ((inode->i_nlink == 0) && |
1467 | !REISERFS_SB(inode->i_sb)->s_is_unlinked_ok) { | 1602 | !REISERFS_SB(inode->i_sb)->s_is_unlinked_ok) { |
1468 | reiserfs_warning(inode->i_sb, "vs-13075", | 1603 | reiserfs_warning(inode->i_sb, "vs-13075", |
@@ -1472,7 +1607,8 @@ void reiserfs_read_locked_inode(struct inode *inode, | |||
1472 | reiserfs_make_bad_inode(inode); | 1607 | reiserfs_make_bad_inode(inode); |
1473 | } | 1608 | } |
1474 | 1609 | ||
1475 | reiserfs_check_path(&path_to_sd); /* init inode should be relsing */ | 1610 | /* init inode should be relsing */ |
1611 | reiserfs_check_path(&path_to_sd); | ||
1476 | 1612 | ||
1477 | /* | 1613 | /* |
1478 | * Stat data v1 doesn't support ACLs. | 1614 | * Stat data v1 doesn't support ACLs. |
@@ -1481,7 +1617,7 @@ void reiserfs_read_locked_inode(struct inode *inode, | |||
1481 | cache_no_acl(inode); | 1617 | cache_no_acl(inode); |
1482 | } | 1618 | } |
1483 | 1619 | ||
1484 | /** | 1620 | /* |
1485 | * reiserfs_find_actor() - "find actor" reiserfs supplies to iget5_locked(). | 1621 | * reiserfs_find_actor() - "find actor" reiserfs supplies to iget5_locked(). |
1486 | * | 1622 | * |
1487 | * @inode: inode from hash table to check | 1623 | * @inode: inode from hash table to check |
@@ -1556,7 +1692,8 @@ static struct dentry *reiserfs_get_dentry(struct super_block *sb, | |||
1556 | struct dentry *reiserfs_fh_to_dentry(struct super_block *sb, struct fid *fid, | 1692 | struct dentry *reiserfs_fh_to_dentry(struct super_block *sb, struct fid *fid, |
1557 | int fh_len, int fh_type) | 1693 | int fh_len, int fh_type) |
1558 | { | 1694 | { |
1559 | /* fhtype happens to reflect the number of u32s encoded. | 1695 | /* |
1696 | * fhtype happens to reflect the number of u32s encoded. | ||
1560 | * due to a bug in earlier code, fhtype might indicate there | 1697 | * due to a bug in earlier code, fhtype might indicate there |
1561 | * are more u32s then actually fitted. | 1698 | * are more u32s then actually fitted. |
1562 | * so if fhtype seems to be more than len, reduce fhtype. | 1699 | * so if fhtype seems to be more than len, reduce fhtype. |
@@ -1625,13 +1762,16 @@ int reiserfs_encode_fh(struct inode *inode, __u32 * data, int *lenp, | |||
1625 | return *lenp; | 1762 | return *lenp; |
1626 | } | 1763 | } |
1627 | 1764 | ||
1628 | /* looks for stat data, then copies fields to it, marks the buffer | 1765 | /* |
1629 | containing stat data as dirty */ | 1766 | * looks for stat data, then copies fields to it, marks the buffer |
1630 | /* reiserfs inodes are never really dirty, since the dirty inode call | 1767 | * containing stat data as dirty |
1631 | ** always logs them. This call allows the VFS inode marking routines | 1768 | */ |
1632 | ** to properly mark inodes for datasync and such, but only actually | 1769 | /* |
1633 | ** does something when called for a synchronous update. | 1770 | * reiserfs inodes are never really dirty, since the dirty inode call |
1634 | */ | 1771 | * always logs them. This call allows the VFS inode marking routines |
1772 | * to properly mark inodes for datasync and such, but only actually | ||
1773 | * does something when called for a synchronous update. | ||
1774 | */ | ||
1635 | int reiserfs_write_inode(struct inode *inode, struct writeback_control *wbc) | 1775 | int reiserfs_write_inode(struct inode *inode, struct writeback_control *wbc) |
1636 | { | 1776 | { |
1637 | struct reiserfs_transaction_handle th; | 1777 | struct reiserfs_transaction_handle th; |
@@ -1639,24 +1779,28 @@ int reiserfs_write_inode(struct inode *inode, struct writeback_control *wbc) | |||
1639 | 1779 | ||
1640 | if (inode->i_sb->s_flags & MS_RDONLY) | 1780 | if (inode->i_sb->s_flags & MS_RDONLY) |
1641 | return -EROFS; | 1781 | return -EROFS; |
1642 | /* memory pressure can sometimes initiate write_inode calls with sync == 1, | 1782 | /* |
1643 | ** these cases are just when the system needs ram, not when the | 1783 | * memory pressure can sometimes initiate write_inode calls with |
1644 | ** inode needs to reach disk for safety, and they can safely be | 1784 | * sync == 1, |
1645 | ** ignored because the altered inode has already been logged. | 1785 | * these cases are just when the system needs ram, not when the |
1786 | * inode needs to reach disk for safety, and they can safely be | ||
1787 | * ignored because the altered inode has already been logged. | ||
1646 | */ | 1788 | */ |
1647 | if (wbc->sync_mode == WB_SYNC_ALL && !(current->flags & PF_MEMALLOC)) { | 1789 | if (wbc->sync_mode == WB_SYNC_ALL && !(current->flags & PF_MEMALLOC)) { |
1648 | reiserfs_write_lock(inode->i_sb); | 1790 | reiserfs_write_lock(inode->i_sb); |
1649 | if (!journal_begin(&th, inode->i_sb, jbegin_count)) { | 1791 | if (!journal_begin(&th, inode->i_sb, jbegin_count)) { |
1650 | reiserfs_update_sd(&th, inode); | 1792 | reiserfs_update_sd(&th, inode); |
1651 | journal_end_sync(&th, inode->i_sb, jbegin_count); | 1793 | journal_end_sync(&th); |
1652 | } | 1794 | } |
1653 | reiserfs_write_unlock(inode->i_sb); | 1795 | reiserfs_write_unlock(inode->i_sb); |
1654 | } | 1796 | } |
1655 | return 0; | 1797 | return 0; |
1656 | } | 1798 | } |
1657 | 1799 | ||
1658 | /* stat data of new object is inserted already, this inserts the item | 1800 | /* |
1659 | containing "." and ".." entries */ | 1801 | * stat data of new object is inserted already, this inserts the item |
1802 | * containing "." and ".." entries | ||
1803 | */ | ||
1660 | static int reiserfs_new_directory(struct reiserfs_transaction_handle *th, | 1804 | static int reiserfs_new_directory(struct reiserfs_transaction_handle *th, |
1661 | struct inode *inode, | 1805 | struct inode *inode, |
1662 | struct item_head *ih, struct treepath *path, | 1806 | struct item_head *ih, struct treepath *path, |
@@ -1674,9 +1818,11 @@ static int reiserfs_new_directory(struct reiserfs_transaction_handle *th, | |||
1674 | le32_to_cpu(ih->ih_key.k_objectid), DOT_OFFSET, | 1818 | le32_to_cpu(ih->ih_key.k_objectid), DOT_OFFSET, |
1675 | TYPE_DIRENTRY, 3 /*key length */ ); | 1819 | TYPE_DIRENTRY, 3 /*key length */ ); |
1676 | 1820 | ||
1677 | /* compose item head for new item. Directories consist of items of | 1821 | /* |
1678 | old type (ITEM_VERSION_1). Do not set key (second arg is 0), it | 1822 | * compose item head for new item. Directories consist of items of |
1679 | is done by reiserfs_new_inode */ | 1823 | * old type (ITEM_VERSION_1). Do not set key (second arg is 0), it |
1824 | * is done by reiserfs_new_inode | ||
1825 | */ | ||
1680 | if (old_format_only(sb)) { | 1826 | if (old_format_only(sb)) { |
1681 | make_le_item_head(ih, NULL, KEY_FORMAT_3_5, DOT_OFFSET, | 1827 | make_le_item_head(ih, NULL, KEY_FORMAT_3_5, DOT_OFFSET, |
1682 | TYPE_DIRENTRY, EMPTY_DIR_SIZE_V1, 2); | 1828 | TYPE_DIRENTRY, EMPTY_DIR_SIZE_V1, 2); |
@@ -1714,9 +1860,12 @@ static int reiserfs_new_directory(struct reiserfs_transaction_handle *th, | |||
1714 | return reiserfs_insert_item(th, path, &key, ih, inode, body); | 1860 | return reiserfs_insert_item(th, path, &key, ih, inode, body); |
1715 | } | 1861 | } |
1716 | 1862 | ||
1717 | /* stat data of object has been inserted, this inserts the item | 1863 | /* |
1718 | containing the body of symlink */ | 1864 | * stat data of object has been inserted, this inserts the item |
1719 | static int reiserfs_new_symlink(struct reiserfs_transaction_handle *th, struct inode *inode, /* Inode of symlink */ | 1865 | * containing the body of symlink |
1866 | */ | ||
1867 | static int reiserfs_new_symlink(struct reiserfs_transaction_handle *th, | ||
1868 | struct inode *inode, | ||
1720 | struct item_head *ih, | 1869 | struct item_head *ih, |
1721 | struct treepath *path, const char *symname, | 1870 | struct treepath *path, const char *symname, |
1722 | int item_len) | 1871 | int item_len) |
@@ -1754,15 +1903,26 @@ static int reiserfs_new_symlink(struct reiserfs_transaction_handle *th, struct i | |||
1754 | return reiserfs_insert_item(th, path, &key, ih, inode, symname); | 1903 | return reiserfs_insert_item(th, path, &key, ih, inode, symname); |
1755 | } | 1904 | } |
1756 | 1905 | ||
1757 | /* inserts the stat data into the tree, and then calls | 1906 | /* |
1758 | reiserfs_new_directory (to insert ".", ".." item if new object is | 1907 | * inserts the stat data into the tree, and then calls |
1759 | directory) or reiserfs_new_symlink (to insert symlink body if new | 1908 | * reiserfs_new_directory (to insert ".", ".." item if new object is |
1760 | object is symlink) or nothing (if new object is regular file) | 1909 | * directory) or reiserfs_new_symlink (to insert symlink body if new |
1761 | 1910 | * object is symlink) or nothing (if new object is regular file) | |
1762 | NOTE! uid and gid must already be set in the inode. If we return | 1911 | |
1763 | non-zero due to an error, we have to drop the quota previously allocated | 1912 | * NOTE! uid and gid must already be set in the inode. If we return |
1764 | for the fresh inode. This can only be done outside a transaction, so | 1913 | * non-zero due to an error, we have to drop the quota previously allocated |
1765 | if we return non-zero, we also end the transaction. */ | 1914 | * for the fresh inode. This can only be done outside a transaction, so |
1915 | * if we return non-zero, we also end the transaction. | ||
1916 | * | ||
1917 | * @th: active transaction handle | ||
1918 | * @dir: parent directory for new inode | ||
1919 | * @mode: mode of new inode | ||
1920 | * @symname: symlink contents if inode is symlink | ||
1921 | * @isize: 0 for regular file, EMPTY_DIR_SIZE for dirs, strlen(symname) for | ||
1922 | * symlinks | ||
1923 | * @inode: inode to be filled | ||
1924 | * @security: optional security context to associate with this inode | ||
1925 | */ | ||
1766 | int reiserfs_new_inode(struct reiserfs_transaction_handle *th, | 1926 | int reiserfs_new_inode(struct reiserfs_transaction_handle *th, |
1767 | struct inode *dir, umode_t mode, const char *symname, | 1927 | struct inode *dir, umode_t mode, const char *symname, |
1768 | /* 0 for regular, EMTRY_DIR_SIZE for dirs, | 1928 | /* 0 for regular, EMTRY_DIR_SIZE for dirs, |
@@ -1807,7 +1967,7 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th, | |||
1807 | else | 1967 | else |
1808 | make_le_item_head(&ih, NULL, KEY_FORMAT_3_6, SD_OFFSET, | 1968 | make_le_item_head(&ih, NULL, KEY_FORMAT_3_6, SD_OFFSET, |
1809 | TYPE_STAT_DATA, SD_SIZE, MAX_US_INT); | 1969 | TYPE_STAT_DATA, SD_SIZE, MAX_US_INT); |
1810 | memcpy(INODE_PKEY(inode), &(ih.ih_key), KEY_SIZE); | 1970 | memcpy(INODE_PKEY(inode), &ih.ih_key, KEY_SIZE); |
1811 | args.dirid = le32_to_cpu(ih.ih_key.k_dir_id); | 1971 | args.dirid = le32_to_cpu(ih.ih_key.k_dir_id); |
1812 | 1972 | ||
1813 | depth = reiserfs_write_unlock_nested(inode->i_sb); | 1973 | depth = reiserfs_write_unlock_nested(inode->i_sb); |
@@ -1820,10 +1980,11 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th, | |||
1820 | } | 1980 | } |
1821 | 1981 | ||
1822 | if (old_format_only(sb)) | 1982 | if (old_format_only(sb)) |
1823 | /* not a perfect generation count, as object ids can be reused, but | 1983 | /* |
1824 | ** this is as good as reiserfs can do right now. | 1984 | * not a perfect generation count, as object ids can be reused, |
1825 | ** note that the private part of inode isn't filled in yet, we have | 1985 | * but this is as good as reiserfs can do right now. |
1826 | ** to use the directory. | 1986 | * note that the private part of inode isn't filled in yet, |
1987 | * we have to use the directory. | ||
1827 | */ | 1988 | */ |
1828 | inode->i_generation = le32_to_cpu(INODE_PKEY(dir)->k_objectid); | 1989 | inode->i_generation = le32_to_cpu(INODE_PKEY(dir)->k_objectid); |
1829 | else | 1990 | else |
@@ -1850,7 +2011,7 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th, | |||
1850 | REISERFS_I(inode)->i_first_direct_byte = S_ISLNK(mode) ? 1 : | 2011 | REISERFS_I(inode)->i_first_direct_byte = S_ISLNK(mode) ? 1 : |
1851 | U32_MAX /*NO_BYTES_IN_DIRECT_ITEM */ ; | 2012 | U32_MAX /*NO_BYTES_IN_DIRECT_ITEM */ ; |
1852 | 2013 | ||
1853 | INIT_LIST_HEAD(&(REISERFS_I(inode)->i_prealloc_list)); | 2014 | INIT_LIST_HEAD(&REISERFS_I(inode)->i_prealloc_list); |
1854 | REISERFS_I(inode)->i_flags = 0; | 2015 | REISERFS_I(inode)->i_flags = 0; |
1855 | REISERFS_I(inode)->i_prealloc_block = 0; | 2016 | REISERFS_I(inode)->i_prealloc_block = 0; |
1856 | REISERFS_I(inode)->i_prealloc_count = 0; | 2017 | REISERFS_I(inode)->i_prealloc_count = 0; |
@@ -1878,9 +2039,9 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th, | |||
1878 | goto out_bad_inode; | 2039 | goto out_bad_inode; |
1879 | } | 2040 | } |
1880 | if (old_format_only(sb)) { | 2041 | if (old_format_only(sb)) { |
2042 | /* i_uid or i_gid is too big to be stored in stat data v3.5 */ | ||
1881 | if (i_uid_read(inode) & ~0xffff || i_gid_read(inode) & ~0xffff) { | 2043 | if (i_uid_read(inode) & ~0xffff || i_gid_read(inode) & ~0xffff) { |
1882 | pathrelse(&path_to_key); | 2044 | pathrelse(&path_to_key); |
1883 | /* i_uid or i_gid is too big to be stored in stat data v3.5 */ | ||
1884 | err = -EINVAL; | 2045 | err = -EINVAL; |
1885 | goto out_bad_inode; | 2046 | goto out_bad_inode; |
1886 | } | 2047 | } |
@@ -1888,9 +2049,11 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th, | |||
1888 | } else { | 2049 | } else { |
1889 | inode2sd(&sd, inode, inode->i_size); | 2050 | inode2sd(&sd, inode, inode->i_size); |
1890 | } | 2051 | } |
1891 | // store in in-core inode the key of stat data and version all | 2052 | /* |
1892 | // object items will have (directory items will have old offset | 2053 | * store in in-core inode the key of stat data and version all |
1893 | // format, other new objects will consist of new items) | 2054 | * object items will have (directory items will have old offset |
2055 | * format, other new objects will consist of new items) | ||
2056 | */ | ||
1894 | if (old_format_only(sb) || S_ISDIR(mode) || S_ISLNK(mode)) | 2057 | if (old_format_only(sb) || S_ISDIR(mode) || S_ISLNK(mode)) |
1895 | set_inode_item_key_version(inode, KEY_FORMAT_3_5); | 2058 | set_inode_item_key_version(inode, KEY_FORMAT_3_5); |
1896 | else | 2059 | else |
@@ -1934,7 +2097,7 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th, | |||
1934 | if (retval) { | 2097 | if (retval) { |
1935 | err = retval; | 2098 | err = retval; |
1936 | reiserfs_check_path(&path_to_key); | 2099 | reiserfs_check_path(&path_to_key); |
1937 | journal_end(th, th->t_super, th->t_blocks_allocated); | 2100 | journal_end(th); |
1938 | goto out_inserted_sd; | 2101 | goto out_inserted_sd; |
1939 | } | 2102 | } |
1940 | 2103 | ||
@@ -1945,7 +2108,7 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th, | |||
1945 | if (retval) { | 2108 | if (retval) { |
1946 | err = retval; | 2109 | err = retval; |
1947 | reiserfs_check_path(&path_to_key); | 2110 | reiserfs_check_path(&path_to_key); |
1948 | journal_end(th, th->t_super, th->t_blocks_allocated); | 2111 | journal_end(th); |
1949 | goto out_inserted_sd; | 2112 | goto out_inserted_sd; |
1950 | } | 2113 | } |
1951 | } else if (inode->i_sb->s_flags & MS_POSIXACL) { | 2114 | } else if (inode->i_sb->s_flags & MS_POSIXACL) { |
@@ -1962,8 +2125,7 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th, | |||
1962 | if (retval) { | 2125 | if (retval) { |
1963 | err = retval; | 2126 | err = retval; |
1964 | reiserfs_check_path(&path_to_key); | 2127 | reiserfs_check_path(&path_to_key); |
1965 | retval = journal_end(th, th->t_super, | 2128 | retval = journal_end(th); |
1966 | th->t_blocks_allocated); | ||
1967 | if (retval) | 2129 | if (retval) |
1968 | err = retval; | 2130 | err = retval; |
1969 | goto out_inserted_sd; | 2131 | goto out_inserted_sd; |
@@ -1975,11 +2137,7 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th, | |||
1975 | 2137 | ||
1976 | return 0; | 2138 | return 0; |
1977 | 2139 | ||
1978 | /* it looks like you can easily compress these two goto targets into | 2140 | out_bad_inode: |
1979 | * one. Keeping it like this doesn't actually hurt anything, and they | ||
1980 | * are place holders for what the quota code actually needs. | ||
1981 | */ | ||
1982 | out_bad_inode: | ||
1983 | /* Invalidate the object, nothing was inserted yet */ | 2141 | /* Invalidate the object, nothing was inserted yet */ |
1984 | INODE_PKEY(inode)->k_objectid = 0; | 2142 | INODE_PKEY(inode)->k_objectid = 0; |
1985 | 2143 | ||
@@ -1988,16 +2146,19 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th, | |||
1988 | dquot_free_inode(inode); | 2146 | dquot_free_inode(inode); |
1989 | reiserfs_write_lock_nested(inode->i_sb, depth); | 2147 | reiserfs_write_lock_nested(inode->i_sb, depth); |
1990 | 2148 | ||
1991 | out_end_trans: | 2149 | out_end_trans: |
1992 | journal_end(th, th->t_super, th->t_blocks_allocated); | 2150 | journal_end(th); |
1993 | /* Drop can be outside and it needs more credits so it's better to have it outside */ | 2151 | /* |
2152 | * Drop can be outside and it needs more credits so it's better | ||
2153 | * to have it outside | ||
2154 | */ | ||
1994 | depth = reiserfs_write_unlock_nested(inode->i_sb); | 2155 | depth = reiserfs_write_unlock_nested(inode->i_sb); |
1995 | dquot_drop(inode); | 2156 | dquot_drop(inode); |
1996 | reiserfs_write_lock_nested(inode->i_sb, depth); | 2157 | reiserfs_write_lock_nested(inode->i_sb, depth); |
1997 | inode->i_flags |= S_NOQUOTA; | 2158 | inode->i_flags |= S_NOQUOTA; |
1998 | make_bad_inode(inode); | 2159 | make_bad_inode(inode); |
1999 | 2160 | ||
2000 | out_inserted_sd: | 2161 | out_inserted_sd: |
2001 | clear_nlink(inode); | 2162 | clear_nlink(inode); |
2002 | th->t_trans_id = 0; /* so the caller can't use this handle later */ | 2163 | th->t_trans_id = 0; /* so the caller can't use this handle later */ |
2003 | unlock_new_inode(inode); /* OK to do even if we hadn't locked it */ | 2164 | unlock_new_inode(inode); /* OK to do even if we hadn't locked it */ |
@@ -2006,25 +2167,26 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th, | |||
2006 | } | 2167 | } |
2007 | 2168 | ||
2008 | /* | 2169 | /* |
2009 | ** finds the tail page in the page cache, | 2170 | * finds the tail page in the page cache, |
2010 | ** reads the last block in. | 2171 | * reads the last block in. |
2011 | ** | 2172 | * |
2012 | ** On success, page_result is set to a locked, pinned page, and bh_result | 2173 | * On success, page_result is set to a locked, pinned page, and bh_result |
2013 | ** is set to an up to date buffer for the last block in the file. returns 0. | 2174 | * is set to an up to date buffer for the last block in the file. returns 0. |
2014 | ** | 2175 | * |
2015 | ** tail conversion is not done, so bh_result might not be valid for writing | 2176 | * tail conversion is not done, so bh_result might not be valid for writing |
2016 | ** check buffer_mapped(bh_result) and bh_result->b_blocknr != 0 before | 2177 | * check buffer_mapped(bh_result) and bh_result->b_blocknr != 0 before |
2017 | ** trying to write the block. | 2178 | * trying to write the block. |
2018 | ** | 2179 | * |
2019 | ** on failure, nonzero is returned, page_result and bh_result are untouched. | 2180 | * on failure, nonzero is returned, page_result and bh_result are untouched. |
2020 | */ | 2181 | */ |
2021 | static int grab_tail_page(struct inode *inode, | 2182 | static int grab_tail_page(struct inode *inode, |
2022 | struct page **page_result, | 2183 | struct page **page_result, |
2023 | struct buffer_head **bh_result) | 2184 | struct buffer_head **bh_result) |
2024 | { | 2185 | { |
2025 | 2186 | ||
2026 | /* we want the page with the last byte in the file, | 2187 | /* |
2027 | ** not the page that will hold the next byte for appending | 2188 | * we want the page with the last byte in the file, |
2189 | * not the page that will hold the next byte for appending | ||
2028 | */ | 2190 | */ |
2029 | unsigned long index = (inode->i_size - 1) >> PAGE_CACHE_SHIFT; | 2191 | unsigned long index = (inode->i_size - 1) >> PAGE_CACHE_SHIFT; |
2030 | unsigned long pos = 0; | 2192 | unsigned long pos = 0; |
@@ -2036,10 +2198,11 @@ static int grab_tail_page(struct inode *inode, | |||
2036 | struct page *page; | 2198 | struct page *page; |
2037 | int error; | 2199 | int error; |
2038 | 2200 | ||
2039 | /* we know that we are only called with inode->i_size > 0. | 2201 | /* |
2040 | ** we also know that a file tail can never be as big as a block | 2202 | * we know that we are only called with inode->i_size > 0. |
2041 | ** If i_size % blocksize == 0, our file is currently block aligned | 2203 | * we also know that a file tail can never be as big as a block |
2042 | ** and it won't need converting or zeroing after a truncate. | 2204 | * If i_size % blocksize == 0, our file is currently block aligned |
2205 | * and it won't need converting or zeroing after a truncate. | ||
2043 | */ | 2206 | */ |
2044 | if ((offset & (blocksize - 1)) == 0) { | 2207 | if ((offset & (blocksize - 1)) == 0) { |
2045 | return -ENOENT; | 2208 | return -ENOENT; |
@@ -2068,10 +2231,11 @@ static int grab_tail_page(struct inode *inode, | |||
2068 | } while (bh != head); | 2231 | } while (bh != head); |
2069 | 2232 | ||
2070 | if (!buffer_uptodate(bh)) { | 2233 | if (!buffer_uptodate(bh)) { |
2071 | /* note, this should never happen, prepare_write should | 2234 | /* |
2072 | ** be taking care of this for us. If the buffer isn't up to date, | 2235 | * note, this should never happen, prepare_write should be |
2073 | ** I've screwed up the code to find the buffer, or the code to | 2236 | * taking care of this for us. If the buffer isn't up to |
2074 | ** call prepare_write | 2237 | * date, I've screwed up the code to find the buffer, or the |
2238 | * code to call prepare_write | ||
2075 | */ | 2239 | */ |
2076 | reiserfs_error(inode->i_sb, "clm-6000", | 2240 | reiserfs_error(inode->i_sb, "clm-6000", |
2077 | "error reading block %lu", bh->b_blocknr); | 2241 | "error reading block %lu", bh->b_blocknr); |
@@ -2081,21 +2245,21 @@ static int grab_tail_page(struct inode *inode, | |||
2081 | *bh_result = bh; | 2245 | *bh_result = bh; |
2082 | *page_result = page; | 2246 | *page_result = page; |
2083 | 2247 | ||
2084 | out: | 2248 | out: |
2085 | return error; | 2249 | return error; |
2086 | 2250 | ||
2087 | unlock: | 2251 | unlock: |
2088 | unlock_page(page); | 2252 | unlock_page(page); |
2089 | page_cache_release(page); | 2253 | page_cache_release(page); |
2090 | return error; | 2254 | return error; |
2091 | } | 2255 | } |
2092 | 2256 | ||
2093 | /* | 2257 | /* |
2094 | ** vfs version of truncate file. Must NOT be called with | 2258 | * vfs version of truncate file. Must NOT be called with |
2095 | ** a transaction already started. | 2259 | * a transaction already started. |
2096 | ** | 2260 | * |
2097 | ** some code taken from block_truncate_page | 2261 | * some code taken from block_truncate_page |
2098 | */ | 2262 | */ |
2099 | int reiserfs_truncate_file(struct inode *inode, int update_timestamps) | 2263 | int reiserfs_truncate_file(struct inode *inode, int update_timestamps) |
2100 | { | 2264 | { |
2101 | struct reiserfs_transaction_handle th; | 2265 | struct reiserfs_transaction_handle th; |
@@ -2113,9 +2277,11 @@ int reiserfs_truncate_file(struct inode *inode, int update_timestamps) | |||
2113 | if (inode->i_size > 0) { | 2277 | if (inode->i_size > 0) { |
2114 | error = grab_tail_page(inode, &page, &bh); | 2278 | error = grab_tail_page(inode, &page, &bh); |
2115 | if (error) { | 2279 | if (error) { |
2116 | // -ENOENT means we truncated past the end of the file, | 2280 | /* |
2117 | // and get_block_create_0 could not find a block to read in, | 2281 | * -ENOENT means we truncated past the end of the |
2118 | // which is ok. | 2282 | * file, and get_block_create_0 could not find a |
2283 | * block to read in, which is ok. | ||
2284 | */ | ||
2119 | if (error != -ENOENT) | 2285 | if (error != -ENOENT) |
2120 | reiserfs_error(inode->i_sb, "clm-6001", | 2286 | reiserfs_error(inode->i_sb, "clm-6001", |
2121 | "grab_tail_page failed %d", | 2287 | "grab_tail_page failed %d", |
@@ -2125,29 +2291,33 @@ int reiserfs_truncate_file(struct inode *inode, int update_timestamps) | |||
2125 | } | 2291 | } |
2126 | } | 2292 | } |
2127 | 2293 | ||
2128 | /* so, if page != NULL, we have a buffer head for the offset at | 2294 | /* |
2129 | ** the end of the file. if the bh is mapped, and bh->b_blocknr != 0, | 2295 | * so, if page != NULL, we have a buffer head for the offset at |
2130 | ** then we have an unformatted node. Otherwise, we have a direct item, | 2296 | * the end of the file. if the bh is mapped, and bh->b_blocknr != 0, |
2131 | ** and no zeroing is required on disk. We zero after the truncate, | 2297 | * then we have an unformatted node. Otherwise, we have a direct item, |
2132 | ** because the truncate might pack the item anyway | 2298 | * and no zeroing is required on disk. We zero after the truncate, |
2133 | ** (it will unmap bh if it packs). | 2299 | * because the truncate might pack the item anyway |
2300 | * (it will unmap bh if it packs). | ||
2301 | * | ||
2302 | * it is enough to reserve space in transaction for 2 balancings: | ||
2303 | * one for "save" link adding and another for the first | ||
2304 | * cut_from_item. 1 is for update_sd | ||
2134 | */ | 2305 | */ |
2135 | /* it is enough to reserve space in transaction for 2 balancings: | ||
2136 | one for "save" link adding and another for the first | ||
2137 | cut_from_item. 1 is for update_sd */ | ||
2138 | error = journal_begin(&th, inode->i_sb, | 2306 | error = journal_begin(&th, inode->i_sb, |
2139 | JOURNAL_PER_BALANCE_CNT * 2 + 1); | 2307 | JOURNAL_PER_BALANCE_CNT * 2 + 1); |
2140 | if (error) | 2308 | if (error) |
2141 | goto out; | 2309 | goto out; |
2142 | reiserfs_update_inode_transaction(inode); | 2310 | reiserfs_update_inode_transaction(inode); |
2143 | if (update_timestamps) | 2311 | if (update_timestamps) |
2144 | /* we are doing real truncate: if the system crashes before the last | 2312 | /* |
2145 | transaction of truncating gets committed - on reboot the file | 2313 | * we are doing real truncate: if the system crashes |
2146 | either appears truncated properly or not truncated at all */ | 2314 | * before the last transaction of truncating gets committed |
2315 | * - on reboot the file either appears truncated properly | ||
2316 | * or not truncated at all | ||
2317 | */ | ||
2147 | add_save_link(&th, inode, 1); | 2318 | add_save_link(&th, inode, 1); |
2148 | err2 = reiserfs_do_truncate(&th, inode, page, update_timestamps); | 2319 | err2 = reiserfs_do_truncate(&th, inode, page, update_timestamps); |
2149 | error = | 2320 | error = journal_end(&th); |
2150 | journal_end(&th, inode->i_sb, JOURNAL_PER_BALANCE_CNT * 2 + 1); | ||
2151 | if (error) | 2321 | if (error) |
2152 | goto out; | 2322 | goto out; |
2153 | 2323 | ||
@@ -2180,7 +2350,7 @@ int reiserfs_truncate_file(struct inode *inode, int update_timestamps) | |||
2180 | reiserfs_write_unlock(inode->i_sb); | 2350 | reiserfs_write_unlock(inode->i_sb); |
2181 | 2351 | ||
2182 | return 0; | 2352 | return 0; |
2183 | out: | 2353 | out: |
2184 | if (page) { | 2354 | if (page) { |
2185 | unlock_page(page); | 2355 | unlock_page(page); |
2186 | page_cache_release(page); | 2356 | page_cache_release(page); |
@@ -2212,7 +2382,10 @@ static int map_block_for_writepage(struct inode *inode, | |||
2212 | int copy_size; | 2382 | int copy_size; |
2213 | int trans_running = 0; | 2383 | int trans_running = 0; |
2214 | 2384 | ||
2215 | /* catch places below that try to log something without starting a trans */ | 2385 | /* |
2386 | * catch places below that try to log something without | ||
2387 | * starting a trans | ||
2388 | */ | ||
2216 | th.t_trans_id = 0; | 2389 | th.t_trans_id = 0; |
2217 | 2390 | ||
2218 | if (!buffer_uptodate(bh_result)) { | 2391 | if (!buffer_uptodate(bh_result)) { |
@@ -2220,11 +2393,11 @@ static int map_block_for_writepage(struct inode *inode, | |||
2220 | } | 2393 | } |
2221 | 2394 | ||
2222 | kmap(bh_result->b_page); | 2395 | kmap(bh_result->b_page); |
2223 | start_over: | 2396 | start_over: |
2224 | reiserfs_write_lock(inode->i_sb); | 2397 | reiserfs_write_lock(inode->i_sb); |
2225 | make_cpu_key(&key, inode, byte_offset, TYPE_ANY, 3); | 2398 | make_cpu_key(&key, inode, byte_offset, TYPE_ANY, 3); |
2226 | 2399 | ||
2227 | research: | 2400 | research: |
2228 | retval = search_for_position_by_key(inode->i_sb, &key, &path); | 2401 | retval = search_for_position_by_key(inode->i_sb, &key, &path); |
2229 | if (retval != POSITION_FOUND) { | 2402 | if (retval != POSITION_FOUND) { |
2230 | use_get_block = 1; | 2403 | use_get_block = 1; |
@@ -2232,8 +2405,8 @@ static int map_block_for_writepage(struct inode *inode, | |||
2232 | } | 2405 | } |
2233 | 2406 | ||
2234 | bh = get_last_bh(&path); | 2407 | bh = get_last_bh(&path); |
2235 | ih = get_ih(&path); | 2408 | ih = tp_item_head(&path); |
2236 | item = get_item(&path); | 2409 | item = tp_item_body(&path); |
2237 | pos_in_item = path.pos_in_item; | 2410 | pos_in_item = path.pos_in_item; |
2238 | 2411 | ||
2239 | /* we've found an unformatted node */ | 2412 | /* we've found an unformatted node */ |
@@ -2281,10 +2454,10 @@ static int map_block_for_writepage(struct inode *inode, | |||
2281 | goto research; | 2454 | goto research; |
2282 | } | 2455 | } |
2283 | 2456 | ||
2284 | memcpy(B_I_PITEM(bh, ih) + pos_in_item, p + bytes_copied, | 2457 | memcpy(ih_item_body(bh, ih) + pos_in_item, p + bytes_copied, |
2285 | copy_size); | 2458 | copy_size); |
2286 | 2459 | ||
2287 | journal_mark_dirty(&th, inode->i_sb, bh); | 2460 | journal_mark_dirty(&th, bh); |
2288 | bytes_copied += copy_size; | 2461 | bytes_copied += copy_size; |
2289 | set_block_dev_mapped(bh_result, 0, inode); | 2462 | set_block_dev_mapped(bh_result, 0, inode); |
2290 | 2463 | ||
@@ -2304,10 +2477,10 @@ static int map_block_for_writepage(struct inode *inode, | |||
2304 | } | 2477 | } |
2305 | retval = 0; | 2478 | retval = 0; |
2306 | 2479 | ||
2307 | out: | 2480 | out: |
2308 | pathrelse(&path); | 2481 | pathrelse(&path); |
2309 | if (trans_running) { | 2482 | if (trans_running) { |
2310 | int err = journal_end(&th, inode->i_sb, jbegin_count); | 2483 | int err = journal_end(&th); |
2311 | if (err) | 2484 | if (err) |
2312 | retval = err; | 2485 | retval = err; |
2313 | trans_running = 0; | 2486 | trans_running = 0; |
@@ -2331,7 +2504,8 @@ static int map_block_for_writepage(struct inode *inode, | |||
2331 | kunmap(bh_result->b_page); | 2504 | kunmap(bh_result->b_page); |
2332 | 2505 | ||
2333 | if (!retval && buffer_mapped(bh_result) && bh_result->b_blocknr == 0) { | 2506 | if (!retval && buffer_mapped(bh_result) && bh_result->b_blocknr == 0) { |
2334 | /* we've copied data from the page into the direct item, so the | 2507 | /* |
2508 | * we've copied data from the page into the direct item, so the | ||
2335 | * buffer in the page is now clean, mark it to reflect that. | 2509 | * buffer in the page is now clean, mark it to reflect that. |
2336 | */ | 2510 | */ |
2337 | lock_buffer(bh_result); | 2511 | lock_buffer(bh_result); |
@@ -2370,7 +2544,8 @@ static int reiserfs_write_full_page(struct page *page, | |||
2370 | return 0; | 2544 | return 0; |
2371 | } | 2545 | } |
2372 | 2546 | ||
2373 | /* The page dirty bit is cleared before writepage is called, which | 2547 | /* |
2548 | * The page dirty bit is cleared before writepage is called, which | ||
2374 | * means we have to tell create_empty_buffers to make dirty buffers | 2549 | * means we have to tell create_empty_buffers to make dirty buffers |
2375 | * The page really should be up to date at this point, so tossing | 2550 | * The page really should be up to date at this point, so tossing |
2376 | * in the BH_Uptodate is just a sanity check. | 2551 | * in the BH_Uptodate is just a sanity check. |
@@ -2381,8 +2556,9 @@ static int reiserfs_write_full_page(struct page *page, | |||
2381 | } | 2556 | } |
2382 | head = page_buffers(page); | 2557 | head = page_buffers(page); |
2383 | 2558 | ||
2384 | /* last page in the file, zero out any contents past the | 2559 | /* |
2385 | ** last byte in the file | 2560 | * last page in the file, zero out any contents past the |
2561 | * last byte in the file | ||
2386 | */ | 2562 | */ |
2387 | if (page->index >= end_index) { | 2563 | if (page->index >= end_index) { |
2388 | unsigned last_offset; | 2564 | unsigned last_offset; |
@@ -2412,7 +2588,8 @@ static int reiserfs_write_full_page(struct page *page, | |||
2412 | (!buffer_mapped(bh) || (buffer_mapped(bh) | 2588 | (!buffer_mapped(bh) || (buffer_mapped(bh) |
2413 | && bh->b_blocknr == | 2589 | && bh->b_blocknr == |
2414 | 0))) { | 2590 | 0))) { |
2415 | /* not mapped yet, or it points to a direct item, search | 2591 | /* |
2592 | * not mapped yet, or it points to a direct item, search | ||
2416 | * the btree for the mapping info, and log any direct | 2593 | * the btree for the mapping info, and log any direct |
2417 | * items found | 2594 | * items found |
2418 | */ | 2595 | */ |
@@ -2450,10 +2627,11 @@ static int reiserfs_write_full_page(struct page *page, | |||
2450 | 2627 | ||
2451 | if (checked) { | 2628 | if (checked) { |
2452 | reiserfs_prepare_for_journal(s, bh, 1); | 2629 | reiserfs_prepare_for_journal(s, bh, 1); |
2453 | journal_mark_dirty(&th, s, bh); | 2630 | journal_mark_dirty(&th, bh); |
2454 | continue; | 2631 | continue; |
2455 | } | 2632 | } |
2456 | /* from this point on, we know the buffer is mapped to a | 2633 | /* |
2634 | * from this point on, we know the buffer is mapped to a | ||
2457 | * real block and not a direct item | 2635 | * real block and not a direct item |
2458 | */ | 2636 | */ |
2459 | if (wbc->sync_mode != WB_SYNC_NONE) { | 2637 | if (wbc->sync_mode != WB_SYNC_NONE) { |
@@ -2472,7 +2650,7 @@ static int reiserfs_write_full_page(struct page *page, | |||
2472 | } while ((bh = bh->b_this_page) != head); | 2650 | } while ((bh = bh->b_this_page) != head); |
2473 | 2651 | ||
2474 | if (checked) { | 2652 | if (checked) { |
2475 | error = journal_end(&th, s, bh_per_page + 1); | 2653 | error = journal_end(&th); |
2476 | reiserfs_write_unlock(s); | 2654 | reiserfs_write_unlock(s); |
2477 | if (error) | 2655 | if (error) |
2478 | goto fail; | 2656 | goto fail; |
@@ -2497,7 +2675,7 @@ static int reiserfs_write_full_page(struct page *page, | |||
2497 | } while (bh != head); | 2675 | } while (bh != head); |
2498 | 2676 | ||
2499 | error = 0; | 2677 | error = 0; |
2500 | done: | 2678 | done: |
2501 | if (nr == 0) { | 2679 | if (nr == 0) { |
2502 | /* | 2680 | /* |
2503 | * if this page only had a direct item, it is very possible for | 2681 | * if this page only had a direct item, it is very possible for |
@@ -2519,8 +2697,9 @@ static int reiserfs_write_full_page(struct page *page, | |||
2519 | } | 2697 | } |
2520 | return error; | 2698 | return error; |
2521 | 2699 | ||
2522 | fail: | 2700 | fail: |
2523 | /* catches various errors, we need to make sure any valid dirty blocks | 2701 | /* |
2702 | * catches various errors, we need to make sure any valid dirty blocks | ||
2524 | * get to the media. The page is currently locked and not marked for | 2703 | * get to the media. The page is currently locked and not marked for |
2525 | * writeback | 2704 | * writeback |
2526 | */ | 2705 | */ |
@@ -2533,8 +2712,8 @@ static int reiserfs_write_full_page(struct page *page, | |||
2533 | mark_buffer_async_write(bh); | 2712 | mark_buffer_async_write(bh); |
2534 | } else { | 2713 | } else { |
2535 | /* | 2714 | /* |
2536 | * clear any dirty bits that might have come from getting | 2715 | * clear any dirty bits that might have come from |
2537 | * attached to a dirty page | 2716 | * getting attached to a dirty page |
2538 | */ | 2717 | */ |
2539 | clear_buffer_dirty(bh); | 2718 | clear_buffer_dirty(bh); |
2540 | } | 2719 | } |
@@ -2614,15 +2793,18 @@ static int reiserfs_write_begin(struct file *file, | |||
2614 | ret = __block_write_begin(page, pos, len, reiserfs_get_block); | 2793 | ret = __block_write_begin(page, pos, len, reiserfs_get_block); |
2615 | if (ret && reiserfs_transaction_running(inode->i_sb)) { | 2794 | if (ret && reiserfs_transaction_running(inode->i_sb)) { |
2616 | struct reiserfs_transaction_handle *th = current->journal_info; | 2795 | struct reiserfs_transaction_handle *th = current->journal_info; |
2617 | /* this gets a little ugly. If reiserfs_get_block returned an | 2796 | /* |
2618 | * error and left a transacstion running, we've got to close it, | 2797 | * this gets a little ugly. If reiserfs_get_block returned an |
2619 | * and we've got to free handle if it was a persistent transaction. | 2798 | * error and left a transacstion running, we've got to close |
2799 | * it, and we've got to free handle if it was a persistent | ||
2800 | * transaction. | ||
2620 | * | 2801 | * |
2621 | * But, if we had nested into an existing transaction, we need | 2802 | * But, if we had nested into an existing transaction, we need |
2622 | * to just drop the ref count on the handle. | 2803 | * to just drop the ref count on the handle. |
2623 | * | 2804 | * |
2624 | * If old_ref == 0, the transaction is from reiserfs_get_block, | 2805 | * If old_ref == 0, the transaction is from reiserfs_get_block, |
2625 | * and it was a persistent trans. Otherwise, it was nested above. | 2806 | * and it was a persistent trans. Otherwise, it was nested |
2807 | * above. | ||
2626 | */ | 2808 | */ |
2627 | if (th->t_refcount > old_ref) { | 2809 | if (th->t_refcount > old_ref) { |
2628 | if (old_ref) | 2810 | if (old_ref) |
@@ -2671,15 +2853,18 @@ int __reiserfs_write_begin(struct page *page, unsigned from, unsigned len) | |||
2671 | ret = __block_write_begin(page, from, len, reiserfs_get_block); | 2853 | ret = __block_write_begin(page, from, len, reiserfs_get_block); |
2672 | if (ret && reiserfs_transaction_running(inode->i_sb)) { | 2854 | if (ret && reiserfs_transaction_running(inode->i_sb)) { |
2673 | struct reiserfs_transaction_handle *th = current->journal_info; | 2855 | struct reiserfs_transaction_handle *th = current->journal_info; |
2674 | /* this gets a little ugly. If reiserfs_get_block returned an | 2856 | /* |
2675 | * error and left a transacstion running, we've got to close it, | 2857 | * this gets a little ugly. If reiserfs_get_block returned an |
2676 | * and we've got to free handle if it was a persistent transaction. | 2858 | * error and left a transacstion running, we've got to close |
2859 | * it, and we've got to free handle if it was a persistent | ||
2860 | * transaction. | ||
2677 | * | 2861 | * |
2678 | * But, if we had nested into an existing transaction, we need | 2862 | * But, if we had nested into an existing transaction, we need |
2679 | * to just drop the ref count on the handle. | 2863 | * to just drop the ref count on the handle. |
2680 | * | 2864 | * |
2681 | * If old_ref == 0, the transaction is from reiserfs_get_block, | 2865 | * If old_ref == 0, the transaction is from reiserfs_get_block, |
2682 | * and it was a persistent trans. Otherwise, it was nested above. | 2866 | * and it was a persistent trans. Otherwise, it was nested |
2867 | * above. | ||
2683 | */ | 2868 | */ |
2684 | if (th->t_refcount > old_ref) { | 2869 | if (th->t_refcount > old_ref) { |
2685 | if (old_ref) | 2870 | if (old_ref) |
@@ -2734,17 +2919,20 @@ static int reiserfs_write_end(struct file *file, struct address_space *mapping, | |||
2734 | 2919 | ||
2735 | reiserfs_commit_page(inode, page, start, start + copied); | 2920 | reiserfs_commit_page(inode, page, start, start + copied); |
2736 | 2921 | ||
2737 | /* generic_commit_write does this for us, but does not update the | 2922 | /* |
2738 | ** transaction tracking stuff when the size changes. So, we have | 2923 | * generic_commit_write does this for us, but does not update the |
2739 | ** to do the i_size updates here. | 2924 | * transaction tracking stuff when the size changes. So, we have |
2925 | * to do the i_size updates here. | ||
2740 | */ | 2926 | */ |
2741 | if (pos + copied > inode->i_size) { | 2927 | if (pos + copied > inode->i_size) { |
2742 | struct reiserfs_transaction_handle myth; | 2928 | struct reiserfs_transaction_handle myth; |
2743 | reiserfs_write_lock(inode->i_sb); | 2929 | reiserfs_write_lock(inode->i_sb); |
2744 | locked = true; | 2930 | locked = true; |
2745 | /* If the file have grown beyond the border where it | 2931 | /* |
2746 | can have a tail, unmark it as needing a tail | 2932 | * If the file have grown beyond the border where it |
2747 | packing */ | 2933 | * can have a tail, unmark it as needing a tail |
2934 | * packing | ||
2935 | */ | ||
2748 | if ((have_large_tails(inode->i_sb) | 2936 | if ((have_large_tails(inode->i_sb) |
2749 | && inode->i_size > i_block_size(inode) * 4) | 2937 | && inode->i_size > i_block_size(inode) * 4) |
2750 | || (have_small_tails(inode->i_sb) | 2938 | || (have_small_tails(inode->i_sb) |
@@ -2759,13 +2947,13 @@ static int reiserfs_write_end(struct file *file, struct address_space *mapping, | |||
2759 | inode->i_size = pos + copied; | 2947 | inode->i_size = pos + copied; |
2760 | /* | 2948 | /* |
2761 | * this will just nest into our transaction. It's important | 2949 | * this will just nest into our transaction. It's important |
2762 | * to use mark_inode_dirty so the inode gets pushed around on the | 2950 | * to use mark_inode_dirty so the inode gets pushed around on |
2763 | * dirty lists, and so that O_SYNC works as expected | 2951 | * the dirty lists, and so that O_SYNC works as expected |
2764 | */ | 2952 | */ |
2765 | mark_inode_dirty(inode); | 2953 | mark_inode_dirty(inode); |
2766 | reiserfs_update_sd(&myth, inode); | 2954 | reiserfs_update_sd(&myth, inode); |
2767 | update_sd = 1; | 2955 | update_sd = 1; |
2768 | ret = journal_end(&myth, inode->i_sb, 1); | 2956 | ret = journal_end(&myth); |
2769 | if (ret) | 2957 | if (ret) |
2770 | goto journal_error; | 2958 | goto journal_error; |
2771 | } | 2959 | } |
@@ -2781,7 +2969,7 @@ static int reiserfs_write_end(struct file *file, struct address_space *mapping, | |||
2781 | goto out; | 2969 | goto out; |
2782 | } | 2970 | } |
2783 | 2971 | ||
2784 | out: | 2972 | out: |
2785 | if (locked) | 2973 | if (locked) |
2786 | reiserfs_write_unlock(inode->i_sb); | 2974 | reiserfs_write_unlock(inode->i_sb); |
2787 | unlock_page(page); | 2975 | unlock_page(page); |
@@ -2792,7 +2980,7 @@ static int reiserfs_write_end(struct file *file, struct address_space *mapping, | |||
2792 | 2980 | ||
2793 | return ret == 0 ? copied : ret; | 2981 | return ret == 0 ? copied : ret; |
2794 | 2982 | ||
2795 | journal_error: | 2983 | journal_error: |
2796 | reiserfs_write_unlock(inode->i_sb); | 2984 | reiserfs_write_unlock(inode->i_sb); |
2797 | locked = false; | 2985 | locked = false; |
2798 | if (th) { | 2986 | if (th) { |
@@ -2822,15 +3010,18 @@ int reiserfs_commit_write(struct file *f, struct page *page, | |||
2822 | } | 3010 | } |
2823 | reiserfs_commit_page(inode, page, from, to); | 3011 | reiserfs_commit_page(inode, page, from, to); |
2824 | 3012 | ||
2825 | /* generic_commit_write does this for us, but does not update the | 3013 | /* |
2826 | ** transaction tracking stuff when the size changes. So, we have | 3014 | * generic_commit_write does this for us, but does not update the |
2827 | ** to do the i_size updates here. | 3015 | * transaction tracking stuff when the size changes. So, we have |
3016 | * to do the i_size updates here. | ||
2828 | */ | 3017 | */ |
2829 | if (pos > inode->i_size) { | 3018 | if (pos > inode->i_size) { |
2830 | struct reiserfs_transaction_handle myth; | 3019 | struct reiserfs_transaction_handle myth; |
2831 | /* If the file have grown beyond the border where it | 3020 | /* |
2832 | can have a tail, unmark it as needing a tail | 3021 | * If the file have grown beyond the border where it |
2833 | packing */ | 3022 | * can have a tail, unmark it as needing a tail |
3023 | * packing | ||
3024 | */ | ||
2834 | if ((have_large_tails(inode->i_sb) | 3025 | if ((have_large_tails(inode->i_sb) |
2835 | && inode->i_size > i_block_size(inode) * 4) | 3026 | && inode->i_size > i_block_size(inode) * 4) |
2836 | || (have_small_tails(inode->i_sb) | 3027 | || (have_small_tails(inode->i_sb) |
@@ -2845,13 +3036,13 @@ int reiserfs_commit_write(struct file *f, struct page *page, | |||
2845 | inode->i_size = pos; | 3036 | inode->i_size = pos; |
2846 | /* | 3037 | /* |
2847 | * this will just nest into our transaction. It's important | 3038 | * this will just nest into our transaction. It's important |
2848 | * to use mark_inode_dirty so the inode gets pushed around on the | 3039 | * to use mark_inode_dirty so the inode gets pushed around |
2849 | * dirty lists, and so that O_SYNC works as expected | 3040 | * on the dirty lists, and so that O_SYNC works as expected |
2850 | */ | 3041 | */ |
2851 | mark_inode_dirty(inode); | 3042 | mark_inode_dirty(inode); |
2852 | reiserfs_update_sd(&myth, inode); | 3043 | reiserfs_update_sd(&myth, inode); |
2853 | update_sd = 1; | 3044 | update_sd = 1; |
2854 | ret = journal_end(&myth, inode->i_sb, 1); | 3045 | ret = journal_end(&myth); |
2855 | if (ret) | 3046 | if (ret) |
2856 | goto journal_error; | 3047 | goto journal_error; |
2857 | } | 3048 | } |
@@ -2863,10 +3054,10 @@ int reiserfs_commit_write(struct file *f, struct page *page, | |||
2863 | goto out; | 3054 | goto out; |
2864 | } | 3055 | } |
2865 | 3056 | ||
2866 | out: | 3057 | out: |
2867 | return ret; | 3058 | return ret; |
2868 | 3059 | ||
2869 | journal_error: | 3060 | journal_error: |
2870 | if (th) { | 3061 | if (th) { |
2871 | if (!update_sd) | 3062 | if (!update_sd) |
2872 | reiserfs_update_sd(th, inode); | 3063 | reiserfs_update_sd(th, inode); |
@@ -2924,9 +3115,10 @@ void i_attrs_to_sd_attrs(struct inode *inode, __u16 * sd_attrs) | |||
2924 | } | 3115 | } |
2925 | } | 3116 | } |
2926 | 3117 | ||
2927 | /* decide if this buffer needs to stay around for data logging or ordered | 3118 | /* |
2928 | ** write purposes | 3119 | * decide if this buffer needs to stay around for data logging or ordered |
2929 | */ | 3120 | * write purposes |
3121 | */ | ||
2930 | static int invalidatepage_can_drop(struct inode *inode, struct buffer_head *bh) | 3122 | static int invalidatepage_can_drop(struct inode *inode, struct buffer_head *bh) |
2931 | { | 3123 | { |
2932 | int ret = 1; | 3124 | int ret = 1; |
@@ -2937,7 +3129,8 @@ static int invalidatepage_can_drop(struct inode *inode, struct buffer_head *bh) | |||
2937 | if (!buffer_mapped(bh)) { | 3129 | if (!buffer_mapped(bh)) { |
2938 | goto free_jh; | 3130 | goto free_jh; |
2939 | } | 3131 | } |
2940 | /* the page is locked, and the only places that log a data buffer | 3132 | /* |
3133 | * the page is locked, and the only places that log a data buffer | ||
2941 | * also lock the page. | 3134 | * also lock the page. |
2942 | */ | 3135 | */ |
2943 | if (reiserfs_file_data_log(inode)) { | 3136 | if (reiserfs_file_data_log(inode)) { |
@@ -2952,7 +3145,8 @@ static int invalidatepage_can_drop(struct inode *inode, struct buffer_head *bh) | |||
2952 | struct reiserfs_journal_list *jl; | 3145 | struct reiserfs_journal_list *jl; |
2953 | struct reiserfs_jh *jh = bh->b_private; | 3146 | struct reiserfs_jh *jh = bh->b_private; |
2954 | 3147 | ||
2955 | /* why is this safe? | 3148 | /* |
3149 | * why is this safe? | ||
2956 | * reiserfs_setattr updates i_size in the on disk | 3150 | * reiserfs_setattr updates i_size in the on disk |
2957 | * stat data before allowing vmtruncate to be called. | 3151 | * stat data before allowing vmtruncate to be called. |
2958 | * | 3152 | * |
@@ -2969,7 +3163,7 @@ static int invalidatepage_can_drop(struct inode *inode, struct buffer_head *bh) | |||
2969 | && jl != SB_JOURNAL(inode->i_sb)->j_current_jl) | 3163 | && jl != SB_JOURNAL(inode->i_sb)->j_current_jl) |
2970 | ret = 0; | 3164 | ret = 0; |
2971 | } | 3165 | } |
2972 | free_jh: | 3166 | free_jh: |
2973 | if (ret && bh->b_private) { | 3167 | if (ret && bh->b_private) { |
2974 | reiserfs_free_jh(bh); | 3168 | reiserfs_free_jh(bh); |
2975 | } | 3169 | } |
@@ -3028,7 +3222,7 @@ static void reiserfs_invalidatepage(struct page *page, unsigned int offset, | |||
3028 | ret = try_to_release_page(page, 0); | 3222 | ret = try_to_release_page(page, 0); |
3029 | /* maybe should BUG_ON(!ret); - neilb */ | 3223 | /* maybe should BUG_ON(!ret); - neilb */ |
3030 | } | 3224 | } |
3031 | out: | 3225 | out: |
3032 | return; | 3226 | return; |
3033 | } | 3227 | } |
3034 | 3228 | ||
@@ -3080,8 +3274,10 @@ static int reiserfs_releasepage(struct page *page, gfp_t unused_gfp_flags) | |||
3080 | return ret; | 3274 | return ret; |
3081 | } | 3275 | } |
3082 | 3276 | ||
3083 | /* We thank Mingming Cao for helping us understand in great detail what | 3277 | /* |
3084 | to do in this section of the code. */ | 3278 | * We thank Mingming Cao for helping us understand in great detail what |
3279 | * to do in this section of the code. | ||
3280 | */ | ||
3085 | static ssize_t reiserfs_direct_IO(int rw, struct kiocb *iocb, | 3281 | static ssize_t reiserfs_direct_IO(int rw, struct kiocb *iocb, |
3086 | const struct iovec *iov, loff_t offset, | 3282 | const struct iovec *iov, loff_t offset, |
3087 | unsigned long nr_segs) | 3283 | unsigned long nr_segs) |
@@ -3127,8 +3323,9 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr) | |||
3127 | dquot_initialize(inode); | 3323 | dquot_initialize(inode); |
3128 | reiserfs_write_lock(inode->i_sb); | 3324 | reiserfs_write_lock(inode->i_sb); |
3129 | if (attr->ia_valid & ATTR_SIZE) { | 3325 | if (attr->ia_valid & ATTR_SIZE) { |
3130 | /* version 2 items will be caught by the s_maxbytes check | 3326 | /* |
3131 | ** done for us in vmtruncate | 3327 | * version 2 items will be caught by the s_maxbytes check |
3328 | * done for us in vmtruncate | ||
3132 | */ | 3329 | */ |
3133 | if (get_inode_item_key_version(inode) == KEY_FORMAT_3_5 && | 3330 | if (get_inode_item_key_version(inode) == KEY_FORMAT_3_5 && |
3134 | attr->ia_size > MAX_NON_LFS) { | 3331 | attr->ia_size > MAX_NON_LFS) { |
@@ -3149,7 +3346,7 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr) | |||
3149 | err = journal_begin(&th, inode->i_sb, 4); | 3346 | err = journal_begin(&th, inode->i_sb, 4); |
3150 | if (!err) { | 3347 | if (!err) { |
3151 | reiserfs_discard_prealloc(&th, inode); | 3348 | reiserfs_discard_prealloc(&th, inode); |
3152 | err = journal_end(&th, inode->i_sb, 4); | 3349 | err = journal_end(&th); |
3153 | } | 3350 | } |
3154 | if (err) | 3351 | if (err) |
3155 | error = err; | 3352 | error = err; |
@@ -3189,7 +3386,10 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr) | |||
3189 | if (error) | 3386 | if (error) |
3190 | return error; | 3387 | return error; |
3191 | 3388 | ||
3192 | /* (user+group)*(old+new) structure - we count quota info and , inode write (sb, inode) */ | 3389 | /* |
3390 | * (user+group)*(old+new) structure - we count quota | ||
3391 | * info and , inode write (sb, inode) | ||
3392 | */ | ||
3193 | reiserfs_write_lock(inode->i_sb); | 3393 | reiserfs_write_lock(inode->i_sb); |
3194 | error = journal_begin(&th, inode->i_sb, jbegin_count); | 3394 | error = journal_begin(&th, inode->i_sb, jbegin_count); |
3195 | reiserfs_write_unlock(inode->i_sb); | 3395 | reiserfs_write_unlock(inode->i_sb); |
@@ -3198,19 +3398,21 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr) | |||
3198 | error = dquot_transfer(inode, attr); | 3398 | error = dquot_transfer(inode, attr); |
3199 | reiserfs_write_lock(inode->i_sb); | 3399 | reiserfs_write_lock(inode->i_sb); |
3200 | if (error) { | 3400 | if (error) { |
3201 | journal_end(&th, inode->i_sb, jbegin_count); | 3401 | journal_end(&th); |
3202 | reiserfs_write_unlock(inode->i_sb); | 3402 | reiserfs_write_unlock(inode->i_sb); |
3203 | goto out; | 3403 | goto out; |
3204 | } | 3404 | } |
3205 | 3405 | ||
3206 | /* Update corresponding info in inode so that everything is in | 3406 | /* |
3207 | * one transaction */ | 3407 | * Update corresponding info in inode so that everything |
3408 | * is in one transaction | ||
3409 | */ | ||
3208 | if (attr->ia_valid & ATTR_UID) | 3410 | if (attr->ia_valid & ATTR_UID) |
3209 | inode->i_uid = attr->ia_uid; | 3411 | inode->i_uid = attr->ia_uid; |
3210 | if (attr->ia_valid & ATTR_GID) | 3412 | if (attr->ia_valid & ATTR_GID) |
3211 | inode->i_gid = attr->ia_gid; | 3413 | inode->i_gid = attr->ia_gid; |
3212 | mark_inode_dirty(inode); | 3414 | mark_inode_dirty(inode); |
3213 | error = journal_end(&th, inode->i_sb, jbegin_count); | 3415 | error = journal_end(&th); |
3214 | reiserfs_write_unlock(inode->i_sb); | 3416 | reiserfs_write_unlock(inode->i_sb); |
3215 | if (error) | 3417 | if (error) |
3216 | goto out; | 3418 | goto out; |
@@ -3220,8 +3422,14 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr) | |||
3220 | attr->ia_size != i_size_read(inode)) { | 3422 | attr->ia_size != i_size_read(inode)) { |
3221 | error = inode_newsize_ok(inode, attr->ia_size); | 3423 | error = inode_newsize_ok(inode, attr->ia_size); |
3222 | if (!error) { | 3424 | if (!error) { |
3425 | /* | ||
3426 | * Could race against reiserfs_file_release | ||
3427 | * if called from NFS, so take tailpack mutex. | ||
3428 | */ | ||
3429 | mutex_lock(&REISERFS_I(inode)->tailpack); | ||
3223 | truncate_setsize(inode, attr->ia_size); | 3430 | truncate_setsize(inode, attr->ia_size); |
3224 | reiserfs_vfs_truncate_file(inode); | 3431 | reiserfs_truncate_file(inode, 1); |
3432 | mutex_unlock(&REISERFS_I(inode)->tailpack); | ||
3225 | } | 3433 | } |
3226 | } | 3434 | } |
3227 | 3435 | ||