V4L/DVB (10978): Report tuning algorith correctly
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / fs / jffs2 / nodemgmt.c
CommitLineData
1da177e4
LT
1/*
2 * JFFS2 -- Journalling Flash File System, Version 2.
3 *
c00c310e 4 * Copyright © 2001-2007 Red Hat, Inc.
1da177e4
LT
5 *
6 * Created by David Woodhouse <dwmw2@infradead.org>
7 *
8 * For licensing information, see the file 'LICENCE' in this directory.
9 *
1da177e4
LT
10 */
11
12#include <linux/kernel.h>
13#include <linux/slab.h>
14#include <linux/mtd/mtd.h>
15#include <linux/compiler.h>
16#include <linux/sched.h> /* For cond_resched() */
17#include "nodelist.h"
e631ddba 18#include "debug.h"
1da177e4
LT
19
20/**
21 * jffs2_reserve_space - request physical space to write nodes to flash
22 * @c: superblock info
23 * @minsize: Minimum acceptable size of allocation
1da177e4
LT
24 * @len: Returned value of allocation length
25 * @prio: Allocation type - ALLOC_{NORMAL,DELETION}
26 *
27 * Requests a block of physical space on the flash. Returns zero for success
9fe4854c
DW
28 * and puts 'len' into the appropriate place, or returns -ENOSPC or other
29 * error if appropriate. Doesn't return len since that's
1da177e4
LT
30 *
31 * If it returns zero, jffs2_reserve_space() also downs the per-filesystem
32 * allocation semaphore, to prevent more than one allocation from being
33 * active at any time. The semaphore is later released by jffs2_commit_allocation()
34 *
35 * jffs2_reserve_space() may trigger garbage collection in order to make room
36 * for the requested allocation.
37 */
38
e631ddba 39static int jffs2_do_reserve_space(struct jffs2_sb_info *c, uint32_t minsize,
9fe4854c 40 uint32_t *len, uint32_t sumsize);
1da177e4 41
9fe4854c 42int jffs2_reserve_space(struct jffs2_sb_info *c, uint32_t minsize,
e631ddba 43 uint32_t *len, int prio, uint32_t sumsize)
1da177e4
LT
44{
45 int ret = -EAGAIN;
46 int blocksneeded = c->resv_blocks_write;
47 /* align it */
48 minsize = PAD(minsize);
49
50 D1(printk(KERN_DEBUG "jffs2_reserve_space(): Requested 0x%x bytes\n", minsize));
ced22070 51 mutex_lock(&c->alloc_sem);
1da177e4
LT
52
53 D1(printk(KERN_DEBUG "jffs2_reserve_space(): alloc sem got\n"));
54
55 spin_lock(&c->erase_completion_lock);
56
57 /* this needs a little more thought (true <tglx> :)) */
58 while(ret == -EAGAIN) {
59 while(c->nr_free_blocks + c->nr_erasing_blocks < blocksneeded) {
1da177e4
LT
60 uint32_t dirty, avail;
61
62 /* calculate real dirty size
63 * dirty_size contains blocks on erase_pending_list
64 * those blocks are counted in c->nr_erasing_blocks.
65 * If one block is actually erased, it is not longer counted as dirty_space
66 * but it is counted in c->nr_erasing_blocks, so we add it and subtract it
67 * with c->nr_erasing_blocks * c->sector_size again.
68 * Blocks on erasable_list are counted as dirty_size, but not in c->nr_erasing_blocks
69 * This helps us to force gc and pick eventually a clean block to spread the load.
70 * We add unchecked_size here, as we hopefully will find some space to use.
71 * This will affect the sum only once, as gc first finishes checking
72 * of nodes.
73 */
74 dirty = c->dirty_size + c->erasing_size - c->nr_erasing_blocks * c->sector_size + c->unchecked_size;
75 if (dirty < c->nospc_dirty_size) {
76 if (prio == ALLOC_DELETION && c->nr_free_blocks + c->nr_erasing_blocks >= c->resv_blocks_deletion) {
4132ace8 77 D1(printk(KERN_NOTICE "jffs2_reserve_space(): Low on dirty space to GC, but it's a deletion. Allowing...\n"));
1da177e4
LT
78 break;
79 }
80 D1(printk(KERN_DEBUG "dirty size 0x%08x + unchecked_size 0x%08x < nospc_dirty_size 0x%08x, returning -ENOSPC\n",
81 dirty, c->unchecked_size, c->sector_size));
82
83 spin_unlock(&c->erase_completion_lock);
ced22070 84 mutex_unlock(&c->alloc_sem);
1da177e4
LT
85 return -ENOSPC;
86 }
182ec4ee 87
1da177e4
LT
88 /* Calc possibly available space. Possibly available means that we
89 * don't know, if unchecked size contains obsoleted nodes, which could give us some
90 * more usable space. This will affect the sum only once, as gc first finishes checking
91 * of nodes.
182ec4ee 92 + Return -ENOSPC, if the maximum possibly available space is less or equal than
1da177e4
LT
93 * blocksneeded * sector_size.
94 * This blocks endless gc looping on a filesystem, which is nearly full, even if
95 * the check above passes.
96 */
97 avail = c->free_size + c->dirty_size + c->erasing_size + c->unchecked_size;
98 if ( (avail / c->sector_size) <= blocksneeded) {
99 if (prio == ALLOC_DELETION && c->nr_free_blocks + c->nr_erasing_blocks >= c->resv_blocks_deletion) {
4132ace8 100 D1(printk(KERN_NOTICE "jffs2_reserve_space(): Low on possibly available space, but it's a deletion. Allowing...\n"));
1da177e4
LT
101 break;
102 }
103
104 D1(printk(KERN_DEBUG "max. available size 0x%08x < blocksneeded * sector_size 0x%08x, returning -ENOSPC\n",
105 avail, blocksneeded * c->sector_size));
106 spin_unlock(&c->erase_completion_lock);
ced22070 107 mutex_unlock(&c->alloc_sem);
1da177e4
LT
108 return -ENOSPC;
109 }
110
ced22070 111 mutex_unlock(&c->alloc_sem);
1da177e4
LT
112
113 D1(printk(KERN_DEBUG "Triggering GC pass. nr_free_blocks %d, nr_erasing_blocks %d, free_size 0x%08x, dirty_size 0x%08x, wasted_size 0x%08x, used_size 0x%08x, erasing_size 0x%08x, bad_size 0x%08x (total 0x%08x of 0x%08x)\n",
114 c->nr_free_blocks, c->nr_erasing_blocks, c->free_size, c->dirty_size, c->wasted_size, c->used_size, c->erasing_size, c->bad_size,
115 c->free_size + c->dirty_size + c->wasted_size + c->used_size + c->erasing_size + c->bad_size, c->flash_size));
116 spin_unlock(&c->erase_completion_lock);
182ec4ee 117
1da177e4 118 ret = jffs2_garbage_collect_pass(c);
422b1202
DW
119
120 if (ret == -EAGAIN)
121 jffs2_erase_pending_blocks(c, 1);
122 else if (ret)
1da177e4
LT
123 return ret;
124
125 cond_resched();
126
127 if (signal_pending(current))
128 return -EINTR;
129
ced22070 130 mutex_lock(&c->alloc_sem);
1da177e4
LT
131 spin_lock(&c->erase_completion_lock);
132 }
133
9fe4854c 134 ret = jffs2_do_reserve_space(c, minsize, len, sumsize);
1da177e4
LT
135 if (ret) {
136 D1(printk(KERN_DEBUG "jffs2_reserve_space: ret is %d\n", ret));
137 }
138 }
139 spin_unlock(&c->erase_completion_lock);
2f785402 140 if (!ret)
046b8b98 141 ret = jffs2_prealloc_raw_node_refs(c, c->nextblock, 1);
1da177e4 142 if (ret)
ced22070 143 mutex_unlock(&c->alloc_sem);
1da177e4
LT
144 return ret;
145}
146
9fe4854c
DW
147int jffs2_reserve_space_gc(struct jffs2_sb_info *c, uint32_t minsize,
148 uint32_t *len, uint32_t sumsize)
1da177e4
LT
149{
150 int ret = -EAGAIN;
151 minsize = PAD(minsize);
152
153 D1(printk(KERN_DEBUG "jffs2_reserve_space_gc(): Requested 0x%x bytes\n", minsize));
154
155 spin_lock(&c->erase_completion_lock);
156 while(ret == -EAGAIN) {
9fe4854c 157 ret = jffs2_do_reserve_space(c, minsize, len, sumsize);
1da177e4 158 if (ret) {
ef53cb02 159 D1(printk(KERN_DEBUG "jffs2_reserve_space_gc: looping, ret is %d\n", ret));
1da177e4
LT
160 }
161 }
162 spin_unlock(&c->erase_completion_lock);
2f785402 163 if (!ret)
046b8b98 164 ret = jffs2_prealloc_raw_node_refs(c, c->nextblock, 1);
2f785402 165
1da177e4
LT
166 return ret;
167}
168
e631ddba
FH
169
170/* Classify nextblock (clean, dirty of verydirty) and force to select an other one */
171
172static void jffs2_close_nextblock(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb)
1da177e4 173{
e631ddba 174
99c2594f
AH
175 if (c->nextblock == NULL) {
176 D1(printk(KERN_DEBUG "jffs2_close_nextblock: Erase block at 0x%08x has already been placed in a list\n",
177 jeb->offset));
178 return;
179 }
e631ddba
FH
180 /* Check, if we have a dirty block now, or if it was dirty already */
181 if (ISDIRTY (jeb->wasted_size + jeb->dirty_size)) {
182 c->dirty_size += jeb->wasted_size;
183 c->wasted_size -= jeb->wasted_size;
184 jeb->dirty_size += jeb->wasted_size;
185 jeb->wasted_size = 0;
186 if (VERYDIRTY(c, jeb->dirty_size)) {
187 D1(printk(KERN_DEBUG "Adding full erase block at 0x%08x to very_dirty_list (free 0x%08x, dirty 0x%08x, used 0x%08x\n",
188 jeb->offset, jeb->free_size, jeb->dirty_size, jeb->used_size));
189 list_add_tail(&jeb->list, &c->very_dirty_list);
190 } else {
191 D1(printk(KERN_DEBUG "Adding full erase block at 0x%08x to dirty_list (free 0x%08x, dirty 0x%08x, used 0x%08x\n",
192 jeb->offset, jeb->free_size, jeb->dirty_size, jeb->used_size));
193 list_add_tail(&jeb->list, &c->dirty_list);
194 }
182ec4ee 195 } else {
e631ddba
FH
196 D1(printk(KERN_DEBUG "Adding full erase block at 0x%08x to clean_list (free 0x%08x, dirty 0x%08x, used 0x%08x\n",
197 jeb->offset, jeb->free_size, jeb->dirty_size, jeb->used_size));
198 list_add_tail(&jeb->list, &c->clean_list);
199 }
200 c->nextblock = NULL;
201
202}
203
204/* Select a new jeb for nextblock */
205
206static int jffs2_find_nextblock(struct jffs2_sb_info *c)
207{
208 struct list_head *next;
182ec4ee 209
e631ddba
FH
210 /* Take the next block off the 'free' list */
211
212 if (list_empty(&c->free_list)) {
213
214 if (!c->nr_erasing_blocks &&
215 !list_empty(&c->erasable_list)) {
216 struct jffs2_eraseblock *ejeb;
217
218 ejeb = list_entry(c->erasable_list.next, struct jffs2_eraseblock, list);
f116629d 219 list_move_tail(&ejeb->list, &c->erase_pending_list);
e631ddba
FH
220 c->nr_erasing_blocks++;
221 jffs2_erase_pending_trigger(c);
222 D1(printk(KERN_DEBUG "jffs2_find_nextblock: Triggering erase of erasable block at 0x%08x\n",
223 ejeb->offset));
224 }
225
226 if (!c->nr_erasing_blocks &&
227 !list_empty(&c->erasable_pending_wbuf_list)) {
228 D1(printk(KERN_DEBUG "jffs2_find_nextblock: Flushing write buffer\n"));
229 /* c->nextblock is NULL, no update to c->nextblock allowed */
1da177e4 230 spin_unlock(&c->erase_completion_lock);
1da177e4
LT
231 jffs2_flush_wbuf_pad(c);
232 spin_lock(&c->erase_completion_lock);
e631ddba
FH
233 /* Have another go. It'll be on the erasable_list now */
234 return -EAGAIN;
1da177e4 235 }
e631ddba
FH
236
237 if (!c->nr_erasing_blocks) {
238 /* Ouch. We're in GC, or we wouldn't have got here.
239 And there's no space left. At all. */
182ec4ee
TG
240 printk(KERN_CRIT "Argh. No free space left for GC. nr_erasing_blocks is %d. nr_free_blocks is %d. (erasableempty: %s, erasingempty: %s, erasependingempty: %s)\n",
241 c->nr_erasing_blocks, c->nr_free_blocks, list_empty(&c->erasable_list)?"yes":"no",
e631ddba
FH
242 list_empty(&c->erasing_list)?"yes":"no", list_empty(&c->erase_pending_list)?"yes":"no");
243 return -ENOSPC;
1da177e4 244 }
e631ddba
FH
245
246 spin_unlock(&c->erase_completion_lock);
247 /* Don't wait for it; just erase one right now */
248 jffs2_erase_pending_blocks(c, 1);
249 spin_lock(&c->erase_completion_lock);
250
251 /* An erase may have failed, decreasing the
252 amount of free space available. So we must
253 restart from the beginning */
254 return -EAGAIN;
1da177e4 255 }
e631ddba
FH
256
257 next = c->free_list.next;
258 list_del(next);
259 c->nextblock = list_entry(next, struct jffs2_eraseblock, list);
260 c->nr_free_blocks--;
182ec4ee 261
e631ddba
FH
262 jffs2_sum_reset_collected(c->summary); /* reset collected summary */
263
f04de505 264#ifdef CONFIG_JFFS2_FS_WRITEBUFFER
5bf17237
AB
265 /* adjust write buffer offset, else we get a non contiguous write bug */
266 if (!(c->wbuf_ofs % c->sector_size) && !c->wbuf_len)
267 c->wbuf_ofs = 0xffffffff;
f04de505 268#endif
5bf17237 269
e631ddba
FH
270 D1(printk(KERN_DEBUG "jffs2_find_nextblock(): new nextblock = 0x%08x\n", c->nextblock->offset));
271
272 return 0;
273}
274
275/* Called with alloc sem _and_ erase_completion_lock */
9fe4854c
DW
276static int jffs2_do_reserve_space(struct jffs2_sb_info *c, uint32_t minsize,
277 uint32_t *len, uint32_t sumsize)
e631ddba
FH
278{
279 struct jffs2_eraseblock *jeb = c->nextblock;
9fe4854c 280 uint32_t reserved_size; /* for summary information at the end of the jeb */
e631ddba
FH
281 int ret;
282
283 restart:
284 reserved_size = 0;
285
286 if (jffs2_sum_active() && (sumsize != JFFS2_SUMMARY_NOSUM_SIZE)) {
287 /* NOSUM_SIZE means not to generate summary */
288
289 if (jeb) {
290 reserved_size = PAD(sumsize + c->summary->sum_size + JFFS2_SUMMARY_FRAME_SIZE);
733802d9 291 dbg_summary("minsize=%d , jeb->free=%d ,"
e631ddba
FH
292 "summary->size=%d , sumsize=%d\n",
293 minsize, jeb->free_size,
294 c->summary->sum_size, sumsize);
295 }
296
297 /* Is there enough space for writing out the current node, or we have to
298 write out summary information now, close this jeb and select new nextblock? */
299 if (jeb && (PAD(minsize) + PAD(c->summary->sum_size + sumsize +
300 JFFS2_SUMMARY_FRAME_SIZE) > jeb->free_size)) {
301
302 /* Has summary been disabled for this jeb? */
303 if (jffs2_sum_is_disabled(c->summary)) {
304 sumsize = JFFS2_SUMMARY_NOSUM_SIZE;
305 goto restart;
1da177e4
LT
306 }
307
e631ddba 308 /* Writing out the collected summary information */
733802d9 309 dbg_summary("generating summary for 0x%08x.\n", jeb->offset);
e631ddba
FH
310 ret = jffs2_sum_write_sumnode(c);
311
312 if (ret)
313 return ret;
314
315 if (jffs2_sum_is_disabled(c->summary)) {
316 /* jffs2_write_sumnode() couldn't write out the summary information
317 diabling summary for this jeb and free the collected information
318 */
319 sumsize = JFFS2_SUMMARY_NOSUM_SIZE;
320 goto restart;
321 }
322
323 jffs2_close_nextblock(c, jeb);
324 jeb = NULL;
34c0e906
FH
325 /* keep always valid value in reserved_size */
326 reserved_size = PAD(sumsize + c->summary->sum_size + JFFS2_SUMMARY_FRAME_SIZE);
e631ddba
FH
327 }
328 } else {
329 if (jeb && minsize > jeb->free_size) {
fc6612f6
DW
330 uint32_t waste;
331
e631ddba
FH
332 /* Skip the end of this block and file it as having some dirty space */
333 /* If there's a pending write to it, flush now */
334
335 if (jffs2_wbuf_dirty(c)) {
1da177e4 336 spin_unlock(&c->erase_completion_lock);
e631ddba 337 D1(printk(KERN_DEBUG "jffs2_do_reserve_space: Flushing write buffer\n"));
1da177e4
LT
338 jffs2_flush_wbuf_pad(c);
339 spin_lock(&c->erase_completion_lock);
e631ddba
FH
340 jeb = c->nextblock;
341 goto restart;
1da177e4
LT
342 }
343
fc6612f6
DW
344 spin_unlock(&c->erase_completion_lock);
345
346 ret = jffs2_prealloc_raw_node_refs(c, jeb, 1);
347 if (ret)
348 return ret;
349 /* Just lock it again and continue. Nothing much can change because
350 we hold c->alloc_sem anyway. In fact, it's not entirely clear why
351 we hold c->erase_completion_lock in the majority of this function...
352 but that's a question for another (more caffeine-rich) day. */
353 spin_lock(&c->erase_completion_lock);
354
355 waste = jeb->free_size;
356 jffs2_link_node_ref(c, jeb,
357 (jeb->offset + c->sector_size - waste) | REF_OBSOLETE,
358 waste, NULL);
359 /* FIXME: that made it count as dirty. Convert to wasted */
360 jeb->dirty_size -= waste;
361 c->dirty_size -= waste;
362 jeb->wasted_size += waste;
363 c->wasted_size += waste;
1da177e4 364
e631ddba
FH
365 jffs2_close_nextblock(c, jeb);
366 jeb = NULL;
1da177e4 367 }
e631ddba
FH
368 }
369
370 if (!jeb) {
371
372 ret = jffs2_find_nextblock(c);
373 if (ret)
374 return ret;
1da177e4 375
e631ddba 376 jeb = c->nextblock;
1da177e4
LT
377
378 if (jeb->free_size != c->sector_size - c->cleanmarker_size) {
379 printk(KERN_WARNING "Eep. Block 0x%08x taken from free_list had free_size of 0x%08x!!\n", jeb->offset, jeb->free_size);
380 goto restart;
381 }
382 }
383 /* OK, jeb (==c->nextblock) is now pointing at a block which definitely has
384 enough space */
e631ddba 385 *len = jeb->free_size - reserved_size;
1da177e4
LT
386
387 if (c->cleanmarker_size && jeb->used_size == c->cleanmarker_size &&
388 !jeb->first_node->next_in_ino) {
182ec4ee 389 /* Only node in it beforehand was a CLEANMARKER node (we think).
1da177e4 390 So mark it obsolete now that there's going to be another node
182ec4ee 391 in the block. This will reduce used_size to zero but We've
1da177e4
LT
392 already set c->nextblock so that jffs2_mark_node_obsolete()
393 won't try to refile it to the dirty_list.
394 */
395 spin_unlock(&c->erase_completion_lock);
396 jffs2_mark_node_obsolete(c, jeb->first_node);
397 spin_lock(&c->erase_completion_lock);
398 }
399
9fe4854c
DW
400 D1(printk(KERN_DEBUG "jffs2_do_reserve_space(): Giving 0x%x bytes at 0x%x\n",
401 *len, jeb->offset + (c->sector_size - jeb->free_size)));
1da177e4
LT
402 return 0;
403}
404
405/**
406 * jffs2_add_physical_node_ref - add a physical node reference to the list
407 * @c: superblock info
408 * @new: new node reference to add
409 * @len: length of this physical node
1da177e4 410 *
182ec4ee 411 * Should only be used to report nodes for which space has been allocated
1da177e4
LT
412 * by jffs2_reserve_space.
413 *
414 * Must be called with the alloc_sem held.
415 */
182ec4ee 416
2f785402
DW
417struct jffs2_raw_node_ref *jffs2_add_physical_node_ref(struct jffs2_sb_info *c,
418 uint32_t ofs, uint32_t len,
419 struct jffs2_inode_cache *ic)
1da177e4
LT
420{
421 struct jffs2_eraseblock *jeb;
2f785402 422 struct jffs2_raw_node_ref *new;
1da177e4 423
2f785402 424 jeb = &c->blocks[ofs / c->sector_size];
1da177e4 425
2f785402
DW
426 D1(printk(KERN_DEBUG "jffs2_add_physical_node_ref(): Node at 0x%x(%d), size 0x%x\n",
427 ofs & ~3, ofs & 3, len));
1da177e4 428#if 1
2f785402
DW
429 /* Allow non-obsolete nodes only to be added at the end of c->nextblock,
430 if c->nextblock is set. Note that wbuf.c will file obsolete nodes
431 even after refiling c->nextblock */
432 if ((c->nextblock || ((ofs & 3) != REF_OBSOLETE))
433 && (jeb != c->nextblock || (ofs & ~3) != jeb->offset + (c->sector_size - jeb->free_size))) {
66bfaeaa
DW
434 printk(KERN_WARNING "argh. node added in wrong place at 0x%08x(%d)\n", ofs & ~3, ofs & 3);
435 if (c->nextblock)
436 printk(KERN_WARNING "nextblock 0x%08x", c->nextblock->offset);
437 else
438 printk(KERN_WARNING "No nextblock");
439 printk(", expected at %08x\n", jeb->offset + (c->sector_size - jeb->free_size));
2f785402 440 return ERR_PTR(-EINVAL);
1da177e4
LT
441 }
442#endif
443 spin_lock(&c->erase_completion_lock);
444
2f785402 445 new = jffs2_link_node_ref(c, jeb, ofs, len, ic);
1da177e4 446
9b88f473 447 if (!jeb->free_size && !jeb->dirty_size && !ISDIRTY(jeb->wasted_size)) {
1da177e4
LT
448 /* If it lives on the dirty_list, jffs2_reserve_space will put it there */
449 D1(printk(KERN_DEBUG "Adding full erase block at 0x%08x to clean_list (free 0x%08x, dirty 0x%08x, used 0x%08x\n",
450 jeb->offset, jeb->free_size, jeb->dirty_size, jeb->used_size));
451 if (jffs2_wbuf_dirty(c)) {
452 /* Flush the last write in the block if it's outstanding */
453 spin_unlock(&c->erase_completion_lock);
454 jffs2_flush_wbuf_pad(c);
455 spin_lock(&c->erase_completion_lock);
456 }
457
458 list_add_tail(&jeb->list, &c->clean_list);
459 c->nextblock = NULL;
460 }
e0c8e42f
AB
461 jffs2_dbg_acct_sanity_check_nolock(c,jeb);
462 jffs2_dbg_acct_paranoia_check_nolock(c, jeb);
1da177e4
LT
463
464 spin_unlock(&c->erase_completion_lock);
465
2f785402 466 return new;
1da177e4
LT
467}
468
469
470void jffs2_complete_reservation(struct jffs2_sb_info *c)
471{
472 D1(printk(KERN_DEBUG "jffs2_complete_reservation()\n"));
473 jffs2_garbage_collect_trigger(c);
ced22070 474 mutex_unlock(&c->alloc_sem);
1da177e4
LT
475}
476
477static inline int on_list(struct list_head *obj, struct list_head *head)
478{
479 struct list_head *this;
480
481 list_for_each(this, head) {
482 if (this == obj) {
483 D1(printk("%p is on list at %p\n", obj, head));
484 return 1;
485
486 }
487 }
488 return 0;
489}
490
491void jffs2_mark_node_obsolete(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *ref)
492{
493 struct jffs2_eraseblock *jeb;
494 int blocknr;
495 struct jffs2_unknown_node n;
496 int ret, addedsize;
497 size_t retlen;
1417fc44 498 uint32_t freed_len;
1da177e4 499
9bfeb691 500 if(unlikely(!ref)) {
1da177e4
LT
501 printk(KERN_NOTICE "EEEEEK. jffs2_mark_node_obsolete called with NULL node\n");
502 return;
503 }
504 if (ref_obsolete(ref)) {
505 D1(printk(KERN_DEBUG "jffs2_mark_node_obsolete called with already obsolete node at 0x%08x\n", ref_offset(ref)));
506 return;
507 }
508 blocknr = ref->flash_offset / c->sector_size;
509 if (blocknr >= c->nr_blocks) {
510 printk(KERN_NOTICE "raw node at 0x%08x is off the end of device!\n", ref->flash_offset);
511 BUG();
512 }
513 jeb = &c->blocks[blocknr];
514
515 if (jffs2_can_mark_obsolete(c) && !jffs2_is_readonly(c) &&
31fbdf7a 516 !(c->flags & (JFFS2_SB_FLAG_SCANNING | JFFS2_SB_FLAG_BUILDING))) {
182ec4ee
TG
517 /* Hm. This may confuse static lock analysis. If any of the above
518 three conditions is false, we're going to return from this
1da177e4
LT
519 function without actually obliterating any nodes or freeing
520 any jffs2_raw_node_refs. So we don't need to stop erases from
521 happening, or protect against people holding an obsolete
522 jffs2_raw_node_ref without the erase_completion_lock. */
ced22070 523 mutex_lock(&c->erase_free_sem);
1da177e4
LT
524 }
525
526 spin_lock(&c->erase_completion_lock);
527
1417fc44
DW
528 freed_len = ref_totlen(c, jeb, ref);
529
1da177e4 530 if (ref_flags(ref) == REF_UNCHECKED) {
1417fc44 531 D1(if (unlikely(jeb->unchecked_size < freed_len)) {
1da177e4 532 printk(KERN_NOTICE "raw unchecked node of size 0x%08x freed from erase block %d at 0x%08x, but unchecked_size was already 0x%08x\n",
1417fc44 533 freed_len, blocknr, ref->flash_offset, jeb->used_size);
1da177e4
LT
534 BUG();
535 })
1417fc44
DW
536 D1(printk(KERN_DEBUG "Obsoleting previously unchecked node at 0x%08x of len %x: ", ref_offset(ref), freed_len));
537 jeb->unchecked_size -= freed_len;
538 c->unchecked_size -= freed_len;
1da177e4 539 } else {
1417fc44 540 D1(if (unlikely(jeb->used_size < freed_len)) {
1da177e4 541 printk(KERN_NOTICE "raw node of size 0x%08x freed from erase block %d at 0x%08x, but used_size was already 0x%08x\n",
1417fc44 542 freed_len, blocknr, ref->flash_offset, jeb->used_size);
1da177e4
LT
543 BUG();
544 })
1417fc44
DW
545 D1(printk(KERN_DEBUG "Obsoleting node at 0x%08x of len %#x: ", ref_offset(ref), freed_len));
546 jeb->used_size -= freed_len;
547 c->used_size -= freed_len;
1da177e4
LT
548 }
549
550 // Take care, that wasted size is taken into concern
1417fc44 551 if ((jeb->dirty_size || ISDIRTY(jeb->wasted_size + freed_len)) && jeb != c->nextblock) {
c7c16c8e 552 D1(printk("Dirtying\n"));
1417fc44
DW
553 addedsize = freed_len;
554 jeb->dirty_size += freed_len;
555 c->dirty_size += freed_len;
1da177e4
LT
556
557 /* Convert wasted space to dirty, if not a bad block */
558 if (jeb->wasted_size) {
559 if (on_list(&jeb->list, &c->bad_used_list)) {
560 D1(printk(KERN_DEBUG "Leaving block at %08x on the bad_used_list\n",
561 jeb->offset));
562 addedsize = 0; /* To fool the refiling code later */
563 } else {
564 D1(printk(KERN_DEBUG "Converting %d bytes of wasted space to dirty in block at %08x\n",
565 jeb->wasted_size, jeb->offset));
566 addedsize += jeb->wasted_size;
567 jeb->dirty_size += jeb->wasted_size;
568 c->dirty_size += jeb->wasted_size;
569 c->wasted_size -= jeb->wasted_size;
570 jeb->wasted_size = 0;
571 }
572 }
573 } else {
c7c16c8e 574 D1(printk("Wasting\n"));
1da177e4 575 addedsize = 0;
1417fc44
DW
576 jeb->wasted_size += freed_len;
577 c->wasted_size += freed_len;
1da177e4
LT
578 }
579 ref->flash_offset = ref_offset(ref) | REF_OBSOLETE;
182ec4ee 580
e0c8e42f
AB
581 jffs2_dbg_acct_sanity_check_nolock(c, jeb);
582 jffs2_dbg_acct_paranoia_check_nolock(c, jeb);
1da177e4 583
31fbdf7a
AB
584 if (c->flags & JFFS2_SB_FLAG_SCANNING) {
585 /* Flash scanning is in progress. Don't muck about with the block
1da177e4 586 lists because they're not ready yet, and don't actually
182ec4ee 587 obliterate nodes that look obsolete. If they weren't
1da177e4
LT
588 marked obsolete on the flash at the time they _became_
589 obsolete, there was probably a reason for that. */
590 spin_unlock(&c->erase_completion_lock);
591 /* We didn't lock the erase_free_sem */
592 return;
593 }
594
595 if (jeb == c->nextblock) {
596 D2(printk(KERN_DEBUG "Not moving nextblock 0x%08x to dirty/erase_pending list\n", jeb->offset));
597 } else if (!jeb->used_size && !jeb->unchecked_size) {
598 if (jeb == c->gcblock) {
599 D1(printk(KERN_DEBUG "gcblock at 0x%08x completely dirtied. Clearing gcblock...\n", jeb->offset));
600 c->gcblock = NULL;
601 } else {
602 D1(printk(KERN_DEBUG "Eraseblock at 0x%08x completely dirtied. Removing from (dirty?) list...\n", jeb->offset));
603 list_del(&jeb->list);
604 }
605 if (jffs2_wbuf_dirty(c)) {
606 D1(printk(KERN_DEBUG "...and adding to erasable_pending_wbuf_list\n"));
607 list_add_tail(&jeb->list, &c->erasable_pending_wbuf_list);
608 } else {
609 if (jiffies & 127) {
610 /* Most of the time, we just erase it immediately. Otherwise we
611 spend ages scanning it on mount, etc. */
612 D1(printk(KERN_DEBUG "...and adding to erase_pending_list\n"));
613 list_add_tail(&jeb->list, &c->erase_pending_list);
614 c->nr_erasing_blocks++;
615 jffs2_erase_pending_trigger(c);
616 } else {
617 /* Sometimes, however, we leave it elsewhere so it doesn't get
618 immediately reused, and we spread the load a bit. */
619 D1(printk(KERN_DEBUG "...and adding to erasable_list\n"));
620 list_add_tail(&jeb->list, &c->erasable_list);
182ec4ee 621 }
1da177e4
LT
622 }
623 D1(printk(KERN_DEBUG "Done OK\n"));
624 } else if (jeb == c->gcblock) {
625 D2(printk(KERN_DEBUG "Not moving gcblock 0x%08x to dirty_list\n", jeb->offset));
626 } else if (ISDIRTY(jeb->dirty_size) && !ISDIRTY(jeb->dirty_size - addedsize)) {
627 D1(printk(KERN_DEBUG "Eraseblock at 0x%08x is freshly dirtied. Removing from clean list...\n", jeb->offset));
628 list_del(&jeb->list);
629 D1(printk(KERN_DEBUG "...and adding to dirty_list\n"));
630 list_add_tail(&jeb->list, &c->dirty_list);
631 } else if (VERYDIRTY(c, jeb->dirty_size) &&
632 !VERYDIRTY(c, jeb->dirty_size - addedsize)) {
633 D1(printk(KERN_DEBUG "Eraseblock at 0x%08x is now very dirty. Removing from dirty list...\n", jeb->offset));
634 list_del(&jeb->list);
635 D1(printk(KERN_DEBUG "...and adding to very_dirty_list\n"));
636 list_add_tail(&jeb->list, &c->very_dirty_list);
637 } else {
638 D1(printk(KERN_DEBUG "Eraseblock at 0x%08x not moved anywhere. (free 0x%08x, dirty 0x%08x, used 0x%08x)\n",
182ec4ee
TG
639 jeb->offset, jeb->free_size, jeb->dirty_size, jeb->used_size));
640 }
1da177e4
LT
641
642 spin_unlock(&c->erase_completion_lock);
643
31fbdf7a
AB
644 if (!jffs2_can_mark_obsolete(c) || jffs2_is_readonly(c) ||
645 (c->flags & JFFS2_SB_FLAG_BUILDING)) {
1da177e4
LT
646 /* We didn't lock the erase_free_sem */
647 return;
648 }
649
650 /* The erase_free_sem is locked, and has been since before we marked the node obsolete
651 and potentially put its eraseblock onto the erase_pending_list. Thus, we know that
652 the block hasn't _already_ been erased, and that 'ref' itself hasn't been freed yet
c38c1b61 653 by jffs2_free_jeb_node_refs() in erase.c. Which is nice. */
1da177e4
LT
654
655 D1(printk(KERN_DEBUG "obliterating obsoleted node at 0x%08x\n", ref_offset(ref)));
656 ret = jffs2_flash_read(c, ref_offset(ref), sizeof(n), &retlen, (char *)&n);
657 if (ret) {
658 printk(KERN_WARNING "Read error reading from obsoleted node at 0x%08x: %d\n", ref_offset(ref), ret);
659 goto out_erase_sem;
660 }
661 if (retlen != sizeof(n)) {
662 printk(KERN_WARNING "Short read from obsoleted node at 0x%08x: %zd\n", ref_offset(ref), retlen);
663 goto out_erase_sem;
664 }
1417fc44
DW
665 if (PAD(je32_to_cpu(n.totlen)) != PAD(freed_len)) {
666 printk(KERN_WARNING "Node totlen on flash (0x%08x) != totlen from node ref (0x%08x)\n", je32_to_cpu(n.totlen), freed_len);
1da177e4
LT
667 goto out_erase_sem;
668 }
669 if (!(je16_to_cpu(n.nodetype) & JFFS2_NODE_ACCURATE)) {
670 D1(printk(KERN_DEBUG "Node at 0x%08x was already marked obsolete (nodetype 0x%04x)\n", ref_offset(ref), je16_to_cpu(n.nodetype)));
671 goto out_erase_sem;
672 }
673 /* XXX FIXME: This is ugly now */
674 n.nodetype = cpu_to_je16(je16_to_cpu(n.nodetype) & ~JFFS2_NODE_ACCURATE);
675 ret = jffs2_flash_write(c, ref_offset(ref), sizeof(n), &retlen, (char *)&n);
676 if (ret) {
677 printk(KERN_WARNING "Write error in obliterating obsoleted node at 0x%08x: %d\n", ref_offset(ref), ret);
678 goto out_erase_sem;
679 }
680 if (retlen != sizeof(n)) {
681 printk(KERN_WARNING "Short write in obliterating obsoleted node at 0x%08x: %zd\n", ref_offset(ref), retlen);
682 goto out_erase_sem;
683 }
684
685 /* Nodes which have been marked obsolete no longer need to be
686 associated with any inode. Remove them from the per-inode list.
182ec4ee
TG
687
688 Note we can't do this for NAND at the moment because we need
1da177e4
LT
689 obsolete dirent nodes to stay on the lists, because of the
690 horridness in jffs2_garbage_collect_deletion_dirent(). Also
182ec4ee 691 because we delete the inocache, and on NAND we need that to
1da177e4
LT
692 stay around until all the nodes are actually erased, in order
693 to stop us from giving the same inode number to another newly
694 created inode. */
695 if (ref->next_in_ino) {
696 struct jffs2_inode_cache *ic;
697 struct jffs2_raw_node_ref **p;
698
699 spin_lock(&c->erase_completion_lock);
700
701 ic = jffs2_raw_ref_to_ic(ref);
702 for (p = &ic->nodes; (*p) != ref; p = &((*p)->next_in_ino))
703 ;
704
705 *p = ref->next_in_ino;
706 ref->next_in_ino = NULL;
707
c9f700f8
KK
708 switch (ic->class) {
709#ifdef CONFIG_JFFS2_FS_XATTR
710 case RAWNODE_CLASS_XATTR_DATUM:
711 jffs2_release_xattr_datum(c, (struct jffs2_xattr_datum *)ic);
712 break;
713 case RAWNODE_CLASS_XATTR_REF:
714 jffs2_release_xattr_ref(c, (struct jffs2_xattr_ref *)ic);
715 break;
716#endif
717 default:
27c72b04 718 if (ic->nodes == (void *)ic && ic->pino_nlink == 0)
c9f700f8
KK
719 jffs2_del_ino_cache(c, ic);
720 break;
721 }
1da177e4
LT
722 spin_unlock(&c->erase_completion_lock);
723 }
724
1da177e4 725 out_erase_sem:
ced22070 726 mutex_unlock(&c->erase_free_sem);
1da177e4
LT
727}
728
1da177e4
LT
729int jffs2_thread_should_wake(struct jffs2_sb_info *c)
730{
731 int ret = 0;
732 uint32_t dirty;
8fb870df
DW
733 int nr_very_dirty = 0;
734 struct jffs2_eraseblock *jeb;
1da177e4
LT
735
736 if (c->unchecked_size) {
737 D1(printk(KERN_DEBUG "jffs2_thread_should_wake(): unchecked_size %d, checked_ino #%d\n",
738 c->unchecked_size, c->checked_ino));
739 return 1;
740 }
741
742 /* dirty_size contains blocks on erase_pending_list
743 * those blocks are counted in c->nr_erasing_blocks.
744 * If one block is actually erased, it is not longer counted as dirty_space
745 * but it is counted in c->nr_erasing_blocks, so we add it and subtract it
746 * with c->nr_erasing_blocks * c->sector_size again.
747 * Blocks on erasable_list are counted as dirty_size, but not in c->nr_erasing_blocks
748 * This helps us to force gc and pick eventually a clean block to spread the load.
749 */
750 dirty = c->dirty_size + c->erasing_size - c->nr_erasing_blocks * c->sector_size;
751
182ec4ee
TG
752 if (c->nr_free_blocks + c->nr_erasing_blocks < c->resv_blocks_gctrigger &&
753 (dirty > c->nospc_dirty_size))
1da177e4
LT
754 ret = 1;
755
8fb870df
DW
756 list_for_each_entry(jeb, &c->very_dirty_list, list) {
757 nr_very_dirty++;
758 if (nr_very_dirty == c->vdirty_blocks_gctrigger) {
759 ret = 1;
a8c68f32
DW
760 /* In debug mode, actually go through and count them all */
761 D1(continue);
762 break;
8fb870df
DW
763 }
764 }
765
766 D1(printk(KERN_DEBUG "jffs2_thread_should_wake(): nr_free_blocks %d, nr_erasing_blocks %d, dirty_size 0x%x, vdirty_blocks %d: %s\n",
767 c->nr_free_blocks, c->nr_erasing_blocks, c->dirty_size, nr_very_dirty, ret?"yes":"no"));
1da177e4
LT
768
769 return ret;
770}