gc.c (e631ddba588783edd521c5a89f7b2902772fb691) | gc.c (182ec4eee397543101a6db8906ed88727d3f7e53) |
---|---|
1/* 2 * JFFS2 -- Journalling Flash File System, Version 2. 3 * 4 * Copyright (C) 2001-2003 Red Hat, Inc. 5 * 6 * Created by David Woodhouse <dwmw2@infradead.org> 7 * 8 * For licensing information, see the file 'LICENCE' in this directory. 9 * | 1/* 2 * JFFS2 -- Journalling Flash File System, Version 2. 3 * 4 * Copyright (C) 2001-2003 Red Hat, Inc. 5 * 6 * Created by David Woodhouse <dwmw2@infradead.org> 7 * 8 * For licensing information, see the file 'LICENCE' in this directory. 9 * |
10 * $Id: gc.c,v 1.154 2005/09/07 08:34:54 havasi Exp $ | 10 * $Id: gc.c,v 1.155 2005/11/07 11:14:39 gleixner Exp $ |
11 * 12 */ 13 14#include <linux/kernel.h> 15#include <linux/mtd/mtd.h> 16#include <linux/slab.h> 17#include <linux/pagemap.h> 18#include <linux/crc32.h> 19#include <linux/compiler.h> 20#include <linux/stat.h> 21#include "nodelist.h" 22#include "compr.h" 23 | 11 * 12 */ 13 14#include <linux/kernel.h> 15#include <linux/mtd/mtd.h> 16#include <linux/slab.h> 17#include <linux/pagemap.h> 18#include <linux/crc32.h> 19#include <linux/compiler.h> 20#include <linux/stat.h> 21#include "nodelist.h" 22#include "compr.h" 23 |
24static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c, | 24static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c, |
25 struct jffs2_inode_cache *ic, 26 struct jffs2_raw_node_ref *raw); | 25 struct jffs2_inode_cache *ic, 26 struct jffs2_raw_node_ref *raw); |
27static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, | 27static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, |
28 struct jffs2_inode_info *f, struct jffs2_full_dnode *fd); | 28 struct jffs2_inode_info *f, struct jffs2_full_dnode *fd); |
29static int jffs2_garbage_collect_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, | 29static int jffs2_garbage_collect_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, |
30 struct jffs2_inode_info *f, struct jffs2_full_dirent *fd); | 30 struct jffs2_inode_info *f, struct jffs2_full_dirent *fd); |
31static int jffs2_garbage_collect_deletion_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, | 31static int jffs2_garbage_collect_deletion_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, |
32 struct jffs2_inode_info *f, struct jffs2_full_dirent *fd); 33static int jffs2_garbage_collect_hole(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, 34 struct jffs2_inode_info *f, struct jffs2_full_dnode *fn, 35 uint32_t start, uint32_t end); 36static int jffs2_garbage_collect_dnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, 37 struct jffs2_inode_info *f, struct jffs2_full_dnode *fn, 38 uint32_t start, uint32_t end); 39static int jffs2_garbage_collect_live(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, --- 10 unchanged lines hidden (view full) --- 50 put the clever wear-levelling algorithms. Eventually. */ 51 /* We possibly want to favour the dirtier blocks more when the 52 number of free blocks is low. */ 53again: 54 if (!list_empty(&c->bad_used_list) && c->nr_free_blocks > c->resv_blocks_gcbad) { 55 D1(printk(KERN_DEBUG "Picking block from bad_used_list to GC next\n")); 56 nextlist = &c->bad_used_list; 57 } else if (n < 50 && !list_empty(&c->erasable_list)) { | 32 struct jffs2_inode_info *f, struct jffs2_full_dirent *fd); 33static int jffs2_garbage_collect_hole(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, 34 struct jffs2_inode_info *f, struct jffs2_full_dnode *fn, 35 uint32_t start, uint32_t end); 36static int jffs2_garbage_collect_dnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, 37 struct jffs2_inode_info *f, struct jffs2_full_dnode *fn, 38 uint32_t start, uint32_t end); 39static int jffs2_garbage_collect_live(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, --- 10 unchanged lines hidden (view full) --- 50 put the clever wear-levelling algorithms. Eventually. */ 51 /* We possibly want to favour the dirtier blocks more when the 52 number of free blocks is low. */ 53again: 54 if (!list_empty(&c->bad_used_list) && c->nr_free_blocks > c->resv_blocks_gcbad) { 55 D1(printk(KERN_DEBUG "Picking block from bad_used_list to GC next\n")); 56 nextlist = &c->bad_used_list; 57 } else if (n < 50 && !list_empty(&c->erasable_list)) { |
58 /* Note that most of them will have gone directly to be erased. | 58 /* Note that most of them will have gone directly to be erased. |
59 So don't favour the erasable_list _too_ much. */ 60 D1(printk(KERN_DEBUG "Picking block from erasable_list to GC next\n")); 61 nextlist = &c->erasable_list; 62 } else if (n < 110 && !list_empty(&c->very_dirty_list)) { 63 /* Most of the time, pick one off the very_dirty list */ 64 D1(printk(KERN_DEBUG "Picking block from very_dirty_list to GC next\n")); 65 nextlist = &c->very_dirty_list; 66 } else if (n < 126 && !list_empty(&c->dirty_list)) { --- 29 unchanged lines hidden (view full) --- 96 ret = list_entry(nextlist->next, struct jffs2_eraseblock, list); 97 list_del(&ret->list); 98 c->gcblock = ret; 99 ret->gc_node = ret->first_node; 100 if (!ret->gc_node) { 101 printk(KERN_WARNING "Eep. ret->gc_node for block at 0x%08x is NULL\n", ret->offset); 102 BUG(); 103 } | 59 So don't favour the erasable_list _too_ much. */ 60 D1(printk(KERN_DEBUG "Picking block from erasable_list to GC next\n")); 61 nextlist = &c->erasable_list; 62 } else if (n < 110 && !list_empty(&c->very_dirty_list)) { 63 /* Most of the time, pick one off the very_dirty list */ 64 D1(printk(KERN_DEBUG "Picking block from very_dirty_list to GC next\n")); 65 nextlist = &c->very_dirty_list; 66 } else if (n < 126 && !list_empty(&c->dirty_list)) { --- 29 unchanged lines hidden (view full) --- 96 ret = list_entry(nextlist->next, struct jffs2_eraseblock, list); 97 list_del(&ret->list); 98 c->gcblock = ret; 99 ret->gc_node = ret->first_node; 100 if (!ret->gc_node) { 101 printk(KERN_WARNING "Eep. ret->gc_node for block at 0x%08x is NULL\n", ret->offset); 102 BUG(); 103 } |
104 | 104 |
105 /* Have we accidentally picked a clean block with wasted space ? */ 106 if (ret->wasted_size) { 107 D1(printk(KERN_DEBUG "Converting wasted_size %08x to dirty_size\n", ret->wasted_size)); 108 ret->dirty_size += ret->wasted_size; 109 c->wasted_size -= ret->wasted_size; 110 c->dirty_size += ret->wasted_size; 111 ret->wasted_size = 0; 112 } --- 18 unchanged lines hidden (view full) --- 131 132 for (;;) { 133 spin_lock(&c->erase_completion_lock); 134 if (!c->unchecked_size) 135 break; 136 137 /* We can't start doing GC yet. We haven't finished checking 138 the node CRCs etc. Do it now. */ | 105 /* Have we accidentally picked a clean block with wasted space ? */ 106 if (ret->wasted_size) { 107 D1(printk(KERN_DEBUG "Converting wasted_size %08x to dirty_size\n", ret->wasted_size)); 108 ret->dirty_size += ret->wasted_size; 109 c->wasted_size -= ret->wasted_size; 110 c->dirty_size += ret->wasted_size; 111 ret->wasted_size = 0; 112 } --- 18 unchanged lines hidden (view full) --- 131 132 for (;;) { 133 spin_lock(&c->erase_completion_lock); 134 if (!c->unchecked_size) 135 break; 136 137 /* We can't start doing GC yet. We haven't finished checking 138 the node CRCs etc. Do it now. */ |
139 | 139 |
140 /* checked_ino is protected by the alloc_sem */ 141 if (c->checked_ino > c->highest_ino) { 142 printk(KERN_CRIT "Checked all inodes but still 0x%x bytes of unchecked space?\n", 143 c->unchecked_size); 144 jffs2_dbg_dump_block_lists_nolock(c); 145 spin_unlock(&c->erase_completion_lock); 146 BUG(); 147 } --- 25 unchanged lines hidden (view full) --- 173 case INO_STATE_GC: 174 case INO_STATE_CHECKING: 175 printk(KERN_WARNING "Inode #%u is in state %d during CRC check phase!\n", ic->ino, ic->state); 176 spin_unlock(&c->inocache_lock); 177 BUG(); 178 179 case INO_STATE_READING: 180 /* We need to wait for it to finish, lest we move on | 140 /* checked_ino is protected by the alloc_sem */ 141 if (c->checked_ino > c->highest_ino) { 142 printk(KERN_CRIT "Checked all inodes but still 0x%x bytes of unchecked space?\n", 143 c->unchecked_size); 144 jffs2_dbg_dump_block_lists_nolock(c); 145 spin_unlock(&c->erase_completion_lock); 146 BUG(); 147 } --- 25 unchanged lines hidden (view full) --- 173 case INO_STATE_GC: 174 case INO_STATE_CHECKING: 175 printk(KERN_WARNING "Inode #%u is in state %d during CRC check phase!\n", ic->ino, ic->state); 176 spin_unlock(&c->inocache_lock); 177 BUG(); 178 179 case INO_STATE_READING: 180 /* We need to wait for it to finish, lest we move on |
181 and trigger the BUG() above while we haven't yet | 181 and trigger the BUG() above while we haven't yet |
182 finished checking all its nodes */ 183 D1(printk(KERN_DEBUG "Waiting for ino #%u to finish reading\n", ic->ino)); 184 up(&c->alloc_sem); 185 sleep_on_spinunlock(&c->inocache_wq, &c->inocache_lock); 186 return 0; 187 188 default: 189 BUG(); --- 33 unchanged lines hidden (view full) --- 223 printk(KERN_DEBUG "Nextblock at %08x, used_size %08x, dirty_size %08x, wasted_size %08x, free_size %08x\n", c->nextblock->offset, c->nextblock->used_size, c->nextblock->dirty_size, c->nextblock->wasted_size, c->nextblock->free_size)); 224 225 if (!jeb->used_size) { 226 up(&c->alloc_sem); 227 goto eraseit; 228 } 229 230 raw = jeb->gc_node; | 182 finished checking all its nodes */ 183 D1(printk(KERN_DEBUG "Waiting for ino #%u to finish reading\n", ic->ino)); 184 up(&c->alloc_sem); 185 sleep_on_spinunlock(&c->inocache_wq, &c->inocache_lock); 186 return 0; 187 188 default: 189 BUG(); --- 33 unchanged lines hidden (view full) --- 223 printk(KERN_DEBUG "Nextblock at %08x, used_size %08x, dirty_size %08x, wasted_size %08x, free_size %08x\n", c->nextblock->offset, c->nextblock->used_size, c->nextblock->dirty_size, c->nextblock->wasted_size, c->nextblock->free_size)); 224 225 if (!jeb->used_size) { 226 up(&c->alloc_sem); 227 goto eraseit; 228 } 229 230 raw = jeb->gc_node; |
231 | 231 |
232 while(ref_obsolete(raw)) { 233 D1(printk(KERN_DEBUG "Node at 0x%08x is obsolete... skipping\n", ref_offset(raw))); 234 raw = raw->next_phys; 235 if (unlikely(!raw)) { 236 printk(KERN_WARNING "eep. End of raw list while still supposedly nodes to GC\n"); | 232 while(ref_obsolete(raw)) { 233 D1(printk(KERN_DEBUG "Node at 0x%08x is obsolete... skipping\n", ref_offset(raw))); 234 raw = raw->next_phys; 235 if (unlikely(!raw)) { 236 printk(KERN_WARNING "eep. End of raw list while still supposedly nodes to GC\n"); |
237 printk(KERN_WARNING "erase block at 0x%08x. free_size 0x%08x, dirty_size 0x%08x, used_size 0x%08x\n", | 237 printk(KERN_WARNING "erase block at 0x%08x. free_size 0x%08x, dirty_size 0x%08x, used_size 0x%08x\n", |
238 jeb->offset, jeb->free_size, jeb->dirty_size, jeb->used_size); 239 jeb->gc_node = raw; 240 spin_unlock(&c->erase_completion_lock); 241 up(&c->alloc_sem); 242 BUG(); 243 } 244 } 245 jeb->gc_node = raw; --- 8 unchanged lines hidden (view full) --- 254 jffs2_mark_node_obsolete(c, raw); 255 up(&c->alloc_sem); 256 goto eraseit_lock; 257 } 258 259 ic = jffs2_raw_ref_to_ic(raw); 260 261 /* We need to hold the inocache. Either the erase_completion_lock or | 238 jeb->offset, jeb->free_size, jeb->dirty_size, jeb->used_size); 239 jeb->gc_node = raw; 240 spin_unlock(&c->erase_completion_lock); 241 up(&c->alloc_sem); 242 BUG(); 243 } 244 } 245 jeb->gc_node = raw; --- 8 unchanged lines hidden (view full) --- 254 jffs2_mark_node_obsolete(c, raw); 255 up(&c->alloc_sem); 256 goto eraseit_lock; 257 } 258 259 ic = jffs2_raw_ref_to_ic(raw); 260 261 /* We need to hold the inocache. Either the erase_completion_lock or |
262 the inocache_lock are sufficient; we trade down since the inocache_lock | 262 the inocache_lock are sufficient; we trade down since the inocache_lock |
263 causes less contention. */ 264 spin_lock(&c->inocache_lock); 265 266 spin_unlock(&c->erase_completion_lock); 267 268 D1(printk(KERN_DEBUG "jffs2_garbage_collect_pass collecting from block @0x%08x. Node @0x%08x(%d), ino #%u\n", jeb->offset, ref_offset(raw), ref_flags(raw), ic->ino)); 269 270 /* Three possibilities: 271 1. Inode is already in-core. We must iget it and do proper 272 updating to its fragtree, etc. 273 2. Inode is not in-core, node is REF_PRISTINE. We lock the 274 inocache to prevent a read_inode(), copy the node intact. 275 3. Inode is not in-core, node is not pristine. We must iget() 276 and take the slow path. 277 */ 278 279 switch(ic->state) { 280 case INO_STATE_CHECKEDABSENT: | 263 causes less contention. */ 264 spin_lock(&c->inocache_lock); 265 266 spin_unlock(&c->erase_completion_lock); 267 268 D1(printk(KERN_DEBUG "jffs2_garbage_collect_pass collecting from block @0x%08x. Node @0x%08x(%d), ino #%u\n", jeb->offset, ref_offset(raw), ref_flags(raw), ic->ino)); 269 270 /* Three possibilities: 271 1. Inode is already in-core. We must iget it and do proper 272 updating to its fragtree, etc. 273 2. Inode is not in-core, node is REF_PRISTINE. We lock the 274 inocache to prevent a read_inode(), copy the node intact. 275 3. Inode is not in-core, node is not pristine. We must iget() 276 and take the slow path. 277 */ 278 279 switch(ic->state) { 280 case INO_STATE_CHECKEDABSENT: |
281 /* It's been checked, but it's not currently in-core. | 281 /* It's been checked, but it's not currently in-core. |
282 We can just copy any pristine nodes, but have 283 to prevent anyone else from doing read_inode() while 284 we're at it, so we set the state accordingly */ 285 if (ref_flags(raw) == REF_PRISTINE) 286 ic->state = INO_STATE_GC; 287 else { | 282 We can just copy any pristine nodes, but have 283 to prevent anyone else from doing read_inode() while 284 we're at it, so we set the state accordingly */ 285 if (ref_flags(raw) == REF_PRISTINE) 286 ic->state = INO_STATE_GC; 287 else { |
288 D1(printk(KERN_DEBUG "Ino #%u is absent but node not REF_PRISTINE. Reading.\n", | 288 D1(printk(KERN_DEBUG "Ino #%u is absent but node not REF_PRISTINE. Reading.\n", |
289 ic->ino)); 290 } 291 break; 292 293 case INO_STATE_PRESENT: 294 /* It's in-core. GC must iget() it. */ 295 break; 296 297 case INO_STATE_UNCHECKED: 298 case INO_STATE_CHECKING: 299 case INO_STATE_GC: 300 /* Should never happen. We should have finished checking | 289 ic->ino)); 290 } 291 break; 292 293 case INO_STATE_PRESENT: 294 /* It's in-core. GC must iget() it. */ 295 break; 296 297 case INO_STATE_UNCHECKED: 298 case INO_STATE_CHECKING: 299 case INO_STATE_GC: 300 /* Should never happen. We should have finished checking |
301 by the time we actually start doing any GC, and since 302 we're holding the alloc_sem, no other garbage collection | 301 by the time we actually start doing any GC, and since 302 we're holding the alloc_sem, no other garbage collection |
303 can happen. 304 */ 305 printk(KERN_CRIT "Inode #%u already in state %d in jffs2_garbage_collect_pass()!\n", 306 ic->ino, ic->state); 307 up(&c->alloc_sem); 308 spin_unlock(&c->inocache_lock); 309 BUG(); 310 311 case INO_STATE_READING: 312 /* Someone's currently trying to read it. We must wait for 313 them to finish and then go through the full iget() route 314 to do the GC. However, sometimes read_inode() needs to get 315 the alloc_sem() (for marking nodes invalid) so we must 316 drop the alloc_sem before sleeping. */ 317 318 up(&c->alloc_sem); 319 D1(printk(KERN_DEBUG "jffs2_garbage_collect_pass() waiting for ino #%u in state %d\n", 320 ic->ino, ic->state)); 321 sleep_on_spinunlock(&c->inocache_wq, &c->inocache_lock); | 303 can happen. 304 */ 305 printk(KERN_CRIT "Inode #%u already in state %d in jffs2_garbage_collect_pass()!\n", 306 ic->ino, ic->state); 307 up(&c->alloc_sem); 308 spin_unlock(&c->inocache_lock); 309 BUG(); 310 311 case INO_STATE_READING: 312 /* Someone's currently trying to read it. We must wait for 313 them to finish and then go through the full iget() route 314 to do the GC. However, sometimes read_inode() needs to get 315 the alloc_sem() (for marking nodes invalid) so we must 316 drop the alloc_sem before sleeping. */ 317 318 up(&c->alloc_sem); 319 D1(printk(KERN_DEBUG "jffs2_garbage_collect_pass() waiting for ino #%u in state %d\n", 320 ic->ino, ic->state)); 321 sleep_on_spinunlock(&c->inocache_wq, &c->inocache_lock); |
322 /* And because we dropped the alloc_sem we must start again from the | 322 /* And because we dropped the alloc_sem we must start again from the |
323 beginning. Ponder chance of livelock here -- we're returning success 324 without actually making any progress. 325 | 323 beginning. Ponder chance of livelock here -- we're returning success 324 without actually making any progress. 325 |
326 Q: What are the chances that the inode is back in INO_STATE_READING | 326 Q: What are the chances that the inode is back in INO_STATE_READING |
327 again by the time we next enter this function? And that this happens 328 enough times to cause a real delay? 329 | 327 again by the time we next enter this function? And that this happens 328 enough times to cause a real delay? 329 |
330 A: Small enough that I don't care :) | 330 A: Small enough that I don't care :) |
331 */ 332 return 0; 333 } 334 335 /* OK. Now if the inode is in state INO_STATE_GC, we are going to copy the | 331 */ 332 return 0; 333 } 334 335 /* OK. Now if the inode is in state INO_STATE_GC, we are going to copy the |
336 node intact, and we don't have to muck about with the fragtree etc. | 336 node intact, and we don't have to muck about with the fragtree etc. |
337 because we know it's not in-core. If it _was_ in-core, we go through 338 all the iget() crap anyway */ 339 340 if (ic->state == INO_STATE_GC) { 341 spin_unlock(&c->inocache_lock); 342 343 ret = jffs2_garbage_collect_pristine(c, ic, raw); 344 --- 103 unchanged lines hidden (view full) --- 448 } 449 } 450 if (fn) { 451 if (ref_flags(raw) == REF_PRISTINE) { 452 ret = jffs2_garbage_collect_pristine(c, f->inocache, raw); 453 if (!ret) { 454 /* Urgh. Return it sensibly. */ 455 frag->node->raw = f->inocache->nodes; | 337 because we know it's not in-core. If it _was_ in-core, we go through 338 all the iget() crap anyway */ 339 340 if (ic->state == INO_STATE_GC) { 341 spin_unlock(&c->inocache_lock); 342 343 ret = jffs2_garbage_collect_pristine(c, ic, raw); 344 --- 103 unchanged lines hidden (view full) --- 448 } 449 } 450 if (fn) { 451 if (ref_flags(raw) == REF_PRISTINE) { 452 ret = jffs2_garbage_collect_pristine(c, f->inocache, raw); 453 if (!ret) { 454 /* Urgh. Return it sensibly. */ 455 frag->node->raw = f->inocache->nodes; |
456 } | 456 } |
457 if (ret != -EBADFD) 458 goto upnout; 459 } 460 /* We found a datanode. Do the GC */ 461 if((start >> PAGE_CACHE_SHIFT) < ((end-1) >> PAGE_CACHE_SHIFT)) { 462 /* It crosses a page boundary. Therefore, it must be a hole. */ 463 ret = jffs2_garbage_collect_hole(c, jeb, f, fn, start, end); 464 } else { 465 /* It could still be a hole. But we GC the page this way anyway */ 466 ret = jffs2_garbage_collect_dnode(c, jeb, f, fn, start, end); 467 } 468 goto upnout; 469 } | 457 if (ret != -EBADFD) 458 goto upnout; 459 } 460 /* We found a datanode. Do the GC */ 461 if((start >> PAGE_CACHE_SHIFT) < ((end-1) >> PAGE_CACHE_SHIFT)) { 462 /* It crosses a page boundary. Therefore, it must be a hole. */ 463 ret = jffs2_garbage_collect_hole(c, jeb, f, fn, start, end); 464 } else { 465 /* It could still be a hole. But we GC the page this way anyway */ 466 ret = jffs2_garbage_collect_dnode(c, jeb, f, fn, start, end); 467 } 468 goto upnout; 469 } |
470 | 470 |
471 /* Wasn't a dnode. Try dirent */ 472 for (fd = f->dents; fd; fd=fd->next) { 473 if (fd->raw == raw) 474 break; 475 } 476 477 if (fd && fd->ino) { 478 ret = jffs2_garbage_collect_dirent(c, jeb, f, fd); --- 10 unchanged lines hidden (view full) --- 489 } 490 } 491 upnout: 492 up(&f->sem); 493 494 return ret; 495} 496 | 471 /* Wasn't a dnode. Try dirent */ 472 for (fd = f->dents; fd; fd=fd->next) { 473 if (fd->raw == raw) 474 break; 475 } 476 477 if (fd && fd->ino) { 478 ret = jffs2_garbage_collect_dirent(c, jeb, f, fd); --- 10 unchanged lines hidden (view full) --- 489 } 490 } 491 upnout: 492 up(&f->sem); 493 494 return ret; 495} 496 |
497static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c, | 497static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c, |
498 struct jffs2_inode_cache *ic, 499 struct jffs2_raw_node_ref *raw) 500{ 501 union jffs2_node_union *node; 502 struct jffs2_raw_node_ref *nraw; 503 size_t retlen; 504 int ret; 505 uint32_t phys_ofs, alloclen; --- 69 unchanged lines hidden (view full) --- 575 if (je32_to_cpu(node->d.name_crc) != crc) { 576 printk(KERN_WARNING "Name CRC failed on REF_PRISTINE dirent ode at 0x%08x: Read 0x%08x, calculated 0x%08x\n", 577 ref_offset(raw), je32_to_cpu(node->d.name_crc), crc); 578 goto bail; 579 } 580 } 581 break; 582 default: | 498 struct jffs2_inode_cache *ic, 499 struct jffs2_raw_node_ref *raw) 500{ 501 union jffs2_node_union *node; 502 struct jffs2_raw_node_ref *nraw; 503 size_t retlen; 504 int ret; 505 uint32_t phys_ofs, alloclen; --- 69 unchanged lines hidden (view full) --- 575 if (je32_to_cpu(node->d.name_crc) != crc) { 576 printk(KERN_WARNING "Name CRC failed on REF_PRISTINE dirent ode at 0x%08x: Read 0x%08x, calculated 0x%08x\n", 577 ref_offset(raw), je32_to_cpu(node->d.name_crc), crc); 578 goto bail; 579 } 580 } 581 break; 582 default: |
583 printk(KERN_WARNING "Unknown node type for REF_PRISTINE node at 0x%08x: 0x%04x\n", | 583 printk(KERN_WARNING "Unknown node type for REF_PRISTINE node at 0x%08x: 0x%04x\n", |
584 ref_offset(raw), je16_to_cpu(node->u.nodetype)); 585 goto bail; 586 } 587 588 nraw = jffs2_alloc_raw_node_ref(); 589 if (!nraw) { 590 ret = -ENOMEM; 591 goto out_node; --- 24 unchanged lines hidden (view full) --- 616 if (!retried && (nraw = jffs2_alloc_raw_node_ref())) { 617 /* Try to reallocate space and retry */ 618 uint32_t dummy; 619 struct jffs2_eraseblock *jeb = &c->blocks[phys_ofs / c->sector_size]; 620 621 retried = 1; 622 623 D1(printk(KERN_DEBUG "Retrying failed write of REF_PRISTINE node.\n")); | 584 ref_offset(raw), je16_to_cpu(node->u.nodetype)); 585 goto bail; 586 } 587 588 nraw = jffs2_alloc_raw_node_ref(); 589 if (!nraw) { 590 ret = -ENOMEM; 591 goto out_node; --- 24 unchanged lines hidden (view full) --- 616 if (!retried && (nraw = jffs2_alloc_raw_node_ref())) { 617 /* Try to reallocate space and retry */ 618 uint32_t dummy; 619 struct jffs2_eraseblock *jeb = &c->blocks[phys_ofs / c->sector_size]; 620 621 retried = 1; 622 623 D1(printk(KERN_DEBUG "Retrying failed write of REF_PRISTINE node.\n")); |
624 | 624 |
625 jffs2_dbg_acct_sanity_check(c,jeb); 626 jffs2_dbg_acct_paranoia_check(c, jeb); 627 628 ret = jffs2_reserve_space_gc(c, rawlen, &phys_ofs, &dummy, rawlen); 629 /* this is not the exact summary size of it, 630 it is only an upper estimation */ 631 632 if (!ret) { --- 31 unchanged lines hidden (view full) --- 664 out_node: 665 kfree(node); 666 return ret; 667 bail: 668 ret = -EBADFD; 669 goto out_node; 670} 671 | 625 jffs2_dbg_acct_sanity_check(c,jeb); 626 jffs2_dbg_acct_paranoia_check(c, jeb); 627 628 ret = jffs2_reserve_space_gc(c, rawlen, &phys_ofs, &dummy, rawlen); 629 /* this is not the exact summary size of it, 630 it is only an upper estimation */ 631 632 if (!ret) { --- 31 unchanged lines hidden (view full) --- 664 out_node: 665 kfree(node); 666 return ret; 667 bail: 668 ret = -EBADFD; 669 goto out_node; 670} 671 |
672static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, | 672static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, |
673 struct jffs2_inode_info *f, struct jffs2_full_dnode *fn) 674{ 675 struct jffs2_full_dnode *new_fn; 676 struct jffs2_raw_inode ri; 677 struct jffs2_node_frag *last_frag; 678 jint16_t dev; 679 char *mdata = NULL, mdatalen = 0; 680 uint32_t alloclen, phys_ofs, ilen; 681 int ret; 682 683 if (S_ISBLK(JFFS2_F_I_MODE(f)) || 684 S_ISCHR(JFFS2_F_I_MODE(f)) ) { 685 /* For these, we don't actually need to read the old node */ 686 /* FIXME: for minor or major > 255. */ | 673 struct jffs2_inode_info *f, struct jffs2_full_dnode *fn) 674{ 675 struct jffs2_full_dnode *new_fn; 676 struct jffs2_raw_inode ri; 677 struct jffs2_node_frag *last_frag; 678 jint16_t dev; 679 char *mdata = NULL, mdatalen = 0; 680 uint32_t alloclen, phys_ofs, ilen; 681 int ret; 682 683 if (S_ISBLK(JFFS2_F_I_MODE(f)) || 684 S_ISCHR(JFFS2_F_I_MODE(f)) ) { 685 /* For these, we don't actually need to read the old node */ 686 /* FIXME: for minor or major > 255. */ |
687 dev = cpu_to_je16(((JFFS2_F_I_RDEV_MAJ(f) << 8) | | 687 dev = cpu_to_je16(((JFFS2_F_I_RDEV_MAJ(f) << 8) | |
688 JFFS2_F_I_RDEV_MIN(f))); 689 mdata = (char *)&dev; 690 mdatalen = sizeof(dev); 691 D1(printk(KERN_DEBUG "jffs2_garbage_collect_metadata(): Writing %d bytes of kdev_t\n", mdatalen)); 692 } else if (S_ISLNK(JFFS2_F_I_MODE(f))) { 693 mdatalen = fn->size; 694 mdata = kmalloc(fn->size, GFP_KERNEL); 695 if (!mdata) { --- 4 unchanged lines hidden (view full) --- 700 if (ret) { 701 printk(KERN_WARNING "read of old metadata failed in jffs2_garbage_collect_metadata(): %d\n", ret); 702 kfree(mdata); 703 return ret; 704 } 705 D1(printk(KERN_DEBUG "jffs2_garbage_collect_metadata(): Writing %d bites of symlink target\n", mdatalen)); 706 707 } | 688 JFFS2_F_I_RDEV_MIN(f))); 689 mdata = (char *)&dev; 690 mdatalen = sizeof(dev); 691 D1(printk(KERN_DEBUG "jffs2_garbage_collect_metadata(): Writing %d bytes of kdev_t\n", mdatalen)); 692 } else if (S_ISLNK(JFFS2_F_I_MODE(f))) { 693 mdatalen = fn->size; 694 mdata = kmalloc(fn->size, GFP_KERNEL); 695 if (!mdata) { --- 4 unchanged lines hidden (view full) --- 700 if (ret) { 701 printk(KERN_WARNING "read of old metadata failed in jffs2_garbage_collect_metadata(): %d\n", ret); 702 kfree(mdata); 703 return ret; 704 } 705 D1(printk(KERN_DEBUG "jffs2_garbage_collect_metadata(): Writing %d bites of symlink target\n", mdatalen)); 706 707 } |
708 | 708 |
709 ret = jffs2_reserve_space_gc(c, sizeof(ri) + mdatalen, &phys_ofs, &alloclen, 710 JFFS2_SUMMARY_INODE_SIZE); 711 if (ret) { 712 printk(KERN_WARNING "jffs2_reserve_space_gc of %zd bytes for garbage_collect_metadata failed: %d\n", 713 sizeof(ri)+ mdatalen, ret); 714 goto out; 715 } | 709 ret = jffs2_reserve_space_gc(c, sizeof(ri) + mdatalen, &phys_ofs, &alloclen, 710 JFFS2_SUMMARY_INODE_SIZE); 711 if (ret) { 712 printk(KERN_WARNING "jffs2_reserve_space_gc of %zd bytes for garbage_collect_metadata failed: %d\n", 713 sizeof(ri)+ mdatalen, ret); 714 goto out; 715 } |
716 | 716 |
717 last_frag = frag_last(&f->fragtree); 718 if (last_frag) 719 /* Fetch the inode length from the fragtree rather then 720 * from i_size since i_size may have not been updated yet */ 721 ilen = last_frag->ofs + last_frag->size; 722 else 723 ilen = JFFS2_F_I_SIZE(f); | 717 last_frag = frag_last(&f->fragtree); 718 if (last_frag) 719 /* Fetch the inode length from the fragtree rather then 720 * from i_size since i_size may have not been updated yet */ 721 ilen = last_frag->ofs + last_frag->size; 722 else 723 ilen = JFFS2_F_I_SIZE(f); |
724 | 724 |
725 memset(&ri, 0, sizeof(ri)); 726 ri.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); 727 ri.nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE); 728 ri.totlen = cpu_to_je32(sizeof(ri) + mdatalen); 729 ri.hdr_crc = cpu_to_je32(crc32(0, &ri, sizeof(struct jffs2_unknown_node)-4)); 730 731 ri.ino = cpu_to_je32(f->inocache->ino); 732 ri.version = cpu_to_je32(++f->highest_version); --- 22 unchanged lines hidden (view full) --- 755 jffs2_free_full_dnode(fn); 756 f->metadata = new_fn; 757 out: 758 if (S_ISLNK(JFFS2_F_I_MODE(f))) 759 kfree(mdata); 760 return ret; 761} 762 | 725 memset(&ri, 0, sizeof(ri)); 726 ri.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); 727 ri.nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE); 728 ri.totlen = cpu_to_je32(sizeof(ri) + mdatalen); 729 ri.hdr_crc = cpu_to_je32(crc32(0, &ri, sizeof(struct jffs2_unknown_node)-4)); 730 731 ri.ino = cpu_to_je32(f->inocache->ino); 732 ri.version = cpu_to_je32(++f->highest_version); --- 22 unchanged lines hidden (view full) --- 755 jffs2_free_full_dnode(fn); 756 f->metadata = new_fn; 757 out: 758 if (S_ISLNK(JFFS2_F_I_MODE(f))) 759 kfree(mdata); 760 return ret; 761} 762 |
763static int jffs2_garbage_collect_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, | 763static int jffs2_garbage_collect_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, |
764 struct jffs2_inode_info *f, struct jffs2_full_dirent *fd) 765{ 766 struct jffs2_full_dirent *new_fd; 767 struct jffs2_raw_dirent rd; 768 uint32_t alloclen, phys_ofs; 769 int ret; 770 771 rd.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); --- 4 unchanged lines hidden (view full) --- 776 777 rd.pino = cpu_to_je32(f->inocache->ino); 778 rd.version = cpu_to_je32(++f->highest_version); 779 rd.ino = cpu_to_je32(fd->ino); 780 /* If the times on this inode were set by explicit utime() they can be different, 781 so refrain from splatting them. */ 782 if (JFFS2_F_I_MTIME(f) == JFFS2_F_I_CTIME(f)) 783 rd.mctime = cpu_to_je32(JFFS2_F_I_MTIME(f)); | 764 struct jffs2_inode_info *f, struct jffs2_full_dirent *fd) 765{ 766 struct jffs2_full_dirent *new_fd; 767 struct jffs2_raw_dirent rd; 768 uint32_t alloclen, phys_ofs; 769 int ret; 770 771 rd.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); --- 4 unchanged lines hidden (view full) --- 776 777 rd.pino = cpu_to_je32(f->inocache->ino); 778 rd.version = cpu_to_je32(++f->highest_version); 779 rd.ino = cpu_to_je32(fd->ino); 780 /* If the times on this inode were set by explicit utime() they can be different, 781 so refrain from splatting them. */ 782 if (JFFS2_F_I_MTIME(f) == JFFS2_F_I_CTIME(f)) 783 rd.mctime = cpu_to_je32(JFFS2_F_I_MTIME(f)); |
784 else | 784 else |
785 rd.mctime = cpu_to_je32(0); 786 rd.type = fd->type; 787 rd.node_crc = cpu_to_je32(crc32(0, &rd, sizeof(rd)-8)); 788 rd.name_crc = cpu_to_je32(crc32(0, fd->name, rd.nsize)); | 785 rd.mctime = cpu_to_je32(0); 786 rd.type = fd->type; 787 rd.node_crc = cpu_to_je32(crc32(0, &rd, sizeof(rd)-8)); 788 rd.name_crc = cpu_to_je32(crc32(0, fd->name, rd.nsize)); |
789 | 789 |
790 ret = jffs2_reserve_space_gc(c, sizeof(rd)+rd.nsize, &phys_ofs, &alloclen, 791 JFFS2_SUMMARY_DIRENT_SIZE(rd.nsize)); 792 if (ret) { 793 printk(KERN_WARNING "jffs2_reserve_space_gc of %zd bytes for garbage_collect_dirent failed: %d\n", 794 sizeof(rd)+rd.nsize, ret); 795 return ret; 796 } 797 new_fd = jffs2_write_dirent(c, f, &rd, fd->name, rd.nsize, phys_ofs, ALLOC_GC); 798 799 if (IS_ERR(new_fd)) { 800 printk(KERN_WARNING "jffs2_write_dirent in garbage_collect_dirent failed: %ld\n", PTR_ERR(new_fd)); 801 return PTR_ERR(new_fd); 802 } 803 jffs2_add_fd_to_list(c, new_fd, &f->dents); 804 return 0; 805} 806 | 790 ret = jffs2_reserve_space_gc(c, sizeof(rd)+rd.nsize, &phys_ofs, &alloclen, 791 JFFS2_SUMMARY_DIRENT_SIZE(rd.nsize)); 792 if (ret) { 793 printk(KERN_WARNING "jffs2_reserve_space_gc of %zd bytes for garbage_collect_dirent failed: %d\n", 794 sizeof(rd)+rd.nsize, ret); 795 return ret; 796 } 797 new_fd = jffs2_write_dirent(c, f, &rd, fd->name, rd.nsize, phys_ofs, ALLOC_GC); 798 799 if (IS_ERR(new_fd)) { 800 printk(KERN_WARNING "jffs2_write_dirent in garbage_collect_dirent failed: %ld\n", PTR_ERR(new_fd)); 801 return PTR_ERR(new_fd); 802 } 803 jffs2_add_fd_to_list(c, new_fd, &f->dents); 804 return 0; 805} 806 |
807static int jffs2_garbage_collect_deletion_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, | 807static int jffs2_garbage_collect_deletion_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, |
808 struct jffs2_inode_info *f, struct jffs2_full_dirent *fd) 809{ 810 struct jffs2_full_dirent **fdp = &f->dents; 811 int found = 0; 812 813 /* On a medium where we can't actually mark nodes obsolete 814 pernamently, such as NAND flash, we need to work out 815 whether this deletion dirent is still needed to actively --- 22 unchanged lines hidden (view full) --- 838 /* We only care about obsolete ones */ 839 if (!(ref_obsolete(raw))) 840 continue; 841 842 /* Any dirent with the same name is going to have the same length... */ 843 if (ref_totlen(c, NULL, raw) != rawlen) 844 continue; 845 | 808 struct jffs2_inode_info *f, struct jffs2_full_dirent *fd) 809{ 810 struct jffs2_full_dirent **fdp = &f->dents; 811 int found = 0; 812 813 /* On a medium where we can't actually mark nodes obsolete 814 pernamently, such as NAND flash, we need to work out 815 whether this deletion dirent is still needed to actively --- 22 unchanged lines hidden (view full) --- 838 /* We only care about obsolete ones */ 839 if (!(ref_obsolete(raw))) 840 continue; 841 842 /* Any dirent with the same name is going to have the same length... */ 843 if (ref_totlen(c, NULL, raw) != rawlen) 844 continue; 845 |
846 /* Doesn't matter if there's one in the same erase block. We're going to | 846 /* Doesn't matter if there's one in the same erase block. We're going to |
847 delete it too at the same time. */ 848 if (SECTOR_ADDR(raw->flash_offset) == SECTOR_ADDR(fd->raw->flash_offset)) 849 continue; 850 851 D1(printk(KERN_DEBUG "Check potential deletion dirent at %08x\n", ref_offset(raw))); 852 853 /* This is an obsolete node belonging to the same directory, and it's of the right 854 length. We need to take a closer look...*/ --- 35 unchanged lines hidden (view full) --- 890 891 return jffs2_garbage_collect_dirent(c, jeb, f, fd); 892 } 893 894 up(&c->erase_free_sem); 895 kfree(rd); 896 } 897 | 847 delete it too at the same time. */ 848 if (SECTOR_ADDR(raw->flash_offset) == SECTOR_ADDR(fd->raw->flash_offset)) 849 continue; 850 851 D1(printk(KERN_DEBUG "Check potential deletion dirent at %08x\n", ref_offset(raw))); 852 853 /* This is an obsolete node belonging to the same directory, and it's of the right 854 length. We need to take a closer look...*/ --- 35 unchanged lines hidden (view full) --- 890 891 return jffs2_garbage_collect_dirent(c, jeb, f, fd); 892 } 893 894 up(&c->erase_free_sem); 895 kfree(rd); 896 } 897 |
898 /* FIXME: If we're deleting a dirent which contains the current mtime and ctime, | 898 /* FIXME: If we're deleting a dirent which contains the current mtime and ctime, |
899 we should update the metadata node with those times accordingly */ 900 901 /* No need for it any more. Just mark it obsolete and remove it from the list */ 902 while (*fdp) { 903 if ((*fdp) == fd) { 904 found = 1; 905 *fdp = fd->next; 906 break; --- 15 unchanged lines hidden (view full) --- 922 struct jffs2_raw_inode ri; 923 struct jffs2_node_frag *frag; 924 struct jffs2_full_dnode *new_fn; 925 uint32_t alloclen, phys_ofs, ilen; 926 int ret; 927 928 D1(printk(KERN_DEBUG "Writing replacement hole node for ino #%u from offset 0x%x to 0x%x\n", 929 f->inocache->ino, start, end)); | 899 we should update the metadata node with those times accordingly */ 900 901 /* No need for it any more. Just mark it obsolete and remove it from the list */ 902 while (*fdp) { 903 if ((*fdp) == fd) { 904 found = 1; 905 *fdp = fd->next; 906 break; --- 15 unchanged lines hidden (view full) --- 922 struct jffs2_raw_inode ri; 923 struct jffs2_node_frag *frag; 924 struct jffs2_full_dnode *new_fn; 925 uint32_t alloclen, phys_ofs, ilen; 926 int ret; 927 928 D1(printk(KERN_DEBUG "Writing replacement hole node for ino #%u from offset 0x%x to 0x%x\n", 929 f->inocache->ino, start, end)); |
930 | 930 |
931 memset(&ri, 0, sizeof(ri)); 932 933 if(fn->frags > 1) { 934 size_t readlen; 935 uint32_t crc; | 931 memset(&ri, 0, sizeof(ri)); 932 933 if(fn->frags > 1) { 934 size_t readlen; 935 uint32_t crc; |
936 /* It's partially obsoleted by a later write. So we have to | 936 /* It's partially obsoleted by a later write. So we have to |
937 write it out again with the _same_ version as before */ 938 ret = jffs2_flash_read(c, ref_offset(fn->raw), sizeof(ri), &readlen, (char *)&ri); 939 if (readlen != sizeof(ri) || ret) { 940 printk(KERN_WARNING "Node read failed in jffs2_garbage_collect_hole. Ret %d, retlen %zd. Data will be lost by writing new hole node\n", ret, readlen); 941 goto fill; 942 } 943 if (je16_to_cpu(ri.nodetype) != JFFS2_NODETYPE_INODE) { 944 printk(KERN_WARNING "jffs2_garbage_collect_hole: Node at 0x%08x had node type 0x%04x instead of JFFS2_NODETYPE_INODE(0x%04x)\n", --- 5 unchanged lines hidden (view full) --- 950 printk(KERN_WARNING "jffs2_garbage_collect_hole: Node at 0x%08x had totlen 0x%x instead of expected 0x%zx\n", 951 ref_offset(fn->raw), 952 je32_to_cpu(ri.totlen), sizeof(ri)); 953 return -EIO; 954 } 955 crc = crc32(0, &ri, sizeof(ri)-8); 956 if (crc != je32_to_cpu(ri.node_crc)) { 957 printk(KERN_WARNING "jffs2_garbage_collect_hole: Node at 0x%08x had CRC 0x%08x which doesn't match calculated CRC 0x%08x\n", | 937 write it out again with the _same_ version as before */ 938 ret = jffs2_flash_read(c, ref_offset(fn->raw), sizeof(ri), &readlen, (char *)&ri); 939 if (readlen != sizeof(ri) || ret) { 940 printk(KERN_WARNING "Node read failed in jffs2_garbage_collect_hole. Ret %d, retlen %zd. Data will be lost by writing new hole node\n", ret, readlen); 941 goto fill; 942 } 943 if (je16_to_cpu(ri.nodetype) != JFFS2_NODETYPE_INODE) { 944 printk(KERN_WARNING "jffs2_garbage_collect_hole: Node at 0x%08x had node type 0x%04x instead of JFFS2_NODETYPE_INODE(0x%04x)\n", --- 5 unchanged lines hidden (view full) --- 950 printk(KERN_WARNING "jffs2_garbage_collect_hole: Node at 0x%08x had totlen 0x%x instead of expected 0x%zx\n", 951 ref_offset(fn->raw), 952 je32_to_cpu(ri.totlen), sizeof(ri)); 953 return -EIO; 954 } 955 crc = crc32(0, &ri, sizeof(ri)-8); 956 if (crc != je32_to_cpu(ri.node_crc)) { 957 printk(KERN_WARNING "jffs2_garbage_collect_hole: Node at 0x%08x had CRC 0x%08x which doesn't match calculated CRC 0x%08x\n", |
958 ref_offset(fn->raw), | 958 ref_offset(fn->raw), |
959 je32_to_cpu(ri.node_crc), crc); 960 /* FIXME: We could possibly deal with this by writing new holes for each frag */ | 959 je32_to_cpu(ri.node_crc), crc); 960 /* FIXME: We could possibly deal with this by writing new holes for each frag */ |
961 printk(KERN_WARNING "Data in the range 0x%08x to 0x%08x of inode #%u will be lost\n", | 961 printk(KERN_WARNING "Data in the range 0x%08x to 0x%08x of inode #%u will be lost\n", |
962 start, end, f->inocache->ino); 963 goto fill; 964 } 965 if (ri.compr != JFFS2_COMPR_ZERO) { 966 printk(KERN_WARNING "jffs2_garbage_collect_hole: Node 0x%08x wasn't a hole node!\n", ref_offset(fn->raw)); | 962 start, end, f->inocache->ino); 963 goto fill; 964 } 965 if (ri.compr != JFFS2_COMPR_ZERO) { 966 printk(KERN_WARNING "jffs2_garbage_collect_hole: Node 0x%08x wasn't a hole node!\n", ref_offset(fn->raw)); |
967 printk(KERN_WARNING "Data in the range 0x%08x to 0x%08x of inode #%u will be lost\n", | 967 printk(KERN_WARNING "Data in the range 0x%08x to 0x%08x of inode #%u will be lost\n", |
968 start, end, f->inocache->ino); 969 goto fill; 970 } 971 } else { 972 fill: 973 ri.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); 974 ri.nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE); 975 ri.totlen = cpu_to_je32(sizeof(ri)); 976 ri.hdr_crc = cpu_to_je32(crc32(0, &ri, sizeof(struct jffs2_unknown_node)-4)); 977 978 ri.ino = cpu_to_je32(f->inocache->ino); 979 ri.version = cpu_to_je32(++f->highest_version); 980 ri.offset = cpu_to_je32(start); 981 ri.dsize = cpu_to_je32(end - start); 982 ri.csize = cpu_to_je32(0); 983 ri.compr = JFFS2_COMPR_ZERO; 984 } | 968 start, end, f->inocache->ino); 969 goto fill; 970 } 971 } else { 972 fill: 973 ri.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); 974 ri.nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE); 975 ri.totlen = cpu_to_je32(sizeof(ri)); 976 ri.hdr_crc = cpu_to_je32(crc32(0, &ri, sizeof(struct jffs2_unknown_node)-4)); 977 978 ri.ino = cpu_to_je32(f->inocache->ino); 979 ri.version = cpu_to_je32(++f->highest_version); 980 ri.offset = cpu_to_je32(start); 981 ri.dsize = cpu_to_je32(end - start); 982 ri.csize = cpu_to_je32(0); 983 ri.compr = JFFS2_COMPR_ZERO; 984 } |
985 | 985 |
986 frag = frag_last(&f->fragtree); 987 if (frag) 988 /* Fetch the inode length from the fragtree rather then 989 * from i_size since i_size may have not been updated yet */ 990 ilen = frag->ofs + frag->size; 991 else 992 ilen = JFFS2_F_I_SIZE(f); 993 --- 25 unchanged lines hidden (view full) --- 1019 if (f->metadata) { 1020 jffs2_mark_node_obsolete(c, f->metadata->raw); 1021 jffs2_free_full_dnode(f->metadata); 1022 f->metadata = NULL; 1023 } 1024 return 0; 1025 } 1026 | 986 frag = frag_last(&f->fragtree); 987 if (frag) 988 /* Fetch the inode length from the fragtree rather then 989 * from i_size since i_size may have not been updated yet */ 990 ilen = frag->ofs + frag->size; 991 else 992 ilen = JFFS2_F_I_SIZE(f); 993 --- 25 unchanged lines hidden (view full) --- 1019 if (f->metadata) { 1020 jffs2_mark_node_obsolete(c, f->metadata->raw); 1021 jffs2_free_full_dnode(f->metadata); 1022 f->metadata = NULL; 1023 } 1024 return 0; 1025 } 1026 |
1027 /* | 1027 /* |
1028 * We should only get here in the case where the node we are 1029 * replacing had more than one frag, so we kept the same version | 1028 * We should only get here in the case where the node we are 1029 * replacing had more than one frag, so we kept the same version |
1030 * number as before. (Except in case of error -- see 'goto fill;' | 1030 * number as before. (Except in case of error -- see 'goto fill;' |
1031 * above.) 1032 */ 1033 D1(if(unlikely(fn->frags <= 1)) { 1034 printk(KERN_WARNING "jffs2_garbage_collect_hole: Replacing fn with %d frag(s) but new ver %d != highest_version %d of ino #%d\n", 1035 fn->frags, je32_to_cpu(ri.version), f->highest_version, 1036 je32_to_cpu(ri.ino)); 1037 }); 1038 1039 /* This is a partially-overlapped hole node. Mark it REF_NORMAL not REF_PRISTINE */ 1040 mark_ref_normal(new_fn->raw); 1041 | 1031 * above.) 1032 */ 1033 D1(if(unlikely(fn->frags <= 1)) { 1034 printk(KERN_WARNING "jffs2_garbage_collect_hole: Replacing fn with %d frag(s) but new ver %d != highest_version %d of ino #%d\n", 1035 fn->frags, je32_to_cpu(ri.version), f->highest_version, 1036 je32_to_cpu(ri.ino)); 1037 }); 1038 1039 /* This is a partially-overlapped hole node. Mark it REF_NORMAL not REF_PRISTINE */ 1040 mark_ref_normal(new_fn->raw); 1041 |
1042 for (frag = jffs2_lookup_node_frag(&f->fragtree, fn->ofs); | 1042 for (frag = jffs2_lookup_node_frag(&f->fragtree, fn->ofs); |
1043 frag; frag = frag_next(frag)) { 1044 if (frag->ofs > fn->size + fn->ofs) 1045 break; 1046 if (frag->node == fn) { 1047 frag->node = new_fn; 1048 new_fn->frags++; 1049 fn->frags--; 1050 } 1051 } 1052 if (fn->frags) { 1053 printk(KERN_WARNING "jffs2_garbage_collect_hole: Old node still has frags!\n"); 1054 BUG(); 1055 } 1056 if (!new_fn->frags) { 1057 printk(KERN_WARNING "jffs2_garbage_collect_hole: New node has no frags!\n"); 1058 BUG(); 1059 } | 1043 frag; frag = frag_next(frag)) { 1044 if (frag->ofs > fn->size + fn->ofs) 1045 break; 1046 if (frag->node == fn) { 1047 frag->node = new_fn; 1048 new_fn->frags++; 1049 fn->frags--; 1050 } 1051 } 1052 if (fn->frags) { 1053 printk(KERN_WARNING "jffs2_garbage_collect_hole: Old node still has frags!\n"); 1054 BUG(); 1055 } 1056 if (!new_fn->frags) { 1057 printk(KERN_WARNING "jffs2_garbage_collect_hole: New node has no frags!\n"); 1058 BUG(); 1059 } |
1060 | 1060 |
1061 jffs2_mark_node_obsolete(c, fn->raw); 1062 jffs2_free_full_dnode(fn); | 1061 jffs2_mark_node_obsolete(c, fn->raw); 1062 jffs2_free_full_dnode(fn); |
1063 | 1063 |
1064 return 0; 1065} 1066 1067static int jffs2_garbage_collect_dnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, 1068 struct jffs2_inode_info *f, struct jffs2_full_dnode *fn, 1069 uint32_t start, uint32_t end) 1070{ 1071 struct jffs2_full_dnode *new_fn; 1072 struct jffs2_raw_inode ri; | 1064 return 0; 1065} 1066 1067static int jffs2_garbage_collect_dnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, 1068 struct jffs2_inode_info *f, struct jffs2_full_dnode *fn, 1069 uint32_t start, uint32_t end) 1070{ 1071 struct jffs2_full_dnode *new_fn; 1072 struct jffs2_raw_inode ri; |
1073 uint32_t alloclen, phys_ofs, offset, orig_end, orig_start; | 1073 uint32_t alloclen, phys_ofs, offset, orig_end, orig_start; |
1074 int ret = 0; 1075 unsigned char *comprbuf = NULL, *writebuf; 1076 unsigned long pg; 1077 unsigned char *pg_ptr; | 1074 int ret = 0; 1075 unsigned char *comprbuf = NULL, *writebuf; 1076 unsigned long pg; 1077 unsigned char *pg_ptr; |
1078 | 1078 |
1079 memset(&ri, 0, sizeof(ri)); 1080 1081 D1(printk(KERN_DEBUG "Writing replacement dnode for ino #%u from offset 0x%x to 0x%x\n", 1082 f->inocache->ino, start, end)); 1083 1084 orig_end = end; 1085 orig_start = start; 1086 1087 if (c->nr_free_blocks + c->nr_erasing_blocks > c->resv_blocks_gcmerge) { 1088 /* Attempt to do some merging. But only expand to cover logically 1089 adjacent frags if the block containing them is already considered | 1079 memset(&ri, 0, sizeof(ri)); 1080 1081 D1(printk(KERN_DEBUG "Writing replacement dnode for ino #%u from offset 0x%x to 0x%x\n", 1082 f->inocache->ino, start, end)); 1083 1084 orig_end = end; 1085 orig_start = start; 1086 1087 if (c->nr_free_blocks + c->nr_erasing_blocks > c->resv_blocks_gcmerge) { 1088 /* Attempt to do some merging. But only expand to cover logically 1089 adjacent frags if the block containing them is already considered |
1090 to be dirty. Otherwise we end up with GC just going round in 1091 circles dirtying the nodes it already wrote out, especially | 1090 to be dirty. Otherwise we end up with GC just going round in 1091 circles dirtying the nodes it already wrote out, especially |
1092 on NAND where we have small eraseblocks and hence a much higher 1093 chance of nodes having to be split to cross boundaries. */ 1094 1095 struct jffs2_node_frag *frag; 1096 uint32_t min, max; 1097 1098 min = start & ~(PAGE_CACHE_SIZE-1); 1099 max = min + PAGE_CACHE_SIZE; --- 17 unchanged lines hidden (view full) --- 1117 } 1118 /* OK. This frag holds the first byte of the page. */ 1119 if (!frag->node || !frag->node->raw) { 1120 D1(printk(KERN_DEBUG "First frag in page is hole (0x%x-0x%x). Not expanding down.\n", 1121 frag->ofs, frag->ofs+frag->size)); 1122 break; 1123 } else { 1124 | 1092 on NAND where we have small eraseblocks and hence a much higher 1093 chance of nodes having to be split to cross boundaries. */ 1094 1095 struct jffs2_node_frag *frag; 1096 uint32_t min, max; 1097 1098 min = start & ~(PAGE_CACHE_SIZE-1); 1099 max = min + PAGE_CACHE_SIZE; --- 17 unchanged lines hidden (view full) --- 1117 } 1118 /* OK. This frag holds the first byte of the page. */ 1119 if (!frag->node || !frag->node->raw) { 1120 D1(printk(KERN_DEBUG "First frag in page is hole (0x%x-0x%x). Not expanding down.\n", 1121 frag->ofs, frag->ofs+frag->size)); 1122 break; 1123 } else { 1124 |
1125 /* OK, it's a frag which extends to the beginning of the page. Does it live | 1125 /* OK, it's a frag which extends to the beginning of the page. Does it live |
1126 in a block which is still considered clean? If so, don't obsolete it. 1127 If not, cover it anyway. */ 1128 1129 struct jffs2_raw_node_ref *raw = frag->node->raw; 1130 struct jffs2_eraseblock *jeb; 1131 1132 jeb = &c->blocks[raw->flash_offset / c->sector_size]; 1133 --- 33 unchanged lines hidden (view full) --- 1167 } 1168 1169 if (!frag->node || !frag->node->raw) { 1170 D1(printk(KERN_DEBUG "Last frag in page is hole (0x%x-0x%x). Not expanding up.\n", 1171 frag->ofs, frag->ofs+frag->size)); 1172 break; 1173 } else { 1174 | 1126 in a block which is still considered clean? If so, don't obsolete it. 1127 If not, cover it anyway. */ 1128 1129 struct jffs2_raw_node_ref *raw = frag->node->raw; 1130 struct jffs2_eraseblock *jeb; 1131 1132 jeb = &c->blocks[raw->flash_offset / c->sector_size]; 1133 --- 33 unchanged lines hidden (view full) --- 1167 } 1168 1169 if (!frag->node || !frag->node->raw) { 1170 D1(printk(KERN_DEBUG "Last frag in page is hole (0x%x-0x%x). Not expanding up.\n", 1171 frag->ofs, frag->ofs+frag->size)); 1172 break; 1173 } else { 1174 |
1175 /* OK, it's a frag which extends to the beginning of the page. Does it live | 1175 /* OK, it's a frag which extends to the beginning of the page. Does it live |
1176 in a block which is still considered clean? If so, don't obsolete it. 1177 If not, cover it anyway. */ 1178 1179 struct jffs2_raw_node_ref *raw = frag->node->raw; 1180 struct jffs2_eraseblock *jeb; 1181 1182 jeb = &c->blocks[raw->flash_offset / c->sector_size]; 1183 --- 10 unchanged lines hidden (view full) --- 1194 } 1195 1196 D1(printk(KERN_DEBUG "Expanding up to cover frag (0x%x-0x%x) in dirty block %08x\n", 1197 frag->ofs, frag->ofs+frag->size, jeb->offset)); 1198 end = frag->ofs + frag->size; 1199 break; 1200 } 1201 } | 1176 in a block which is still considered clean? If so, don't obsolete it. 1177 If not, cover it anyway. */ 1178 1179 struct jffs2_raw_node_ref *raw = frag->node->raw; 1180 struct jffs2_eraseblock *jeb; 1181 1182 jeb = &c->blocks[raw->flash_offset / c->sector_size]; 1183 --- 10 unchanged lines hidden (view full) --- 1194 } 1195 1196 D1(printk(KERN_DEBUG "Expanding up to cover frag (0x%x-0x%x) in dirty block %08x\n", 1197 frag->ofs, frag->ofs+frag->size, jeb->offset)); 1198 end = frag->ofs + frag->size; 1199 break; 1200 } 1201 } |
1202 D1(printk(KERN_DEBUG "Expanded dnode to write from (0x%x-0x%x) to (0x%x-0x%x)\n", | 1202 D1(printk(KERN_DEBUG "Expanded dnode to write from (0x%x-0x%x) to (0x%x-0x%x)\n", |
1203 orig_start, orig_end, start, end)); 1204 1205 D1(BUG_ON(end > frag_last(&f->fragtree)->ofs + frag_last(&f->fragtree)->size)); 1206 BUG_ON(end < orig_end); 1207 BUG_ON(start > orig_start); 1208 } | 1203 orig_start, orig_end, start, end)); 1204 1205 D1(BUG_ON(end > frag_last(&f->fragtree)->ofs + frag_last(&f->fragtree)->size)); 1206 BUG_ON(end < orig_end); 1207 BUG_ON(start > orig_start); 1208 } |
1209 | 1209 |
1210 /* First, use readpage() to read the appropriate page into the page cache */ 1211 /* Q: What happens if we actually try to GC the _same_ page for which commit_write() 1212 * triggered garbage collection in the first place? 1213 * A: I _think_ it's OK. read_cache_page shouldn't deadlock, we'll write out the 1214 * page OK. We'll actually write it out again in commit_write, which is a little 1215 * suboptimal, but at least we're correct. 1216 */ 1217 pg_ptr = jffs2_gc_fetch_page(c, f, start, &pg); --- 40 unchanged lines hidden (view full) --- 1258 ri.mtime = cpu_to_je32(JFFS2_F_I_MTIME(f)); 1259 ri.offset = cpu_to_je32(offset); 1260 ri.csize = cpu_to_je32(cdatalen); 1261 ri.dsize = cpu_to_je32(datalen); 1262 ri.compr = comprtype & 0xff; 1263 ri.usercompr = (comprtype >> 8) & 0xff; 1264 ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8)); 1265 ri.data_crc = cpu_to_je32(crc32(0, comprbuf, cdatalen)); | 1210 /* First, use readpage() to read the appropriate page into the page cache */ 1211 /* Q: What happens if we actually try to GC the _same_ page for which commit_write() 1212 * triggered garbage collection in the first place? 1213 * A: I _think_ it's OK. read_cache_page shouldn't deadlock, we'll write out the 1214 * page OK. We'll actually write it out again in commit_write, which is a little 1215 * suboptimal, but at least we're correct. 1216 */ 1217 pg_ptr = jffs2_gc_fetch_page(c, f, start, &pg); --- 40 unchanged lines hidden (view full) --- 1258 ri.mtime = cpu_to_je32(JFFS2_F_I_MTIME(f)); 1259 ri.offset = cpu_to_je32(offset); 1260 ri.csize = cpu_to_je32(cdatalen); 1261 ri.dsize = cpu_to_je32(datalen); 1262 ri.compr = comprtype & 0xff; 1263 ri.usercompr = (comprtype >> 8) & 0xff; 1264 ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8)); 1265 ri.data_crc = cpu_to_je32(crc32(0, comprbuf, cdatalen)); |
1266 | 1266 |
1267 new_fn = jffs2_write_dnode(c, f, &ri, comprbuf, cdatalen, phys_ofs, ALLOC_GC); 1268 1269 jffs2_free_comprbuf(comprbuf, writebuf); 1270 1271 if (IS_ERR(new_fn)) { 1272 printk(KERN_WARNING "Error writing new dnode: %ld\n", PTR_ERR(new_fn)); 1273 ret = PTR_ERR(new_fn); 1274 break; --- 13 unchanged lines hidden --- | 1267 new_fn = jffs2_write_dnode(c, f, &ri, comprbuf, cdatalen, phys_ofs, ALLOC_GC); 1268 1269 jffs2_free_comprbuf(comprbuf, writebuf); 1270 1271 if (IS_ERR(new_fn)) { 1272 printk(KERN_WARNING "Error writing new dnode: %ld\n", PTR_ERR(new_fn)); 1273 ret = PTR_ERR(new_fn); 1274 break; --- 13 unchanged lines hidden --- |