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