diff options
Diffstat (limited to 'fs/jffs2/nodelist.c')
-rw-r--r-- | fs/jffs2/nodelist.c | 170 |
1 files changed, 85 insertions, 85 deletions
diff --git a/fs/jffs2/nodelist.c b/fs/jffs2/nodelist.c index 80fe8feffb4d..c79eebb8ab32 100644 --- a/fs/jffs2/nodelist.c +++ b/fs/jffs2/nodelist.c | |||
@@ -7,7 +7,7 @@ | |||
7 | * | 7 | * |
8 | * For licensing information, see the file 'LICENCE' in this directory. | 8 | * For licensing information, see the file 'LICENCE' in this directory. |
9 | * | 9 | * |
10 | * $Id: nodelist.c,v 1.114 2005/09/21 13:28:35 dedekind Exp $ | 10 | * $Id: nodelist.c,v 1.115 2005/11/07 11:14:40 gleixner Exp $ |
11 | * | 11 | * |
12 | */ | 12 | */ |
13 | 13 | ||
@@ -24,7 +24,7 @@ | |||
24 | void jffs2_add_fd_to_list(struct jffs2_sb_info *c, struct jffs2_full_dirent *new, struct jffs2_full_dirent **list) | 24 | void jffs2_add_fd_to_list(struct jffs2_sb_info *c, struct jffs2_full_dirent *new, struct jffs2_full_dirent **list) |
25 | { | 25 | { |
26 | struct jffs2_full_dirent **prev = list; | 26 | struct jffs2_full_dirent **prev = list; |
27 | 27 | ||
28 | dbg_dentlist("add dirent \"%s\", ino #%u\n", new->name, new->ino); | 28 | dbg_dentlist("add dirent \"%s\", ino #%u\n", new->name, new->ino); |
29 | 29 | ||
30 | while ((*prev) && (*prev)->nhash <= new->nhash) { | 30 | while ((*prev) && (*prev)->nhash <= new->nhash) { |
@@ -75,14 +75,14 @@ void jffs2_truncate_fragtree(struct jffs2_sb_info *c, struct rb_root *list, uint | |||
75 | if (size == 0) | 75 | if (size == 0) |
76 | return; | 76 | return; |
77 | 77 | ||
78 | /* | 78 | /* |
79 | * If the last fragment starts at the RAM page boundary, it is | 79 | * If the last fragment starts at the RAM page boundary, it is |
80 | * REF_PRISTINE irrespective of its size. | 80 | * REF_PRISTINE irrespective of its size. |
81 | */ | 81 | */ |
82 | frag = frag_last(list); | 82 | frag = frag_last(list); |
83 | if (frag->node && (frag->ofs & (PAGE_CACHE_SIZE - 1)) == 0) { | 83 | if (frag->node && (frag->ofs & (PAGE_CACHE_SIZE - 1)) == 0) { |
84 | dbg_fragtree2("marking the last fragment 0x%08x-0x%08x REF_PRISTINE.\n", | 84 | dbg_fragtree2("marking the last fragment 0x%08x-0x%08x REF_PRISTINE.\n", |
85 | frag->ofs, frag->ofs + frag->size); | 85 | frag->ofs, frag->ofs + frag->size); |
86 | frag->node->raw->flash_offset = ref_offset(frag->node->raw) | REF_PRISTINE; | 86 | frag->node->raw->flash_offset = ref_offset(frag->node->raw) | REF_PRISTINE; |
87 | } | 87 | } |
88 | } | 88 | } |
@@ -102,7 +102,7 @@ void jffs2_obsolete_node_frag(struct jffs2_sb_info *c, struct jffs2_node_frag *t | |||
102 | ref_offset(this->node->raw), this->node->ofs, this->node->ofs+this->node->size, this->node->frags); | 102 | ref_offset(this->node->raw), this->node->ofs, this->node->ofs+this->node->size, this->node->frags); |
103 | mark_ref_normal(this->node->raw); | 103 | mark_ref_normal(this->node->raw); |
104 | } | 104 | } |
105 | 105 | ||
106 | } | 106 | } |
107 | jffs2_free_node_frag(this); | 107 | jffs2_free_node_frag(this); |
108 | } | 108 | } |
@@ -117,7 +117,7 @@ static void jffs2_fragtree_insert(struct jffs2_node_frag *newfrag, struct jffs2_ | |||
117 | while (*link) { | 117 | while (*link) { |
118 | parent = *link; | 118 | parent = *link; |
119 | base = rb_entry(parent, struct jffs2_node_frag, rb); | 119 | base = rb_entry(parent, struct jffs2_node_frag, rb); |
120 | 120 | ||
121 | if (newfrag->ofs > base->ofs) | 121 | if (newfrag->ofs > base->ofs) |
122 | link = &base->rb.rb_right; | 122 | link = &base->rb.rb_right; |
123 | else if (newfrag->ofs < base->ofs) | 123 | else if (newfrag->ofs < base->ofs) |
@@ -137,7 +137,7 @@ static void jffs2_fragtree_insert(struct jffs2_node_frag *newfrag, struct jffs2_ | |||
137 | static inline struct jffs2_node_frag * new_fragment(struct jffs2_full_dnode *fn, uint32_t ofs, uint32_t size) | 137 | static inline struct jffs2_node_frag * new_fragment(struct jffs2_full_dnode *fn, uint32_t ofs, uint32_t size) |
138 | { | 138 | { |
139 | struct jffs2_node_frag *newfrag; | 139 | struct jffs2_node_frag *newfrag; |
140 | 140 | ||
141 | newfrag = jffs2_alloc_node_frag(); | 141 | newfrag = jffs2_alloc_node_frag(); |
142 | if (likely(newfrag)) { | 142 | if (likely(newfrag)) { |
143 | newfrag->ofs = ofs; | 143 | newfrag->ofs = ofs; |
@@ -169,7 +169,7 @@ static int no_overlapping_node(struct jffs2_sb_info *c, struct rb_root *root, | |||
169 | } | 169 | } |
170 | 170 | ||
171 | if (this) { | 171 | if (this) { |
172 | /* By definition, the 'this' node has no right-hand child, | 172 | /* By definition, the 'this' node has no right-hand child, |
173 | because there are no frags with offset greater than it. | 173 | because there are no frags with offset greater than it. |
174 | So that's where we want to put the hole */ | 174 | So that's where we want to put the hole */ |
175 | dbg_fragtree2("add hole frag %#04x-%#04x on the right of the new frag.\n", | 175 | dbg_fragtree2("add hole frag %#04x-%#04x on the right of the new frag.\n", |
@@ -183,13 +183,13 @@ static int no_overlapping_node(struct jffs2_sb_info *c, struct rb_root *root, | |||
183 | rb_insert_color(&holefrag->rb, root); | 183 | rb_insert_color(&holefrag->rb, root); |
184 | this = holefrag; | 184 | this = holefrag; |
185 | } | 185 | } |
186 | 186 | ||
187 | if (this) { | 187 | if (this) { |
188 | /* By definition, the 'this' node has no right-hand child, | 188 | /* By definition, the 'this' node has no right-hand child, |
189 | because there are no frags with offset greater than it. | 189 | because there are no frags with offset greater than it. |
190 | So that's where we want to put new fragment */ | 190 | So that's where we want to put new fragment */ |
191 | dbg_fragtree2("add the new node at the right\n"); | 191 | dbg_fragtree2("add the new node at the right\n"); |
192 | rb_link_node(&newfrag->rb, &this->rb, &this->rb.rb_right); | 192 | rb_link_node(&newfrag->rb, &this->rb, &this->rb.rb_right); |
193 | } else { | 193 | } else { |
194 | dbg_fragtree2("insert the new node at the root of the tree\n"); | 194 | dbg_fragtree2("insert the new node at the root of the tree\n"); |
195 | rb_link_node(&newfrag->rb, NULL, &root->rb_node); | 195 | rb_link_node(&newfrag->rb, NULL, &root->rb_node); |
@@ -216,7 +216,7 @@ static int jffs2_add_frag_to_fragtree(struct jffs2_sb_info *c, struct rb_root *r | |||
216 | dbg_fragtree2("lookup gave no frag\n"); | 216 | dbg_fragtree2("lookup gave no frag\n"); |
217 | lastend = 0; | 217 | lastend = 0; |
218 | } | 218 | } |
219 | 219 | ||
220 | /* See if we ran off the end of the fragtree */ | 220 | /* See if we ran off the end of the fragtree */ |
221 | if (lastend <= newfrag->ofs) { | 221 | if (lastend <= newfrag->ofs) { |
222 | /* We did */ | 222 | /* We did */ |
@@ -243,7 +243,7 @@ static int jffs2_add_frag_to_fragtree(struct jffs2_sb_info *c, struct rb_root *r | |||
243 | this->ofs, this->ofs + this->size); | 243 | this->ofs, this->ofs + this->size); |
244 | 244 | ||
245 | /* OK. 'this' is pointing at the first frag that newfrag->ofs at least partially obsoletes, | 245 | /* OK. 'this' is pointing at the first frag that newfrag->ofs at least partially obsoletes, |
246 | * - i.e. newfrag->ofs < this->ofs+this->size && newfrag->ofs >= this->ofs | 246 | * - i.e. newfrag->ofs < this->ofs+this->size && newfrag->ofs >= this->ofs |
247 | */ | 247 | */ |
248 | if (newfrag->ofs > this->ofs) { | 248 | if (newfrag->ofs > this->ofs) { |
249 | /* This node isn't completely obsoleted. The start of it remains valid */ | 249 | /* This node isn't completely obsoleted. The start of it remains valid */ |
@@ -261,10 +261,10 @@ static int jffs2_add_frag_to_fragtree(struct jffs2_sb_info *c, struct rb_root *r | |||
261 | if (this->node) | 261 | if (this->node) |
262 | dbg_fragtree2("split old frag 0x%04x-0x%04x, phys 0x%08x\n", | 262 | dbg_fragtree2("split old frag 0x%04x-0x%04x, phys 0x%08x\n", |
263 | this->ofs, this->ofs+this->size, ref_offset(this->node->raw)); | 263 | this->ofs, this->ofs+this->size, ref_offset(this->node->raw)); |
264 | else | 264 | else |
265 | dbg_fragtree2("split old hole frag 0x%04x-0x%04x\n", | 265 | dbg_fragtree2("split old hole frag 0x%04x-0x%04x\n", |
266 | this->ofs, this->ofs+this->size); | 266 | this->ofs, this->ofs+this->size); |
267 | 267 | ||
268 | /* New second frag pointing to this's node */ | 268 | /* New second frag pointing to this's node */ |
269 | newfrag2 = new_fragment(this->node, newfrag->ofs + newfrag->size, | 269 | newfrag2 = new_fragment(this->node, newfrag->ofs + newfrag->size, |
270 | this->ofs + this->size - newfrag->ofs - newfrag->size); | 270 | this->ofs + this->size - newfrag->ofs - newfrag->size); |
@@ -284,10 +284,10 @@ static int jffs2_add_frag_to_fragtree(struct jffs2_sb_info *c, struct rb_root *r | |||
284 | from newfrag to insert newfrag2. */ | 284 | from newfrag to insert newfrag2. */ |
285 | jffs2_fragtree_insert(newfrag, this); | 285 | jffs2_fragtree_insert(newfrag, this); |
286 | rb_insert_color(&newfrag->rb, root); | 286 | rb_insert_color(&newfrag->rb, root); |
287 | 287 | ||
288 | jffs2_fragtree_insert(newfrag2, newfrag); | 288 | jffs2_fragtree_insert(newfrag2, newfrag); |
289 | rb_insert_color(&newfrag2->rb, root); | 289 | rb_insert_color(&newfrag2->rb, root); |
290 | 290 | ||
291 | return 0; | 291 | return 0; |
292 | } | 292 | } |
293 | /* New node just reduces 'this' frag in size, doesn't split it */ | 293 | /* New node just reduces 'this' frag in size, doesn't split it */ |
@@ -297,13 +297,13 @@ static int jffs2_add_frag_to_fragtree(struct jffs2_sb_info *c, struct rb_root *r | |||
297 | jffs2_fragtree_insert(newfrag, this); | 297 | jffs2_fragtree_insert(newfrag, this); |
298 | rb_insert_color(&newfrag->rb, root); | 298 | rb_insert_color(&newfrag->rb, root); |
299 | } else { | 299 | } else { |
300 | /* New frag starts at the same point as 'this' used to. Replace | 300 | /* New frag starts at the same point as 'this' used to. Replace |
301 | it in the tree without doing a delete and insertion */ | 301 | it in the tree without doing a delete and insertion */ |
302 | dbg_fragtree2("inserting newfrag (*%p),%d-%d in before 'this' (*%p),%d-%d\n", | 302 | dbg_fragtree2("inserting newfrag (*%p),%d-%d in before 'this' (*%p),%d-%d\n", |
303 | newfrag, newfrag->ofs, newfrag->ofs+newfrag->size, this, this->ofs, this->ofs+this->size); | 303 | newfrag, newfrag->ofs, newfrag->ofs+newfrag->size, this, this->ofs, this->ofs+this->size); |
304 | 304 | ||
305 | rb_replace_node(&this->rb, &newfrag->rb, root); | 305 | rb_replace_node(&this->rb, &newfrag->rb, root); |
306 | 306 | ||
307 | if (newfrag->ofs + newfrag->size >= this->ofs+this->size) { | 307 | if (newfrag->ofs + newfrag->size >= this->ofs+this->size) { |
308 | dbg_fragtree2("obsoleting node frag %p (%x-%x)\n", this, this->ofs, this->ofs+this->size); | 308 | dbg_fragtree2("obsoleting node frag %p (%x-%x)\n", this, this->ofs, this->ofs+this->size); |
309 | jffs2_obsolete_node_frag(c, this); | 309 | jffs2_obsolete_node_frag(c, this); |
@@ -317,7 +317,7 @@ static int jffs2_add_frag_to_fragtree(struct jffs2_sb_info *c, struct rb_root *r | |||
317 | } | 317 | } |
318 | } | 318 | } |
319 | /* OK, now we have newfrag added in the correct place in the tree, but | 319 | /* OK, now we have newfrag added in the correct place in the tree, but |
320 | frag_next(newfrag) may be a fragment which is overlapped by it | 320 | frag_next(newfrag) may be a fragment which is overlapped by it |
321 | */ | 321 | */ |
322 | while ((this = frag_next(newfrag)) && newfrag->ofs + newfrag->size >= this->ofs + this->size) { | 322 | while ((this = frag_next(newfrag)) && newfrag->ofs + newfrag->size >= this->ofs + this->size) { |
323 | /* 'this' frag is obsoleted completely. */ | 323 | /* 'this' frag is obsoleted completely. */ |
@@ -326,7 +326,7 @@ static int jffs2_add_frag_to_fragtree(struct jffs2_sb_info *c, struct rb_root *r | |||
326 | rb_erase(&this->rb, root); | 326 | rb_erase(&this->rb, root); |
327 | jffs2_obsolete_node_frag(c, this); | 327 | jffs2_obsolete_node_frag(c, this); |
328 | } | 328 | } |
329 | /* Now we're pointing at the first frag which isn't totally obsoleted by | 329 | /* Now we're pointing at the first frag which isn't totally obsoleted by |
330 | the new frag */ | 330 | the new frag */ |
331 | 331 | ||
332 | if (!this || newfrag->ofs + newfrag->size == this->ofs) | 332 | if (!this || newfrag->ofs + newfrag->size == this->ofs) |
@@ -344,7 +344,7 @@ static int jffs2_add_frag_to_fragtree(struct jffs2_sb_info *c, struct rb_root *r | |||
344 | return 0; | 344 | return 0; |
345 | } | 345 | } |
346 | 346 | ||
347 | /* | 347 | /* |
348 | * Given an inode, probably with existing tree of fragments, add the new node | 348 | * Given an inode, probably with existing tree of fragments, add the new node |
349 | * to the fragment tree. | 349 | * to the fragment tree. |
350 | */ | 350 | */ |
@@ -363,7 +363,7 @@ int jffs2_add_full_dnode_to_inode(struct jffs2_sb_info *c, struct jffs2_inode_in | |||
363 | 363 | ||
364 | dbg_fragtree("adding node %#04x-%#04x @0x%08x on flash, newfrag *%p\n", | 364 | dbg_fragtree("adding node %#04x-%#04x @0x%08x on flash, newfrag *%p\n", |
365 | fn->ofs, fn->ofs+fn->size, ref_offset(fn->raw), newfrag); | 365 | fn->ofs, fn->ofs+fn->size, ref_offset(fn->raw), newfrag); |
366 | 366 | ||
367 | ret = jffs2_add_frag_to_fragtree(c, &f->fragtree, newfrag); | 367 | ret = jffs2_add_frag_to_fragtree(c, &f->fragtree, newfrag); |
368 | if (unlikely(ret)) | 368 | if (unlikely(ret)) |
369 | return ret; | 369 | return ret; |
@@ -374,14 +374,14 @@ int jffs2_add_full_dnode_to_inode(struct jffs2_sb_info *c, struct jffs2_inode_in | |||
374 | struct jffs2_node_frag *prev = frag_prev(newfrag); | 374 | struct jffs2_node_frag *prev = frag_prev(newfrag); |
375 | 375 | ||
376 | mark_ref_normal(fn->raw); | 376 | mark_ref_normal(fn->raw); |
377 | /* If we don't start at zero there's _always_ a previous */ | 377 | /* If we don't start at zero there's _always_ a previous */ |
378 | if (prev->node) | 378 | if (prev->node) |
379 | mark_ref_normal(prev->node->raw); | 379 | mark_ref_normal(prev->node->raw); |
380 | } | 380 | } |
381 | 381 | ||
382 | if ((newfrag->ofs+newfrag->size) & (PAGE_CACHE_SIZE-1)) { | 382 | if ((newfrag->ofs+newfrag->size) & (PAGE_CACHE_SIZE-1)) { |
383 | struct jffs2_node_frag *next = frag_next(newfrag); | 383 | struct jffs2_node_frag *next = frag_next(newfrag); |
384 | 384 | ||
385 | if (next) { | 385 | if (next) { |
386 | mark_ref_normal(fn->raw); | 386 | mark_ref_normal(fn->raw); |
387 | if (next->node) | 387 | if (next->node) |
@@ -412,7 +412,7 @@ static int check_node_data(struct jffs2_sb_info *c, struct jffs2_tmp_dnode_info | |||
412 | 412 | ||
413 | if (!jffs2_is_writebuffered(c)) | 413 | if (!jffs2_is_writebuffered(c)) |
414 | goto adj_acc; | 414 | goto adj_acc; |
415 | 415 | ||
416 | /* Calculate how many bytes were already checked */ | 416 | /* Calculate how many bytes were already checked */ |
417 | ofs = ref_offset(ref) + sizeof(struct jffs2_raw_inode); | 417 | ofs = ref_offset(ref) + sizeof(struct jffs2_raw_inode); |
418 | len = ofs % c->wbuf_pagesize; | 418 | len = ofs % c->wbuf_pagesize; |
@@ -424,13 +424,13 @@ static int check_node_data(struct jffs2_sb_info *c, struct jffs2_tmp_dnode_info | |||
424 | ref_offset(ref), tn->csize, ofs); | 424 | ref_offset(ref), tn->csize, ofs); |
425 | goto adj_acc; | 425 | goto adj_acc; |
426 | } | 426 | } |
427 | 427 | ||
428 | ofs += len; | 428 | ofs += len; |
429 | len = tn->csize - len; | 429 | len = tn->csize - len; |
430 | 430 | ||
431 | dbg_readinode("check node at %#08x, data length %u, partial CRC %#08x, correct CRC %#08x, data starts at %#08x, start checking from %#08x - %u bytes.\n", | 431 | dbg_readinode("check node at %#08x, data length %u, partial CRC %#08x, correct CRC %#08x, data starts at %#08x, start checking from %#08x - %u bytes.\n", |
432 | ref_offset(ref), tn->csize, tn->partial_crc, tn->data_crc, ofs - len, ofs, len); | 432 | ref_offset(ref), tn->csize, tn->partial_crc, tn->data_crc, ofs - len, ofs, len); |
433 | 433 | ||
434 | #ifndef __ECOS | 434 | #ifndef __ECOS |
435 | /* TODO: instead, incapsulate point() stuff to jffs2_flash_read(), | 435 | /* TODO: instead, incapsulate point() stuff to jffs2_flash_read(), |
436 | * adding and jffs2_flash_read_end() interface. */ | 436 | * adding and jffs2_flash_read_end() interface. */ |
@@ -445,12 +445,12 @@ static int check_node_data(struct jffs2_sb_info *c, struct jffs2_tmp_dnode_info | |||
445 | pointed = 1; /* succefully pointed to device */ | 445 | pointed = 1; /* succefully pointed to device */ |
446 | } | 446 | } |
447 | #endif | 447 | #endif |
448 | 448 | ||
449 | if (!pointed) { | 449 | if (!pointed) { |
450 | buffer = kmalloc(len, GFP_KERNEL); | 450 | buffer = kmalloc(len, GFP_KERNEL); |
451 | if (unlikely(!buffer)) | 451 | if (unlikely(!buffer)) |
452 | return -ENOMEM; | 452 | return -ENOMEM; |
453 | 453 | ||
454 | /* TODO: this is very frequent pattern, make it a separate | 454 | /* TODO: this is very frequent pattern, make it a separate |
455 | * routine */ | 455 | * routine */ |
456 | err = jffs2_flash_read(c, ofs, len, &retlen, buffer); | 456 | err = jffs2_flash_read(c, ofs, len, &retlen, buffer); |
@@ -458,7 +458,7 @@ static int check_node_data(struct jffs2_sb_info *c, struct jffs2_tmp_dnode_info | |||
458 | JFFS2_ERROR("can not read %d bytes from 0x%08x, error code: %d.\n", len, ofs, err); | 458 | JFFS2_ERROR("can not read %d bytes from 0x%08x, error code: %d.\n", len, ofs, err); |
459 | goto free_out; | 459 | goto free_out; |
460 | } | 460 | } |
461 | 461 | ||
462 | if (retlen != len) { | 462 | if (retlen != len) { |
463 | JFFS2_ERROR("short read at %#08x: %d instead of %d.\n", ofs, retlen, len); | 463 | JFFS2_ERROR("short read at %#08x: %d instead of %d.\n", ofs, retlen, len); |
464 | err = -EIO; | 464 | err = -EIO; |
@@ -485,7 +485,7 @@ adj_acc: | |||
485 | jeb = &c->blocks[ref->flash_offset / c->sector_size]; | 485 | jeb = &c->blocks[ref->flash_offset / c->sector_size]; |
486 | len = ref_totlen(c, jeb, ref); | 486 | len = ref_totlen(c, jeb, ref); |
487 | 487 | ||
488 | /* | 488 | /* |
489 | * Mark the node as having been checked and fix the | 489 | * Mark the node as having been checked and fix the |
490 | * accounting accordingly. | 490 | * accounting accordingly. |
491 | */ | 491 | */ |
@@ -516,13 +516,13 @@ free_out: | |||
516 | static inline int check_node(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_tmp_dnode_info *tn) | 516 | static inline int check_node(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_tmp_dnode_info *tn) |
517 | { | 517 | { |
518 | int ret; | 518 | int ret; |
519 | 519 | ||
520 | BUG_ON(ref_obsolete(tn->fn->raw)); | 520 | BUG_ON(ref_obsolete(tn->fn->raw)); |
521 | 521 | ||
522 | /* We only check the data CRC of unchecked nodes */ | 522 | /* We only check the data CRC of unchecked nodes */ |
523 | if (ref_flags(tn->fn->raw) != REF_UNCHECKED) | 523 | if (ref_flags(tn->fn->raw) != REF_UNCHECKED) |
524 | return 0; | 524 | return 0; |
525 | 525 | ||
526 | dbg_fragtree2("check node %#04x-%#04x, phys offs %#08x.\n", | 526 | dbg_fragtree2("check node %#04x-%#04x, phys offs %#08x.\n", |
527 | tn->fn->ofs, tn->fn->ofs + tn->fn->size, ref_offset(tn->fn->raw)); | 527 | tn->fn->ofs, tn->fn->ofs + tn->fn->size, ref_offset(tn->fn->raw)); |
528 | 528 | ||
@@ -538,7 +538,7 @@ static inline int check_node(struct jffs2_sb_info *c, struct jffs2_inode_info *f | |||
538 | return ret; | 538 | return ret; |
539 | } | 539 | } |
540 | 540 | ||
541 | /* | 541 | /* |
542 | * Helper function for jffs2_add_older_frag_to_fragtree(). | 542 | * Helper function for jffs2_add_older_frag_to_fragtree(). |
543 | * | 543 | * |
544 | * Called when the new fragment that is being inserted | 544 | * Called when the new fragment that is being inserted |
@@ -551,31 +551,31 @@ static int split_hole(struct jffs2_sb_info *c, struct rb_root *root, | |||
551 | newfrag->ofs, newfrag->ofs + newfrag->size, hole->ofs, hole->ofs + hole->size); | 551 | newfrag->ofs, newfrag->ofs + newfrag->size, hole->ofs, hole->ofs + hole->size); |
552 | 552 | ||
553 | if (hole->ofs == newfrag->ofs) { | 553 | if (hole->ofs == newfrag->ofs) { |
554 | /* | 554 | /* |
555 | * Well, the new fragment actually starts at the same offset as | 555 | * Well, the new fragment actually starts at the same offset as |
556 | * the hole. | 556 | * the hole. |
557 | */ | 557 | */ |
558 | if (hole->ofs + hole->size > newfrag->ofs + newfrag->size) { | 558 | if (hole->ofs + hole->size > newfrag->ofs + newfrag->size) { |
559 | /* | 559 | /* |
560 | * We replace the overlapped left part of the hole by | 560 | * We replace the overlapped left part of the hole by |
561 | * the new node. | 561 | * the new node. |
562 | */ | 562 | */ |
563 | 563 | ||
564 | dbg_fragtree2("insert fragment %#04x-%#04x and cut the left part of the hole\n", | 564 | dbg_fragtree2("insert fragment %#04x-%#04x and cut the left part of the hole\n", |
565 | newfrag->ofs, newfrag->ofs + newfrag->size); | 565 | newfrag->ofs, newfrag->ofs + newfrag->size); |
566 | rb_replace_node(&hole->rb, &newfrag->rb, root); | 566 | rb_replace_node(&hole->rb, &newfrag->rb, root); |
567 | 567 | ||
568 | hole->ofs += newfrag->size; | 568 | hole->ofs += newfrag->size; |
569 | hole->size -= newfrag->size; | 569 | hole->size -= newfrag->size; |
570 | 570 | ||
571 | /* | 571 | /* |
572 | * We know that 'hole' should be the right hand | 572 | * We know that 'hole' should be the right hand |
573 | * fragment. | 573 | * fragment. |
574 | */ | 574 | */ |
575 | jffs2_fragtree_insert(hole, newfrag); | 575 | jffs2_fragtree_insert(hole, newfrag); |
576 | rb_insert_color(&hole->rb, root); | 576 | rb_insert_color(&hole->rb, root); |
577 | } else { | 577 | } else { |
578 | /* | 578 | /* |
579 | * Ah, the new fragment is of the same size as the hole. | 579 | * Ah, the new fragment is of the same size as the hole. |
580 | * Relace the hole by it. | 580 | * Relace the hole by it. |
581 | */ | 581 | */ |
@@ -586,7 +586,7 @@ static int split_hole(struct jffs2_sb_info *c, struct rb_root *root, | |||
586 | } | 586 | } |
587 | } else { | 587 | } else { |
588 | /* The new fragment lefts some hole space at the left */ | 588 | /* The new fragment lefts some hole space at the left */ |
589 | 589 | ||
590 | struct jffs2_node_frag * newfrag2 = NULL; | 590 | struct jffs2_node_frag * newfrag2 = NULL; |
591 | 591 | ||
592 | if (hole->ofs + hole->size > newfrag->ofs + newfrag->size) { | 592 | if (hole->ofs + hole->size > newfrag->ofs + newfrag->size) { |
@@ -606,7 +606,7 @@ static int split_hole(struct jffs2_sb_info *c, struct rb_root *root, | |||
606 | 606 | ||
607 | jffs2_fragtree_insert(newfrag, hole); | 607 | jffs2_fragtree_insert(newfrag, hole); |
608 | rb_insert_color(&newfrag->rb, root); | 608 | rb_insert_color(&newfrag->rb, root); |
609 | 609 | ||
610 | if (newfrag2) { | 610 | if (newfrag2) { |
611 | dbg_fragtree2("left the hole %#04x-%#04x at the right\n", | 611 | dbg_fragtree2("left the hole %#04x-%#04x at the right\n", |
612 | newfrag2->ofs, newfrag2->ofs + newfrag2->size); | 612 | newfrag2->ofs, newfrag2->ofs + newfrag2->size); |
@@ -654,18 +654,18 @@ int jffs2_add_older_frag_to_fragtree(struct jffs2_sb_info *c, struct jffs2_inode | |||
654 | lastend = this->ofs + this->size; | 654 | lastend = this->ofs + this->size; |
655 | else | 655 | else |
656 | lastend = 0; | 656 | lastend = 0; |
657 | 657 | ||
658 | /* Detect the preliminary type of node */ | 658 | /* Detect the preliminary type of node */ |
659 | if (fn->size >= PAGE_CACHE_SIZE) | 659 | if (fn->size >= PAGE_CACHE_SIZE) |
660 | ref_flag = REF_PRISTINE; | 660 | ref_flag = REF_PRISTINE; |
661 | else | 661 | else |
662 | ref_flag = REF_NORMAL; | 662 | ref_flag = REF_NORMAL; |
663 | 663 | ||
664 | /* See if we ran off the end of the root */ | 664 | /* See if we ran off the end of the root */ |
665 | if (lastend <= fn_ofs) { | 665 | if (lastend <= fn_ofs) { |
666 | /* We did */ | 666 | /* We did */ |
667 | 667 | ||
668 | /* | 668 | /* |
669 | * We are going to insert the new node into the | 669 | * We are going to insert the new node into the |
670 | * fragment tree, so check it. | 670 | * fragment tree, so check it. |
671 | */ | 671 | */ |
@@ -691,21 +691,21 @@ int jffs2_add_older_frag_to_fragtree(struct jffs2_sb_info *c, struct jffs2_inode | |||
691 | fn->frags = 0; | 691 | fn->frags = 0; |
692 | 692 | ||
693 | while (1) { | 693 | while (1) { |
694 | /* | 694 | /* |
695 | * Here we have: | 695 | * Here we have: |
696 | * fn_ofs < this->ofs + this->size && fn_ofs >= this->ofs. | 696 | * fn_ofs < this->ofs + this->size && fn_ofs >= this->ofs. |
697 | * | 697 | * |
698 | * Remember, 'this' has higher version, any non-hole node | 698 | * Remember, 'this' has higher version, any non-hole node |
699 | * which is already in the fragtree is newer then the newly | 699 | * which is already in the fragtree is newer then the newly |
700 | * inserted. | 700 | * inserted. |
701 | */ | 701 | */ |
702 | if (!this->node) { | 702 | if (!this->node) { |
703 | /* | 703 | /* |
704 | * 'this' is the hole fragment, so at least the | 704 | * 'this' is the hole fragment, so at least the |
705 | * beginning of the new fragment is valid. | 705 | * beginning of the new fragment is valid. |
706 | */ | 706 | */ |
707 | 707 | ||
708 | /* | 708 | /* |
709 | * We are going to insert the new node into the | 709 | * We are going to insert the new node into the |
710 | * fragment tree, so check it. | 710 | * fragment tree, so check it. |
711 | */ | 711 | */ |
@@ -715,7 +715,7 @@ int jffs2_add_older_frag_to_fragtree(struct jffs2_sb_info *c, struct jffs2_inode | |||
715 | return err; | 715 | return err; |
716 | checked = 1; | 716 | checked = 1; |
717 | } | 717 | } |
718 | 718 | ||
719 | if (this->ofs + this->size >= fn_ofs + fn_size) { | 719 | if (this->ofs + this->size >= fn_ofs + fn_size) { |
720 | /* We split the hole on two parts */ | 720 | /* We split the hole on two parts */ |
721 | 721 | ||
@@ -730,7 +730,7 @@ int jffs2_add_older_frag_to_fragtree(struct jffs2_sb_info *c, struct jffs2_inode | |||
730 | goto out_ok; | 730 | goto out_ok; |
731 | } | 731 | } |
732 | 732 | ||
733 | /* | 733 | /* |
734 | * The beginning of the new fragment is valid since it | 734 | * The beginning of the new fragment is valid since it |
735 | * overlaps the hole node. | 735 | * overlaps the hole node. |
736 | */ | 736 | */ |
@@ -742,9 +742,9 @@ int jffs2_add_older_frag_to_fragtree(struct jffs2_sb_info *c, struct jffs2_inode | |||
742 | this->ofs + this->size - fn_ofs); | 742 | this->ofs + this->size - fn_ofs); |
743 | if (unlikely(!newfrag)) | 743 | if (unlikely(!newfrag)) |
744 | return -ENOMEM; | 744 | return -ENOMEM; |
745 | 745 | ||
746 | if (fn_ofs == this->ofs) { | 746 | if (fn_ofs == this->ofs) { |
747 | /* | 747 | /* |
748 | * The new node starts at the same offset as | 748 | * The new node starts at the same offset as |
749 | * the hole and supersieds the hole. | 749 | * the hole and supersieds the hole. |
750 | */ | 750 | */ |
@@ -754,21 +754,21 @@ int jffs2_add_older_frag_to_fragtree(struct jffs2_sb_info *c, struct jffs2_inode | |||
754 | rb_replace_node(&this->rb, &newfrag->rb, root); | 754 | rb_replace_node(&this->rb, &newfrag->rb, root); |
755 | jffs2_free_node_frag(this); | 755 | jffs2_free_node_frag(this); |
756 | } else { | 756 | } else { |
757 | /* | 757 | /* |
758 | * The hole becomes shorter as its right part | 758 | * The hole becomes shorter as its right part |
759 | * is supersieded by the new fragment. | 759 | * is supersieded by the new fragment. |
760 | */ | 760 | */ |
761 | dbg_fragtree2("reduce size of hole %#04x-%#04x to %#04x-%#04x\n", | 761 | dbg_fragtree2("reduce size of hole %#04x-%#04x to %#04x-%#04x\n", |
762 | this->ofs, this->ofs + this->size, this->ofs, this->ofs + this->size - newfrag->size); | 762 | this->ofs, this->ofs + this->size, this->ofs, this->ofs + this->size - newfrag->size); |
763 | 763 | ||
764 | dbg_fragtree2("add new fragment %#04x-%#04x, refcnt %d\n", fn_ofs, | 764 | dbg_fragtree2("add new fragment %#04x-%#04x, refcnt %d\n", fn_ofs, |
765 | fn_ofs + this->ofs + this->size - fn_ofs, fn->frags); | 765 | fn_ofs + this->ofs + this->size - fn_ofs, fn->frags); |
766 | 766 | ||
767 | this->size -= newfrag->size; | 767 | this->size -= newfrag->size; |
768 | jffs2_fragtree_insert(newfrag, this); | 768 | jffs2_fragtree_insert(newfrag, this); |
769 | rb_insert_color(&newfrag->rb, root); | 769 | rb_insert_color(&newfrag->rb, root); |
770 | } | 770 | } |
771 | 771 | ||
772 | fn_ofs += newfrag->size; | 772 | fn_ofs += newfrag->size; |
773 | fn_size -= newfrag->size; | 773 | fn_size -= newfrag->size; |
774 | this = rb_entry(rb_next(&newfrag->rb), | 774 | this = rb_entry(rb_next(&newfrag->rb), |
@@ -778,7 +778,7 @@ int jffs2_add_older_frag_to_fragtree(struct jffs2_sb_info *c, struct jffs2_inode | |||
778 | this->ofs, this->ofs + this->size, this->node ? "(data)" : "(hole)"); | 778 | this->ofs, this->ofs + this->size, this->node ? "(data)" : "(hole)"); |
779 | } | 779 | } |
780 | 780 | ||
781 | /* | 781 | /* |
782 | * 'This' node is not the hole so it obsoletes the new fragment | 782 | * 'This' node is not the hole so it obsoletes the new fragment |
783 | * either fully or partially. | 783 | * either fully or partially. |
784 | */ | 784 | */ |
@@ -791,19 +791,19 @@ int jffs2_add_older_frag_to_fragtree(struct jffs2_sb_info *c, struct jffs2_inode | |||
791 | goto out_ok; | 791 | goto out_ok; |
792 | } else { | 792 | } else { |
793 | struct jffs2_node_frag *new_this; | 793 | struct jffs2_node_frag *new_this; |
794 | 794 | ||
795 | /* 'This' node obsoletes the beginning of the new node */ | 795 | /* 'This' node obsoletes the beginning of the new node */ |
796 | dbg_fragtree2("the beginning %#04x-%#04x is obsolete\n", fn_ofs, this->ofs + this->size); | 796 | dbg_fragtree2("the beginning %#04x-%#04x is obsolete\n", fn_ofs, this->ofs + this->size); |
797 | 797 | ||
798 | ref_flag = REF_NORMAL; | 798 | ref_flag = REF_NORMAL; |
799 | 799 | ||
800 | fn_size -= this->ofs + this->size - fn_ofs; | 800 | fn_size -= this->ofs + this->size - fn_ofs; |
801 | fn_ofs = this->ofs + this->size; | 801 | fn_ofs = this->ofs + this->size; |
802 | dbg_fragtree2("now considering %#04x-%#04x\n", fn_ofs, fn_ofs + fn_size); | 802 | dbg_fragtree2("now considering %#04x-%#04x\n", fn_ofs, fn_ofs + fn_size); |
803 | 803 | ||
804 | new_this = rb_entry(rb_next(&this->rb), struct jffs2_node_frag, rb); | 804 | new_this = rb_entry(rb_next(&this->rb), struct jffs2_node_frag, rb); |
805 | if (!new_this) { | 805 | if (!new_this) { |
806 | /* | 806 | /* |
807 | * There is no next fragment. Add the rest of | 807 | * There is no next fragment. Add the rest of |
808 | * the new node as the right-hand child. | 808 | * the new node as the right-hand child. |
809 | */ | 809 | */ |
@@ -813,7 +813,7 @@ int jffs2_add_older_frag_to_fragtree(struct jffs2_sb_info *c, struct jffs2_inode | |||
813 | return err; | 813 | return err; |
814 | checked = 1; | 814 | checked = 1; |
815 | } | 815 | } |
816 | 816 | ||
817 | fn->frags += 1; | 817 | fn->frags += 1; |
818 | newfrag = new_fragment(fn, fn_ofs, fn_size); | 818 | newfrag = new_fragment(fn, fn_ofs, fn_size); |
819 | if (unlikely(!newfrag)) | 819 | if (unlikely(!newfrag)) |
@@ -821,7 +821,7 @@ int jffs2_add_older_frag_to_fragtree(struct jffs2_sb_info *c, struct jffs2_inode | |||
821 | 821 | ||
822 | dbg_fragtree2("there are no more fragments, insert %#04x-%#04x\n", | 822 | dbg_fragtree2("there are no more fragments, insert %#04x-%#04x\n", |
823 | newfrag->ofs, newfrag->ofs + newfrag->size); | 823 | newfrag->ofs, newfrag->ofs + newfrag->size); |
824 | rb_link_node(&newfrag->rb, &this->rb, &this->rb.rb_right); | 824 | rb_link_node(&newfrag->rb, &this->rb, &this->rb.rb_right); |
825 | rb_insert_color(&newfrag->rb, root); | 825 | rb_insert_color(&newfrag->rb, root); |
826 | goto out_ok; | 826 | goto out_ok; |
827 | } else { | 827 | } else { |
@@ -862,9 +862,9 @@ void jffs2_set_inocache_state(struct jffs2_sb_info *c, struct jffs2_inode_cache | |||
862 | 862 | ||
863 | /* During mount, this needs no locking. During normal operation, its | 863 | /* During mount, this needs no locking. During normal operation, its |
864 | callers want to do other stuff while still holding the inocache_lock. | 864 | callers want to do other stuff while still holding the inocache_lock. |
865 | Rather than introducing special case get_ino_cache functions or | 865 | Rather than introducing special case get_ino_cache functions or |
866 | callbacks, we just let the caller do the locking itself. */ | 866 | callbacks, we just let the caller do the locking itself. */ |
867 | 867 | ||
868 | struct jffs2_inode_cache *jffs2_get_ino_cache(struct jffs2_sb_info *c, uint32_t ino) | 868 | struct jffs2_inode_cache *jffs2_get_ino_cache(struct jffs2_sb_info *c, uint32_t ino) |
869 | { | 869 | { |
870 | struct jffs2_inode_cache *ret; | 870 | struct jffs2_inode_cache *ret; |
@@ -873,7 +873,7 @@ struct jffs2_inode_cache *jffs2_get_ino_cache(struct jffs2_sb_info *c, uint32_t | |||
873 | while (ret && ret->ino < ino) { | 873 | while (ret && ret->ino < ino) { |
874 | ret = ret->next; | 874 | ret = ret->next; |
875 | } | 875 | } |
876 | 876 | ||
877 | if (ret && ret->ino != ino) | 877 | if (ret && ret->ino != ino) |
878 | ret = NULL; | 878 | ret = NULL; |
879 | 879 | ||
@@ -907,9 +907,9 @@ void jffs2_del_ino_cache(struct jffs2_sb_info *c, struct jffs2_inode_cache *old) | |||
907 | 907 | ||
908 | dbg_inocache("del %p (ino #%u)\n", old, old->ino); | 908 | dbg_inocache("del %p (ino #%u)\n", old, old->ino); |
909 | spin_lock(&c->inocache_lock); | 909 | spin_lock(&c->inocache_lock); |
910 | 910 | ||
911 | prev = &c->inocache_list[old->ino % INOCACHE_HASHSIZE]; | 911 | prev = &c->inocache_list[old->ino % INOCACHE_HASHSIZE]; |
912 | 912 | ||
913 | while ((*prev) && (*prev)->ino < old->ino) { | 913 | while ((*prev) && (*prev)->ino < old->ino) { |
914 | prev = &(*prev)->next; | 914 | prev = &(*prev)->next; |
915 | } | 915 | } |
@@ -919,7 +919,7 @@ void jffs2_del_ino_cache(struct jffs2_sb_info *c, struct jffs2_inode_cache *old) | |||
919 | 919 | ||
920 | /* Free it now unless it's in READING or CLEARING state, which | 920 | /* Free it now unless it's in READING or CLEARING state, which |
921 | are the transitions upon read_inode() and clear_inode(). The | 921 | are the transitions upon read_inode() and clear_inode(). The |
922 | rest of the time we know nobody else is looking at it, and | 922 | rest of the time we know nobody else is looking at it, and |
923 | if it's held by read_inode() or clear_inode() they'll free it | 923 | if it's held by read_inode() or clear_inode() they'll free it |
924 | for themselves. */ | 924 | for themselves. */ |
925 | if (old->state != INO_STATE_READING && old->state != INO_STATE_CLEARING) | 925 | if (old->state != INO_STATE_READING && old->state != INO_STATE_CLEARING) |
@@ -932,7 +932,7 @@ void jffs2_free_ino_caches(struct jffs2_sb_info *c) | |||
932 | { | 932 | { |
933 | int i; | 933 | int i; |
934 | struct jffs2_inode_cache *this, *next; | 934 | struct jffs2_inode_cache *this, *next; |
935 | 935 | ||
936 | for (i=0; i<INOCACHE_HASHSIZE; i++) { | 936 | for (i=0; i<INOCACHE_HASHSIZE; i++) { |
937 | this = c->inocache_list[i]; | 937 | this = c->inocache_list[i]; |
938 | while (this) { | 938 | while (this) { |
@@ -959,10 +959,10 @@ void jffs2_free_raw_node_refs(struct jffs2_sb_info *c) | |||
959 | c->blocks[i].first_node = c->blocks[i].last_node = NULL; | 959 | c->blocks[i].first_node = c->blocks[i].last_node = NULL; |
960 | } | 960 | } |
961 | } | 961 | } |
962 | 962 | ||
963 | struct jffs2_node_frag *jffs2_lookup_node_frag(struct rb_root *fragtree, uint32_t offset) | 963 | struct jffs2_node_frag *jffs2_lookup_node_frag(struct rb_root *fragtree, uint32_t offset) |
964 | { | 964 | { |
965 | /* The common case in lookup is that there will be a node | 965 | /* The common case in lookup is that there will be a node |
966 | which precisely matches. So we go looking for that first */ | 966 | which precisely matches. So we go looking for that first */ |
967 | struct rb_node *next; | 967 | struct rb_node *next; |
968 | struct jffs2_node_frag *prev = NULL; | 968 | struct jffs2_node_frag *prev = NULL; |
@@ -993,9 +993,9 @@ struct jffs2_node_frag *jffs2_lookup_node_frag(struct rb_root *fragtree, uint32_ | |||
993 | if (prev) | 993 | if (prev) |
994 | dbg_fragtree2("no match. Returning frag %#04x-%#04x, closest previous\n", | 994 | dbg_fragtree2("no match. Returning frag %#04x-%#04x, closest previous\n", |
995 | prev->ofs, prev->ofs+prev->size); | 995 | prev->ofs, prev->ofs+prev->size); |
996 | else | 996 | else |
997 | dbg_fragtree2("returning NULL, empty fragtree\n"); | 997 | dbg_fragtree2("returning NULL, empty fragtree\n"); |
998 | 998 | ||
999 | return prev; | 999 | return prev; |
1000 | } | 1000 | } |
1001 | 1001 | ||
@@ -1010,7 +1010,7 @@ void jffs2_kill_fragtree(struct rb_root *root, struct jffs2_sb_info *c) | |||
1010 | return; | 1010 | return; |
1011 | 1011 | ||
1012 | dbg_fragtree("killing\n"); | 1012 | dbg_fragtree("killing\n"); |
1013 | 1013 | ||
1014 | frag = (rb_entry(root->rb_node, struct jffs2_node_frag, rb)); | 1014 | frag = (rb_entry(root->rb_node, struct jffs2_node_frag, rb)); |
1015 | while(frag) { | 1015 | while(frag) { |
1016 | if (frag->rb.rb_left) { | 1016 | if (frag->rb.rb_left) { |
@@ -1023,18 +1023,18 @@ void jffs2_kill_fragtree(struct rb_root *root, struct jffs2_sb_info *c) | |||
1023 | } | 1023 | } |
1024 | 1024 | ||
1025 | if (frag->node && !(--frag->node->frags)) { | 1025 | if (frag->node && !(--frag->node->frags)) { |
1026 | /* Not a hole, and it's the final remaining frag | 1026 | /* Not a hole, and it's the final remaining frag |
1027 | of this node. Free the node */ | 1027 | of this node. Free the node */ |
1028 | if (c) | 1028 | if (c) |
1029 | jffs2_mark_node_obsolete(c, frag->node->raw); | 1029 | jffs2_mark_node_obsolete(c, frag->node->raw); |
1030 | 1030 | ||
1031 | jffs2_free_full_dnode(frag->node); | 1031 | jffs2_free_full_dnode(frag->node); |
1032 | } | 1032 | } |
1033 | parent = frag_parent(frag); | 1033 | parent = frag_parent(frag); |
1034 | if (parent) { | 1034 | if (parent) { |
1035 | if (frag_left(parent) == frag) | 1035 | if (frag_left(parent) == frag) |
1036 | parent->rb.rb_left = NULL; | 1036 | parent->rb.rb_left = NULL; |
1037 | else | 1037 | else |
1038 | parent->rb.rb_right = NULL; | 1038 | parent->rb.rb_right = NULL; |
1039 | } | 1039 | } |
1040 | 1040 | ||