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