1*1da177e4SLinus Torvalds /* 2*1da177e4SLinus Torvalds * JFFS2 -- Journalling Flash File System, Version 2. 3*1da177e4SLinus Torvalds * 4*1da177e4SLinus Torvalds * Copyright (C) 2001-2003 Red Hat, Inc. 5*1da177e4SLinus Torvalds * 6*1da177e4SLinus Torvalds * Created by David Woodhouse <dwmw2@infradead.org> 7*1da177e4SLinus Torvalds * 8*1da177e4SLinus Torvalds * For licensing information, see the file 'LICENCE' in this directory. 9*1da177e4SLinus Torvalds * 10*1da177e4SLinus Torvalds * $Id: gc.c,v 1.144 2004/12/21 11:18:50 dwmw2 Exp $ 11*1da177e4SLinus Torvalds * 12*1da177e4SLinus Torvalds */ 13*1da177e4SLinus Torvalds 14*1da177e4SLinus Torvalds #include <linux/kernel.h> 15*1da177e4SLinus Torvalds #include <linux/mtd/mtd.h> 16*1da177e4SLinus Torvalds #include <linux/slab.h> 17*1da177e4SLinus Torvalds #include <linux/pagemap.h> 18*1da177e4SLinus Torvalds #include <linux/crc32.h> 19*1da177e4SLinus Torvalds #include <linux/compiler.h> 20*1da177e4SLinus Torvalds #include <linux/stat.h> 21*1da177e4SLinus Torvalds #include "nodelist.h" 22*1da177e4SLinus Torvalds #include "compr.h" 23*1da177e4SLinus Torvalds 24*1da177e4SLinus Torvalds static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c, 25*1da177e4SLinus Torvalds struct jffs2_inode_cache *ic, 26*1da177e4SLinus Torvalds struct jffs2_raw_node_ref *raw); 27*1da177e4SLinus Torvalds static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, 28*1da177e4SLinus Torvalds struct jffs2_inode_info *f, struct jffs2_full_dnode *fd); 29*1da177e4SLinus Torvalds static int jffs2_garbage_collect_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, 30*1da177e4SLinus Torvalds struct jffs2_inode_info *f, struct jffs2_full_dirent *fd); 31*1da177e4SLinus Torvalds static int jffs2_garbage_collect_deletion_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, 32*1da177e4SLinus Torvalds struct jffs2_inode_info *f, struct jffs2_full_dirent *fd); 33*1da177e4SLinus Torvalds static int jffs2_garbage_collect_hole(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, 34*1da177e4SLinus Torvalds struct jffs2_inode_info *f, struct jffs2_full_dnode *fn, 35*1da177e4SLinus Torvalds uint32_t start, uint32_t end); 36*1da177e4SLinus Torvalds static int jffs2_garbage_collect_dnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, 37*1da177e4SLinus Torvalds struct jffs2_inode_info *f, struct jffs2_full_dnode *fn, 38*1da177e4SLinus Torvalds uint32_t start, uint32_t end); 39*1da177e4SLinus Torvalds static int jffs2_garbage_collect_live(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, 40*1da177e4SLinus Torvalds struct jffs2_raw_node_ref *raw, struct jffs2_inode_info *f); 41*1da177e4SLinus Torvalds 42*1da177e4SLinus Torvalds /* Called with erase_completion_lock held */ 43*1da177e4SLinus Torvalds static struct jffs2_eraseblock *jffs2_find_gc_block(struct jffs2_sb_info *c) 44*1da177e4SLinus Torvalds { 45*1da177e4SLinus Torvalds struct jffs2_eraseblock *ret; 46*1da177e4SLinus Torvalds struct list_head *nextlist = NULL; 47*1da177e4SLinus Torvalds int n = jiffies % 128; 48*1da177e4SLinus Torvalds 49*1da177e4SLinus Torvalds /* Pick an eraseblock to garbage collect next. This is where we'll 50*1da177e4SLinus Torvalds put the clever wear-levelling algorithms. Eventually. */ 51*1da177e4SLinus Torvalds /* We possibly want to favour the dirtier blocks more when the 52*1da177e4SLinus Torvalds number of free blocks is low. */ 53*1da177e4SLinus Torvalds if (!list_empty(&c->bad_used_list) && c->nr_free_blocks > c->resv_blocks_gcbad) { 54*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Picking block from bad_used_list to GC next\n")); 55*1da177e4SLinus Torvalds nextlist = &c->bad_used_list; 56*1da177e4SLinus Torvalds } else if (n < 50 && !list_empty(&c->erasable_list)) { 57*1da177e4SLinus Torvalds /* Note that most of them will have gone directly to be erased. 58*1da177e4SLinus Torvalds So don't favour the erasable_list _too_ much. */ 59*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Picking block from erasable_list to GC next\n")); 60*1da177e4SLinus Torvalds nextlist = &c->erasable_list; 61*1da177e4SLinus Torvalds } else if (n < 110 && !list_empty(&c->very_dirty_list)) { 62*1da177e4SLinus Torvalds /* Most of the time, pick one off the very_dirty list */ 63*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Picking block from very_dirty_list to GC next\n")); 64*1da177e4SLinus Torvalds nextlist = &c->very_dirty_list; 65*1da177e4SLinus Torvalds } else if (n < 126 && !list_empty(&c->dirty_list)) { 66*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Picking block from dirty_list to GC next\n")); 67*1da177e4SLinus Torvalds nextlist = &c->dirty_list; 68*1da177e4SLinus Torvalds } else if (!list_empty(&c->clean_list)) { 69*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Picking block from clean_list to GC next\n")); 70*1da177e4SLinus Torvalds nextlist = &c->clean_list; 71*1da177e4SLinus Torvalds } else if (!list_empty(&c->dirty_list)) { 72*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Picking block from dirty_list to GC next (clean_list was empty)\n")); 73*1da177e4SLinus Torvalds 74*1da177e4SLinus Torvalds nextlist = &c->dirty_list; 75*1da177e4SLinus Torvalds } else if (!list_empty(&c->very_dirty_list)) { 76*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Picking block from very_dirty_list to GC next (clean_list and dirty_list were empty)\n")); 77*1da177e4SLinus Torvalds nextlist = &c->very_dirty_list; 78*1da177e4SLinus Torvalds } else if (!list_empty(&c->erasable_list)) { 79*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Picking block from erasable_list to GC next (clean_list and {very_,}dirty_list were empty)\n")); 80*1da177e4SLinus Torvalds 81*1da177e4SLinus Torvalds nextlist = &c->erasable_list; 82*1da177e4SLinus Torvalds } else { 83*1da177e4SLinus Torvalds /* Eep. All were empty */ 84*1da177e4SLinus Torvalds D1(printk(KERN_NOTICE "jffs2: No clean, dirty _or_ erasable blocks to GC from! Where are they all?\n")); 85*1da177e4SLinus Torvalds return NULL; 86*1da177e4SLinus Torvalds } 87*1da177e4SLinus Torvalds 88*1da177e4SLinus Torvalds ret = list_entry(nextlist->next, struct jffs2_eraseblock, list); 89*1da177e4SLinus Torvalds list_del(&ret->list); 90*1da177e4SLinus Torvalds c->gcblock = ret; 91*1da177e4SLinus Torvalds ret->gc_node = ret->first_node; 92*1da177e4SLinus Torvalds if (!ret->gc_node) { 93*1da177e4SLinus Torvalds printk(KERN_WARNING "Eep. ret->gc_node for block at 0x%08x is NULL\n", ret->offset); 94*1da177e4SLinus Torvalds BUG(); 95*1da177e4SLinus Torvalds } 96*1da177e4SLinus Torvalds 97*1da177e4SLinus Torvalds /* Have we accidentally picked a clean block with wasted space ? */ 98*1da177e4SLinus Torvalds if (ret->wasted_size) { 99*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Converting wasted_size %08x to dirty_size\n", ret->wasted_size)); 100*1da177e4SLinus Torvalds ret->dirty_size += ret->wasted_size; 101*1da177e4SLinus Torvalds c->wasted_size -= ret->wasted_size; 102*1da177e4SLinus Torvalds c->dirty_size += ret->wasted_size; 103*1da177e4SLinus Torvalds ret->wasted_size = 0; 104*1da177e4SLinus Torvalds } 105*1da177e4SLinus Torvalds 106*1da177e4SLinus Torvalds D2(jffs2_dump_block_lists(c)); 107*1da177e4SLinus Torvalds return ret; 108*1da177e4SLinus Torvalds } 109*1da177e4SLinus Torvalds 110*1da177e4SLinus Torvalds /* jffs2_garbage_collect_pass 111*1da177e4SLinus Torvalds * Make a single attempt to progress GC. Move one node, and possibly 112*1da177e4SLinus Torvalds * start erasing one eraseblock. 113*1da177e4SLinus Torvalds */ 114*1da177e4SLinus Torvalds int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) 115*1da177e4SLinus Torvalds { 116*1da177e4SLinus Torvalds struct jffs2_inode_info *f; 117*1da177e4SLinus Torvalds struct jffs2_inode_cache *ic; 118*1da177e4SLinus Torvalds struct jffs2_eraseblock *jeb; 119*1da177e4SLinus Torvalds struct jffs2_raw_node_ref *raw; 120*1da177e4SLinus Torvalds int ret = 0, inum, nlink; 121*1da177e4SLinus Torvalds 122*1da177e4SLinus Torvalds if (down_interruptible(&c->alloc_sem)) 123*1da177e4SLinus Torvalds return -EINTR; 124*1da177e4SLinus Torvalds 125*1da177e4SLinus Torvalds for (;;) { 126*1da177e4SLinus Torvalds spin_lock(&c->erase_completion_lock); 127*1da177e4SLinus Torvalds if (!c->unchecked_size) 128*1da177e4SLinus Torvalds break; 129*1da177e4SLinus Torvalds 130*1da177e4SLinus Torvalds /* We can't start doing GC yet. We haven't finished checking 131*1da177e4SLinus Torvalds the node CRCs etc. Do it now. */ 132*1da177e4SLinus Torvalds 133*1da177e4SLinus Torvalds /* checked_ino is protected by the alloc_sem */ 134*1da177e4SLinus Torvalds if (c->checked_ino > c->highest_ino) { 135*1da177e4SLinus Torvalds printk(KERN_CRIT "Checked all inodes but still 0x%x bytes of unchecked space?\n", 136*1da177e4SLinus Torvalds c->unchecked_size); 137*1da177e4SLinus Torvalds D2(jffs2_dump_block_lists(c)); 138*1da177e4SLinus Torvalds spin_unlock(&c->erase_completion_lock); 139*1da177e4SLinus Torvalds BUG(); 140*1da177e4SLinus Torvalds } 141*1da177e4SLinus Torvalds 142*1da177e4SLinus Torvalds spin_unlock(&c->erase_completion_lock); 143*1da177e4SLinus Torvalds 144*1da177e4SLinus Torvalds spin_lock(&c->inocache_lock); 145*1da177e4SLinus Torvalds 146*1da177e4SLinus Torvalds ic = jffs2_get_ino_cache(c, c->checked_ino++); 147*1da177e4SLinus Torvalds 148*1da177e4SLinus Torvalds if (!ic) { 149*1da177e4SLinus Torvalds spin_unlock(&c->inocache_lock); 150*1da177e4SLinus Torvalds continue; 151*1da177e4SLinus Torvalds } 152*1da177e4SLinus Torvalds 153*1da177e4SLinus Torvalds if (!ic->nlink) { 154*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Skipping check of ino #%d with nlink zero\n", 155*1da177e4SLinus Torvalds ic->ino)); 156*1da177e4SLinus Torvalds spin_unlock(&c->inocache_lock); 157*1da177e4SLinus Torvalds continue; 158*1da177e4SLinus Torvalds } 159*1da177e4SLinus Torvalds switch(ic->state) { 160*1da177e4SLinus Torvalds case INO_STATE_CHECKEDABSENT: 161*1da177e4SLinus Torvalds case INO_STATE_PRESENT: 162*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Skipping ino #%u already checked\n", ic->ino)); 163*1da177e4SLinus Torvalds spin_unlock(&c->inocache_lock); 164*1da177e4SLinus Torvalds continue; 165*1da177e4SLinus Torvalds 166*1da177e4SLinus Torvalds case INO_STATE_GC: 167*1da177e4SLinus Torvalds case INO_STATE_CHECKING: 168*1da177e4SLinus Torvalds printk(KERN_WARNING "Inode #%u is in state %d during CRC check phase!\n", ic->ino, ic->state); 169*1da177e4SLinus Torvalds spin_unlock(&c->inocache_lock); 170*1da177e4SLinus Torvalds BUG(); 171*1da177e4SLinus Torvalds 172*1da177e4SLinus Torvalds case INO_STATE_READING: 173*1da177e4SLinus Torvalds /* We need to wait for it to finish, lest we move on 174*1da177e4SLinus Torvalds and trigger the BUG() above while we haven't yet 175*1da177e4SLinus Torvalds finished checking all its nodes */ 176*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Waiting for ino #%u to finish reading\n", ic->ino)); 177*1da177e4SLinus Torvalds up(&c->alloc_sem); 178*1da177e4SLinus Torvalds sleep_on_spinunlock(&c->inocache_wq, &c->inocache_lock); 179*1da177e4SLinus Torvalds return 0; 180*1da177e4SLinus Torvalds 181*1da177e4SLinus Torvalds default: 182*1da177e4SLinus Torvalds BUG(); 183*1da177e4SLinus Torvalds 184*1da177e4SLinus Torvalds case INO_STATE_UNCHECKED: 185*1da177e4SLinus Torvalds ; 186*1da177e4SLinus Torvalds } 187*1da177e4SLinus Torvalds ic->state = INO_STATE_CHECKING; 188*1da177e4SLinus Torvalds spin_unlock(&c->inocache_lock); 189*1da177e4SLinus Torvalds 190*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "jffs2_garbage_collect_pass() triggering inode scan of ino#%u\n", ic->ino)); 191*1da177e4SLinus Torvalds 192*1da177e4SLinus Torvalds ret = jffs2_do_crccheck_inode(c, ic); 193*1da177e4SLinus Torvalds if (ret) 194*1da177e4SLinus Torvalds printk(KERN_WARNING "Returned error for crccheck of ino #%u. Expect badness...\n", ic->ino); 195*1da177e4SLinus Torvalds 196*1da177e4SLinus Torvalds jffs2_set_inocache_state(c, ic, INO_STATE_CHECKEDABSENT); 197*1da177e4SLinus Torvalds up(&c->alloc_sem); 198*1da177e4SLinus Torvalds return ret; 199*1da177e4SLinus Torvalds } 200*1da177e4SLinus Torvalds 201*1da177e4SLinus Torvalds /* First, work out which block we're garbage-collecting */ 202*1da177e4SLinus Torvalds jeb = c->gcblock; 203*1da177e4SLinus Torvalds 204*1da177e4SLinus Torvalds if (!jeb) 205*1da177e4SLinus Torvalds jeb = jffs2_find_gc_block(c); 206*1da177e4SLinus Torvalds 207*1da177e4SLinus Torvalds if (!jeb) { 208*1da177e4SLinus Torvalds D1 (printk(KERN_NOTICE "jffs2: Couldn't find erase block to garbage collect!\n")); 209*1da177e4SLinus Torvalds spin_unlock(&c->erase_completion_lock); 210*1da177e4SLinus Torvalds up(&c->alloc_sem); 211*1da177e4SLinus Torvalds return -EIO; 212*1da177e4SLinus Torvalds } 213*1da177e4SLinus Torvalds 214*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "GC from block %08x, used_size %08x, dirty_size %08x, free_size %08x\n", jeb->offset, jeb->used_size, jeb->dirty_size, jeb->free_size)); 215*1da177e4SLinus Torvalds D1(if (c->nextblock) 216*1da177e4SLinus Torvalds 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)); 217*1da177e4SLinus Torvalds 218*1da177e4SLinus Torvalds if (!jeb->used_size) { 219*1da177e4SLinus Torvalds up(&c->alloc_sem); 220*1da177e4SLinus Torvalds goto eraseit; 221*1da177e4SLinus Torvalds } 222*1da177e4SLinus Torvalds 223*1da177e4SLinus Torvalds raw = jeb->gc_node; 224*1da177e4SLinus Torvalds 225*1da177e4SLinus Torvalds while(ref_obsolete(raw)) { 226*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Node at 0x%08x is obsolete... skipping\n", ref_offset(raw))); 227*1da177e4SLinus Torvalds raw = raw->next_phys; 228*1da177e4SLinus Torvalds if (unlikely(!raw)) { 229*1da177e4SLinus Torvalds printk(KERN_WARNING "eep. End of raw list while still supposedly nodes to GC\n"); 230*1da177e4SLinus Torvalds printk(KERN_WARNING "erase block at 0x%08x. free_size 0x%08x, dirty_size 0x%08x, used_size 0x%08x\n", 231*1da177e4SLinus Torvalds jeb->offset, jeb->free_size, jeb->dirty_size, jeb->used_size); 232*1da177e4SLinus Torvalds jeb->gc_node = raw; 233*1da177e4SLinus Torvalds spin_unlock(&c->erase_completion_lock); 234*1da177e4SLinus Torvalds up(&c->alloc_sem); 235*1da177e4SLinus Torvalds BUG(); 236*1da177e4SLinus Torvalds } 237*1da177e4SLinus Torvalds } 238*1da177e4SLinus Torvalds jeb->gc_node = raw; 239*1da177e4SLinus Torvalds 240*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Going to garbage collect node at 0x%08x\n", ref_offset(raw))); 241*1da177e4SLinus Torvalds 242*1da177e4SLinus Torvalds if (!raw->next_in_ino) { 243*1da177e4SLinus Torvalds /* Inode-less node. Clean marker, snapshot or something like that */ 244*1da177e4SLinus Torvalds /* FIXME: If it's something that needs to be copied, including something 245*1da177e4SLinus Torvalds we don't grok that has JFFS2_NODETYPE_RWCOMPAT_COPY, we should do so */ 246*1da177e4SLinus Torvalds spin_unlock(&c->erase_completion_lock); 247*1da177e4SLinus Torvalds jffs2_mark_node_obsolete(c, raw); 248*1da177e4SLinus Torvalds up(&c->alloc_sem); 249*1da177e4SLinus Torvalds goto eraseit_lock; 250*1da177e4SLinus Torvalds } 251*1da177e4SLinus Torvalds 252*1da177e4SLinus Torvalds ic = jffs2_raw_ref_to_ic(raw); 253*1da177e4SLinus Torvalds 254*1da177e4SLinus Torvalds /* We need to hold the inocache. Either the erase_completion_lock or 255*1da177e4SLinus Torvalds the inocache_lock are sufficient; we trade down since the inocache_lock 256*1da177e4SLinus Torvalds causes less contention. */ 257*1da177e4SLinus Torvalds spin_lock(&c->inocache_lock); 258*1da177e4SLinus Torvalds 259*1da177e4SLinus Torvalds spin_unlock(&c->erase_completion_lock); 260*1da177e4SLinus Torvalds 261*1da177e4SLinus Torvalds 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)); 262*1da177e4SLinus Torvalds 263*1da177e4SLinus Torvalds /* Three possibilities: 264*1da177e4SLinus Torvalds 1. Inode is already in-core. We must iget it and do proper 265*1da177e4SLinus Torvalds updating to its fragtree, etc. 266*1da177e4SLinus Torvalds 2. Inode is not in-core, node is REF_PRISTINE. We lock the 267*1da177e4SLinus Torvalds inocache to prevent a read_inode(), copy the node intact. 268*1da177e4SLinus Torvalds 3. Inode is not in-core, node is not pristine. We must iget() 269*1da177e4SLinus Torvalds and take the slow path. 270*1da177e4SLinus Torvalds */ 271*1da177e4SLinus Torvalds 272*1da177e4SLinus Torvalds switch(ic->state) { 273*1da177e4SLinus Torvalds case INO_STATE_CHECKEDABSENT: 274*1da177e4SLinus Torvalds /* It's been checked, but it's not currently in-core. 275*1da177e4SLinus Torvalds We can just copy any pristine nodes, but have 276*1da177e4SLinus Torvalds to prevent anyone else from doing read_inode() while 277*1da177e4SLinus Torvalds we're at it, so we set the state accordingly */ 278*1da177e4SLinus Torvalds if (ref_flags(raw) == REF_PRISTINE) 279*1da177e4SLinus Torvalds ic->state = INO_STATE_GC; 280*1da177e4SLinus Torvalds else { 281*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Ino #%u is absent but node not REF_PRISTINE. Reading.\n", 282*1da177e4SLinus Torvalds ic->ino)); 283*1da177e4SLinus Torvalds } 284*1da177e4SLinus Torvalds break; 285*1da177e4SLinus Torvalds 286*1da177e4SLinus Torvalds case INO_STATE_PRESENT: 287*1da177e4SLinus Torvalds /* It's in-core. GC must iget() it. */ 288*1da177e4SLinus Torvalds break; 289*1da177e4SLinus Torvalds 290*1da177e4SLinus Torvalds case INO_STATE_UNCHECKED: 291*1da177e4SLinus Torvalds case INO_STATE_CHECKING: 292*1da177e4SLinus Torvalds case INO_STATE_GC: 293*1da177e4SLinus Torvalds /* Should never happen. We should have finished checking 294*1da177e4SLinus Torvalds by the time we actually start doing any GC, and since 295*1da177e4SLinus Torvalds we're holding the alloc_sem, no other garbage collection 296*1da177e4SLinus Torvalds can happen. 297*1da177e4SLinus Torvalds */ 298*1da177e4SLinus Torvalds printk(KERN_CRIT "Inode #%u already in state %d in jffs2_garbage_collect_pass()!\n", 299*1da177e4SLinus Torvalds ic->ino, ic->state); 300*1da177e4SLinus Torvalds up(&c->alloc_sem); 301*1da177e4SLinus Torvalds spin_unlock(&c->inocache_lock); 302*1da177e4SLinus Torvalds BUG(); 303*1da177e4SLinus Torvalds 304*1da177e4SLinus Torvalds case INO_STATE_READING: 305*1da177e4SLinus Torvalds /* Someone's currently trying to read it. We must wait for 306*1da177e4SLinus Torvalds them to finish and then go through the full iget() route 307*1da177e4SLinus Torvalds to do the GC. However, sometimes read_inode() needs to get 308*1da177e4SLinus Torvalds the alloc_sem() (for marking nodes invalid) so we must 309*1da177e4SLinus Torvalds drop the alloc_sem before sleeping. */ 310*1da177e4SLinus Torvalds 311*1da177e4SLinus Torvalds up(&c->alloc_sem); 312*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "jffs2_garbage_collect_pass() waiting for ino #%u in state %d\n", 313*1da177e4SLinus Torvalds ic->ino, ic->state)); 314*1da177e4SLinus Torvalds sleep_on_spinunlock(&c->inocache_wq, &c->inocache_lock); 315*1da177e4SLinus Torvalds /* And because we dropped the alloc_sem we must start again from the 316*1da177e4SLinus Torvalds beginning. Ponder chance of livelock here -- we're returning success 317*1da177e4SLinus Torvalds without actually making any progress. 318*1da177e4SLinus Torvalds 319*1da177e4SLinus Torvalds Q: What are the chances that the inode is back in INO_STATE_READING 320*1da177e4SLinus Torvalds again by the time we next enter this function? And that this happens 321*1da177e4SLinus Torvalds enough times to cause a real delay? 322*1da177e4SLinus Torvalds 323*1da177e4SLinus Torvalds A: Small enough that I don't care :) 324*1da177e4SLinus Torvalds */ 325*1da177e4SLinus Torvalds return 0; 326*1da177e4SLinus Torvalds } 327*1da177e4SLinus Torvalds 328*1da177e4SLinus Torvalds /* OK. Now if the inode is in state INO_STATE_GC, we are going to copy the 329*1da177e4SLinus Torvalds node intact, and we don't have to muck about with the fragtree etc. 330*1da177e4SLinus Torvalds because we know it's not in-core. If it _was_ in-core, we go through 331*1da177e4SLinus Torvalds all the iget() crap anyway */ 332*1da177e4SLinus Torvalds 333*1da177e4SLinus Torvalds if (ic->state == INO_STATE_GC) { 334*1da177e4SLinus Torvalds spin_unlock(&c->inocache_lock); 335*1da177e4SLinus Torvalds 336*1da177e4SLinus Torvalds ret = jffs2_garbage_collect_pristine(c, ic, raw); 337*1da177e4SLinus Torvalds 338*1da177e4SLinus Torvalds spin_lock(&c->inocache_lock); 339*1da177e4SLinus Torvalds ic->state = INO_STATE_CHECKEDABSENT; 340*1da177e4SLinus Torvalds wake_up(&c->inocache_wq); 341*1da177e4SLinus Torvalds 342*1da177e4SLinus Torvalds if (ret != -EBADFD) { 343*1da177e4SLinus Torvalds spin_unlock(&c->inocache_lock); 344*1da177e4SLinus Torvalds goto release_sem; 345*1da177e4SLinus Torvalds } 346*1da177e4SLinus Torvalds 347*1da177e4SLinus Torvalds /* Fall through if it wanted us to, with inocache_lock held */ 348*1da177e4SLinus Torvalds } 349*1da177e4SLinus Torvalds 350*1da177e4SLinus Torvalds /* Prevent the fairly unlikely race where the gcblock is 351*1da177e4SLinus Torvalds entirely obsoleted by the final close of a file which had 352*1da177e4SLinus Torvalds the only valid nodes in the block, followed by erasure, 353*1da177e4SLinus Torvalds followed by freeing of the ic because the erased block(s) 354*1da177e4SLinus Torvalds held _all_ the nodes of that inode.... never been seen but 355*1da177e4SLinus Torvalds it's vaguely possible. */ 356*1da177e4SLinus Torvalds 357*1da177e4SLinus Torvalds inum = ic->ino; 358*1da177e4SLinus Torvalds nlink = ic->nlink; 359*1da177e4SLinus Torvalds spin_unlock(&c->inocache_lock); 360*1da177e4SLinus Torvalds 361*1da177e4SLinus Torvalds f = jffs2_gc_fetch_inode(c, inum, nlink); 362*1da177e4SLinus Torvalds if (IS_ERR(f)) { 363*1da177e4SLinus Torvalds ret = PTR_ERR(f); 364*1da177e4SLinus Torvalds goto release_sem; 365*1da177e4SLinus Torvalds } 366*1da177e4SLinus Torvalds if (!f) { 367*1da177e4SLinus Torvalds ret = 0; 368*1da177e4SLinus Torvalds goto release_sem; 369*1da177e4SLinus Torvalds } 370*1da177e4SLinus Torvalds 371*1da177e4SLinus Torvalds ret = jffs2_garbage_collect_live(c, jeb, raw, f); 372*1da177e4SLinus Torvalds 373*1da177e4SLinus Torvalds jffs2_gc_release_inode(c, f); 374*1da177e4SLinus Torvalds 375*1da177e4SLinus Torvalds release_sem: 376*1da177e4SLinus Torvalds up(&c->alloc_sem); 377*1da177e4SLinus Torvalds 378*1da177e4SLinus Torvalds eraseit_lock: 379*1da177e4SLinus Torvalds /* If we've finished this block, start it erasing */ 380*1da177e4SLinus Torvalds spin_lock(&c->erase_completion_lock); 381*1da177e4SLinus Torvalds 382*1da177e4SLinus Torvalds eraseit: 383*1da177e4SLinus Torvalds if (c->gcblock && !c->gcblock->used_size) { 384*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Block at 0x%08x completely obsoleted by GC. Moving to erase_pending_list\n", c->gcblock->offset)); 385*1da177e4SLinus Torvalds /* We're GC'ing an empty block? */ 386*1da177e4SLinus Torvalds list_add_tail(&c->gcblock->list, &c->erase_pending_list); 387*1da177e4SLinus Torvalds c->gcblock = NULL; 388*1da177e4SLinus Torvalds c->nr_erasing_blocks++; 389*1da177e4SLinus Torvalds jffs2_erase_pending_trigger(c); 390*1da177e4SLinus Torvalds } 391*1da177e4SLinus Torvalds spin_unlock(&c->erase_completion_lock); 392*1da177e4SLinus Torvalds 393*1da177e4SLinus Torvalds return ret; 394*1da177e4SLinus Torvalds } 395*1da177e4SLinus Torvalds 396*1da177e4SLinus Torvalds static int jffs2_garbage_collect_live(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, 397*1da177e4SLinus Torvalds struct jffs2_raw_node_ref *raw, struct jffs2_inode_info *f) 398*1da177e4SLinus Torvalds { 399*1da177e4SLinus Torvalds struct jffs2_node_frag *frag; 400*1da177e4SLinus Torvalds struct jffs2_full_dnode *fn = NULL; 401*1da177e4SLinus Torvalds struct jffs2_full_dirent *fd; 402*1da177e4SLinus Torvalds uint32_t start = 0, end = 0, nrfrags = 0; 403*1da177e4SLinus Torvalds int ret = 0; 404*1da177e4SLinus Torvalds 405*1da177e4SLinus Torvalds down(&f->sem); 406*1da177e4SLinus Torvalds 407*1da177e4SLinus Torvalds /* Now we have the lock for this inode. Check that it's still the one at the head 408*1da177e4SLinus Torvalds of the list. */ 409*1da177e4SLinus Torvalds 410*1da177e4SLinus Torvalds spin_lock(&c->erase_completion_lock); 411*1da177e4SLinus Torvalds 412*1da177e4SLinus Torvalds if (c->gcblock != jeb) { 413*1da177e4SLinus Torvalds spin_unlock(&c->erase_completion_lock); 414*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "GC block is no longer gcblock. Restart\n")); 415*1da177e4SLinus Torvalds goto upnout; 416*1da177e4SLinus Torvalds } 417*1da177e4SLinus Torvalds if (ref_obsolete(raw)) { 418*1da177e4SLinus Torvalds spin_unlock(&c->erase_completion_lock); 419*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "node to be GC'd was obsoleted in the meantime.\n")); 420*1da177e4SLinus Torvalds /* They'll call again */ 421*1da177e4SLinus Torvalds goto upnout; 422*1da177e4SLinus Torvalds } 423*1da177e4SLinus Torvalds spin_unlock(&c->erase_completion_lock); 424*1da177e4SLinus Torvalds 425*1da177e4SLinus Torvalds /* OK. Looks safe. And nobody can get us now because we have the semaphore. Move the block */ 426*1da177e4SLinus Torvalds if (f->metadata && f->metadata->raw == raw) { 427*1da177e4SLinus Torvalds fn = f->metadata; 428*1da177e4SLinus Torvalds ret = jffs2_garbage_collect_metadata(c, jeb, f, fn); 429*1da177e4SLinus Torvalds goto upnout; 430*1da177e4SLinus Torvalds } 431*1da177e4SLinus Torvalds 432*1da177e4SLinus Torvalds /* FIXME. Read node and do lookup? */ 433*1da177e4SLinus Torvalds for (frag = frag_first(&f->fragtree); frag; frag = frag_next(frag)) { 434*1da177e4SLinus Torvalds if (frag->node && frag->node->raw == raw) { 435*1da177e4SLinus Torvalds fn = frag->node; 436*1da177e4SLinus Torvalds end = frag->ofs + frag->size; 437*1da177e4SLinus Torvalds if (!nrfrags++) 438*1da177e4SLinus Torvalds start = frag->ofs; 439*1da177e4SLinus Torvalds if (nrfrags == frag->node->frags) 440*1da177e4SLinus Torvalds break; /* We've found them all */ 441*1da177e4SLinus Torvalds } 442*1da177e4SLinus Torvalds } 443*1da177e4SLinus Torvalds if (fn) { 444*1da177e4SLinus Torvalds if (ref_flags(raw) == REF_PRISTINE) { 445*1da177e4SLinus Torvalds ret = jffs2_garbage_collect_pristine(c, f->inocache, raw); 446*1da177e4SLinus Torvalds if (!ret) { 447*1da177e4SLinus Torvalds /* Urgh. Return it sensibly. */ 448*1da177e4SLinus Torvalds frag->node->raw = f->inocache->nodes; 449*1da177e4SLinus Torvalds } 450*1da177e4SLinus Torvalds if (ret != -EBADFD) 451*1da177e4SLinus Torvalds goto upnout; 452*1da177e4SLinus Torvalds } 453*1da177e4SLinus Torvalds /* We found a datanode. Do the GC */ 454*1da177e4SLinus Torvalds if((start >> PAGE_CACHE_SHIFT) < ((end-1) >> PAGE_CACHE_SHIFT)) { 455*1da177e4SLinus Torvalds /* It crosses a page boundary. Therefore, it must be a hole. */ 456*1da177e4SLinus Torvalds ret = jffs2_garbage_collect_hole(c, jeb, f, fn, start, end); 457*1da177e4SLinus Torvalds } else { 458*1da177e4SLinus Torvalds /* It could still be a hole. But we GC the page this way anyway */ 459*1da177e4SLinus Torvalds ret = jffs2_garbage_collect_dnode(c, jeb, f, fn, start, end); 460*1da177e4SLinus Torvalds } 461*1da177e4SLinus Torvalds goto upnout; 462*1da177e4SLinus Torvalds } 463*1da177e4SLinus Torvalds 464*1da177e4SLinus Torvalds /* Wasn't a dnode. Try dirent */ 465*1da177e4SLinus Torvalds for (fd = f->dents; fd; fd=fd->next) { 466*1da177e4SLinus Torvalds if (fd->raw == raw) 467*1da177e4SLinus Torvalds break; 468*1da177e4SLinus Torvalds } 469*1da177e4SLinus Torvalds 470*1da177e4SLinus Torvalds if (fd && fd->ino) { 471*1da177e4SLinus Torvalds ret = jffs2_garbage_collect_dirent(c, jeb, f, fd); 472*1da177e4SLinus Torvalds } else if (fd) { 473*1da177e4SLinus Torvalds ret = jffs2_garbage_collect_deletion_dirent(c, jeb, f, fd); 474*1da177e4SLinus Torvalds } else { 475*1da177e4SLinus Torvalds printk(KERN_WARNING "Raw node at 0x%08x wasn't in node lists for ino #%u\n", 476*1da177e4SLinus Torvalds ref_offset(raw), f->inocache->ino); 477*1da177e4SLinus Torvalds if (ref_obsolete(raw)) { 478*1da177e4SLinus Torvalds printk(KERN_WARNING "But it's obsolete so we don't mind too much\n"); 479*1da177e4SLinus Torvalds } else { 480*1da177e4SLinus Torvalds ret = -EIO; 481*1da177e4SLinus Torvalds } 482*1da177e4SLinus Torvalds } 483*1da177e4SLinus Torvalds upnout: 484*1da177e4SLinus Torvalds up(&f->sem); 485*1da177e4SLinus Torvalds 486*1da177e4SLinus Torvalds return ret; 487*1da177e4SLinus Torvalds } 488*1da177e4SLinus Torvalds 489*1da177e4SLinus Torvalds static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c, 490*1da177e4SLinus Torvalds struct jffs2_inode_cache *ic, 491*1da177e4SLinus Torvalds struct jffs2_raw_node_ref *raw) 492*1da177e4SLinus Torvalds { 493*1da177e4SLinus Torvalds union jffs2_node_union *node; 494*1da177e4SLinus Torvalds struct jffs2_raw_node_ref *nraw; 495*1da177e4SLinus Torvalds size_t retlen; 496*1da177e4SLinus Torvalds int ret; 497*1da177e4SLinus Torvalds uint32_t phys_ofs, alloclen; 498*1da177e4SLinus Torvalds uint32_t crc, rawlen; 499*1da177e4SLinus Torvalds int retried = 0; 500*1da177e4SLinus Torvalds 501*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Going to GC REF_PRISTINE node at 0x%08x\n", ref_offset(raw))); 502*1da177e4SLinus Torvalds 503*1da177e4SLinus Torvalds rawlen = ref_totlen(c, c->gcblock, raw); 504*1da177e4SLinus Torvalds 505*1da177e4SLinus Torvalds /* Ask for a small amount of space (or the totlen if smaller) because we 506*1da177e4SLinus Torvalds don't want to force wastage of the end of a block if splitting would 507*1da177e4SLinus Torvalds work. */ 508*1da177e4SLinus Torvalds ret = jffs2_reserve_space_gc(c, min_t(uint32_t, sizeof(struct jffs2_raw_inode) + JFFS2_MIN_DATA_LEN, 509*1da177e4SLinus Torvalds rawlen), &phys_ofs, &alloclen); 510*1da177e4SLinus Torvalds if (ret) 511*1da177e4SLinus Torvalds return ret; 512*1da177e4SLinus Torvalds 513*1da177e4SLinus Torvalds if (alloclen < rawlen) { 514*1da177e4SLinus Torvalds /* Doesn't fit untouched. We'll go the old route and split it */ 515*1da177e4SLinus Torvalds return -EBADFD; 516*1da177e4SLinus Torvalds } 517*1da177e4SLinus Torvalds 518*1da177e4SLinus Torvalds node = kmalloc(rawlen, GFP_KERNEL); 519*1da177e4SLinus Torvalds if (!node) 520*1da177e4SLinus Torvalds return -ENOMEM; 521*1da177e4SLinus Torvalds 522*1da177e4SLinus Torvalds ret = jffs2_flash_read(c, ref_offset(raw), rawlen, &retlen, (char *)node); 523*1da177e4SLinus Torvalds if (!ret && retlen != rawlen) 524*1da177e4SLinus Torvalds ret = -EIO; 525*1da177e4SLinus Torvalds if (ret) 526*1da177e4SLinus Torvalds goto out_node; 527*1da177e4SLinus Torvalds 528*1da177e4SLinus Torvalds crc = crc32(0, node, sizeof(struct jffs2_unknown_node)-4); 529*1da177e4SLinus Torvalds if (je32_to_cpu(node->u.hdr_crc) != crc) { 530*1da177e4SLinus Torvalds printk(KERN_WARNING "Header CRC failed on REF_PRISTINE node at 0x%08x: Read 0x%08x, calculated 0x%08x\n", 531*1da177e4SLinus Torvalds ref_offset(raw), je32_to_cpu(node->u.hdr_crc), crc); 532*1da177e4SLinus Torvalds goto bail; 533*1da177e4SLinus Torvalds } 534*1da177e4SLinus Torvalds 535*1da177e4SLinus Torvalds switch(je16_to_cpu(node->u.nodetype)) { 536*1da177e4SLinus Torvalds case JFFS2_NODETYPE_INODE: 537*1da177e4SLinus Torvalds crc = crc32(0, node, sizeof(node->i)-8); 538*1da177e4SLinus Torvalds if (je32_to_cpu(node->i.node_crc) != crc) { 539*1da177e4SLinus Torvalds printk(KERN_WARNING "Node CRC failed on REF_PRISTINE data node at 0x%08x: Read 0x%08x, calculated 0x%08x\n", 540*1da177e4SLinus Torvalds ref_offset(raw), je32_to_cpu(node->i.node_crc), crc); 541*1da177e4SLinus Torvalds goto bail; 542*1da177e4SLinus Torvalds } 543*1da177e4SLinus Torvalds 544*1da177e4SLinus Torvalds if (je32_to_cpu(node->i.dsize)) { 545*1da177e4SLinus Torvalds crc = crc32(0, node->i.data, je32_to_cpu(node->i.csize)); 546*1da177e4SLinus Torvalds if (je32_to_cpu(node->i.data_crc) != crc) { 547*1da177e4SLinus Torvalds printk(KERN_WARNING "Data CRC failed on REF_PRISTINE data node at 0x%08x: Read 0x%08x, calculated 0x%08x\n", 548*1da177e4SLinus Torvalds ref_offset(raw), je32_to_cpu(node->i.data_crc), crc); 549*1da177e4SLinus Torvalds goto bail; 550*1da177e4SLinus Torvalds } 551*1da177e4SLinus Torvalds } 552*1da177e4SLinus Torvalds break; 553*1da177e4SLinus Torvalds 554*1da177e4SLinus Torvalds case JFFS2_NODETYPE_DIRENT: 555*1da177e4SLinus Torvalds crc = crc32(0, node, sizeof(node->d)-8); 556*1da177e4SLinus Torvalds if (je32_to_cpu(node->d.node_crc) != crc) { 557*1da177e4SLinus Torvalds printk(KERN_WARNING "Node CRC failed on REF_PRISTINE dirent node at 0x%08x: Read 0x%08x, calculated 0x%08x\n", 558*1da177e4SLinus Torvalds ref_offset(raw), je32_to_cpu(node->d.node_crc), crc); 559*1da177e4SLinus Torvalds goto bail; 560*1da177e4SLinus Torvalds } 561*1da177e4SLinus Torvalds 562*1da177e4SLinus Torvalds if (node->d.nsize) { 563*1da177e4SLinus Torvalds crc = crc32(0, node->d.name, node->d.nsize); 564*1da177e4SLinus Torvalds if (je32_to_cpu(node->d.name_crc) != crc) { 565*1da177e4SLinus Torvalds printk(KERN_WARNING "Name CRC failed on REF_PRISTINE dirent ode at 0x%08x: Read 0x%08x, calculated 0x%08x\n", 566*1da177e4SLinus Torvalds ref_offset(raw), je32_to_cpu(node->d.name_crc), crc); 567*1da177e4SLinus Torvalds goto bail; 568*1da177e4SLinus Torvalds } 569*1da177e4SLinus Torvalds } 570*1da177e4SLinus Torvalds break; 571*1da177e4SLinus Torvalds default: 572*1da177e4SLinus Torvalds printk(KERN_WARNING "Unknown node type for REF_PRISTINE node at 0x%08x: 0x%04x\n", 573*1da177e4SLinus Torvalds ref_offset(raw), je16_to_cpu(node->u.nodetype)); 574*1da177e4SLinus Torvalds goto bail; 575*1da177e4SLinus Torvalds } 576*1da177e4SLinus Torvalds 577*1da177e4SLinus Torvalds nraw = jffs2_alloc_raw_node_ref(); 578*1da177e4SLinus Torvalds if (!nraw) { 579*1da177e4SLinus Torvalds ret = -ENOMEM; 580*1da177e4SLinus Torvalds goto out_node; 581*1da177e4SLinus Torvalds } 582*1da177e4SLinus Torvalds 583*1da177e4SLinus Torvalds /* OK, all the CRCs are good; this node can just be copied as-is. */ 584*1da177e4SLinus Torvalds retry: 585*1da177e4SLinus Torvalds nraw->flash_offset = phys_ofs; 586*1da177e4SLinus Torvalds nraw->__totlen = rawlen; 587*1da177e4SLinus Torvalds nraw->next_phys = NULL; 588*1da177e4SLinus Torvalds 589*1da177e4SLinus Torvalds ret = jffs2_flash_write(c, phys_ofs, rawlen, &retlen, (char *)node); 590*1da177e4SLinus Torvalds 591*1da177e4SLinus Torvalds if (ret || (retlen != rawlen)) { 592*1da177e4SLinus Torvalds printk(KERN_NOTICE "Write of %d bytes at 0x%08x failed. returned %d, retlen %zd\n", 593*1da177e4SLinus Torvalds rawlen, phys_ofs, ret, retlen); 594*1da177e4SLinus Torvalds if (retlen) { 595*1da177e4SLinus Torvalds /* Doesn't belong to any inode */ 596*1da177e4SLinus Torvalds nraw->next_in_ino = NULL; 597*1da177e4SLinus Torvalds 598*1da177e4SLinus Torvalds nraw->flash_offset |= REF_OBSOLETE; 599*1da177e4SLinus Torvalds jffs2_add_physical_node_ref(c, nraw); 600*1da177e4SLinus Torvalds jffs2_mark_node_obsolete(c, nraw); 601*1da177e4SLinus Torvalds } else { 602*1da177e4SLinus Torvalds printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", nraw->flash_offset); 603*1da177e4SLinus Torvalds jffs2_free_raw_node_ref(nraw); 604*1da177e4SLinus Torvalds } 605*1da177e4SLinus Torvalds if (!retried && (nraw = jffs2_alloc_raw_node_ref())) { 606*1da177e4SLinus Torvalds /* Try to reallocate space and retry */ 607*1da177e4SLinus Torvalds uint32_t dummy; 608*1da177e4SLinus Torvalds struct jffs2_eraseblock *jeb = &c->blocks[phys_ofs / c->sector_size]; 609*1da177e4SLinus Torvalds 610*1da177e4SLinus Torvalds retried = 1; 611*1da177e4SLinus Torvalds 612*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Retrying failed write of REF_PRISTINE node.\n")); 613*1da177e4SLinus Torvalds 614*1da177e4SLinus Torvalds ACCT_SANITY_CHECK(c,jeb); 615*1da177e4SLinus Torvalds D1(ACCT_PARANOIA_CHECK(jeb)); 616*1da177e4SLinus Torvalds 617*1da177e4SLinus Torvalds ret = jffs2_reserve_space_gc(c, rawlen, &phys_ofs, &dummy); 618*1da177e4SLinus Torvalds 619*1da177e4SLinus Torvalds if (!ret) { 620*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Allocated space at 0x%08x to retry failed write.\n", phys_ofs)); 621*1da177e4SLinus Torvalds 622*1da177e4SLinus Torvalds ACCT_SANITY_CHECK(c,jeb); 623*1da177e4SLinus Torvalds D1(ACCT_PARANOIA_CHECK(jeb)); 624*1da177e4SLinus Torvalds 625*1da177e4SLinus Torvalds goto retry; 626*1da177e4SLinus Torvalds } 627*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Failed to allocate space to retry failed write: %d!\n", ret)); 628*1da177e4SLinus Torvalds jffs2_free_raw_node_ref(nraw); 629*1da177e4SLinus Torvalds } 630*1da177e4SLinus Torvalds 631*1da177e4SLinus Torvalds jffs2_free_raw_node_ref(nraw); 632*1da177e4SLinus Torvalds if (!ret) 633*1da177e4SLinus Torvalds ret = -EIO; 634*1da177e4SLinus Torvalds goto out_node; 635*1da177e4SLinus Torvalds } 636*1da177e4SLinus Torvalds nraw->flash_offset |= REF_PRISTINE; 637*1da177e4SLinus Torvalds jffs2_add_physical_node_ref(c, nraw); 638*1da177e4SLinus Torvalds 639*1da177e4SLinus Torvalds /* Link into per-inode list. This is safe because of the ic 640*1da177e4SLinus Torvalds state being INO_STATE_GC. Note that if we're doing this 641*1da177e4SLinus Torvalds for an inode which is in-core, the 'nraw' pointer is then 642*1da177e4SLinus Torvalds going to be fetched from ic->nodes by our caller. */ 643*1da177e4SLinus Torvalds spin_lock(&c->erase_completion_lock); 644*1da177e4SLinus Torvalds nraw->next_in_ino = ic->nodes; 645*1da177e4SLinus Torvalds ic->nodes = nraw; 646*1da177e4SLinus Torvalds spin_unlock(&c->erase_completion_lock); 647*1da177e4SLinus Torvalds 648*1da177e4SLinus Torvalds jffs2_mark_node_obsolete(c, raw); 649*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "WHEEE! GC REF_PRISTINE node at 0x%08x succeeded\n", ref_offset(raw))); 650*1da177e4SLinus Torvalds 651*1da177e4SLinus Torvalds out_node: 652*1da177e4SLinus Torvalds kfree(node); 653*1da177e4SLinus Torvalds return ret; 654*1da177e4SLinus Torvalds bail: 655*1da177e4SLinus Torvalds ret = -EBADFD; 656*1da177e4SLinus Torvalds goto out_node; 657*1da177e4SLinus Torvalds } 658*1da177e4SLinus Torvalds 659*1da177e4SLinus Torvalds static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, 660*1da177e4SLinus Torvalds struct jffs2_inode_info *f, struct jffs2_full_dnode *fn) 661*1da177e4SLinus Torvalds { 662*1da177e4SLinus Torvalds struct jffs2_full_dnode *new_fn; 663*1da177e4SLinus Torvalds struct jffs2_raw_inode ri; 664*1da177e4SLinus Torvalds jint16_t dev; 665*1da177e4SLinus Torvalds char *mdata = NULL, mdatalen = 0; 666*1da177e4SLinus Torvalds uint32_t alloclen, phys_ofs; 667*1da177e4SLinus Torvalds int ret; 668*1da177e4SLinus Torvalds 669*1da177e4SLinus Torvalds if (S_ISBLK(JFFS2_F_I_MODE(f)) || 670*1da177e4SLinus Torvalds S_ISCHR(JFFS2_F_I_MODE(f)) ) { 671*1da177e4SLinus Torvalds /* For these, we don't actually need to read the old node */ 672*1da177e4SLinus Torvalds /* FIXME: for minor or major > 255. */ 673*1da177e4SLinus Torvalds dev = cpu_to_je16(((JFFS2_F_I_RDEV_MAJ(f) << 8) | 674*1da177e4SLinus Torvalds JFFS2_F_I_RDEV_MIN(f))); 675*1da177e4SLinus Torvalds mdata = (char *)&dev; 676*1da177e4SLinus Torvalds mdatalen = sizeof(dev); 677*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "jffs2_garbage_collect_metadata(): Writing %d bytes of kdev_t\n", mdatalen)); 678*1da177e4SLinus Torvalds } else if (S_ISLNK(JFFS2_F_I_MODE(f))) { 679*1da177e4SLinus Torvalds mdatalen = fn->size; 680*1da177e4SLinus Torvalds mdata = kmalloc(fn->size, GFP_KERNEL); 681*1da177e4SLinus Torvalds if (!mdata) { 682*1da177e4SLinus Torvalds printk(KERN_WARNING "kmalloc of mdata failed in jffs2_garbage_collect_metadata()\n"); 683*1da177e4SLinus Torvalds return -ENOMEM; 684*1da177e4SLinus Torvalds } 685*1da177e4SLinus Torvalds ret = jffs2_read_dnode(c, f, fn, mdata, 0, mdatalen); 686*1da177e4SLinus Torvalds if (ret) { 687*1da177e4SLinus Torvalds printk(KERN_WARNING "read of old metadata failed in jffs2_garbage_collect_metadata(): %d\n", ret); 688*1da177e4SLinus Torvalds kfree(mdata); 689*1da177e4SLinus Torvalds return ret; 690*1da177e4SLinus Torvalds } 691*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "jffs2_garbage_collect_metadata(): Writing %d bites of symlink target\n", mdatalen)); 692*1da177e4SLinus Torvalds 693*1da177e4SLinus Torvalds } 694*1da177e4SLinus Torvalds 695*1da177e4SLinus Torvalds ret = jffs2_reserve_space_gc(c, sizeof(ri) + mdatalen, &phys_ofs, &alloclen); 696*1da177e4SLinus Torvalds if (ret) { 697*1da177e4SLinus Torvalds printk(KERN_WARNING "jffs2_reserve_space_gc of %zd bytes for garbage_collect_metadata failed: %d\n", 698*1da177e4SLinus Torvalds sizeof(ri)+ mdatalen, ret); 699*1da177e4SLinus Torvalds goto out; 700*1da177e4SLinus Torvalds } 701*1da177e4SLinus Torvalds 702*1da177e4SLinus Torvalds memset(&ri, 0, sizeof(ri)); 703*1da177e4SLinus Torvalds ri.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); 704*1da177e4SLinus Torvalds ri.nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE); 705*1da177e4SLinus Torvalds ri.totlen = cpu_to_je32(sizeof(ri) + mdatalen); 706*1da177e4SLinus Torvalds ri.hdr_crc = cpu_to_je32(crc32(0, &ri, sizeof(struct jffs2_unknown_node)-4)); 707*1da177e4SLinus Torvalds 708*1da177e4SLinus Torvalds ri.ino = cpu_to_je32(f->inocache->ino); 709*1da177e4SLinus Torvalds ri.version = cpu_to_je32(++f->highest_version); 710*1da177e4SLinus Torvalds ri.mode = cpu_to_jemode(JFFS2_F_I_MODE(f)); 711*1da177e4SLinus Torvalds ri.uid = cpu_to_je16(JFFS2_F_I_UID(f)); 712*1da177e4SLinus Torvalds ri.gid = cpu_to_je16(JFFS2_F_I_GID(f)); 713*1da177e4SLinus Torvalds ri.isize = cpu_to_je32(JFFS2_F_I_SIZE(f)); 714*1da177e4SLinus Torvalds ri.atime = cpu_to_je32(JFFS2_F_I_ATIME(f)); 715*1da177e4SLinus Torvalds ri.ctime = cpu_to_je32(JFFS2_F_I_CTIME(f)); 716*1da177e4SLinus Torvalds ri.mtime = cpu_to_je32(JFFS2_F_I_MTIME(f)); 717*1da177e4SLinus Torvalds ri.offset = cpu_to_je32(0); 718*1da177e4SLinus Torvalds ri.csize = cpu_to_je32(mdatalen); 719*1da177e4SLinus Torvalds ri.dsize = cpu_to_je32(mdatalen); 720*1da177e4SLinus Torvalds ri.compr = JFFS2_COMPR_NONE; 721*1da177e4SLinus Torvalds ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8)); 722*1da177e4SLinus Torvalds ri.data_crc = cpu_to_je32(crc32(0, mdata, mdatalen)); 723*1da177e4SLinus Torvalds 724*1da177e4SLinus Torvalds new_fn = jffs2_write_dnode(c, f, &ri, mdata, mdatalen, phys_ofs, ALLOC_GC); 725*1da177e4SLinus Torvalds 726*1da177e4SLinus Torvalds if (IS_ERR(new_fn)) { 727*1da177e4SLinus Torvalds printk(KERN_WARNING "Error writing new dnode: %ld\n", PTR_ERR(new_fn)); 728*1da177e4SLinus Torvalds ret = PTR_ERR(new_fn); 729*1da177e4SLinus Torvalds goto out; 730*1da177e4SLinus Torvalds } 731*1da177e4SLinus Torvalds jffs2_mark_node_obsolete(c, fn->raw); 732*1da177e4SLinus Torvalds jffs2_free_full_dnode(fn); 733*1da177e4SLinus Torvalds f->metadata = new_fn; 734*1da177e4SLinus Torvalds out: 735*1da177e4SLinus Torvalds if (S_ISLNK(JFFS2_F_I_MODE(f))) 736*1da177e4SLinus Torvalds kfree(mdata); 737*1da177e4SLinus Torvalds return ret; 738*1da177e4SLinus Torvalds } 739*1da177e4SLinus Torvalds 740*1da177e4SLinus Torvalds static int jffs2_garbage_collect_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, 741*1da177e4SLinus Torvalds struct jffs2_inode_info *f, struct jffs2_full_dirent *fd) 742*1da177e4SLinus Torvalds { 743*1da177e4SLinus Torvalds struct jffs2_full_dirent *new_fd; 744*1da177e4SLinus Torvalds struct jffs2_raw_dirent rd; 745*1da177e4SLinus Torvalds uint32_t alloclen, phys_ofs; 746*1da177e4SLinus Torvalds int ret; 747*1da177e4SLinus Torvalds 748*1da177e4SLinus Torvalds rd.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); 749*1da177e4SLinus Torvalds rd.nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT); 750*1da177e4SLinus Torvalds rd.nsize = strlen(fd->name); 751*1da177e4SLinus Torvalds rd.totlen = cpu_to_je32(sizeof(rd) + rd.nsize); 752*1da177e4SLinus Torvalds rd.hdr_crc = cpu_to_je32(crc32(0, &rd, sizeof(struct jffs2_unknown_node)-4)); 753*1da177e4SLinus Torvalds 754*1da177e4SLinus Torvalds rd.pino = cpu_to_je32(f->inocache->ino); 755*1da177e4SLinus Torvalds rd.version = cpu_to_je32(++f->highest_version); 756*1da177e4SLinus Torvalds rd.ino = cpu_to_je32(fd->ino); 757*1da177e4SLinus Torvalds rd.mctime = cpu_to_je32(max(JFFS2_F_I_MTIME(f), JFFS2_F_I_CTIME(f))); 758*1da177e4SLinus Torvalds rd.type = fd->type; 759*1da177e4SLinus Torvalds rd.node_crc = cpu_to_je32(crc32(0, &rd, sizeof(rd)-8)); 760*1da177e4SLinus Torvalds rd.name_crc = cpu_to_je32(crc32(0, fd->name, rd.nsize)); 761*1da177e4SLinus Torvalds 762*1da177e4SLinus Torvalds ret = jffs2_reserve_space_gc(c, sizeof(rd)+rd.nsize, &phys_ofs, &alloclen); 763*1da177e4SLinus Torvalds if (ret) { 764*1da177e4SLinus Torvalds printk(KERN_WARNING "jffs2_reserve_space_gc of %zd bytes for garbage_collect_dirent failed: %d\n", 765*1da177e4SLinus Torvalds sizeof(rd)+rd.nsize, ret); 766*1da177e4SLinus Torvalds return ret; 767*1da177e4SLinus Torvalds } 768*1da177e4SLinus Torvalds new_fd = jffs2_write_dirent(c, f, &rd, fd->name, rd.nsize, phys_ofs, ALLOC_GC); 769*1da177e4SLinus Torvalds 770*1da177e4SLinus Torvalds if (IS_ERR(new_fd)) { 771*1da177e4SLinus Torvalds printk(KERN_WARNING "jffs2_write_dirent in garbage_collect_dirent failed: %ld\n", PTR_ERR(new_fd)); 772*1da177e4SLinus Torvalds return PTR_ERR(new_fd); 773*1da177e4SLinus Torvalds } 774*1da177e4SLinus Torvalds jffs2_add_fd_to_list(c, new_fd, &f->dents); 775*1da177e4SLinus Torvalds return 0; 776*1da177e4SLinus Torvalds } 777*1da177e4SLinus Torvalds 778*1da177e4SLinus Torvalds static int jffs2_garbage_collect_deletion_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, 779*1da177e4SLinus Torvalds struct jffs2_inode_info *f, struct jffs2_full_dirent *fd) 780*1da177e4SLinus Torvalds { 781*1da177e4SLinus Torvalds struct jffs2_full_dirent **fdp = &f->dents; 782*1da177e4SLinus Torvalds int found = 0; 783*1da177e4SLinus Torvalds 784*1da177e4SLinus Torvalds /* On a medium where we can't actually mark nodes obsolete 785*1da177e4SLinus Torvalds pernamently, such as NAND flash, we need to work out 786*1da177e4SLinus Torvalds whether this deletion dirent is still needed to actively 787*1da177e4SLinus Torvalds delete a 'real' dirent with the same name that's still 788*1da177e4SLinus Torvalds somewhere else on the flash. */ 789*1da177e4SLinus Torvalds if (!jffs2_can_mark_obsolete(c)) { 790*1da177e4SLinus Torvalds struct jffs2_raw_dirent *rd; 791*1da177e4SLinus Torvalds struct jffs2_raw_node_ref *raw; 792*1da177e4SLinus Torvalds int ret; 793*1da177e4SLinus Torvalds size_t retlen; 794*1da177e4SLinus Torvalds int name_len = strlen(fd->name); 795*1da177e4SLinus Torvalds uint32_t name_crc = crc32(0, fd->name, name_len); 796*1da177e4SLinus Torvalds uint32_t rawlen = ref_totlen(c, jeb, fd->raw); 797*1da177e4SLinus Torvalds 798*1da177e4SLinus Torvalds rd = kmalloc(rawlen, GFP_KERNEL); 799*1da177e4SLinus Torvalds if (!rd) 800*1da177e4SLinus Torvalds return -ENOMEM; 801*1da177e4SLinus Torvalds 802*1da177e4SLinus Torvalds /* Prevent the erase code from nicking the obsolete node refs while 803*1da177e4SLinus Torvalds we're looking at them. I really don't like this extra lock but 804*1da177e4SLinus Torvalds can't see any alternative. Suggestions on a postcard to... */ 805*1da177e4SLinus Torvalds down(&c->erase_free_sem); 806*1da177e4SLinus Torvalds 807*1da177e4SLinus Torvalds for (raw = f->inocache->nodes; raw != (void *)f->inocache; raw = raw->next_in_ino) { 808*1da177e4SLinus Torvalds 809*1da177e4SLinus Torvalds /* We only care about obsolete ones */ 810*1da177e4SLinus Torvalds if (!(ref_obsolete(raw))) 811*1da177e4SLinus Torvalds continue; 812*1da177e4SLinus Torvalds 813*1da177e4SLinus Torvalds /* Any dirent with the same name is going to have the same length... */ 814*1da177e4SLinus Torvalds if (ref_totlen(c, NULL, raw) != rawlen) 815*1da177e4SLinus Torvalds continue; 816*1da177e4SLinus Torvalds 817*1da177e4SLinus Torvalds /* Doesn't matter if there's one in the same erase block. We're going to 818*1da177e4SLinus Torvalds delete it too at the same time. */ 819*1da177e4SLinus Torvalds if ((raw->flash_offset & ~(c->sector_size-1)) == 820*1da177e4SLinus Torvalds (fd->raw->flash_offset & ~(c->sector_size-1))) 821*1da177e4SLinus Torvalds continue; 822*1da177e4SLinus Torvalds 823*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Check potential deletion dirent at %08x\n", ref_offset(raw))); 824*1da177e4SLinus Torvalds 825*1da177e4SLinus Torvalds /* This is an obsolete node belonging to the same directory, and it's of the right 826*1da177e4SLinus Torvalds length. We need to take a closer look...*/ 827*1da177e4SLinus Torvalds ret = jffs2_flash_read(c, ref_offset(raw), rawlen, &retlen, (char *)rd); 828*1da177e4SLinus Torvalds if (ret) { 829*1da177e4SLinus Torvalds printk(KERN_WARNING "jffs2_g_c_deletion_dirent(): Read error (%d) reading obsolete node at %08x\n", ret, ref_offset(raw)); 830*1da177e4SLinus Torvalds /* If we can't read it, we don't need to continue to obsolete it. Continue */ 831*1da177e4SLinus Torvalds continue; 832*1da177e4SLinus Torvalds } 833*1da177e4SLinus Torvalds if (retlen != rawlen) { 834*1da177e4SLinus Torvalds printk(KERN_WARNING "jffs2_g_c_deletion_dirent(): Short read (%zd not %u) reading header from obsolete node at %08x\n", 835*1da177e4SLinus Torvalds retlen, rawlen, ref_offset(raw)); 836*1da177e4SLinus Torvalds continue; 837*1da177e4SLinus Torvalds } 838*1da177e4SLinus Torvalds 839*1da177e4SLinus Torvalds if (je16_to_cpu(rd->nodetype) != JFFS2_NODETYPE_DIRENT) 840*1da177e4SLinus Torvalds continue; 841*1da177e4SLinus Torvalds 842*1da177e4SLinus Torvalds /* If the name CRC doesn't match, skip */ 843*1da177e4SLinus Torvalds if (je32_to_cpu(rd->name_crc) != name_crc) 844*1da177e4SLinus Torvalds continue; 845*1da177e4SLinus Torvalds 846*1da177e4SLinus Torvalds /* If the name length doesn't match, or it's another deletion dirent, skip */ 847*1da177e4SLinus Torvalds if (rd->nsize != name_len || !je32_to_cpu(rd->ino)) 848*1da177e4SLinus Torvalds continue; 849*1da177e4SLinus Torvalds 850*1da177e4SLinus Torvalds /* OK, check the actual name now */ 851*1da177e4SLinus Torvalds if (memcmp(rd->name, fd->name, name_len)) 852*1da177e4SLinus Torvalds continue; 853*1da177e4SLinus Torvalds 854*1da177e4SLinus Torvalds /* OK. The name really does match. There really is still an older node on 855*1da177e4SLinus Torvalds the flash which our deletion dirent obsoletes. So we have to write out 856*1da177e4SLinus Torvalds a new deletion dirent to replace it */ 857*1da177e4SLinus Torvalds up(&c->erase_free_sem); 858*1da177e4SLinus Torvalds 859*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Deletion dirent at %08x still obsoletes real dirent \"%s\" at %08x for ino #%u\n", 860*1da177e4SLinus Torvalds ref_offset(fd->raw), fd->name, ref_offset(raw), je32_to_cpu(rd->ino))); 861*1da177e4SLinus Torvalds kfree(rd); 862*1da177e4SLinus Torvalds 863*1da177e4SLinus Torvalds return jffs2_garbage_collect_dirent(c, jeb, f, fd); 864*1da177e4SLinus Torvalds } 865*1da177e4SLinus Torvalds 866*1da177e4SLinus Torvalds up(&c->erase_free_sem); 867*1da177e4SLinus Torvalds kfree(rd); 868*1da177e4SLinus Torvalds } 869*1da177e4SLinus Torvalds 870*1da177e4SLinus Torvalds /* No need for it any more. Just mark it obsolete and remove it from the list */ 871*1da177e4SLinus Torvalds while (*fdp) { 872*1da177e4SLinus Torvalds if ((*fdp) == fd) { 873*1da177e4SLinus Torvalds found = 1; 874*1da177e4SLinus Torvalds *fdp = fd->next; 875*1da177e4SLinus Torvalds break; 876*1da177e4SLinus Torvalds } 877*1da177e4SLinus Torvalds fdp = &(*fdp)->next; 878*1da177e4SLinus Torvalds } 879*1da177e4SLinus Torvalds if (!found) { 880*1da177e4SLinus Torvalds printk(KERN_WARNING "Deletion dirent \"%s\" not found in list for ino #%u\n", fd->name, f->inocache->ino); 881*1da177e4SLinus Torvalds } 882*1da177e4SLinus Torvalds jffs2_mark_node_obsolete(c, fd->raw); 883*1da177e4SLinus Torvalds jffs2_free_full_dirent(fd); 884*1da177e4SLinus Torvalds return 0; 885*1da177e4SLinus Torvalds } 886*1da177e4SLinus Torvalds 887*1da177e4SLinus Torvalds static int jffs2_garbage_collect_hole(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, 888*1da177e4SLinus Torvalds struct jffs2_inode_info *f, struct jffs2_full_dnode *fn, 889*1da177e4SLinus Torvalds uint32_t start, uint32_t end) 890*1da177e4SLinus Torvalds { 891*1da177e4SLinus Torvalds struct jffs2_raw_inode ri; 892*1da177e4SLinus Torvalds struct jffs2_node_frag *frag; 893*1da177e4SLinus Torvalds struct jffs2_full_dnode *new_fn; 894*1da177e4SLinus Torvalds uint32_t alloclen, phys_ofs; 895*1da177e4SLinus Torvalds int ret; 896*1da177e4SLinus Torvalds 897*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Writing replacement hole node for ino #%u from offset 0x%x to 0x%x\n", 898*1da177e4SLinus Torvalds f->inocache->ino, start, end)); 899*1da177e4SLinus Torvalds 900*1da177e4SLinus Torvalds memset(&ri, 0, sizeof(ri)); 901*1da177e4SLinus Torvalds 902*1da177e4SLinus Torvalds if(fn->frags > 1) { 903*1da177e4SLinus Torvalds size_t readlen; 904*1da177e4SLinus Torvalds uint32_t crc; 905*1da177e4SLinus Torvalds /* It's partially obsoleted by a later write. So we have to 906*1da177e4SLinus Torvalds write it out again with the _same_ version as before */ 907*1da177e4SLinus Torvalds ret = jffs2_flash_read(c, ref_offset(fn->raw), sizeof(ri), &readlen, (char *)&ri); 908*1da177e4SLinus Torvalds if (readlen != sizeof(ri) || ret) { 909*1da177e4SLinus Torvalds 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); 910*1da177e4SLinus Torvalds goto fill; 911*1da177e4SLinus Torvalds } 912*1da177e4SLinus Torvalds if (je16_to_cpu(ri.nodetype) != JFFS2_NODETYPE_INODE) { 913*1da177e4SLinus Torvalds printk(KERN_WARNING "jffs2_garbage_collect_hole: Node at 0x%08x had node type 0x%04x instead of JFFS2_NODETYPE_INODE(0x%04x)\n", 914*1da177e4SLinus Torvalds ref_offset(fn->raw), 915*1da177e4SLinus Torvalds je16_to_cpu(ri.nodetype), JFFS2_NODETYPE_INODE); 916*1da177e4SLinus Torvalds return -EIO; 917*1da177e4SLinus Torvalds } 918*1da177e4SLinus Torvalds if (je32_to_cpu(ri.totlen) != sizeof(ri)) { 919*1da177e4SLinus Torvalds printk(KERN_WARNING "jffs2_garbage_collect_hole: Node at 0x%08x had totlen 0x%x instead of expected 0x%zx\n", 920*1da177e4SLinus Torvalds ref_offset(fn->raw), 921*1da177e4SLinus Torvalds je32_to_cpu(ri.totlen), sizeof(ri)); 922*1da177e4SLinus Torvalds return -EIO; 923*1da177e4SLinus Torvalds } 924*1da177e4SLinus Torvalds crc = crc32(0, &ri, sizeof(ri)-8); 925*1da177e4SLinus Torvalds if (crc != je32_to_cpu(ri.node_crc)) { 926*1da177e4SLinus Torvalds printk(KERN_WARNING "jffs2_garbage_collect_hole: Node at 0x%08x had CRC 0x%08x which doesn't match calculated CRC 0x%08x\n", 927*1da177e4SLinus Torvalds ref_offset(fn->raw), 928*1da177e4SLinus Torvalds je32_to_cpu(ri.node_crc), crc); 929*1da177e4SLinus Torvalds /* FIXME: We could possibly deal with this by writing new holes for each frag */ 930*1da177e4SLinus Torvalds printk(KERN_WARNING "Data in the range 0x%08x to 0x%08x of inode #%u will be lost\n", 931*1da177e4SLinus Torvalds start, end, f->inocache->ino); 932*1da177e4SLinus Torvalds goto fill; 933*1da177e4SLinus Torvalds } 934*1da177e4SLinus Torvalds if (ri.compr != JFFS2_COMPR_ZERO) { 935*1da177e4SLinus Torvalds printk(KERN_WARNING "jffs2_garbage_collect_hole: Node 0x%08x wasn't a hole node!\n", ref_offset(fn->raw)); 936*1da177e4SLinus Torvalds printk(KERN_WARNING "Data in the range 0x%08x to 0x%08x of inode #%u will be lost\n", 937*1da177e4SLinus Torvalds start, end, f->inocache->ino); 938*1da177e4SLinus Torvalds goto fill; 939*1da177e4SLinus Torvalds } 940*1da177e4SLinus Torvalds } else { 941*1da177e4SLinus Torvalds fill: 942*1da177e4SLinus Torvalds ri.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); 943*1da177e4SLinus Torvalds ri.nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE); 944*1da177e4SLinus Torvalds ri.totlen = cpu_to_je32(sizeof(ri)); 945*1da177e4SLinus Torvalds ri.hdr_crc = cpu_to_je32(crc32(0, &ri, sizeof(struct jffs2_unknown_node)-4)); 946*1da177e4SLinus Torvalds 947*1da177e4SLinus Torvalds ri.ino = cpu_to_je32(f->inocache->ino); 948*1da177e4SLinus Torvalds ri.version = cpu_to_je32(++f->highest_version); 949*1da177e4SLinus Torvalds ri.offset = cpu_to_je32(start); 950*1da177e4SLinus Torvalds ri.dsize = cpu_to_je32(end - start); 951*1da177e4SLinus Torvalds ri.csize = cpu_to_je32(0); 952*1da177e4SLinus Torvalds ri.compr = JFFS2_COMPR_ZERO; 953*1da177e4SLinus Torvalds } 954*1da177e4SLinus Torvalds ri.mode = cpu_to_jemode(JFFS2_F_I_MODE(f)); 955*1da177e4SLinus Torvalds ri.uid = cpu_to_je16(JFFS2_F_I_UID(f)); 956*1da177e4SLinus Torvalds ri.gid = cpu_to_je16(JFFS2_F_I_GID(f)); 957*1da177e4SLinus Torvalds ri.isize = cpu_to_je32(JFFS2_F_I_SIZE(f)); 958*1da177e4SLinus Torvalds ri.atime = cpu_to_je32(JFFS2_F_I_ATIME(f)); 959*1da177e4SLinus Torvalds ri.ctime = cpu_to_je32(JFFS2_F_I_CTIME(f)); 960*1da177e4SLinus Torvalds ri.mtime = cpu_to_je32(JFFS2_F_I_MTIME(f)); 961*1da177e4SLinus Torvalds ri.data_crc = cpu_to_je32(0); 962*1da177e4SLinus Torvalds ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8)); 963*1da177e4SLinus Torvalds 964*1da177e4SLinus Torvalds ret = jffs2_reserve_space_gc(c, sizeof(ri), &phys_ofs, &alloclen); 965*1da177e4SLinus Torvalds if (ret) { 966*1da177e4SLinus Torvalds printk(KERN_WARNING "jffs2_reserve_space_gc of %zd bytes for garbage_collect_hole failed: %d\n", 967*1da177e4SLinus Torvalds sizeof(ri), ret); 968*1da177e4SLinus Torvalds return ret; 969*1da177e4SLinus Torvalds } 970*1da177e4SLinus Torvalds new_fn = jffs2_write_dnode(c, f, &ri, NULL, 0, phys_ofs, ALLOC_GC); 971*1da177e4SLinus Torvalds 972*1da177e4SLinus Torvalds if (IS_ERR(new_fn)) { 973*1da177e4SLinus Torvalds printk(KERN_WARNING "Error writing new hole node: %ld\n", PTR_ERR(new_fn)); 974*1da177e4SLinus Torvalds return PTR_ERR(new_fn); 975*1da177e4SLinus Torvalds } 976*1da177e4SLinus Torvalds if (je32_to_cpu(ri.version) == f->highest_version) { 977*1da177e4SLinus Torvalds jffs2_add_full_dnode_to_inode(c, f, new_fn); 978*1da177e4SLinus Torvalds if (f->metadata) { 979*1da177e4SLinus Torvalds jffs2_mark_node_obsolete(c, f->metadata->raw); 980*1da177e4SLinus Torvalds jffs2_free_full_dnode(f->metadata); 981*1da177e4SLinus Torvalds f->metadata = NULL; 982*1da177e4SLinus Torvalds } 983*1da177e4SLinus Torvalds return 0; 984*1da177e4SLinus Torvalds } 985*1da177e4SLinus Torvalds 986*1da177e4SLinus Torvalds /* 987*1da177e4SLinus Torvalds * We should only get here in the case where the node we are 988*1da177e4SLinus Torvalds * replacing had more than one frag, so we kept the same version 989*1da177e4SLinus Torvalds * number as before. (Except in case of error -- see 'goto fill;' 990*1da177e4SLinus Torvalds * above.) 991*1da177e4SLinus Torvalds */ 992*1da177e4SLinus Torvalds D1(if(unlikely(fn->frags <= 1)) { 993*1da177e4SLinus Torvalds printk(KERN_WARNING "jffs2_garbage_collect_hole: Replacing fn with %d frag(s) but new ver %d != highest_version %d of ino #%d\n", 994*1da177e4SLinus Torvalds fn->frags, je32_to_cpu(ri.version), f->highest_version, 995*1da177e4SLinus Torvalds je32_to_cpu(ri.ino)); 996*1da177e4SLinus Torvalds }); 997*1da177e4SLinus Torvalds 998*1da177e4SLinus Torvalds /* This is a partially-overlapped hole node. Mark it REF_NORMAL not REF_PRISTINE */ 999*1da177e4SLinus Torvalds mark_ref_normal(new_fn->raw); 1000*1da177e4SLinus Torvalds 1001*1da177e4SLinus Torvalds for (frag = jffs2_lookup_node_frag(&f->fragtree, fn->ofs); 1002*1da177e4SLinus Torvalds frag; frag = frag_next(frag)) { 1003*1da177e4SLinus Torvalds if (frag->ofs > fn->size + fn->ofs) 1004*1da177e4SLinus Torvalds break; 1005*1da177e4SLinus Torvalds if (frag->node == fn) { 1006*1da177e4SLinus Torvalds frag->node = new_fn; 1007*1da177e4SLinus Torvalds new_fn->frags++; 1008*1da177e4SLinus Torvalds fn->frags--; 1009*1da177e4SLinus Torvalds } 1010*1da177e4SLinus Torvalds } 1011*1da177e4SLinus Torvalds if (fn->frags) { 1012*1da177e4SLinus Torvalds printk(KERN_WARNING "jffs2_garbage_collect_hole: Old node still has frags!\n"); 1013*1da177e4SLinus Torvalds BUG(); 1014*1da177e4SLinus Torvalds } 1015*1da177e4SLinus Torvalds if (!new_fn->frags) { 1016*1da177e4SLinus Torvalds printk(KERN_WARNING "jffs2_garbage_collect_hole: New node has no frags!\n"); 1017*1da177e4SLinus Torvalds BUG(); 1018*1da177e4SLinus Torvalds } 1019*1da177e4SLinus Torvalds 1020*1da177e4SLinus Torvalds jffs2_mark_node_obsolete(c, fn->raw); 1021*1da177e4SLinus Torvalds jffs2_free_full_dnode(fn); 1022*1da177e4SLinus Torvalds 1023*1da177e4SLinus Torvalds return 0; 1024*1da177e4SLinus Torvalds } 1025*1da177e4SLinus Torvalds 1026*1da177e4SLinus Torvalds static int jffs2_garbage_collect_dnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, 1027*1da177e4SLinus Torvalds struct jffs2_inode_info *f, struct jffs2_full_dnode *fn, 1028*1da177e4SLinus Torvalds uint32_t start, uint32_t end) 1029*1da177e4SLinus Torvalds { 1030*1da177e4SLinus Torvalds struct jffs2_full_dnode *new_fn; 1031*1da177e4SLinus Torvalds struct jffs2_raw_inode ri; 1032*1da177e4SLinus Torvalds uint32_t alloclen, phys_ofs, offset, orig_end, orig_start; 1033*1da177e4SLinus Torvalds int ret = 0; 1034*1da177e4SLinus Torvalds unsigned char *comprbuf = NULL, *writebuf; 1035*1da177e4SLinus Torvalds unsigned long pg; 1036*1da177e4SLinus Torvalds unsigned char *pg_ptr; 1037*1da177e4SLinus Torvalds 1038*1da177e4SLinus Torvalds memset(&ri, 0, sizeof(ri)); 1039*1da177e4SLinus Torvalds 1040*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Writing replacement dnode for ino #%u from offset 0x%x to 0x%x\n", 1041*1da177e4SLinus Torvalds f->inocache->ino, start, end)); 1042*1da177e4SLinus Torvalds 1043*1da177e4SLinus Torvalds orig_end = end; 1044*1da177e4SLinus Torvalds orig_start = start; 1045*1da177e4SLinus Torvalds 1046*1da177e4SLinus Torvalds if (c->nr_free_blocks + c->nr_erasing_blocks > c->resv_blocks_gcmerge) { 1047*1da177e4SLinus Torvalds /* Attempt to do some merging. But only expand to cover logically 1048*1da177e4SLinus Torvalds adjacent frags if the block containing them is already considered 1049*1da177e4SLinus Torvalds to be dirty. Otherwise we end up with GC just going round in 1050*1da177e4SLinus Torvalds circles dirtying the nodes it already wrote out, especially 1051*1da177e4SLinus Torvalds on NAND where we have small eraseblocks and hence a much higher 1052*1da177e4SLinus Torvalds chance of nodes having to be split to cross boundaries. */ 1053*1da177e4SLinus Torvalds 1054*1da177e4SLinus Torvalds struct jffs2_node_frag *frag; 1055*1da177e4SLinus Torvalds uint32_t min, max; 1056*1da177e4SLinus Torvalds 1057*1da177e4SLinus Torvalds min = start & ~(PAGE_CACHE_SIZE-1); 1058*1da177e4SLinus Torvalds max = min + PAGE_CACHE_SIZE; 1059*1da177e4SLinus Torvalds 1060*1da177e4SLinus Torvalds frag = jffs2_lookup_node_frag(&f->fragtree, start); 1061*1da177e4SLinus Torvalds 1062*1da177e4SLinus Torvalds /* BUG_ON(!frag) but that'll happen anyway... */ 1063*1da177e4SLinus Torvalds 1064*1da177e4SLinus Torvalds BUG_ON(frag->ofs != start); 1065*1da177e4SLinus Torvalds 1066*1da177e4SLinus Torvalds /* First grow down... */ 1067*1da177e4SLinus Torvalds while((frag = frag_prev(frag)) && frag->ofs >= min) { 1068*1da177e4SLinus Torvalds 1069*1da177e4SLinus Torvalds /* If the previous frag doesn't even reach the beginning, there's 1070*1da177e4SLinus Torvalds excessive fragmentation. Just merge. */ 1071*1da177e4SLinus Torvalds if (frag->ofs > min) { 1072*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Expanding down to cover partial frag (0x%x-0x%x)\n", 1073*1da177e4SLinus Torvalds frag->ofs, frag->ofs+frag->size)); 1074*1da177e4SLinus Torvalds start = frag->ofs; 1075*1da177e4SLinus Torvalds continue; 1076*1da177e4SLinus Torvalds } 1077*1da177e4SLinus Torvalds /* OK. This frag holds the first byte of the page. */ 1078*1da177e4SLinus Torvalds if (!frag->node || !frag->node->raw) { 1079*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "First frag in page is hole (0x%x-0x%x). Not expanding down.\n", 1080*1da177e4SLinus Torvalds frag->ofs, frag->ofs+frag->size)); 1081*1da177e4SLinus Torvalds break; 1082*1da177e4SLinus Torvalds } else { 1083*1da177e4SLinus Torvalds 1084*1da177e4SLinus Torvalds /* OK, it's a frag which extends to the beginning of the page. Does it live 1085*1da177e4SLinus Torvalds in a block which is still considered clean? If so, don't obsolete it. 1086*1da177e4SLinus Torvalds If not, cover it anyway. */ 1087*1da177e4SLinus Torvalds 1088*1da177e4SLinus Torvalds struct jffs2_raw_node_ref *raw = frag->node->raw; 1089*1da177e4SLinus Torvalds struct jffs2_eraseblock *jeb; 1090*1da177e4SLinus Torvalds 1091*1da177e4SLinus Torvalds jeb = &c->blocks[raw->flash_offset / c->sector_size]; 1092*1da177e4SLinus Torvalds 1093*1da177e4SLinus Torvalds if (jeb == c->gcblock) { 1094*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Expanding down to cover frag (0x%x-0x%x) in gcblock at %08x\n", 1095*1da177e4SLinus Torvalds frag->ofs, frag->ofs+frag->size, ref_offset(raw))); 1096*1da177e4SLinus Torvalds start = frag->ofs; 1097*1da177e4SLinus Torvalds break; 1098*1da177e4SLinus Torvalds } 1099*1da177e4SLinus Torvalds if (!ISDIRTY(jeb->dirty_size + jeb->wasted_size)) { 1100*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Not expanding down to cover frag (0x%x-0x%x) in clean block %08x\n", 1101*1da177e4SLinus Torvalds frag->ofs, frag->ofs+frag->size, jeb->offset)); 1102*1da177e4SLinus Torvalds break; 1103*1da177e4SLinus Torvalds } 1104*1da177e4SLinus Torvalds 1105*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Expanding down to cover frag (0x%x-0x%x) in dirty block %08x\n", 1106*1da177e4SLinus Torvalds frag->ofs, frag->ofs+frag->size, jeb->offset)); 1107*1da177e4SLinus Torvalds start = frag->ofs; 1108*1da177e4SLinus Torvalds break; 1109*1da177e4SLinus Torvalds } 1110*1da177e4SLinus Torvalds } 1111*1da177e4SLinus Torvalds 1112*1da177e4SLinus Torvalds /* ... then up */ 1113*1da177e4SLinus Torvalds 1114*1da177e4SLinus Torvalds /* Find last frag which is actually part of the node we're to GC. */ 1115*1da177e4SLinus Torvalds frag = jffs2_lookup_node_frag(&f->fragtree, end-1); 1116*1da177e4SLinus Torvalds 1117*1da177e4SLinus Torvalds while((frag = frag_next(frag)) && frag->ofs+frag->size <= max) { 1118*1da177e4SLinus Torvalds 1119*1da177e4SLinus Torvalds /* If the previous frag doesn't even reach the beginning, there's lots 1120*1da177e4SLinus Torvalds of fragmentation. Just merge. */ 1121*1da177e4SLinus Torvalds if (frag->ofs+frag->size < max) { 1122*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Expanding up to cover partial frag (0x%x-0x%x)\n", 1123*1da177e4SLinus Torvalds frag->ofs, frag->ofs+frag->size)); 1124*1da177e4SLinus Torvalds end = frag->ofs + frag->size; 1125*1da177e4SLinus Torvalds continue; 1126*1da177e4SLinus Torvalds } 1127*1da177e4SLinus Torvalds 1128*1da177e4SLinus Torvalds if (!frag->node || !frag->node->raw) { 1129*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Last frag in page is hole (0x%x-0x%x). Not expanding up.\n", 1130*1da177e4SLinus Torvalds frag->ofs, frag->ofs+frag->size)); 1131*1da177e4SLinus Torvalds break; 1132*1da177e4SLinus Torvalds } else { 1133*1da177e4SLinus Torvalds 1134*1da177e4SLinus Torvalds /* OK, it's a frag which extends to the beginning of the page. Does it live 1135*1da177e4SLinus Torvalds in a block which is still considered clean? If so, don't obsolete it. 1136*1da177e4SLinus Torvalds If not, cover it anyway. */ 1137*1da177e4SLinus Torvalds 1138*1da177e4SLinus Torvalds struct jffs2_raw_node_ref *raw = frag->node->raw; 1139*1da177e4SLinus Torvalds struct jffs2_eraseblock *jeb; 1140*1da177e4SLinus Torvalds 1141*1da177e4SLinus Torvalds jeb = &c->blocks[raw->flash_offset / c->sector_size]; 1142*1da177e4SLinus Torvalds 1143*1da177e4SLinus Torvalds if (jeb == c->gcblock) { 1144*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Expanding up to cover frag (0x%x-0x%x) in gcblock at %08x\n", 1145*1da177e4SLinus Torvalds frag->ofs, frag->ofs+frag->size, ref_offset(raw))); 1146*1da177e4SLinus Torvalds end = frag->ofs + frag->size; 1147*1da177e4SLinus Torvalds break; 1148*1da177e4SLinus Torvalds } 1149*1da177e4SLinus Torvalds if (!ISDIRTY(jeb->dirty_size + jeb->wasted_size)) { 1150*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Not expanding up to cover frag (0x%x-0x%x) in clean block %08x\n", 1151*1da177e4SLinus Torvalds frag->ofs, frag->ofs+frag->size, jeb->offset)); 1152*1da177e4SLinus Torvalds break; 1153*1da177e4SLinus Torvalds } 1154*1da177e4SLinus Torvalds 1155*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Expanding up to cover frag (0x%x-0x%x) in dirty block %08x\n", 1156*1da177e4SLinus Torvalds frag->ofs, frag->ofs+frag->size, jeb->offset)); 1157*1da177e4SLinus Torvalds end = frag->ofs + frag->size; 1158*1da177e4SLinus Torvalds break; 1159*1da177e4SLinus Torvalds } 1160*1da177e4SLinus Torvalds } 1161*1da177e4SLinus Torvalds D1(printk(KERN_DEBUG "Expanded dnode to write from (0x%x-0x%x) to (0x%x-0x%x)\n", 1162*1da177e4SLinus Torvalds orig_start, orig_end, start, end)); 1163*1da177e4SLinus Torvalds 1164*1da177e4SLinus Torvalds BUG_ON(end > JFFS2_F_I_SIZE(f)); 1165*1da177e4SLinus Torvalds BUG_ON(end < orig_end); 1166*1da177e4SLinus Torvalds BUG_ON(start > orig_start); 1167*1da177e4SLinus Torvalds } 1168*1da177e4SLinus Torvalds 1169*1da177e4SLinus Torvalds /* First, use readpage() to read the appropriate page into the page cache */ 1170*1da177e4SLinus Torvalds /* Q: What happens if we actually try to GC the _same_ page for which commit_write() 1171*1da177e4SLinus Torvalds * triggered garbage collection in the first place? 1172*1da177e4SLinus Torvalds * A: I _think_ it's OK. read_cache_page shouldn't deadlock, we'll write out the 1173*1da177e4SLinus Torvalds * page OK. We'll actually write it out again in commit_write, which is a little 1174*1da177e4SLinus Torvalds * suboptimal, but at least we're correct. 1175*1da177e4SLinus Torvalds */ 1176*1da177e4SLinus Torvalds pg_ptr = jffs2_gc_fetch_page(c, f, start, &pg); 1177*1da177e4SLinus Torvalds 1178*1da177e4SLinus Torvalds if (IS_ERR(pg_ptr)) { 1179*1da177e4SLinus Torvalds printk(KERN_WARNING "read_cache_page() returned error: %ld\n", PTR_ERR(pg_ptr)); 1180*1da177e4SLinus Torvalds return PTR_ERR(pg_ptr); 1181*1da177e4SLinus Torvalds } 1182*1da177e4SLinus Torvalds 1183*1da177e4SLinus Torvalds offset = start; 1184*1da177e4SLinus Torvalds while(offset < orig_end) { 1185*1da177e4SLinus Torvalds uint32_t datalen; 1186*1da177e4SLinus Torvalds uint32_t cdatalen; 1187*1da177e4SLinus Torvalds uint16_t comprtype = JFFS2_COMPR_NONE; 1188*1da177e4SLinus Torvalds 1189*1da177e4SLinus Torvalds ret = jffs2_reserve_space_gc(c, sizeof(ri) + JFFS2_MIN_DATA_LEN, &phys_ofs, &alloclen); 1190*1da177e4SLinus Torvalds 1191*1da177e4SLinus Torvalds if (ret) { 1192*1da177e4SLinus Torvalds printk(KERN_WARNING "jffs2_reserve_space_gc of %zd bytes for garbage_collect_dnode failed: %d\n", 1193*1da177e4SLinus Torvalds sizeof(ri)+ JFFS2_MIN_DATA_LEN, ret); 1194*1da177e4SLinus Torvalds break; 1195*1da177e4SLinus Torvalds } 1196*1da177e4SLinus Torvalds cdatalen = min_t(uint32_t, alloclen - sizeof(ri), end - offset); 1197*1da177e4SLinus Torvalds datalen = end - offset; 1198*1da177e4SLinus Torvalds 1199*1da177e4SLinus Torvalds writebuf = pg_ptr + (offset & (PAGE_CACHE_SIZE -1)); 1200*1da177e4SLinus Torvalds 1201*1da177e4SLinus Torvalds comprtype = jffs2_compress(c, f, writebuf, &comprbuf, &datalen, &cdatalen); 1202*1da177e4SLinus Torvalds 1203*1da177e4SLinus Torvalds ri.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); 1204*1da177e4SLinus Torvalds ri.nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE); 1205*1da177e4SLinus Torvalds ri.totlen = cpu_to_je32(sizeof(ri) + cdatalen); 1206*1da177e4SLinus Torvalds ri.hdr_crc = cpu_to_je32(crc32(0, &ri, sizeof(struct jffs2_unknown_node)-4)); 1207*1da177e4SLinus Torvalds 1208*1da177e4SLinus Torvalds ri.ino = cpu_to_je32(f->inocache->ino); 1209*1da177e4SLinus Torvalds ri.version = cpu_to_je32(++f->highest_version); 1210*1da177e4SLinus Torvalds ri.mode = cpu_to_jemode(JFFS2_F_I_MODE(f)); 1211*1da177e4SLinus Torvalds ri.uid = cpu_to_je16(JFFS2_F_I_UID(f)); 1212*1da177e4SLinus Torvalds ri.gid = cpu_to_je16(JFFS2_F_I_GID(f)); 1213*1da177e4SLinus Torvalds ri.isize = cpu_to_je32(JFFS2_F_I_SIZE(f)); 1214*1da177e4SLinus Torvalds ri.atime = cpu_to_je32(JFFS2_F_I_ATIME(f)); 1215*1da177e4SLinus Torvalds ri.ctime = cpu_to_je32(JFFS2_F_I_CTIME(f)); 1216*1da177e4SLinus Torvalds ri.mtime = cpu_to_je32(JFFS2_F_I_MTIME(f)); 1217*1da177e4SLinus Torvalds ri.offset = cpu_to_je32(offset); 1218*1da177e4SLinus Torvalds ri.csize = cpu_to_je32(cdatalen); 1219*1da177e4SLinus Torvalds ri.dsize = cpu_to_je32(datalen); 1220*1da177e4SLinus Torvalds ri.compr = comprtype & 0xff; 1221*1da177e4SLinus Torvalds ri.usercompr = (comprtype >> 8) & 0xff; 1222*1da177e4SLinus Torvalds ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8)); 1223*1da177e4SLinus Torvalds ri.data_crc = cpu_to_je32(crc32(0, comprbuf, cdatalen)); 1224*1da177e4SLinus Torvalds 1225*1da177e4SLinus Torvalds new_fn = jffs2_write_dnode(c, f, &ri, comprbuf, cdatalen, phys_ofs, ALLOC_GC); 1226*1da177e4SLinus Torvalds 1227*1da177e4SLinus Torvalds jffs2_free_comprbuf(comprbuf, writebuf); 1228*1da177e4SLinus Torvalds 1229*1da177e4SLinus Torvalds if (IS_ERR(new_fn)) { 1230*1da177e4SLinus Torvalds printk(KERN_WARNING "Error writing new dnode: %ld\n", PTR_ERR(new_fn)); 1231*1da177e4SLinus Torvalds ret = PTR_ERR(new_fn); 1232*1da177e4SLinus Torvalds break; 1233*1da177e4SLinus Torvalds } 1234*1da177e4SLinus Torvalds ret = jffs2_add_full_dnode_to_inode(c, f, new_fn); 1235*1da177e4SLinus Torvalds offset += datalen; 1236*1da177e4SLinus Torvalds if (f->metadata) { 1237*1da177e4SLinus Torvalds jffs2_mark_node_obsolete(c, f->metadata->raw); 1238*1da177e4SLinus Torvalds jffs2_free_full_dnode(f->metadata); 1239*1da177e4SLinus Torvalds f->metadata = NULL; 1240*1da177e4SLinus Torvalds } 1241*1da177e4SLinus Torvalds } 1242*1da177e4SLinus Torvalds 1243*1da177e4SLinus Torvalds jffs2_gc_release_page(c, pg_ptr, &pg); 1244*1da177e4SLinus Torvalds return ret; 1245*1da177e4SLinus Torvalds } 1246*1da177e4SLinus Torvalds 1247