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