linux/drivers/mtd/ubi/scan.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) International Business Machines Corp., 2006
   3 *
   4 * This program is free software; you can redistribute it and/or modify
   5 * it under the terms of the GNU General Public License as published by
   6 * the Free Software Foundation; either version 2 of the License, or
   7 * (at your option) any later version.
   8 *
   9 * This program is distributed in the hope that it will be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
  12 * the GNU General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, write to the Free Software
  16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  17 *
  18 * Author: Artem Bityutskiy (Битюцкий Артём)
  19 */
  20
  21#ifndef __UBI_SCAN_H__
  22#define __UBI_SCAN_H__
  23
  24/* The erase counter value for this physical eraseblock is unknown */
  25#define UBI_SCAN_UNKNOWN_EC (-1)
  26
  27/**
  28 * struct ubi_scan_leb - scanning information about a physical eraseblock.
  29 * @ec: erase counter (%UBI_SCAN_UNKNOWN_EC if it is unknown)
  30 * @pnum: physical eraseblock number
  31 * @lnum: logical eraseblock number
  32 * @scrub: if this physical eraseblock needs scrubbing
  33 * @sqnum: sequence number
  34 * @u: unions RB-tree or @list links
  35 * @u.rb: link in the per-volume RB-tree of &struct ubi_scan_leb objects
  36 * @u.list: link in one of the eraseblock lists
  37 *
  38 * One object of this type is allocated for each physical eraseblock during
  39 * scanning.
  40 */
  41struct ubi_scan_leb {
  42        int ec;
  43        int pnum;
  44        int lnum;
  45        int scrub;
  46        unsigned long long sqnum;
  47        union {
  48                struct rb_node rb;
  49                struct list_head list;
  50        } u;
  51};
  52
  53/**
  54 * struct ubi_scan_volume - scanning information about a volume.
  55 * @vol_id: volume ID
  56 * @highest_lnum: highest logical eraseblock number in this volume
  57 * @leb_count: number of logical eraseblocks in this volume
  58 * @vol_type: volume type
  59 * @used_ebs: number of used logical eraseblocks in this volume (only for
  60 *            static volumes)
  61 * @last_data_size: amount of data in the last logical eraseblock of this
  62 *                  volume (always equivalent to the usable logical eraseblock
  63 *                  size in case of dynamic volumes)
  64 * @data_pad: how many bytes at the end of logical eraseblocks of this volume
  65 *            are not used (due to volume alignment)
  66 * @compat: compatibility flags of this volume
  67 * @rb: link in the volume RB-tree
  68 * @root: root of the RB-tree containing all the eraseblock belonging to this
  69 *        volume (&struct ubi_scan_leb objects)
  70 *
  71 * One object of this type is allocated for each volume during scanning.
  72 */
  73struct ubi_scan_volume {
  74        int vol_id;
  75        int highest_lnum;
  76        int leb_count;
  77        int vol_type;
  78        int used_ebs;
  79        int last_data_size;
  80        int data_pad;
  81        int compat;
  82        struct rb_node rb;
  83        struct rb_root root;
  84};
  85
  86/**
  87 * struct ubi_scan_info - UBI scanning information.
  88 * @volumes: root of the volume RB-tree
  89 * @corr: list of corrupted physical eraseblocks
  90 * @free: list of free physical eraseblocks
  91 * @erase: list of physical eraseblocks which have to be erased
  92 * @alien: list of physical eraseblocks which should not be used by UBI (e.g.,
  93 *         those belonging to "preserve"-compatible internal volumes)
  94 * @bad_peb_count: count of bad physical eraseblocks
  95 * @vols_found: number of volumes found during scanning
  96 * @highest_vol_id: highest volume ID
  97 * @alien_peb_count: count of physical eraseblocks in the @alien list
  98 * @is_empty: flag indicating whether the MTD device is empty or not
  99 * @min_ec: lowest erase counter value
 100 * @max_ec: highest erase counter value
 101 * @max_sqnum: highest sequence number value
 102 * @mean_ec: mean erase counter value
 103 * @ec_sum: a temporary variable used when calculating @mean_ec
 104 * @ec_count: a temporary variable used when calculating @mean_ec
 105 *
 106 * This data structure contains the result of scanning and may be used by other
 107 * UBI sub-systems to build final UBI data structures, further error-recovery
 108 * and so on.
 109 */
 110struct ubi_scan_info {
 111        struct rb_root volumes;
 112        struct list_head corr;
 113        struct list_head free;
 114        struct list_head erase;
 115        struct list_head alien;
 116        int bad_peb_count;
 117        int vols_found;
 118        int highest_vol_id;
 119        int alien_peb_count;
 120        int is_empty;
 121        int min_ec;
 122        int max_ec;
 123        unsigned long long max_sqnum;
 124        int mean_ec;
 125        uint64_t ec_sum;
 126        int ec_count;
 127};
 128
 129struct ubi_device;
 130struct ubi_vid_hdr;
 131
 132/*
 133 * ubi_scan_move_to_list - move a PEB from the volume tree to a list.
 134 *
 135 * @sv: volume scanning information
 136 * @seb: scanning eraseblock infprmation
 137 * @list: the list to move to
 138 */
 139static inline void ubi_scan_move_to_list(struct ubi_scan_volume *sv,
 140                                         struct ubi_scan_leb *seb,
 141                                         struct list_head *list)
 142{
 143                rb_erase(&seb->u.rb, &sv->root);
 144                list_add_tail(&seb->u.list, list);
 145}
 146
 147int ubi_scan_add_used(struct ubi_device *ubi, struct ubi_scan_info *si,
 148                      int pnum, int ec, const struct ubi_vid_hdr *vid_hdr,
 149                      int bitflips);
 150struct ubi_scan_volume *ubi_scan_find_sv(const struct ubi_scan_info *si,
 151                                         int vol_id);
 152struct ubi_scan_leb *ubi_scan_find_seb(const struct ubi_scan_volume *sv,
 153                                       int lnum);
 154void ubi_scan_rm_volume(struct ubi_scan_info *si, struct ubi_scan_volume *sv);
 155struct ubi_scan_leb *ubi_scan_get_free_peb(struct ubi_device *ubi,
 156                                           struct ubi_scan_info *si);
 157int ubi_scan_erase_peb(struct ubi_device *ubi, const struct ubi_scan_info *si,
 158                       int pnum, int ec);
 159struct ubi_scan_info *ubi_scan(struct ubi_device *ubi);
 160void ubi_scan_destroy_si(struct ubi_scan_info *si);
 161
 162#endif /* !__UBI_SCAN_H__ */
 163
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.