| Artem B. Bityutskiy | 801c135 | 2006-06-27 12:22:22 +0400 | [diff] [blame] | 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 |  */ | 
 | 42 | struct 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 |  */ | 
 | 75 | struct 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 |  */ | 
 | 112 | struct 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; | 
| Artem Bityutskiy | 4bc1dca | 2008-04-19 20:44:31 +0300 | [diff] [blame] | 127 | 	uint64_t ec_sum; | 
| Artem B. Bityutskiy | 801c135 | 2006-06-27 12:22:22 +0400 | [diff] [blame] | 128 | 	int ec_count; | 
 | 129 | }; | 
 | 130 |  | 
 | 131 | struct ubi_device; | 
 | 132 | struct 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 |  */ | 
 | 142 | static 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 |  | 
| Artem Bityutskiy | e88d6e10 | 2007-08-29 14:51:52 +0300 | [diff] [blame] | 150 | int ubi_scan_add_used(struct ubi_device *ubi, struct ubi_scan_info *si, | 
| Artem B. Bityutskiy | 801c135 | 2006-06-27 12:22:22 +0400 | [diff] [blame] | 151 | 		      int pnum, int ec, const struct ubi_vid_hdr *vid_hdr, | 
 | 152 | 		      int bitflips); | 
 | 153 | struct ubi_scan_volume *ubi_scan_find_sv(const struct ubi_scan_info *si, | 
 | 154 | 					 int vol_id); | 
 | 155 | struct ubi_scan_leb *ubi_scan_find_seb(const struct ubi_scan_volume *sv, | 
 | 156 | 				       int lnum); | 
 | 157 | void ubi_scan_rm_volume(struct ubi_scan_info *si, struct ubi_scan_volume *sv); | 
| Artem Bityutskiy | e88d6e10 | 2007-08-29 14:51:52 +0300 | [diff] [blame] | 158 | struct ubi_scan_leb *ubi_scan_get_free_peb(struct ubi_device *ubi, | 
| Artem B. Bityutskiy | 801c135 | 2006-06-27 12:22:22 +0400 | [diff] [blame] | 159 | 					   struct ubi_scan_info *si); | 
| Artem Bityutskiy | e88d6e10 | 2007-08-29 14:51:52 +0300 | [diff] [blame] | 160 | int ubi_scan_erase_peb(struct ubi_device *ubi, const struct ubi_scan_info *si, | 
 | 161 | 		       int pnum, int ec); | 
| Artem B. Bityutskiy | 801c135 | 2006-06-27 12:22:22 +0400 | [diff] [blame] | 162 | struct ubi_scan_info *ubi_scan(struct ubi_device *ubi); | 
 | 163 | void ubi_scan_destroy_si(struct ubi_scan_info *si); | 
 | 164 |  | 
 | 165 | #endif /* !__UBI_SCAN_H__ */ |