Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
mtd
ubi
misc.c
Go to the documentation of this file.
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
/* Here we keep miscellaneous functions which are used all over the UBI code */
22
23
#include "
ubi.h
"
24
35
int
ubi_calc_data_len
(
const
struct
ubi_device
*ubi,
const
void
*
buf
,
36
int
length
)
37
{
38
int
i
;
39
40
ubi_assert
(!(length & (ubi->
min_io_size
- 1)));
41
42
for
(i = length - 1; i >= 0; i--)
43
if
(((
const
uint8_t
*)buf)[i] != 0xFF)
44
break
;
45
46
/* The resulting length must be aligned to the minimum flash I/O size */
47
length =
ALIGN
(i + 1, ubi->
min_io_size
);
48
return
length
;
49
}
50
61
int
ubi_check_volume
(
struct
ubi_device
*ubi,
int
vol_id
)
62
{
63
void
*
buf
;
64
int
err
= 0,
i
;
65
struct
ubi_volume
*
vol
= ubi->
volumes
[
vol_id
];
66
67
if
(vol->
vol_type
!=
UBI_STATIC_VOLUME
)
68
return
0;
69
70
buf =
vmalloc
(vol->
usable_leb_size
);
71
if
(!buf)
72
return
-
ENOMEM
;
73
74
for
(
i
= 0;
i
< vol->
used_ebs
;
i
++) {
75
int
size
;
76
77
if
(
i
== vol->
used_ebs
- 1)
78
size = vol->
last_eb_bytes
;
79
else
80
size = vol->
usable_leb_size
;
81
82
err =
ubi_eba_read_leb
(ubi, vol,
i
, buf, 0, size, 1);
83
if
(err) {
84
if
(mtd_is_eccerr(err))
85
err = 1;
86
break
;
87
}
88
}
89
90
vfree
(buf);
91
return
err
;
92
}
93
103
void
ubi_update_reserved
(
struct
ubi_device
*
ubi
)
104
{
105
int
need = ubi->
beb_rsvd_level
- ubi->
beb_rsvd_pebs
;
106
107
if
(need <= 0 || ubi->avail_pebs == 0)
108
return
;
109
110
need =
min_t
(
int
, need, ubi->
avail_pebs
);
111
ubi->
avail_pebs
-= need;
112
ubi->
rsvd_pebs
+= need;
113
ubi->
beb_rsvd_pebs
+= need;
114
ubi_msg
(
"reserved more %d PEBs for bad PEB handling"
, need);
115
}
116
122
void
ubi_calculate_reserved
(
struct
ubi_device
*
ubi
)
123
{
124
/*
125
* Calculate the actual number of PEBs currently needed to be reserved
126
* for future bad eraseblock handling.
127
*/
128
ubi->
beb_rsvd_level
= ubi->
bad_peb_limit
- ubi->
bad_peb_count
;
129
if
(ubi->
beb_rsvd_level
< 0) {
130
ubi->
beb_rsvd_level
= 0;
131
ubi_warn
(
"number of bad PEBs (%d) is above the expected limit (%d), not reserving any PEBs for bad PEB handling, will use available PEBs (if any)"
,
132
ubi->
bad_peb_count
, ubi->
bad_peb_limit
);
133
}
134
}
135
145
int
ubi_check_pattern
(
const
void
*
buf
,
uint8_t
patt,
int
size
)
146
{
147
int
i
;
148
149
for
(i = 0; i <
size
; i++)
150
if
(((
const
uint8_t
*)buf)[i] != patt)
151
return
0;
152
return
1;
153
}
Generated on Thu Jan 10 2013 12:49:00 for Linux Kernel by
1.8.2