aboutsummaryrefslogtreecommitdiffstats
path: root/fs/jffs2/wbuf.c
diff options
context:
space:
mode:
authorDavid Woodhouse <dwmw2@infradead.org>2006-05-23 21:04:45 -0400
committerDavid Woodhouse <dwmw2@infradead.org>2006-05-23 21:04:45 -0400
commit2f785402f39b96a077b6e62bf26164bfb8e0c980 (patch)
tree3f3a38b484ef2dabda1599d4d8f08b121bd03a76 /fs/jffs2/wbuf.c
parent4cbb9b80e171107c6c34116283fe38e5a396c68b (diff)
[JFFS2] Reduce visibility of raw_node_ref to upper layers of JFFS2 code.
As the first step towards eliminating the ref->next_phys member and saving memory by using an _array_ of struct jffs2_raw_node_ref per eraseblock, stop the write functions from allocating their own refs; have them just _reserve_ the appropriate number instead. Then jffs2_link_node_ref() can just fill them in. Use a linked list of pre-allocated refs in the superblock, for now. Once we switch to an array, it'll just be a case of extending that array. Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Diffstat (limited to 'fs/jffs2/wbuf.c')
-rw-r--r--fs/jffs2/wbuf.c26
1 files changed, 9 insertions, 17 deletions
diff --git a/fs/jffs2/wbuf.c b/fs/jffs2/wbuf.c
index 916c87d3393b..0d7abb260489 100644
--- a/fs/jffs2/wbuf.c
+++ b/fs/jffs2/wbuf.c
@@ -179,6 +179,9 @@ static void jffs2_wbuf_recover(struct jffs2_sb_info *c)
179 unsigned char *buf; 179 unsigned char *buf;
180 uint32_t start, end, ofs, len; 180 uint32_t start, end, ofs, len;
181 181
182 if (jffs2_prealloc_raw_node_refs(c, c->reserved_refs + 1))
183 return;
184
182 spin_lock(&c->erase_completion_lock); 185 spin_lock(&c->erase_completion_lock);
183 186
184 jeb = &c->blocks[c->wbuf_ofs / c->sector_size]; 187 jeb = &c->blocks[c->wbuf_ofs / c->sector_size];
@@ -306,17 +309,9 @@ static void jffs2_wbuf_recover(struct jffs2_sb_info *c)
306 printk(KERN_CRIT "Recovery of wbuf failed due to a second write error\n"); 309 printk(KERN_CRIT "Recovery of wbuf failed due to a second write error\n");
307 kfree(buf); 310 kfree(buf);
308 311
309 if (retlen) { 312 if (retlen)
310 struct jffs2_raw_node_ref *raw2; 313 jffs2_add_physical_node_ref(c, ofs | REF_OBSOLETE, ref_totlen(c, jeb, *first_raw), NULL);
311
312 raw2 = jffs2_alloc_raw_node_ref();
313 if (!raw2)
314 return;
315
316 raw2->flash_offset = ofs | REF_OBSOLETE;
317 314
318 jffs2_add_physical_node_ref(c, raw2, ref_totlen(c, jeb, *first_raw), NULL);
319 }
320 return; 315 return;
321 } 316 }
322 printk(KERN_NOTICE "Recovery of wbuf succeeded to %08x\n", ofs); 317 printk(KERN_NOTICE "Recovery of wbuf succeeded to %08x\n", ofs);
@@ -428,6 +423,9 @@ static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad)
428 if (!c->wbuf_len) /* already checked c->wbuf above */ 423 if (!c->wbuf_len) /* already checked c->wbuf above */
429 return 0; 424 return 0;
430 425
426 if (jffs2_prealloc_raw_node_refs(c, c->reserved_refs + 1))
427 return -ENOMEM;
428
431 /* claim remaining space on the page 429 /* claim remaining space on the page
432 this happens, if we have a change to a new block, 430 this happens, if we have a change to a new block,
433 or if fsync forces us to flush the writebuffer. 431 or if fsync forces us to flush the writebuffer.
@@ -485,7 +483,6 @@ static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad)
485 /* Adjust free size of the block if we padded. */ 483 /* Adjust free size of the block if we padded. */
486 if (pad) { 484 if (pad) {
487 struct jffs2_eraseblock *jeb; 485 struct jffs2_eraseblock *jeb;
488 struct jffs2_raw_node_ref *ref;
489 uint32_t waste = c->wbuf_pagesize - c->wbuf_len; 486 uint32_t waste = c->wbuf_pagesize - c->wbuf_len;
490 487
491 jeb = &c->blocks[c->wbuf_ofs / c->sector_size]; 488 jeb = &c->blocks[c->wbuf_ofs / c->sector_size];
@@ -503,15 +500,10 @@ static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad)
503 jeb->offset, jeb->free_size); 500 jeb->offset, jeb->free_size);
504 BUG(); 501 BUG();
505 } 502 }
506 ref = jffs2_alloc_raw_node_ref();
507 if (!ref)
508 return -ENOMEM;
509 ref->flash_offset = c->wbuf_ofs + c->wbuf_len;
510 ref->flash_offset |= REF_OBSOLETE;
511 503
512 spin_lock(&c->erase_completion_lock); 504 spin_lock(&c->erase_completion_lock);
513 505
514 jffs2_link_node_ref(c, jeb, ref, waste, NULL); 506 jffs2_link_node_ref(c, jeb, (c->wbuf_ofs + c->wbuf_len) | REF_OBSOLETE, waste, NULL);
515 /* FIXME: that made it count as dirty. Convert to wasted */ 507 /* FIXME: that made it count as dirty. Convert to wasted */
516 jeb->dirty_size -= waste; 508 jeb->dirty_size -= waste;
517 c->dirty_size -= waste; 509 c->dirty_size -= waste;