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 * @leb_ver: logical eraseblock version (obsolete) 38 * 39 * One object of this type is allocated for each physical eraseblock during 40 * scanning. 41 */ 42struct ubi_scan_leb { 43 int ec; 44 int pnum; 45 int lnum; 46 int scrub; 47 unsigned long long sqnum; 48 union { 49 struct rb_node rb; 50 struct list_head list; 51 } u; 52 uint32_t leb_ver; 53}; 54 55/** 56 * struct ubi_scan_volume - scanning information about a volume. 57 * @vol_id: volume ID 58 * @highest_lnum: highest logical eraseblock number in this volume 59 * @leb_count: number of logical eraseblocks in this volume 60 * @vol_type: volume type 61 * @used_ebs: number of used logical eraseblocks in this volume (only for 62 * static volumes) 63 * @last_data_size: amount of data in the last logical eraseblock of this 64 * volume (always equivalent to the usable logical eraseblock size in case of 65 * dynamic volumes) 66 * @data_pad: how many bytes at the end of logical eraseblocks of this volume 67 * are not used (due to volume alignment) 68 * @compat: compatibility flags of this volume 69 * @rb: link in the volume RB-tree 70 * @root: root of the RB-tree containing all the eraseblock belonging to this 71 * volume (&struct ubi_scan_leb objects) 72 * 73 * One object of this type is allocated for each volume during scanning. 74 */ 75struct ubi_scan_volume { 76 int vol_id; 77 int highest_lnum; 78 int leb_count; 79 int vol_type; 80 int used_ebs; 81 int last_data_size; 82 int data_pad; 83 int compat; 84 struct rb_node rb; 85 struct rb_root root; 86}; 87 88/** 89 * struct ubi_scan_info - UBI scanning information. 90 * @volumes: root of the volume RB-tree 91 * @corr: list of corrupted physical eraseblocks 92 * @free: list of free physical eraseblocks 93 * @erase: list of physical eraseblocks which have to be erased 94 * @alien: list of physical eraseblocks which should not be used by UBI (e.g., 95 * @bad_peb_count: count of bad physical eraseblocks 96 * those belonging to "preserve"-compatible internal volumes) 97 * @vols_found: number of volumes found during scanning 98 * @highest_vol_id: highest volume ID 99 * @alien_peb_count: count of physical eraseblocks in the @alien list 100 * @is_empty: flag indicating whether the MTD device is empty or not 101 * @min_ec: lowest erase counter value 102 * @max_ec: highest erase counter value 103 * @max_sqnum: highest sequence number value 104 * @mean_ec: mean erase counter value 105 * @ec_sum: a temporary variable used when calculating @mean_ec 106 * @ec_count: a temporary variable used when calculating @mean_ec 107 * 108 * This data structure contains the result of scanning and may be used by other 109 * UBI units to build final UBI data structures, further error-recovery and so 110 * on. 111 */ 112struct ubi_scan_info { 113 struct rb_root volumes; 114 struct list_head corr; 115 struct list_head free; 116 struct list_head erase; 117 struct list_head alien; 118 int bad_peb_count; 119 int vols_found; 120 int highest_vol_id; 121 int alien_peb_count; 122 int is_empty; 123 int min_ec; 124 int max_ec; 125 unsigned long long max_sqnum; 126 int mean_ec; 127 int ec_sum; 128 int ec_count; 129}; 130 131struct ubi_device; 132struct ubi_vid_hdr; 133 134/* 135 * ubi_scan_move_to_list - move a physical eraseblock from the volume tree to a 136 * list. 137 * 138 * @sv: volume scanning information 139 * @seb: scanning eraseblock infprmation 140 * @list: the list to move to 141 */ 142static inline void ubi_scan_move_to_list(struct ubi_scan_volume *sv, 143 struct ubi_scan_leb *seb, 144 struct list_head *list) 145{ 146 rb_erase(&seb->u.rb, &sv->root); 147 list_add_tail(&seb->u.list, list); 148} 149 150int ubi_scan_add_to_list(struct ubi_scan_info *si, int pnum, int ec, 151 struct list_head *list); 152int ubi_scan_add_used(const struct ubi_device *ubi, struct ubi_scan_info *si, 153 int pnum, int ec, const struct ubi_vid_hdr *vid_hdr, 154 int bitflips); 155struct ubi_scan_volume *ubi_scan_find_sv(const struct ubi_scan_info *si, 156 int vol_id); 157struct ubi_scan_leb *ubi_scan_find_seb(const struct ubi_scan_volume *sv, 158 int lnum); 159void ubi_scan_rm_volume(struct ubi_scan_info *si, struct ubi_scan_volume *sv); 160struct ubi_scan_leb *ubi_scan_get_free_peb(const struct ubi_device *ubi, 161 struct ubi_scan_info *si); 162int ubi_scan_erase_peb(const struct ubi_device *ubi, 163 const struct ubi_scan_info *si, int pnum, int ec); 164struct ubi_scan_info *ubi_scan(struct ubi_device *ubi); 165void ubi_scan_destroy_si(struct ubi_scan_info *si); 166 167#endif /* !__UBI_SCAN_H__ */ 168