~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/ubifs/find.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0-only
  2 /*
  3  * This file is part of UBIFS.
  4  *
  5  * Copyright (C) 2006-2008 Nokia Corporation.
  6  *
  7  * Authors: Artem Bityutskiy (Битюцкий Артём)
  8  *          Adrian Hunter
  9  */
 10 
 11 /*
 12  * This file contains functions for finding LEBs for various purposes e.g.
 13  * garbage collection. In general, lprops category heaps and lists are used
 14  * for fast access, falling back on scanning the LPT as a last resort.
 15  */
 16 
 17 #include <linux/sort.h>
 18 #include "ubifs.h"
 19 
 20 /**
 21  * struct scan_data - data provided to scan callback functions
 22  * @min_space: minimum number of bytes for which to scan
 23  * @pick_free: whether it is OK to scan for empty LEBs
 24  * @lnum: LEB number found is returned here
 25  * @exclude_index: whether to exclude index LEBs
 26  */
 27 struct scan_data {
 28         int min_space;
 29         int pick_free;
 30         int lnum;
 31         int exclude_index;
 32 };
 33 
 34 /**
 35  * valuable - determine whether LEB properties are valuable.
 36  * @c: the UBIFS file-system description object
 37  * @lprops: LEB properties
 38  *
 39  * This function return %1 if the LEB properties should be added to the LEB
 40  * properties tree in memory. Otherwise %0 is returned.
 41  */
 42 static int valuable(struct ubifs_info *c, const struct ubifs_lprops *lprops)
 43 {
 44         int n, cat = lprops->flags & LPROPS_CAT_MASK;
 45         struct ubifs_lpt_heap *heap;
 46 
 47         switch (cat) {
 48         case LPROPS_DIRTY:
 49         case LPROPS_DIRTY_IDX:
 50         case LPROPS_FREE:
 51                 heap = &c->lpt_heap[cat - 1];
 52                 if (heap->cnt < heap->max_cnt)
 53                         return 1;
 54                 if (lprops->free + lprops->dirty >= c->dark_wm)
 55                         return 1;
 56                 return 0;
 57         case LPROPS_EMPTY:
 58                 n = c->lst.empty_lebs + c->freeable_cnt -
 59                     c->lst.taken_empty_lebs;
 60                 if (n < c->lsave_cnt)
 61                         return 1;
 62                 return 0;
 63         case LPROPS_FREEABLE:
 64                 return 1;
 65         case LPROPS_FRDI_IDX:
 66                 return 1;
 67         }
 68         return 0;
 69 }
 70 
 71 /**
 72  * scan_for_dirty_cb - dirty space scan callback.
 73  * @c: the UBIFS file-system description object
 74  * @lprops: LEB properties to scan
 75  * @in_tree: whether the LEB properties are in main memory
 76  * @arg: information passed to and from the caller of the scan
 77  *
 78  * This function returns a code that indicates whether the scan should continue
 79  * (%LPT_SCAN_CONTINUE), whether the LEB properties should be added to the tree
 80  * in main memory (%LPT_SCAN_ADD), or whether the scan should stop
 81  * (%LPT_SCAN_STOP).
 82  */
 83 static int scan_for_dirty_cb(struct ubifs_info *c,
 84                              const struct ubifs_lprops *lprops, int in_tree,
 85                              void *arg)
 86 {
 87         struct scan_data *data = arg;
 88         int ret = LPT_SCAN_CONTINUE;
 89 
 90         /* Exclude LEBs that are currently in use */
 91         if (lprops->flags & LPROPS_TAKEN)
 92                 return LPT_SCAN_CONTINUE;
 93         /* Determine whether to add these LEB properties to the tree */
 94         if (!in_tree && valuable(c, lprops))
 95                 ret |= LPT_SCAN_ADD;
 96         /* Exclude LEBs with too little space */
 97         if (lprops->free + lprops->dirty < data->min_space)
 98                 return ret;
 99         /* If specified, exclude index LEBs */
100         if (data->exclude_index && lprops->flags & LPROPS_INDEX)
101                 return ret;
102         /* If specified, exclude empty or freeable LEBs */
103         if (lprops->free + lprops->dirty == c->leb_size) {
104                 if (!data->pick_free)
105                         return ret;
106         /* Exclude LEBs with too little dirty space (unless it is empty) */
107         } else if (lprops->dirty < c->dead_wm)
108                 return ret;
109         /* Finally we found space */
110         data->lnum = lprops->lnum;
111         return LPT_SCAN_ADD | LPT_SCAN_STOP;
112 }
113 
114 /**
115  * scan_for_dirty - find a data LEB with free space.
116  * @c: the UBIFS file-system description object
117  * @min_space: minimum amount free plus dirty space the returned LEB has to
118  *             have
119  * @pick_free: if it is OK to return a free or freeable LEB
120  * @exclude_index: whether to exclude index LEBs
121  *
122  * This function returns a pointer to the LEB properties found or a negative
123  * error code.
124  */
125 static const struct ubifs_lprops *scan_for_dirty(struct ubifs_info *c,
126                                                  int min_space, int pick_free,
127                                                  int exclude_index)
128 {
129         const struct ubifs_lprops *lprops;
130         struct ubifs_lpt_heap *heap;
131         struct scan_data data;
132         int err, i;
133 
134         /* There may be an LEB with enough dirty space on the free heap */
135         heap = &c->lpt_heap[LPROPS_FREE - 1];
136         for (i = 0; i < heap->cnt; i++) {
137                 lprops = heap->arr[i];
138                 if (lprops->free + lprops->dirty < min_space)
139                         continue;
140                 if (lprops->dirty < c->dead_wm)
141                         continue;
142                 return lprops;
143         }
144         /*
145          * A LEB may have fallen off of the bottom of the dirty heap, and ended
146          * up as uncategorized even though it has enough dirty space for us now,
147          * so check the uncategorized list. N.B. neither empty nor freeable LEBs
148          * can end up as uncategorized because they are kept on lists not
149          * finite-sized heaps.
150          */
151         list_for_each_entry(lprops, &c->uncat_list, list) {
152                 if (lprops->flags & LPROPS_TAKEN)
153                         continue;
154                 if (lprops->free + lprops->dirty < min_space)
155                         continue;
156                 if (exclude_index && (lprops->flags & LPROPS_INDEX))
157                         continue;
158                 if (lprops->dirty < c->dead_wm)
159                         continue;
160                 return lprops;
161         }
162         /* We have looked everywhere in main memory, now scan the flash */
163         if (c->pnodes_have >= c->pnode_cnt)
164                 /* All pnodes are in memory, so skip scan */
165                 return ERR_PTR(-ENOSPC);
166         data.min_space = min_space;
167         data.pick_free = pick_free;
168         data.lnum = -1;
169         data.exclude_index = exclude_index;
170         err = ubifs_lpt_scan_nolock(c, -1, c->lscan_lnum, scan_for_dirty_cb,
171                                     &data);
172         if (err)
173                 return ERR_PTR(err);
174         ubifs_assert(c, data.lnum >= c->main_first && data.lnum < c->leb_cnt);
175         c->lscan_lnum = data.lnum;
176         lprops = ubifs_lpt_lookup_dirty(c, data.lnum);
177         if (IS_ERR(lprops))
178                 return lprops;
179         ubifs_assert(c, lprops->lnum == data.lnum);
180         ubifs_assert(c, lprops->free + lprops->dirty >= min_space);
181         ubifs_assert(c, lprops->dirty >= c->dead_wm ||
182                      (pick_free &&
183                       lprops->free + lprops->dirty == c->leb_size));
184         ubifs_assert(c, !(lprops->flags & LPROPS_TAKEN));
185         ubifs_assert(c, !exclude_index || !(lprops->flags & LPROPS_INDEX));
186         return lprops;
187 }
188 
189 /**
190  * ubifs_find_dirty_leb - find a dirty LEB for the Garbage Collector.
191  * @c: the UBIFS file-system description object
192  * @ret_lp: LEB properties are returned here on exit
193  * @min_space: minimum amount free plus dirty space the returned LEB has to
194  *             have
195  * @pick_free: controls whether it is OK to pick empty or index LEBs
196  *
197  * This function tries to find a dirty logical eraseblock which has at least
198  * @min_space free and dirty space. It prefers to take an LEB from the dirty or
199  * dirty index heap, and it falls-back to LPT scanning if the heaps are empty
200  * or do not have an LEB which satisfies the @min_space criteria.
201  *
202  * Note, LEBs which have less than dead watermark of free + dirty space are
203  * never picked by this function.
204  *
205  * The additional @pick_free argument controls if this function has to return a
206  * free or freeable LEB if one is present. For example, GC must to set it to %1,
207  * when called from the journal space reservation function, because the
208  * appearance of free space may coincide with the loss of enough dirty space
209  * for GC to succeed anyway.
210  *
211  * In contrast, if the Garbage Collector is called from budgeting, it should
212  * just make free space, not return LEBs which are already free or freeable.
213  *
214  * In addition @pick_free is set to %2 by the recovery process in order to
215  * recover gc_lnum in which case an index LEB must not be returned.
216  *
217  * This function returns zero and the LEB properties of found dirty LEB in case
218  * of success, %-ENOSPC if no dirty LEB was found and a negative error code in
219  * case of other failures. The returned LEB is marked as "taken".
220  */
221 int ubifs_find_dirty_leb(struct ubifs_info *c, struct ubifs_lprops *ret_lp,
222                          int min_space, int pick_free)
223 {
224         int err = 0, sum, exclude_index = pick_free == 2 ? 1 : 0;
225         const struct ubifs_lprops *lp = NULL, *idx_lp = NULL;
226         struct ubifs_lpt_heap *heap, *idx_heap;
227 
228         ubifs_get_lprops(c);
229 
230         if (pick_free) {
231                 int lebs, rsvd_idx_lebs = 0;
232 
233                 spin_lock(&c->space_lock);
234                 lebs = c->lst.empty_lebs + c->idx_gc_cnt;
235                 lebs += c->freeable_cnt - c->lst.taken_empty_lebs;
236 
237                 /*
238                  * Note, the index may consume more LEBs than have been reserved
239                  * for it. It is OK because it might be consolidated by GC.
240                  * But if the index takes fewer LEBs than it is reserved for it,
241                  * this function must avoid picking those reserved LEBs.
242                  */
243                 if (c->bi.min_idx_lebs >= c->lst.idx_lebs) {
244                         rsvd_idx_lebs = c->bi.min_idx_lebs -  c->lst.idx_lebs;
245                         exclude_index = 1;
246                 }
247                 spin_unlock(&c->space_lock);
248 
249                 /* Check if there are enough free LEBs for the index */
250                 if (rsvd_idx_lebs < lebs) {
251                         /* OK, try to find an empty LEB */
252                         lp = ubifs_fast_find_empty(c);
253                         if (lp)
254                                 goto found;
255 
256                         /* Or a freeable LEB */
257                         lp = ubifs_fast_find_freeable(c);
258                         if (lp)
259                                 goto found;
260                 } else
261                         /*
262                          * We cannot pick free/freeable LEBs in the below code.
263                          */
264                         pick_free = 0;
265         } else {
266                 spin_lock(&c->space_lock);
267                 exclude_index = (c->bi.min_idx_lebs >= c->lst.idx_lebs);
268                 spin_unlock(&c->space_lock);
269         }
270 
271         /* Look on the dirty and dirty index heaps */
272         heap = &c->lpt_heap[LPROPS_DIRTY - 1];
273         idx_heap = &c->lpt_heap[LPROPS_DIRTY_IDX - 1];
274 
275         if (idx_heap->cnt && !exclude_index) {
276                 idx_lp = idx_heap->arr[0];
277                 sum = idx_lp->free + idx_lp->dirty;
278                 /*
279                  * Since we reserve thrice as much space for the index than it
280                  * actually takes, it does not make sense to pick indexing LEBs
281                  * with less than, say, half LEB of dirty space. May be half is
282                  * not the optimal boundary - this should be tested and
283                  * checked. This boundary should determine how much we use
284                  * in-the-gaps to consolidate the index comparing to how much
285                  * we use garbage collector to consolidate it. The "half"
286                  * criteria just feels to be fine.
287                  */
288                 if (sum < min_space || sum < c->half_leb_size)
289                         idx_lp = NULL;
290         }
291 
292         if (heap->cnt) {
293                 lp = heap->arr[0];
294                 if (lp->dirty + lp->free < min_space)
295                         lp = NULL;
296         }
297 
298         /* Pick the LEB with most space */
299         if (idx_lp && lp) {
300                 if (idx_lp->free + idx_lp->dirty >= lp->free + lp->dirty)
301                         lp = idx_lp;
302         } else if (idx_lp && !lp)
303                 lp = idx_lp;
304 
305         if (lp) {
306                 ubifs_assert(c, lp->free + lp->dirty >= c->dead_wm);
307                 goto found;
308         }
309 
310         /* Did not find a dirty LEB on the dirty heaps, have to scan */
311         dbg_find("scanning LPT for a dirty LEB");
312         lp = scan_for_dirty(c, min_space, pick_free, exclude_index);
313         if (IS_ERR(lp)) {
314                 err = PTR_ERR(lp);
315                 goto out;
316         }
317         ubifs_assert(c, lp->dirty >= c->dead_wm ||
318                      (pick_free && lp->free + lp->dirty == c->leb_size));
319 
320 found:
321         dbg_find("found LEB %d, free %d, dirty %d, flags %#x",
322                  lp->lnum, lp->free, lp->dirty, lp->flags);
323 
324         lp = ubifs_change_lp(c, lp, LPROPS_NC, LPROPS_NC,
325                              lp->flags | LPROPS_TAKEN, 0);
326         if (IS_ERR(lp)) {
327                 err = PTR_ERR(lp);
328                 goto out;
329         }
330 
331         memcpy(ret_lp, lp, sizeof(struct ubifs_lprops));
332 
333 out:
334         ubifs_release_lprops(c);
335         return err;
336 }
337 
338 /**
339  * scan_for_free_cb - free space scan callback.
340  * @c: the UBIFS file-system description object
341  * @lprops: LEB properties to scan
342  * @in_tree: whether the LEB properties are in main memory
343  * @arg: information passed to and from the caller of the scan
344  *
345  * This function returns a code that indicates whether the scan should continue
346  * (%LPT_SCAN_CONTINUE), whether the LEB properties should be added to the tree
347  * in main memory (%LPT_SCAN_ADD), or whether the scan should stop
348  * (%LPT_SCAN_STOP).
349  */
350 static int scan_for_free_cb(struct ubifs_info *c,
351                             const struct ubifs_lprops *lprops, int in_tree,
352                             void *arg)
353 {
354         struct scan_data *data = arg;
355         int ret = LPT_SCAN_CONTINUE;
356 
357         /* Exclude LEBs that are currently in use */
358         if (lprops->flags & LPROPS_TAKEN)
359                 return LPT_SCAN_CONTINUE;
360         /* Determine whether to add these LEB properties to the tree */
361         if (!in_tree && valuable(c, lprops))
362                 ret |= LPT_SCAN_ADD;
363         /* Exclude index LEBs */
364         if (lprops->flags & LPROPS_INDEX)
365                 return ret;
366         /* Exclude LEBs with too little space */
367         if (lprops->free < data->min_space)
368                 return ret;
369         /* If specified, exclude empty LEBs */
370         if (!data->pick_free && lprops->free == c->leb_size)
371                 return ret;
372         /*
373          * LEBs that have only free and dirty space must not be allocated
374          * because they may have been unmapped already or they may have data
375          * that is obsolete only because of nodes that are still sitting in a
376          * wbuf.
377          */
378         if (lprops->free + lprops->dirty == c->leb_size && lprops->dirty > 0)
379                 return ret;
380         /* Finally we found space */
381         data->lnum = lprops->lnum;
382         return LPT_SCAN_ADD | LPT_SCAN_STOP;
383 }
384 
385 /**
386  * do_find_free_space - find a data LEB with free space.
387  * @c: the UBIFS file-system description object
388  * @min_space: minimum amount of free space required
389  * @pick_free: whether it is OK to scan for empty LEBs
390  * @squeeze: whether to try to find space in a non-empty LEB first
391  *
392  * This function returns a pointer to the LEB properties found or a negative
393  * error code.
394  */
395 static
396 const struct ubifs_lprops *do_find_free_space(struct ubifs_info *c,
397                                               int min_space, int pick_free,
398                                               int squeeze)
399 {
400         const struct ubifs_lprops *lprops;
401         struct ubifs_lpt_heap *heap;
402         struct scan_data data;
403         int err, i;
404 
405         if (squeeze) {
406                 lprops = ubifs_fast_find_free(c);
407                 if (lprops && lprops->free >= min_space)
408                         return lprops;
409         }
410         if (pick_free) {
411                 lprops = ubifs_fast_find_empty(c);
412                 if (lprops)
413                         return lprops;
414         }
415         if (!squeeze) {
416                 lprops = ubifs_fast_find_free(c);
417                 if (lprops && lprops->free >= min_space)
418                         return lprops;
419         }
420         /* There may be an LEB with enough free space on the dirty heap */
421         heap = &c->lpt_heap[LPROPS_DIRTY - 1];
422         for (i = 0; i < heap->cnt; i++) {
423                 lprops = heap->arr[i];
424                 if (lprops->free >= min_space)
425                         return lprops;
426         }
427         /*
428          * A LEB may have fallen off of the bottom of the free heap, and ended
429          * up as uncategorized even though it has enough free space for us now,
430          * so check the uncategorized list. N.B. neither empty nor freeable LEBs
431          * can end up as uncategorized because they are kept on lists not
432          * finite-sized heaps.
433          */
434         list_for_each_entry(lprops, &c->uncat_list, list) {
435                 if (lprops->flags & LPROPS_TAKEN)
436                         continue;
437                 if (lprops->flags & LPROPS_INDEX)
438                         continue;
439                 if (lprops->free >= min_space)
440                         return lprops;
441         }
442         /* We have looked everywhere in main memory, now scan the flash */
443         if (c->pnodes_have >= c->pnode_cnt)
444                 /* All pnodes are in memory, so skip scan */
445                 return ERR_PTR(-ENOSPC);
446         data.min_space = min_space;
447         data.pick_free = pick_free;
448         data.lnum = -1;
449         err = ubifs_lpt_scan_nolock(c, -1, c->lscan_lnum,
450                                     scan_for_free_cb,
451                                     &data);
452         if (err)
453                 return ERR_PTR(err);
454         ubifs_assert(c, data.lnum >= c->main_first && data.lnum < c->leb_cnt);
455         c->lscan_lnum = data.lnum;
456         lprops = ubifs_lpt_lookup_dirty(c, data.lnum);
457         if (IS_ERR(lprops))
458                 return lprops;
459         ubifs_assert(c, lprops->lnum == data.lnum);
460         ubifs_assert(c, lprops->free >= min_space);
461         ubifs_assert(c, !(lprops->flags & LPROPS_TAKEN));
462         ubifs_assert(c, !(lprops->flags & LPROPS_INDEX));
463         return lprops;
464 }
465 
466 /**
467  * ubifs_find_free_space - find a data LEB with free space.
468  * @c: the UBIFS file-system description object
469  * @min_space: minimum amount of required free space
470  * @offs: contains offset of where free space starts on exit
471  * @squeeze: whether to try to find space in a non-empty LEB first
472  *
473  * This function looks for an LEB with at least @min_space bytes of free space.
474  * It tries to find an empty LEB if possible. If no empty LEBs are available,
475  * this function searches for a non-empty data LEB. The returned LEB is marked
476  * as "taken".
477  *
478  * This function returns found LEB number in case of success, %-ENOSPC if it
479  * failed to find a LEB with @min_space bytes of free space and other a negative
480  * error codes in case of failure.
481  */
482 int ubifs_find_free_space(struct ubifs_info *c, int min_space, int *offs,
483                           int squeeze)
484 {
485         const struct ubifs_lprops *lprops;
486         int lebs, rsvd_idx_lebs, pick_free = 0, err, lnum, flags;
487 
488         dbg_find("min_space %d", min_space);
489         ubifs_get_lprops(c);
490 
491         /* Check if there are enough empty LEBs for commit */
492         spin_lock(&c->space_lock);
493         if (c->bi.min_idx_lebs > c->lst.idx_lebs)
494                 rsvd_idx_lebs = c->bi.min_idx_lebs -  c->lst.idx_lebs;
495         else
496                 rsvd_idx_lebs = 0;
497         lebs = c->lst.empty_lebs + c->freeable_cnt + c->idx_gc_cnt -
498                c->lst.taken_empty_lebs;
499         if (rsvd_idx_lebs < lebs)
500                 /*
501                  * OK to allocate an empty LEB, but we still don't want to go
502                  * looking for one if there aren't any.
503                  */
504                 if (c->lst.empty_lebs - c->lst.taken_empty_lebs > 0) {
505                         pick_free = 1;
506                         /*
507                          * Because we release the space lock, we must account
508                          * for this allocation here. After the LEB properties
509                          * flags have been updated, we subtract one. Note, the
510                          * result of this is that lprops also decreases
511                          * @taken_empty_lebs in 'ubifs_change_lp()', so it is
512                          * off by one for a short period of time which may
513                          * introduce a small disturbance to budgeting
514                          * calculations, but this is harmless because at the
515                          * worst case this would make the budgeting subsystem
516                          * be more pessimistic than needed.
517                          *
518                          * Fundamentally, this is about serialization of the
519                          * budgeting and lprops subsystems. We could make the
520                          * @space_lock a mutex and avoid dropping it before
521                          * calling 'ubifs_change_lp()', but mutex is more
522                          * heavy-weight, and we want budgeting to be as fast as
523                          * possible.
524                          */
525                         c->lst.taken_empty_lebs += 1;
526                 }
527         spin_unlock(&c->space_lock);
528 
529         lprops = do_find_free_space(c, min_space, pick_free, squeeze);
530         if (IS_ERR(lprops)) {
531                 err = PTR_ERR(lprops);
532                 goto out;
533         }
534 
535         lnum = lprops->lnum;
536         flags = lprops->flags | LPROPS_TAKEN;
537 
538         lprops = ubifs_change_lp(c, lprops, LPROPS_NC, LPROPS_NC, flags, 0);
539         if (IS_ERR(lprops)) {
540                 err = PTR_ERR(lprops);
541                 goto out;
542         }
543 
544         if (pick_free) {
545                 spin_lock(&c->space_lock);
546                 c->lst.taken_empty_lebs -= 1;
547                 spin_unlock(&c->space_lock);
548         }
549 
550         *offs = c->leb_size - lprops->free;
551         ubifs_release_lprops(c);
552 
553         if (*offs == 0) {
554                 /*
555                  * Ensure that empty LEBs have been unmapped. They may not have
556                  * been, for example, because of an unclean unmount.  Also
557                  * LEBs that were freeable LEBs (free + dirty == leb_size) will
558                  * not have been unmapped.
559                  */
560                 err = ubifs_leb_unmap(c, lnum);
561                 if (err)
562                         return err;
563         }
564 
565         dbg_find("found LEB %d, free %d", lnum, c->leb_size - *offs);
566         ubifs_assert(c, *offs <= c->leb_size - min_space);
567         return lnum;
568 
569 out:
570         if (pick_free) {
571                 spin_lock(&c->space_lock);
572                 c->lst.taken_empty_lebs -= 1;
573                 spin_unlock(&c->space_lock);
574         }
575         ubifs_release_lprops(c);
576         return err;
577 }
578 
579 /**
580  * scan_for_idx_cb - callback used by the scan for a free LEB for the index.
581  * @c: the UBIFS file-system description object
582  * @lprops: LEB properties to scan
583  * @in_tree: whether the LEB properties are in main memory
584  * @arg: information passed to and from the caller of the scan
585  *
586  * This function returns a code that indicates whether the scan should continue
587  * (%LPT_SCAN_CONTINUE), whether the LEB properties should be added to the tree
588  * in main memory (%LPT_SCAN_ADD), or whether the scan should stop
589  * (%LPT_SCAN_STOP).
590  */
591 static int scan_for_idx_cb(struct ubifs_info *c,
592                            const struct ubifs_lprops *lprops, int in_tree,
593                            void *arg)
594 {
595         struct scan_data *data = arg;
596         int ret = LPT_SCAN_CONTINUE;
597 
598         /* Exclude LEBs that are currently in use */
599         if (lprops->flags & LPROPS_TAKEN)
600                 return LPT_SCAN_CONTINUE;
601         /* Determine whether to add these LEB properties to the tree */
602         if (!in_tree && valuable(c, lprops))
603                 ret |= LPT_SCAN_ADD;
604         /* Exclude index LEBS */
605         if (lprops->flags & LPROPS_INDEX)
606                 return ret;
607         /* Exclude LEBs that cannot be made empty */
608         if (lprops->free + lprops->dirty != c->leb_size)
609                 return ret;
610         /*
611          * We are allocating for the index so it is safe to allocate LEBs with
612          * only free and dirty space, because write buffers are sync'd at commit
613          * start.
614          */
615         data->lnum = lprops->lnum;
616         return LPT_SCAN_ADD | LPT_SCAN_STOP;
617 }
618 
619 /**
620  * scan_for_leb_for_idx - scan for a free LEB for the index.
621  * @c: the UBIFS file-system description object
622  */
623 static const struct ubifs_lprops *scan_for_leb_for_idx(struct ubifs_info *c)
624 {
625         const struct ubifs_lprops *lprops;
626         struct scan_data data;
627         int err;
628 
629         data.lnum = -1;
630         err = ubifs_lpt_scan_nolock(c, -1, c->lscan_lnum, scan_for_idx_cb,
631                                     &data);
632         if (err)
633                 return ERR_PTR(err);
634         ubifs_assert(c, data.lnum >= c->main_first && data.lnum < c->leb_cnt);
635         c->lscan_lnum = data.lnum;
636         lprops = ubifs_lpt_lookup_dirty(c, data.lnum);
637         if (IS_ERR(lprops))
638                 return lprops;
639         ubifs_assert(c, lprops->lnum == data.lnum);
640         ubifs_assert(c, lprops->free + lprops->dirty == c->leb_size);
641         ubifs_assert(c, !(lprops->flags & LPROPS_TAKEN));
642         ubifs_assert(c, !(lprops->flags & LPROPS_INDEX));
643         return lprops;
644 }
645 
646 /**
647  * ubifs_find_free_leb_for_idx - find a free LEB for the index.
648  * @c: the UBIFS file-system description object
649  *
650  * This function looks for a free LEB and returns that LEB number. The returned
651  * LEB is marked as "taken", "index".
652  *
653  * Only empty LEBs are allocated. This is for two reasons. First, the commit
654  * calculates the number of LEBs to allocate based on the assumption that they
655  * will be empty. Secondly, free space at the end of an index LEB is not
656  * guaranteed to be empty because it may have been used by the in-the-gaps
657  * method prior to an unclean unmount.
658  *
659  * If no LEB is found %-ENOSPC is returned. For other failures another negative
660  * error code is returned.
661  */
662 int ubifs_find_free_leb_for_idx(struct ubifs_info *c)
663 {
664         const struct ubifs_lprops *lprops;
665         int lnum = -1, err, flags;
666 
667         ubifs_get_lprops(c);
668 
669         lprops = ubifs_fast_find_empty(c);
670         if (!lprops) {
671                 lprops = ubifs_fast_find_freeable(c);
672                 if (!lprops) {
673                         /*
674                          * The first condition means the following: go scan the
675                          * LPT if there are uncategorized lprops, which means
676                          * there may be freeable LEBs there (UBIFS does not
677                          * store the information about freeable LEBs in the
678                          * master node).
679                          */
680                         if (c->in_a_category_cnt != c->main_lebs ||
681                             c->lst.empty_lebs - c->lst.taken_empty_lebs > 0) {
682                                 ubifs_assert(c, c->freeable_cnt == 0);
683                                 lprops = scan_for_leb_for_idx(c);
684                                 if (IS_ERR(lprops)) {
685                                         err = PTR_ERR(lprops);
686                                         goto out;
687                                 }
688                         }
689                 }
690         }
691 
692         if (!lprops) {
693                 err = -ENOSPC;
694                 goto out;
695         }
696 
697         lnum = lprops->lnum;
698 
699         dbg_find("found LEB %d, free %d, dirty %d, flags %#x",
700                  lnum, lprops->free, lprops->dirty, lprops->flags);
701 
702         flags = lprops->flags | LPROPS_TAKEN | LPROPS_INDEX;
703         lprops = ubifs_change_lp(c, lprops, c->leb_size, 0, flags, 0);
704         if (IS_ERR(lprops)) {
705                 err = PTR_ERR(lprops);
706                 goto out;
707         }
708 
709         ubifs_release_lprops(c);
710 
711         /*
712          * Ensure that empty LEBs have been unmapped. They may not have been,
713          * for example, because of an unclean unmount. Also LEBs that were
714          * freeable LEBs (free + dirty == leb_size) will not have been unmapped.
715          */
716         err = ubifs_leb_unmap(c, lnum);
717         if (err) {
718                 ubifs_change_one_lp(c, lnum, LPROPS_NC, LPROPS_NC, 0,
719                                     LPROPS_TAKEN | LPROPS_INDEX, 0);
720                 return err;
721         }
722 
723         return lnum;
724 
725 out:
726         ubifs_release_lprops(c);
727         return err;
728 }
729 
730 static int cmp_dirty_idx(const void *a, const void *b)
731 {
732         const struct ubifs_lprops *lpa = *(const struct ubifs_lprops **)a;
733         const struct ubifs_lprops *lpb = *(const struct ubifs_lprops **)b;
734 
735         return lpa->dirty + lpa->free - lpb->dirty - lpb->free;
736 }
737 
738 /**
739  * ubifs_save_dirty_idx_lnums - save an array of the most dirty index LEB nos.
740  * @c: the UBIFS file-system description object
741  *
742  * This function is called each commit to create an array of LEB numbers of
743  * dirty index LEBs sorted in order of dirty and free space.  This is used by
744  * the in-the-gaps method of TNC commit.
745  */
746 int ubifs_save_dirty_idx_lnums(struct ubifs_info *c)
747 {
748         int i;
749 
750         ubifs_get_lprops(c);
751         /* Copy the LPROPS_DIRTY_IDX heap */
752         c->dirty_idx.cnt = c->lpt_heap[LPROPS_DIRTY_IDX - 1].cnt;
753         memcpy(c->dirty_idx.arr, c->lpt_heap[LPROPS_DIRTY_IDX - 1].arr,
754                sizeof(void *) * c->dirty_idx.cnt);
755         /* Sort it so that the dirtiest is now at the end */
756         sort(c->dirty_idx.arr, c->dirty_idx.cnt, sizeof(void *),
757              cmp_dirty_idx, NULL);
758         dbg_find("found %d dirty index LEBs", c->dirty_idx.cnt);
759         if (c->dirty_idx.cnt)
760                 dbg_find("dirtiest index LEB is %d with dirty %d and free %d",
761                          c->dirty_idx.arr[c->dirty_idx.cnt - 1]->lnum,
762                          c->dirty_idx.arr[c->dirty_idx.cnt - 1]->dirty,
763                          c->dirty_idx.arr[c->dirty_idx.cnt - 1]->free);
764         /* Replace the lprops pointers with LEB numbers */
765         for (i = 0; i < c->dirty_idx.cnt; i++)
766                 c->dirty_idx.arr[i] = (void *)(size_t)c->dirty_idx.arr[i]->lnum;
767         ubifs_release_lprops(c);
768         return 0;
769 }
770 
771 /**
772  * scan_dirty_idx_cb - callback used by the scan for a dirty index LEB.
773  * @c: the UBIFS file-system description object
774  * @lprops: LEB properties to scan
775  * @in_tree: whether the LEB properties are in main memory
776  * @arg: information passed to and from the caller of the scan
777  *
778  * This function returns a code that indicates whether the scan should continue
779  * (%LPT_SCAN_CONTINUE), whether the LEB properties should be added to the tree
780  * in main memory (%LPT_SCAN_ADD), or whether the scan should stop
781  * (%LPT_SCAN_STOP).
782  */
783 static int scan_dirty_idx_cb(struct ubifs_info *c,
784                            const struct ubifs_lprops *lprops, int in_tree,
785                            void *arg)
786 {
787         struct scan_data *data = arg;
788         int ret = LPT_SCAN_CONTINUE;
789 
790         /* Exclude LEBs that are currently in use */
791         if (lprops->flags & LPROPS_TAKEN)
792                 return LPT_SCAN_CONTINUE;
793         /* Determine whether to add these LEB properties to the tree */
794         if (!in_tree && valuable(c, lprops))
795                 ret |= LPT_SCAN_ADD;
796         /* Exclude non-index LEBs */
797         if (!(lprops->flags & LPROPS_INDEX))
798                 return ret;
799         /* Exclude LEBs with too little space */
800         if (lprops->free + lprops->dirty < c->min_idx_node_sz)
801                 return ret;
802         /* Finally we found space */
803         data->lnum = lprops->lnum;
804         return LPT_SCAN_ADD | LPT_SCAN_STOP;
805 }
806 
807 /**
808  * find_dirty_idx_leb - find a dirty index LEB.
809  * @c: the UBIFS file-system description object
810  *
811  * This function returns LEB number upon success and a negative error code upon
812  * failure.  In particular, -ENOSPC is returned if a dirty index LEB is not
813  * found.
814  *
815  * Note that this function scans the entire LPT but it is called very rarely.
816  */
817 static int find_dirty_idx_leb(struct ubifs_info *c)
818 {
819         const struct ubifs_lprops *lprops;
820         struct ubifs_lpt_heap *heap;
821         struct scan_data data;
822         int err, i, ret;
823 
824         /* Check all structures in memory first */
825         data.lnum = -1;
826         heap = &c->lpt_heap[LPROPS_DIRTY_IDX - 1];
827         for (i = 0; i < heap->cnt; i++) {
828                 lprops = heap->arr[i];
829                 ret = scan_dirty_idx_cb(c, lprops, 1, &data);
830                 if (ret & LPT_SCAN_STOP)
831                         goto found;
832         }
833         list_for_each_entry(lprops, &c->frdi_idx_list, list) {
834                 ret = scan_dirty_idx_cb(c, lprops, 1, &data);
835                 if (ret & LPT_SCAN_STOP)
836                         goto found;
837         }
838         list_for_each_entry(lprops, &c->uncat_list, list) {
839                 ret = scan_dirty_idx_cb(c, lprops, 1, &data);
840                 if (ret & LPT_SCAN_STOP)
841                         goto found;
842         }
843         if (c->pnodes_have >= c->pnode_cnt)
844                 /* All pnodes are in memory, so skip scan */
845                 return -ENOSPC;
846         err = ubifs_lpt_scan_nolock(c, -1, c->lscan_lnum, scan_dirty_idx_cb,
847                                     &data);
848         if (err)
849                 return err;
850 found:
851         ubifs_assert(c, data.lnum >= c->main_first && data.lnum < c->leb_cnt);
852         c->lscan_lnum = data.lnum;
853         lprops = ubifs_lpt_lookup_dirty(c, data.lnum);
854         if (IS_ERR(lprops))
855                 return PTR_ERR(lprops);
856         ubifs_assert(c, lprops->lnum == data.lnum);
857         ubifs_assert(c, lprops->free + lprops->dirty >= c->min_idx_node_sz);
858         ubifs_assert(c, !(lprops->flags & LPROPS_TAKEN));
859         ubifs_assert(c, (lprops->flags & LPROPS_INDEX));
860 
861         dbg_find("found dirty LEB %d, free %d, dirty %d, flags %#x",
862                  lprops->lnum, lprops->free, lprops->dirty, lprops->flags);
863 
864         lprops = ubifs_change_lp(c, lprops, LPROPS_NC, LPROPS_NC,
865                                  lprops->flags | LPROPS_TAKEN, 0);
866         if (IS_ERR(lprops))
867                 return PTR_ERR(lprops);
868 
869         return lprops->lnum;
870 }
871 
872 /**
873  * get_idx_gc_leb - try to get a LEB number from trivial GC.
874  * @c: the UBIFS file-system description object
875  */
876 static int get_idx_gc_leb(struct ubifs_info *c)
877 {
878         const struct ubifs_lprops *lp;
879         int err, lnum;
880 
881         err = ubifs_get_idx_gc_leb(c);
882         if (err < 0)
883                 return err;
884         lnum = err;
885         /*
886          * The LEB was due to be unmapped after the commit but
887          * it is needed now for this commit.
888          */
889         lp = ubifs_lpt_lookup_dirty(c, lnum);
890         if (IS_ERR(lp))
891                 return PTR_ERR(lp);
892         lp = ubifs_change_lp(c, lp, LPROPS_NC, LPROPS_NC,
893                              lp->flags | LPROPS_INDEX, -1);
894         if (IS_ERR(lp))
895                 return PTR_ERR(lp);
896         dbg_find("LEB %d, dirty %d and free %d flags %#x",
897                  lp->lnum, lp->dirty, lp->free, lp->flags);
898         return lnum;
899 }
900 
901 /**
902  * find_dirtiest_idx_leb - find dirtiest index LEB from dirtiest array.
903  * @c: the UBIFS file-system description object
904  */
905 static int find_dirtiest_idx_leb(struct ubifs_info *c)
906 {
907         const struct ubifs_lprops *lp;
908         int lnum;
909 
910         while (1) {
911                 if (!c->dirty_idx.cnt)
912                         return -ENOSPC;
913                 /* The lprops pointers were replaced by LEB numbers */
914                 lnum = (size_t)c->dirty_idx.arr[--c->dirty_idx.cnt];
915                 lp = ubifs_lpt_lookup(c, lnum);
916                 if (IS_ERR(lp))
917                         return PTR_ERR(lp);
918                 if ((lp->flags & LPROPS_TAKEN) || !(lp->flags & LPROPS_INDEX))
919                         continue;
920                 lp = ubifs_change_lp(c, lp, LPROPS_NC, LPROPS_NC,
921                                      lp->flags | LPROPS_TAKEN, 0);
922                 if (IS_ERR(lp))
923                         return PTR_ERR(lp);
924                 break;
925         }
926         dbg_find("LEB %d, dirty %d and free %d flags %#x", lp->lnum, lp->dirty,
927                  lp->free, lp->flags);
928         ubifs_assert(c, lp->flags & LPROPS_TAKEN);
929         ubifs_assert(c, lp->flags & LPROPS_INDEX);
930         return lnum;
931 }
932 
933 /**
934  * ubifs_find_dirty_idx_leb - try to find dirtiest index LEB as at last commit.
935  * @c: the UBIFS file-system description object
936  *
937  * This function attempts to find an untaken index LEB with the most free and
938  * dirty space that can be used without overwriting index nodes that were in the
939  * last index committed.
940  */
941 int ubifs_find_dirty_idx_leb(struct ubifs_info *c)
942 {
943         int err;
944 
945         ubifs_get_lprops(c);
946 
947         /*
948          * We made an array of the dirtiest index LEB numbers as at the start of
949          * last commit.  Try that array first.
950          */
951         err = find_dirtiest_idx_leb(c);
952 
953         /* Next try scanning the entire LPT */
954         if (err == -ENOSPC)
955                 err = find_dirty_idx_leb(c);
956 
957         /* Finally take any index LEBs awaiting trivial GC */
958         if (err == -ENOSPC)
959                 err = get_idx_gc_leb(c);
960 
961         ubifs_release_lprops(c);
962         return err;
963 }
964 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php