1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (c) International Business Machines Corp., 2006
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * Author: Artem Bityutskiy (Битюцкий Артём)
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun /* This file mostly implements UBI kernel API functions */
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #ifndef __UBOOT__
12*4882a593Smuzhiyun #include <linux/module.h>
13*4882a593Smuzhiyun #include <linux/slab.h>
14*4882a593Smuzhiyun #include <linux/namei.h>
15*4882a593Smuzhiyun #include <linux/fs.h>
16*4882a593Smuzhiyun #include <asm/div64.h>
17*4882a593Smuzhiyun #else
18*4882a593Smuzhiyun #include <ubi_uboot.h>
19*4882a593Smuzhiyun #endif
20*4882a593Smuzhiyun #include <linux/err.h>
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun #include "ubi.h"
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun /**
25*4882a593Smuzhiyun * ubi_do_get_device_info - get information about UBI device.
26*4882a593Smuzhiyun * @ubi: UBI device description object
27*4882a593Smuzhiyun * @di: the information is stored here
28*4882a593Smuzhiyun *
29*4882a593Smuzhiyun * This function is the same as 'ubi_get_device_info()', but it assumes the UBI
30*4882a593Smuzhiyun * device is locked and cannot disappear.
31*4882a593Smuzhiyun */
ubi_do_get_device_info(struct ubi_device * ubi,struct ubi_device_info * di)32*4882a593Smuzhiyun void ubi_do_get_device_info(struct ubi_device *ubi, struct ubi_device_info *di)
33*4882a593Smuzhiyun {
34*4882a593Smuzhiyun di->ubi_num = ubi->ubi_num;
35*4882a593Smuzhiyun di->leb_size = ubi->leb_size;
36*4882a593Smuzhiyun di->leb_start = ubi->leb_start;
37*4882a593Smuzhiyun di->min_io_size = ubi->min_io_size;
38*4882a593Smuzhiyun di->max_write_size = ubi->max_write_size;
39*4882a593Smuzhiyun di->ro_mode = ubi->ro_mode;
40*4882a593Smuzhiyun #ifndef __UBOOT__
41*4882a593Smuzhiyun di->cdev = ubi->cdev.dev;
42*4882a593Smuzhiyun #endif
43*4882a593Smuzhiyun }
44*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(ubi_do_get_device_info);
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun /**
47*4882a593Smuzhiyun * ubi_get_device_info - get information about UBI device.
48*4882a593Smuzhiyun * @ubi_num: UBI device number
49*4882a593Smuzhiyun * @di: the information is stored here
50*4882a593Smuzhiyun *
51*4882a593Smuzhiyun * This function returns %0 in case of success, %-EINVAL if the UBI device
52*4882a593Smuzhiyun * number is invalid, and %-ENODEV if there is no such UBI device.
53*4882a593Smuzhiyun */
ubi_get_device_info(int ubi_num,struct ubi_device_info * di)54*4882a593Smuzhiyun int ubi_get_device_info(int ubi_num, struct ubi_device_info *di)
55*4882a593Smuzhiyun {
56*4882a593Smuzhiyun struct ubi_device *ubi;
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun if (ubi_num < 0 || ubi_num >= UBI_MAX_DEVICES)
59*4882a593Smuzhiyun return -EINVAL;
60*4882a593Smuzhiyun ubi = ubi_get_device(ubi_num);
61*4882a593Smuzhiyun if (!ubi)
62*4882a593Smuzhiyun return -ENODEV;
63*4882a593Smuzhiyun ubi_do_get_device_info(ubi, di);
64*4882a593Smuzhiyun ubi_put_device(ubi);
65*4882a593Smuzhiyun return 0;
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(ubi_get_device_info);
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun /**
70*4882a593Smuzhiyun * ubi_do_get_volume_info - get information about UBI volume.
71*4882a593Smuzhiyun * @ubi: UBI device description object
72*4882a593Smuzhiyun * @vol: volume description object
73*4882a593Smuzhiyun * @vi: the information is stored here
74*4882a593Smuzhiyun */
ubi_do_get_volume_info(struct ubi_device * ubi,struct ubi_volume * vol,struct ubi_volume_info * vi)75*4882a593Smuzhiyun void ubi_do_get_volume_info(struct ubi_device *ubi, struct ubi_volume *vol,
76*4882a593Smuzhiyun struct ubi_volume_info *vi)
77*4882a593Smuzhiyun {
78*4882a593Smuzhiyun vi->vol_id = vol->vol_id;
79*4882a593Smuzhiyun vi->ubi_num = ubi->ubi_num;
80*4882a593Smuzhiyun vi->size = vol->reserved_pebs;
81*4882a593Smuzhiyun vi->used_bytes = vol->used_bytes;
82*4882a593Smuzhiyun vi->vol_type = vol->vol_type;
83*4882a593Smuzhiyun vi->corrupted = vol->corrupted;
84*4882a593Smuzhiyun vi->upd_marker = vol->upd_marker;
85*4882a593Smuzhiyun vi->alignment = vol->alignment;
86*4882a593Smuzhiyun vi->usable_leb_size = vol->usable_leb_size;
87*4882a593Smuzhiyun vi->name_len = vol->name_len;
88*4882a593Smuzhiyun vi->name = vol->name;
89*4882a593Smuzhiyun vi->cdev = vol->cdev.dev;
90*4882a593Smuzhiyun }
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun /**
93*4882a593Smuzhiyun * ubi_get_volume_info - get information about UBI volume.
94*4882a593Smuzhiyun * @desc: volume descriptor
95*4882a593Smuzhiyun * @vi: the information is stored here
96*4882a593Smuzhiyun */
ubi_get_volume_info(struct ubi_volume_desc * desc,struct ubi_volume_info * vi)97*4882a593Smuzhiyun void ubi_get_volume_info(struct ubi_volume_desc *desc,
98*4882a593Smuzhiyun struct ubi_volume_info *vi)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun ubi_do_get_volume_info(desc->vol->ubi, desc->vol, vi);
101*4882a593Smuzhiyun }
102*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(ubi_get_volume_info);
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun /**
105*4882a593Smuzhiyun * ubi_open_volume - open UBI volume.
106*4882a593Smuzhiyun * @ubi_num: UBI device number
107*4882a593Smuzhiyun * @vol_id: volume ID
108*4882a593Smuzhiyun * @mode: open mode
109*4882a593Smuzhiyun *
110*4882a593Smuzhiyun * The @mode parameter specifies if the volume should be opened in read-only
111*4882a593Smuzhiyun * mode, read-write mode, or exclusive mode. The exclusive mode guarantees that
112*4882a593Smuzhiyun * nobody else will be able to open this volume. UBI allows to have many volume
113*4882a593Smuzhiyun * readers and one writer at a time.
114*4882a593Smuzhiyun *
115*4882a593Smuzhiyun * If a static volume is being opened for the first time since boot, it will be
116*4882a593Smuzhiyun * checked by this function, which means it will be fully read and the CRC
117*4882a593Smuzhiyun * checksum of each logical eraseblock will be checked.
118*4882a593Smuzhiyun *
119*4882a593Smuzhiyun * This function returns volume descriptor in case of success and a negative
120*4882a593Smuzhiyun * error code in case of failure.
121*4882a593Smuzhiyun */
ubi_open_volume(int ubi_num,int vol_id,int mode)122*4882a593Smuzhiyun struct ubi_volume_desc *ubi_open_volume(int ubi_num, int vol_id, int mode)
123*4882a593Smuzhiyun {
124*4882a593Smuzhiyun int err;
125*4882a593Smuzhiyun struct ubi_volume_desc *desc;
126*4882a593Smuzhiyun struct ubi_device *ubi;
127*4882a593Smuzhiyun struct ubi_volume *vol;
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun dbg_gen("open device %d, volume %d, mode %d", ubi_num, vol_id, mode);
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun if (ubi_num < 0 || ubi_num >= UBI_MAX_DEVICES)
132*4882a593Smuzhiyun return ERR_PTR(-EINVAL);
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun if (mode != UBI_READONLY && mode != UBI_READWRITE &&
135*4882a593Smuzhiyun mode != UBI_EXCLUSIVE && mode != UBI_METAONLY)
136*4882a593Smuzhiyun return ERR_PTR(-EINVAL);
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun /*
139*4882a593Smuzhiyun * First of all, we have to get the UBI device to prevent its removal.
140*4882a593Smuzhiyun */
141*4882a593Smuzhiyun ubi = ubi_get_device(ubi_num);
142*4882a593Smuzhiyun if (!ubi)
143*4882a593Smuzhiyun return ERR_PTR(-ENODEV);
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun if (vol_id < 0 || vol_id >= ubi->vtbl_slots) {
146*4882a593Smuzhiyun err = -EINVAL;
147*4882a593Smuzhiyun goto out_put_ubi;
148*4882a593Smuzhiyun }
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun desc = kmalloc(sizeof(struct ubi_volume_desc), GFP_KERNEL);
151*4882a593Smuzhiyun if (!desc) {
152*4882a593Smuzhiyun err = -ENOMEM;
153*4882a593Smuzhiyun goto out_put_ubi;
154*4882a593Smuzhiyun }
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun err = -ENODEV;
157*4882a593Smuzhiyun if (!try_module_get(THIS_MODULE))
158*4882a593Smuzhiyun goto out_free;
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun spin_lock(&ubi->volumes_lock);
161*4882a593Smuzhiyun vol = ubi->volumes[vol_id];
162*4882a593Smuzhiyun if (!vol)
163*4882a593Smuzhiyun goto out_unlock;
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun err = -EBUSY;
166*4882a593Smuzhiyun switch (mode) {
167*4882a593Smuzhiyun case UBI_READONLY:
168*4882a593Smuzhiyun if (vol->exclusive)
169*4882a593Smuzhiyun goto out_unlock;
170*4882a593Smuzhiyun vol->readers += 1;
171*4882a593Smuzhiyun break;
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun case UBI_READWRITE:
174*4882a593Smuzhiyun if (vol->exclusive || vol->writers > 0)
175*4882a593Smuzhiyun goto out_unlock;
176*4882a593Smuzhiyun vol->writers += 1;
177*4882a593Smuzhiyun break;
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun case UBI_EXCLUSIVE:
180*4882a593Smuzhiyun if (vol->exclusive || vol->writers || vol->readers ||
181*4882a593Smuzhiyun vol->metaonly)
182*4882a593Smuzhiyun goto out_unlock;
183*4882a593Smuzhiyun vol->exclusive = 1;
184*4882a593Smuzhiyun break;
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun case UBI_METAONLY:
187*4882a593Smuzhiyun if (vol->metaonly || vol->exclusive)
188*4882a593Smuzhiyun goto out_unlock;
189*4882a593Smuzhiyun vol->metaonly = 1;
190*4882a593Smuzhiyun break;
191*4882a593Smuzhiyun }
192*4882a593Smuzhiyun get_device(&vol->dev);
193*4882a593Smuzhiyun vol->ref_count += 1;
194*4882a593Smuzhiyun spin_unlock(&ubi->volumes_lock);
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun desc->vol = vol;
197*4882a593Smuzhiyun desc->mode = mode;
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun mutex_lock(&ubi->ckvol_mutex);
200*4882a593Smuzhiyun if (!vol->checked) {
201*4882a593Smuzhiyun /* This is the first open - check the volume */
202*4882a593Smuzhiyun err = ubi_check_volume(ubi, vol_id);
203*4882a593Smuzhiyun if (err < 0) {
204*4882a593Smuzhiyun mutex_unlock(&ubi->ckvol_mutex);
205*4882a593Smuzhiyun ubi_close_volume(desc);
206*4882a593Smuzhiyun return ERR_PTR(err);
207*4882a593Smuzhiyun }
208*4882a593Smuzhiyun if (err == 1) {
209*4882a593Smuzhiyun ubi_warn(ubi, "volume %d on UBI device %d is corrupted",
210*4882a593Smuzhiyun vol_id, ubi->ubi_num);
211*4882a593Smuzhiyun vol->corrupted = 1;
212*4882a593Smuzhiyun }
213*4882a593Smuzhiyun vol->checked = 1;
214*4882a593Smuzhiyun }
215*4882a593Smuzhiyun mutex_unlock(&ubi->ckvol_mutex);
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun return desc;
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun out_unlock:
220*4882a593Smuzhiyun spin_unlock(&ubi->volumes_lock);
221*4882a593Smuzhiyun module_put(THIS_MODULE);
222*4882a593Smuzhiyun out_free:
223*4882a593Smuzhiyun kfree(desc);
224*4882a593Smuzhiyun out_put_ubi:
225*4882a593Smuzhiyun ubi_put_device(ubi);
226*4882a593Smuzhiyun ubi_err(ubi, "cannot open device %d, volume %d, error %d",
227*4882a593Smuzhiyun ubi_num, vol_id, err);
228*4882a593Smuzhiyun return ERR_PTR(err);
229*4882a593Smuzhiyun }
230*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(ubi_open_volume);
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun /**
233*4882a593Smuzhiyun * ubi_open_volume_nm - open UBI volume by name.
234*4882a593Smuzhiyun * @ubi_num: UBI device number
235*4882a593Smuzhiyun * @name: volume name
236*4882a593Smuzhiyun * @mode: open mode
237*4882a593Smuzhiyun *
238*4882a593Smuzhiyun * This function is similar to 'ubi_open_volume()', but opens a volume by name.
239*4882a593Smuzhiyun */
ubi_open_volume_nm(int ubi_num,const char * name,int mode)240*4882a593Smuzhiyun struct ubi_volume_desc *ubi_open_volume_nm(int ubi_num, const char *name,
241*4882a593Smuzhiyun int mode)
242*4882a593Smuzhiyun {
243*4882a593Smuzhiyun int i, vol_id = -1, len;
244*4882a593Smuzhiyun struct ubi_device *ubi;
245*4882a593Smuzhiyun struct ubi_volume_desc *ret;
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun dbg_gen("open device %d, volume %s, mode %d", ubi_num, name, mode);
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun if (!name)
250*4882a593Smuzhiyun return ERR_PTR(-EINVAL);
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun len = strnlen(name, UBI_VOL_NAME_MAX + 1);
253*4882a593Smuzhiyun if (len > UBI_VOL_NAME_MAX)
254*4882a593Smuzhiyun return ERR_PTR(-EINVAL);
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun if (ubi_num < 0 || ubi_num >= UBI_MAX_DEVICES)
257*4882a593Smuzhiyun return ERR_PTR(-EINVAL);
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun ubi = ubi_get_device(ubi_num);
260*4882a593Smuzhiyun if (!ubi)
261*4882a593Smuzhiyun return ERR_PTR(-ENODEV);
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun spin_lock(&ubi->volumes_lock);
264*4882a593Smuzhiyun /* Walk all volumes of this UBI device */
265*4882a593Smuzhiyun for (i = 0; i < ubi->vtbl_slots; i++) {
266*4882a593Smuzhiyun struct ubi_volume *vol = ubi->volumes[i];
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun if (vol && len == vol->name_len && !strcmp(name, vol->name)) {
269*4882a593Smuzhiyun vol_id = i;
270*4882a593Smuzhiyun break;
271*4882a593Smuzhiyun }
272*4882a593Smuzhiyun }
273*4882a593Smuzhiyun spin_unlock(&ubi->volumes_lock);
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun if (vol_id >= 0)
276*4882a593Smuzhiyun ret = ubi_open_volume(ubi_num, vol_id, mode);
277*4882a593Smuzhiyun else
278*4882a593Smuzhiyun ret = ERR_PTR(-ENODEV);
279*4882a593Smuzhiyun
280*4882a593Smuzhiyun /*
281*4882a593Smuzhiyun * We should put the UBI device even in case of success, because
282*4882a593Smuzhiyun * 'ubi_open_volume()' took a reference as well.
283*4882a593Smuzhiyun */
284*4882a593Smuzhiyun ubi_put_device(ubi);
285*4882a593Smuzhiyun return ret;
286*4882a593Smuzhiyun }
287*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(ubi_open_volume_nm);
288*4882a593Smuzhiyun
289*4882a593Smuzhiyun #ifndef __UBOOT__
290*4882a593Smuzhiyun /**
291*4882a593Smuzhiyun * ubi_open_volume_path - open UBI volume by its character device node path.
292*4882a593Smuzhiyun * @pathname: volume character device node path
293*4882a593Smuzhiyun * @mode: open mode
294*4882a593Smuzhiyun *
295*4882a593Smuzhiyun * This function is similar to 'ubi_open_volume()', but opens a volume the path
296*4882a593Smuzhiyun * to its character device node.
297*4882a593Smuzhiyun */
ubi_open_volume_path(const char * pathname,int mode)298*4882a593Smuzhiyun struct ubi_volume_desc *ubi_open_volume_path(const char *pathname, int mode)
299*4882a593Smuzhiyun {
300*4882a593Smuzhiyun int error, ubi_num, vol_id, mod;
301*4882a593Smuzhiyun struct inode *inode;
302*4882a593Smuzhiyun struct path path;
303*4882a593Smuzhiyun
304*4882a593Smuzhiyun dbg_gen("open volume %s, mode %d", pathname, mode);
305*4882a593Smuzhiyun
306*4882a593Smuzhiyun if (!pathname || !*pathname)
307*4882a593Smuzhiyun return ERR_PTR(-EINVAL);
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun error = kern_path(pathname, LOOKUP_FOLLOW, &path);
310*4882a593Smuzhiyun if (error)
311*4882a593Smuzhiyun return ERR_PTR(error);
312*4882a593Smuzhiyun
313*4882a593Smuzhiyun inode = d_backing_inode(path.dentry);
314*4882a593Smuzhiyun mod = inode->i_mode;
315*4882a593Smuzhiyun ubi_num = ubi_major2num(imajor(inode));
316*4882a593Smuzhiyun vol_id = iminor(inode) - 1;
317*4882a593Smuzhiyun path_put(&path);
318*4882a593Smuzhiyun
319*4882a593Smuzhiyun if (!S_ISCHR(mod))
320*4882a593Smuzhiyun return ERR_PTR(-EINVAL);
321*4882a593Smuzhiyun if (vol_id >= 0 && ubi_num >= 0)
322*4882a593Smuzhiyun return ubi_open_volume(ubi_num, vol_id, mode);
323*4882a593Smuzhiyun return ERR_PTR(-ENODEV);
324*4882a593Smuzhiyun }
325*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(ubi_open_volume_path);
326*4882a593Smuzhiyun #endif
327*4882a593Smuzhiyun
328*4882a593Smuzhiyun /**
329*4882a593Smuzhiyun * ubi_close_volume - close UBI volume.
330*4882a593Smuzhiyun * @desc: volume descriptor
331*4882a593Smuzhiyun */
ubi_close_volume(struct ubi_volume_desc * desc)332*4882a593Smuzhiyun void ubi_close_volume(struct ubi_volume_desc *desc)
333*4882a593Smuzhiyun {
334*4882a593Smuzhiyun struct ubi_volume *vol = desc->vol;
335*4882a593Smuzhiyun struct ubi_device *ubi = vol->ubi;
336*4882a593Smuzhiyun
337*4882a593Smuzhiyun dbg_gen("close device %d, volume %d, mode %d",
338*4882a593Smuzhiyun ubi->ubi_num, vol->vol_id, desc->mode);
339*4882a593Smuzhiyun
340*4882a593Smuzhiyun spin_lock(&ubi->volumes_lock);
341*4882a593Smuzhiyun switch (desc->mode) {
342*4882a593Smuzhiyun case UBI_READONLY:
343*4882a593Smuzhiyun vol->readers -= 1;
344*4882a593Smuzhiyun break;
345*4882a593Smuzhiyun case UBI_READWRITE:
346*4882a593Smuzhiyun vol->writers -= 1;
347*4882a593Smuzhiyun break;
348*4882a593Smuzhiyun case UBI_EXCLUSIVE:
349*4882a593Smuzhiyun vol->exclusive = 0;
350*4882a593Smuzhiyun break;
351*4882a593Smuzhiyun case UBI_METAONLY:
352*4882a593Smuzhiyun vol->metaonly = 0;
353*4882a593Smuzhiyun break;
354*4882a593Smuzhiyun }
355*4882a593Smuzhiyun vol->ref_count -= 1;
356*4882a593Smuzhiyun spin_unlock(&ubi->volumes_lock);
357*4882a593Smuzhiyun
358*4882a593Smuzhiyun kfree(desc);
359*4882a593Smuzhiyun put_device(&vol->dev);
360*4882a593Smuzhiyun ubi_put_device(ubi);
361*4882a593Smuzhiyun module_put(THIS_MODULE);
362*4882a593Smuzhiyun }
363*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(ubi_close_volume);
364*4882a593Smuzhiyun
365*4882a593Smuzhiyun /**
366*4882a593Smuzhiyun * leb_read_sanity_check - does sanity checks on read requests.
367*4882a593Smuzhiyun * @desc: volume descriptor
368*4882a593Smuzhiyun * @lnum: logical eraseblock number to read from
369*4882a593Smuzhiyun * @offset: offset within the logical eraseblock to read from
370*4882a593Smuzhiyun * @len: how many bytes to read
371*4882a593Smuzhiyun *
372*4882a593Smuzhiyun * This function is used by ubi_leb_read() and ubi_leb_read_sg()
373*4882a593Smuzhiyun * to perform sanity checks.
374*4882a593Smuzhiyun */
leb_read_sanity_check(struct ubi_volume_desc * desc,int lnum,int offset,int len)375*4882a593Smuzhiyun static int leb_read_sanity_check(struct ubi_volume_desc *desc, int lnum,
376*4882a593Smuzhiyun int offset, int len)
377*4882a593Smuzhiyun {
378*4882a593Smuzhiyun struct ubi_volume *vol = desc->vol;
379*4882a593Smuzhiyun struct ubi_device *ubi = vol->ubi;
380*4882a593Smuzhiyun int vol_id = vol->vol_id;
381*4882a593Smuzhiyun
382*4882a593Smuzhiyun if (vol_id < 0 || vol_id >= ubi->vtbl_slots || lnum < 0 ||
383*4882a593Smuzhiyun lnum >= vol->used_ebs || offset < 0 || len < 0 ||
384*4882a593Smuzhiyun offset + len > vol->usable_leb_size)
385*4882a593Smuzhiyun return -EINVAL;
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun if (vol->vol_type == UBI_STATIC_VOLUME) {
388*4882a593Smuzhiyun if (vol->used_ebs == 0)
389*4882a593Smuzhiyun /* Empty static UBI volume */
390*4882a593Smuzhiyun return 0;
391*4882a593Smuzhiyun if (lnum == vol->used_ebs - 1 &&
392*4882a593Smuzhiyun offset + len > vol->last_eb_bytes)
393*4882a593Smuzhiyun return -EINVAL;
394*4882a593Smuzhiyun }
395*4882a593Smuzhiyun
396*4882a593Smuzhiyun if (vol->upd_marker)
397*4882a593Smuzhiyun return -EBADF;
398*4882a593Smuzhiyun
399*4882a593Smuzhiyun return 0;
400*4882a593Smuzhiyun }
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun /**
403*4882a593Smuzhiyun * ubi_leb_read - read data.
404*4882a593Smuzhiyun * @desc: volume descriptor
405*4882a593Smuzhiyun * @lnum: logical eraseblock number to read from
406*4882a593Smuzhiyun * @buf: buffer where to store the read data
407*4882a593Smuzhiyun * @offset: offset within the logical eraseblock to read from
408*4882a593Smuzhiyun * @len: how many bytes to read
409*4882a593Smuzhiyun * @check: whether UBI has to check the read data's CRC or not.
410*4882a593Smuzhiyun *
411*4882a593Smuzhiyun * This function reads data from offset @offset of logical eraseblock @lnum and
412*4882a593Smuzhiyun * stores the data at @buf. When reading from static volumes, @check specifies
413*4882a593Smuzhiyun * whether the data has to be checked or not. If yes, the whole logical
414*4882a593Smuzhiyun * eraseblock will be read and its CRC checksum will be checked (i.e., the CRC
415*4882a593Smuzhiyun * checksum is per-eraseblock). So checking may substantially slow down the
416*4882a593Smuzhiyun * read speed. The @check argument is ignored for dynamic volumes.
417*4882a593Smuzhiyun *
418*4882a593Smuzhiyun * In case of success, this function returns zero. In case of failure, this
419*4882a593Smuzhiyun * function returns a negative error code.
420*4882a593Smuzhiyun *
421*4882a593Smuzhiyun * %-EBADMSG error code is returned:
422*4882a593Smuzhiyun * o for both static and dynamic volumes if MTD driver has detected a data
423*4882a593Smuzhiyun * integrity problem (unrecoverable ECC checksum mismatch in case of NAND);
424*4882a593Smuzhiyun * o for static volumes in case of data CRC mismatch.
425*4882a593Smuzhiyun *
426*4882a593Smuzhiyun * If the volume is damaged because of an interrupted update this function just
427*4882a593Smuzhiyun * returns immediately with %-EBADF error code.
428*4882a593Smuzhiyun */
ubi_leb_read(struct ubi_volume_desc * desc,int lnum,char * buf,int offset,int len,int check)429*4882a593Smuzhiyun int ubi_leb_read(struct ubi_volume_desc *desc, int lnum, char *buf, int offset,
430*4882a593Smuzhiyun int len, int check)
431*4882a593Smuzhiyun {
432*4882a593Smuzhiyun struct ubi_volume *vol = desc->vol;
433*4882a593Smuzhiyun struct ubi_device *ubi = vol->ubi;
434*4882a593Smuzhiyun int err, vol_id = vol->vol_id;
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun dbg_gen("read %d bytes from LEB %d:%d:%d", len, vol_id, lnum, offset);
437*4882a593Smuzhiyun
438*4882a593Smuzhiyun err = leb_read_sanity_check(desc, lnum, offset, len);
439*4882a593Smuzhiyun if (err < 0)
440*4882a593Smuzhiyun return err;
441*4882a593Smuzhiyun
442*4882a593Smuzhiyun if (len == 0)
443*4882a593Smuzhiyun return 0;
444*4882a593Smuzhiyun
445*4882a593Smuzhiyun err = ubi_eba_read_leb(ubi, vol, lnum, buf, offset, len, check);
446*4882a593Smuzhiyun if (err && mtd_is_eccerr(err) && vol->vol_type == UBI_STATIC_VOLUME) {
447*4882a593Smuzhiyun ubi_warn(ubi, "mark volume %d as corrupted", vol_id);
448*4882a593Smuzhiyun vol->corrupted = 1;
449*4882a593Smuzhiyun }
450*4882a593Smuzhiyun
451*4882a593Smuzhiyun return err;
452*4882a593Smuzhiyun }
453*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(ubi_leb_read);
454*4882a593Smuzhiyun
455*4882a593Smuzhiyun #ifndef __UBOOT__
456*4882a593Smuzhiyun /**
457*4882a593Smuzhiyun * ubi_leb_read_sg - read data into a scatter gather list.
458*4882a593Smuzhiyun * @desc: volume descriptor
459*4882a593Smuzhiyun * @lnum: logical eraseblock number to read from
460*4882a593Smuzhiyun * @buf: buffer where to store the read data
461*4882a593Smuzhiyun * @offset: offset within the logical eraseblock to read from
462*4882a593Smuzhiyun * @len: how many bytes to read
463*4882a593Smuzhiyun * @check: whether UBI has to check the read data's CRC or not.
464*4882a593Smuzhiyun *
465*4882a593Smuzhiyun * This function works exactly like ubi_leb_read_sg(). But instead of
466*4882a593Smuzhiyun * storing the read data into a buffer it writes to an UBI scatter gather
467*4882a593Smuzhiyun * list.
468*4882a593Smuzhiyun */
ubi_leb_read_sg(struct ubi_volume_desc * desc,int lnum,struct ubi_sgl * sgl,int offset,int len,int check)469*4882a593Smuzhiyun int ubi_leb_read_sg(struct ubi_volume_desc *desc, int lnum, struct ubi_sgl *sgl,
470*4882a593Smuzhiyun int offset, int len, int check)
471*4882a593Smuzhiyun {
472*4882a593Smuzhiyun struct ubi_volume *vol = desc->vol;
473*4882a593Smuzhiyun struct ubi_device *ubi = vol->ubi;
474*4882a593Smuzhiyun int err, vol_id = vol->vol_id;
475*4882a593Smuzhiyun
476*4882a593Smuzhiyun dbg_gen("read %d bytes from LEB %d:%d:%d", len, vol_id, lnum, offset);
477*4882a593Smuzhiyun
478*4882a593Smuzhiyun err = leb_read_sanity_check(desc, lnum, offset, len);
479*4882a593Smuzhiyun if (err < 0)
480*4882a593Smuzhiyun return err;
481*4882a593Smuzhiyun
482*4882a593Smuzhiyun if (len == 0)
483*4882a593Smuzhiyun return 0;
484*4882a593Smuzhiyun
485*4882a593Smuzhiyun err = ubi_eba_read_leb_sg(ubi, vol, sgl, lnum, offset, len, check);
486*4882a593Smuzhiyun if (err && mtd_is_eccerr(err) && vol->vol_type == UBI_STATIC_VOLUME) {
487*4882a593Smuzhiyun ubi_warn(ubi, "mark volume %d as corrupted", vol_id);
488*4882a593Smuzhiyun vol->corrupted = 1;
489*4882a593Smuzhiyun }
490*4882a593Smuzhiyun
491*4882a593Smuzhiyun return err;
492*4882a593Smuzhiyun }
493*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(ubi_leb_read_sg);
494*4882a593Smuzhiyun #endif
495*4882a593Smuzhiyun
496*4882a593Smuzhiyun /**
497*4882a593Smuzhiyun * ubi_leb_write - write data.
498*4882a593Smuzhiyun * @desc: volume descriptor
499*4882a593Smuzhiyun * @lnum: logical eraseblock number to write to
500*4882a593Smuzhiyun * @buf: data to write
501*4882a593Smuzhiyun * @offset: offset within the logical eraseblock where to write
502*4882a593Smuzhiyun * @len: how many bytes to write
503*4882a593Smuzhiyun *
504*4882a593Smuzhiyun * This function writes @len bytes of data from @buf to offset @offset of
505*4882a593Smuzhiyun * logical eraseblock @lnum.
506*4882a593Smuzhiyun *
507*4882a593Smuzhiyun * This function takes care of physical eraseblock write failures. If write to
508*4882a593Smuzhiyun * the physical eraseblock write operation fails, the logical eraseblock is
509*4882a593Smuzhiyun * re-mapped to another physical eraseblock, the data is recovered, and the
510*4882a593Smuzhiyun * write finishes. UBI has a pool of reserved physical eraseblocks for this.
511*4882a593Smuzhiyun *
512*4882a593Smuzhiyun * If all the data were successfully written, zero is returned. If an error
513*4882a593Smuzhiyun * occurred and UBI has not been able to recover from it, this function returns
514*4882a593Smuzhiyun * a negative error code. Note, in case of an error, it is possible that
515*4882a593Smuzhiyun * something was still written to the flash media, but that may be some
516*4882a593Smuzhiyun * garbage.
517*4882a593Smuzhiyun *
518*4882a593Smuzhiyun * If the volume is damaged because of an interrupted update this function just
519*4882a593Smuzhiyun * returns immediately with %-EBADF code.
520*4882a593Smuzhiyun */
ubi_leb_write(struct ubi_volume_desc * desc,int lnum,const void * buf,int offset,int len)521*4882a593Smuzhiyun int ubi_leb_write(struct ubi_volume_desc *desc, int lnum, const void *buf,
522*4882a593Smuzhiyun int offset, int len)
523*4882a593Smuzhiyun {
524*4882a593Smuzhiyun struct ubi_volume *vol = desc->vol;
525*4882a593Smuzhiyun struct ubi_device *ubi = vol->ubi;
526*4882a593Smuzhiyun int vol_id = vol->vol_id;
527*4882a593Smuzhiyun
528*4882a593Smuzhiyun dbg_gen("write %d bytes to LEB %d:%d:%d", len, vol_id, lnum, offset);
529*4882a593Smuzhiyun
530*4882a593Smuzhiyun if (vol_id < 0 || vol_id >= ubi->vtbl_slots)
531*4882a593Smuzhiyun return -EINVAL;
532*4882a593Smuzhiyun
533*4882a593Smuzhiyun if (desc->mode == UBI_READONLY || vol->vol_type == UBI_STATIC_VOLUME)
534*4882a593Smuzhiyun return -EROFS;
535*4882a593Smuzhiyun
536*4882a593Smuzhiyun if (lnum < 0 || lnum >= vol->reserved_pebs || offset < 0 || len < 0 ||
537*4882a593Smuzhiyun offset + len > vol->usable_leb_size ||
538*4882a593Smuzhiyun offset & (ubi->min_io_size - 1) || len & (ubi->min_io_size - 1))
539*4882a593Smuzhiyun return -EINVAL;
540*4882a593Smuzhiyun
541*4882a593Smuzhiyun if (vol->upd_marker)
542*4882a593Smuzhiyun return -EBADF;
543*4882a593Smuzhiyun
544*4882a593Smuzhiyun if (len == 0)
545*4882a593Smuzhiyun return 0;
546*4882a593Smuzhiyun
547*4882a593Smuzhiyun return ubi_eba_write_leb(ubi, vol, lnum, buf, offset, len);
548*4882a593Smuzhiyun }
549*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(ubi_leb_write);
550*4882a593Smuzhiyun
551*4882a593Smuzhiyun /*
552*4882a593Smuzhiyun * ubi_leb_change - change logical eraseblock atomically.
553*4882a593Smuzhiyun * @desc: volume descriptor
554*4882a593Smuzhiyun * @lnum: logical eraseblock number to change
555*4882a593Smuzhiyun * @buf: data to write
556*4882a593Smuzhiyun * @len: how many bytes to write
557*4882a593Smuzhiyun *
558*4882a593Smuzhiyun * This function changes the contents of a logical eraseblock atomically. @buf
559*4882a593Smuzhiyun * has to contain new logical eraseblock data, and @len - the length of the
560*4882a593Smuzhiyun * data, which has to be aligned. The length may be shorter than the logical
561*4882a593Smuzhiyun * eraseblock size, ant the logical eraseblock may be appended to more times
562*4882a593Smuzhiyun * later on. This function guarantees that in case of an unclean reboot the old
563*4882a593Smuzhiyun * contents is preserved. Returns zero in case of success and a negative error
564*4882a593Smuzhiyun * code in case of failure.
565*4882a593Smuzhiyun */
ubi_leb_change(struct ubi_volume_desc * desc,int lnum,const void * buf,int len)566*4882a593Smuzhiyun int ubi_leb_change(struct ubi_volume_desc *desc, int lnum, const void *buf,
567*4882a593Smuzhiyun int len)
568*4882a593Smuzhiyun {
569*4882a593Smuzhiyun struct ubi_volume *vol = desc->vol;
570*4882a593Smuzhiyun struct ubi_device *ubi = vol->ubi;
571*4882a593Smuzhiyun int vol_id = vol->vol_id;
572*4882a593Smuzhiyun
573*4882a593Smuzhiyun dbg_gen("atomically write %d bytes to LEB %d:%d", len, vol_id, lnum);
574*4882a593Smuzhiyun
575*4882a593Smuzhiyun if (vol_id < 0 || vol_id >= ubi->vtbl_slots)
576*4882a593Smuzhiyun return -EINVAL;
577*4882a593Smuzhiyun
578*4882a593Smuzhiyun if (desc->mode == UBI_READONLY || vol->vol_type == UBI_STATIC_VOLUME)
579*4882a593Smuzhiyun return -EROFS;
580*4882a593Smuzhiyun
581*4882a593Smuzhiyun if (lnum < 0 || lnum >= vol->reserved_pebs || len < 0 ||
582*4882a593Smuzhiyun len > vol->usable_leb_size || len & (ubi->min_io_size - 1))
583*4882a593Smuzhiyun return -EINVAL;
584*4882a593Smuzhiyun
585*4882a593Smuzhiyun if (vol->upd_marker)
586*4882a593Smuzhiyun return -EBADF;
587*4882a593Smuzhiyun
588*4882a593Smuzhiyun if (len == 0)
589*4882a593Smuzhiyun return 0;
590*4882a593Smuzhiyun
591*4882a593Smuzhiyun return ubi_eba_atomic_leb_change(ubi, vol, lnum, buf, len);
592*4882a593Smuzhiyun }
593*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(ubi_leb_change);
594*4882a593Smuzhiyun
595*4882a593Smuzhiyun /**
596*4882a593Smuzhiyun * ubi_leb_erase - erase logical eraseblock.
597*4882a593Smuzhiyun * @desc: volume descriptor
598*4882a593Smuzhiyun * @lnum: logical eraseblock number
599*4882a593Smuzhiyun *
600*4882a593Smuzhiyun * This function un-maps logical eraseblock @lnum and synchronously erases the
601*4882a593Smuzhiyun * correspondent physical eraseblock. Returns zero in case of success and a
602*4882a593Smuzhiyun * negative error code in case of failure.
603*4882a593Smuzhiyun *
604*4882a593Smuzhiyun * If the volume is damaged because of an interrupted update this function just
605*4882a593Smuzhiyun * returns immediately with %-EBADF code.
606*4882a593Smuzhiyun */
ubi_leb_erase(struct ubi_volume_desc * desc,int lnum)607*4882a593Smuzhiyun int ubi_leb_erase(struct ubi_volume_desc *desc, int lnum)
608*4882a593Smuzhiyun {
609*4882a593Smuzhiyun struct ubi_volume *vol = desc->vol;
610*4882a593Smuzhiyun struct ubi_device *ubi = vol->ubi;
611*4882a593Smuzhiyun int err;
612*4882a593Smuzhiyun
613*4882a593Smuzhiyun dbg_gen("erase LEB %d:%d", vol->vol_id, lnum);
614*4882a593Smuzhiyun
615*4882a593Smuzhiyun if (desc->mode == UBI_READONLY || vol->vol_type == UBI_STATIC_VOLUME)
616*4882a593Smuzhiyun return -EROFS;
617*4882a593Smuzhiyun
618*4882a593Smuzhiyun if (lnum < 0 || lnum >= vol->reserved_pebs)
619*4882a593Smuzhiyun return -EINVAL;
620*4882a593Smuzhiyun
621*4882a593Smuzhiyun if (vol->upd_marker)
622*4882a593Smuzhiyun return -EBADF;
623*4882a593Smuzhiyun
624*4882a593Smuzhiyun err = ubi_eba_unmap_leb(ubi, vol, lnum);
625*4882a593Smuzhiyun if (err)
626*4882a593Smuzhiyun return err;
627*4882a593Smuzhiyun
628*4882a593Smuzhiyun return ubi_wl_flush(ubi, vol->vol_id, lnum);
629*4882a593Smuzhiyun }
630*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(ubi_leb_erase);
631*4882a593Smuzhiyun
632*4882a593Smuzhiyun /**
633*4882a593Smuzhiyun * ubi_leb_unmap - un-map logical eraseblock.
634*4882a593Smuzhiyun * @desc: volume descriptor
635*4882a593Smuzhiyun * @lnum: logical eraseblock number
636*4882a593Smuzhiyun *
637*4882a593Smuzhiyun * This function un-maps logical eraseblock @lnum and schedules the
638*4882a593Smuzhiyun * corresponding physical eraseblock for erasure, so that it will eventually be
639*4882a593Smuzhiyun * physically erased in background. This operation is much faster than the
640*4882a593Smuzhiyun * erase operation.
641*4882a593Smuzhiyun *
642*4882a593Smuzhiyun * Unlike erase, the un-map operation does not guarantee that the logical
643*4882a593Smuzhiyun * eraseblock will contain all 0xFF bytes when UBI is initialized again. For
644*4882a593Smuzhiyun * example, if several logical eraseblocks are un-mapped, and an unclean reboot
645*4882a593Smuzhiyun * happens after this, the logical eraseblocks will not necessarily be
646*4882a593Smuzhiyun * un-mapped again when this MTD device is attached. They may actually be
647*4882a593Smuzhiyun * mapped to the same physical eraseblocks again. So, this function has to be
648*4882a593Smuzhiyun * used with care.
649*4882a593Smuzhiyun *
650*4882a593Smuzhiyun * In other words, when un-mapping a logical eraseblock, UBI does not store
651*4882a593Smuzhiyun * any information about this on the flash media, it just marks the logical
652*4882a593Smuzhiyun * eraseblock as "un-mapped" in RAM. If UBI is detached before the physical
653*4882a593Smuzhiyun * eraseblock is physically erased, it will be mapped again to the same logical
654*4882a593Smuzhiyun * eraseblock when the MTD device is attached again.
655*4882a593Smuzhiyun *
656*4882a593Smuzhiyun * The main and obvious use-case of this function is when the contents of a
657*4882a593Smuzhiyun * logical eraseblock has to be re-written. Then it is much more efficient to
658*4882a593Smuzhiyun * first un-map it, then write new data, rather than first erase it, then write
659*4882a593Smuzhiyun * new data. Note, once new data has been written to the logical eraseblock,
660*4882a593Smuzhiyun * UBI guarantees that the old contents has gone forever. In other words, if an
661*4882a593Smuzhiyun * unclean reboot happens after the logical eraseblock has been un-mapped and
662*4882a593Smuzhiyun * then written to, it will contain the last written data.
663*4882a593Smuzhiyun *
664*4882a593Smuzhiyun * This function returns zero in case of success and a negative error code in
665*4882a593Smuzhiyun * case of failure. If the volume is damaged because of an interrupted update
666*4882a593Smuzhiyun * this function just returns immediately with %-EBADF code.
667*4882a593Smuzhiyun */
ubi_leb_unmap(struct ubi_volume_desc * desc,int lnum)668*4882a593Smuzhiyun int ubi_leb_unmap(struct ubi_volume_desc *desc, int lnum)
669*4882a593Smuzhiyun {
670*4882a593Smuzhiyun struct ubi_volume *vol = desc->vol;
671*4882a593Smuzhiyun struct ubi_device *ubi = vol->ubi;
672*4882a593Smuzhiyun
673*4882a593Smuzhiyun dbg_gen("unmap LEB %d:%d", vol->vol_id, lnum);
674*4882a593Smuzhiyun
675*4882a593Smuzhiyun if (desc->mode == UBI_READONLY || vol->vol_type == UBI_STATIC_VOLUME)
676*4882a593Smuzhiyun return -EROFS;
677*4882a593Smuzhiyun
678*4882a593Smuzhiyun if (lnum < 0 || lnum >= vol->reserved_pebs)
679*4882a593Smuzhiyun return -EINVAL;
680*4882a593Smuzhiyun
681*4882a593Smuzhiyun if (vol->upd_marker)
682*4882a593Smuzhiyun return -EBADF;
683*4882a593Smuzhiyun
684*4882a593Smuzhiyun return ubi_eba_unmap_leb(ubi, vol, lnum);
685*4882a593Smuzhiyun }
686*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(ubi_leb_unmap);
687*4882a593Smuzhiyun
688*4882a593Smuzhiyun /**
689*4882a593Smuzhiyun * ubi_leb_map - map logical eraseblock to a physical eraseblock.
690*4882a593Smuzhiyun * @desc: volume descriptor
691*4882a593Smuzhiyun * @lnum: logical eraseblock number
692*4882a593Smuzhiyun *
693*4882a593Smuzhiyun * This function maps an un-mapped logical eraseblock @lnum to a physical
694*4882a593Smuzhiyun * eraseblock. This means, that after a successful invocation of this
695*4882a593Smuzhiyun * function the logical eraseblock @lnum will be empty (contain only %0xFF
696*4882a593Smuzhiyun * bytes) and be mapped to a physical eraseblock, even if an unclean reboot
697*4882a593Smuzhiyun * happens.
698*4882a593Smuzhiyun *
699*4882a593Smuzhiyun * This function returns zero in case of success, %-EBADF if the volume is
700*4882a593Smuzhiyun * damaged because of an interrupted update, %-EBADMSG if the logical
701*4882a593Smuzhiyun * eraseblock is already mapped, and other negative error codes in case of
702*4882a593Smuzhiyun * other failures.
703*4882a593Smuzhiyun */
ubi_leb_map(struct ubi_volume_desc * desc,int lnum)704*4882a593Smuzhiyun int ubi_leb_map(struct ubi_volume_desc *desc, int lnum)
705*4882a593Smuzhiyun {
706*4882a593Smuzhiyun struct ubi_volume *vol = desc->vol;
707*4882a593Smuzhiyun struct ubi_device *ubi = vol->ubi;
708*4882a593Smuzhiyun
709*4882a593Smuzhiyun dbg_gen("unmap LEB %d:%d", vol->vol_id, lnum);
710*4882a593Smuzhiyun
711*4882a593Smuzhiyun if (desc->mode == UBI_READONLY || vol->vol_type == UBI_STATIC_VOLUME)
712*4882a593Smuzhiyun return -EROFS;
713*4882a593Smuzhiyun
714*4882a593Smuzhiyun if (lnum < 0 || lnum >= vol->reserved_pebs)
715*4882a593Smuzhiyun return -EINVAL;
716*4882a593Smuzhiyun
717*4882a593Smuzhiyun if (vol->upd_marker)
718*4882a593Smuzhiyun return -EBADF;
719*4882a593Smuzhiyun
720*4882a593Smuzhiyun if (vol->eba_tbl[lnum] >= 0)
721*4882a593Smuzhiyun return -EBADMSG;
722*4882a593Smuzhiyun
723*4882a593Smuzhiyun return ubi_eba_write_leb(ubi, vol, lnum, NULL, 0, 0);
724*4882a593Smuzhiyun }
725*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(ubi_leb_map);
726*4882a593Smuzhiyun
727*4882a593Smuzhiyun /**
728*4882a593Smuzhiyun * ubi_is_mapped - check if logical eraseblock is mapped.
729*4882a593Smuzhiyun * @desc: volume descriptor
730*4882a593Smuzhiyun * @lnum: logical eraseblock number
731*4882a593Smuzhiyun *
732*4882a593Smuzhiyun * This function checks if logical eraseblock @lnum is mapped to a physical
733*4882a593Smuzhiyun * eraseblock. If a logical eraseblock is un-mapped, this does not necessarily
734*4882a593Smuzhiyun * mean it will still be un-mapped after the UBI device is re-attached. The
735*4882a593Smuzhiyun * logical eraseblock may become mapped to the physical eraseblock it was last
736*4882a593Smuzhiyun * mapped to.
737*4882a593Smuzhiyun *
738*4882a593Smuzhiyun * This function returns %1 if the LEB is mapped, %0 if not, and a negative
739*4882a593Smuzhiyun * error code in case of failure. If the volume is damaged because of an
740*4882a593Smuzhiyun * interrupted update this function just returns immediately with %-EBADF error
741*4882a593Smuzhiyun * code.
742*4882a593Smuzhiyun */
ubi_is_mapped(struct ubi_volume_desc * desc,int lnum)743*4882a593Smuzhiyun int ubi_is_mapped(struct ubi_volume_desc *desc, int lnum)
744*4882a593Smuzhiyun {
745*4882a593Smuzhiyun struct ubi_volume *vol = desc->vol;
746*4882a593Smuzhiyun
747*4882a593Smuzhiyun dbg_gen("test LEB %d:%d", vol->vol_id, lnum);
748*4882a593Smuzhiyun
749*4882a593Smuzhiyun if (lnum < 0 || lnum >= vol->reserved_pebs)
750*4882a593Smuzhiyun return -EINVAL;
751*4882a593Smuzhiyun
752*4882a593Smuzhiyun if (vol->upd_marker)
753*4882a593Smuzhiyun return -EBADF;
754*4882a593Smuzhiyun
755*4882a593Smuzhiyun return vol->eba_tbl[lnum] >= 0;
756*4882a593Smuzhiyun }
757*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(ubi_is_mapped);
758*4882a593Smuzhiyun
759*4882a593Smuzhiyun /**
760*4882a593Smuzhiyun * ubi_sync - synchronize UBI device buffers.
761*4882a593Smuzhiyun * @ubi_num: UBI device to synchronize
762*4882a593Smuzhiyun *
763*4882a593Smuzhiyun * The underlying MTD device may cache data in hardware or in software. This
764*4882a593Smuzhiyun * function ensures the caches are flushed. Returns zero in case of success and
765*4882a593Smuzhiyun * a negative error code in case of failure.
766*4882a593Smuzhiyun */
ubi_sync(int ubi_num)767*4882a593Smuzhiyun int ubi_sync(int ubi_num)
768*4882a593Smuzhiyun {
769*4882a593Smuzhiyun struct ubi_device *ubi;
770*4882a593Smuzhiyun
771*4882a593Smuzhiyun ubi = ubi_get_device(ubi_num);
772*4882a593Smuzhiyun if (!ubi)
773*4882a593Smuzhiyun return -ENODEV;
774*4882a593Smuzhiyun
775*4882a593Smuzhiyun mtd_sync(ubi->mtd);
776*4882a593Smuzhiyun ubi_put_device(ubi);
777*4882a593Smuzhiyun return 0;
778*4882a593Smuzhiyun }
779*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(ubi_sync);
780*4882a593Smuzhiyun
781*4882a593Smuzhiyun /**
782*4882a593Smuzhiyun * ubi_flush - flush UBI work queue.
783*4882a593Smuzhiyun * @ubi_num: UBI device to flush work queue
784*4882a593Smuzhiyun * @vol_id: volume id to flush for
785*4882a593Smuzhiyun * @lnum: logical eraseblock number to flush for
786*4882a593Smuzhiyun *
787*4882a593Smuzhiyun * This function executes all pending works for a particular volume id / logical
788*4882a593Smuzhiyun * eraseblock number pair. If either value is set to %UBI_ALL, then it acts as
789*4882a593Smuzhiyun * a wildcard for all of the corresponding volume numbers or logical
790*4882a593Smuzhiyun * eraseblock numbers. It returns zero in case of success and a negative error
791*4882a593Smuzhiyun * code in case of failure.
792*4882a593Smuzhiyun */
ubi_flush(int ubi_num,int vol_id,int lnum)793*4882a593Smuzhiyun int ubi_flush(int ubi_num, int vol_id, int lnum)
794*4882a593Smuzhiyun {
795*4882a593Smuzhiyun struct ubi_device *ubi;
796*4882a593Smuzhiyun int err = 0;
797*4882a593Smuzhiyun
798*4882a593Smuzhiyun ubi = ubi_get_device(ubi_num);
799*4882a593Smuzhiyun if (!ubi)
800*4882a593Smuzhiyun return -ENODEV;
801*4882a593Smuzhiyun
802*4882a593Smuzhiyun err = ubi_wl_flush(ubi, vol_id, lnum);
803*4882a593Smuzhiyun ubi_put_device(ubi);
804*4882a593Smuzhiyun return err;
805*4882a593Smuzhiyun }
806*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(ubi_flush);
807*4882a593Smuzhiyun
808*4882a593Smuzhiyun #ifndef __UBOOT__
809*4882a593Smuzhiyun BLOCKING_NOTIFIER_HEAD(ubi_notifiers);
810*4882a593Smuzhiyun
811*4882a593Smuzhiyun /**
812*4882a593Smuzhiyun * ubi_register_volume_notifier - register a volume notifier.
813*4882a593Smuzhiyun * @nb: the notifier description object
814*4882a593Smuzhiyun * @ignore_existing: if non-zero, do not send "added" notification for all
815*4882a593Smuzhiyun * already existing volumes
816*4882a593Smuzhiyun *
817*4882a593Smuzhiyun * This function registers a volume notifier, which means that
818*4882a593Smuzhiyun * 'nb->notifier_call()' will be invoked when an UBI volume is created,
819*4882a593Smuzhiyun * removed, re-sized, re-named, or updated. The first argument of the function
820*4882a593Smuzhiyun * is the notification type. The second argument is pointer to a
821*4882a593Smuzhiyun * &struct ubi_notification object which describes the notification event.
822*4882a593Smuzhiyun * Using UBI API from the volume notifier is prohibited.
823*4882a593Smuzhiyun *
824*4882a593Smuzhiyun * This function returns zero in case of success and a negative error code
825*4882a593Smuzhiyun * in case of failure.
826*4882a593Smuzhiyun */
ubi_register_volume_notifier(struct notifier_block * nb,int ignore_existing)827*4882a593Smuzhiyun int ubi_register_volume_notifier(struct notifier_block *nb,
828*4882a593Smuzhiyun int ignore_existing)
829*4882a593Smuzhiyun {
830*4882a593Smuzhiyun int err;
831*4882a593Smuzhiyun
832*4882a593Smuzhiyun err = blocking_notifier_chain_register(&ubi_notifiers, nb);
833*4882a593Smuzhiyun if (err != 0)
834*4882a593Smuzhiyun return err;
835*4882a593Smuzhiyun if (ignore_existing)
836*4882a593Smuzhiyun return 0;
837*4882a593Smuzhiyun
838*4882a593Smuzhiyun /*
839*4882a593Smuzhiyun * We are going to walk all UBI devices and all volumes, and
840*4882a593Smuzhiyun * notify the user about existing volumes by the %UBI_VOLUME_ADDED
841*4882a593Smuzhiyun * event. We have to lock the @ubi_devices_mutex to make sure UBI
842*4882a593Smuzhiyun * devices do not disappear.
843*4882a593Smuzhiyun */
844*4882a593Smuzhiyun mutex_lock(&ubi_devices_mutex);
845*4882a593Smuzhiyun ubi_enumerate_volumes(nb);
846*4882a593Smuzhiyun mutex_unlock(&ubi_devices_mutex);
847*4882a593Smuzhiyun
848*4882a593Smuzhiyun return err;
849*4882a593Smuzhiyun }
850*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(ubi_register_volume_notifier);
851*4882a593Smuzhiyun
852*4882a593Smuzhiyun /**
853*4882a593Smuzhiyun * ubi_unregister_volume_notifier - unregister the volume notifier.
854*4882a593Smuzhiyun * @nb: the notifier description object
855*4882a593Smuzhiyun *
856*4882a593Smuzhiyun * This function unregisters volume notifier @nm and returns zero in case of
857*4882a593Smuzhiyun * success and a negative error code in case of failure.
858*4882a593Smuzhiyun */
ubi_unregister_volume_notifier(struct notifier_block * nb)859*4882a593Smuzhiyun int ubi_unregister_volume_notifier(struct notifier_block *nb)
860*4882a593Smuzhiyun {
861*4882a593Smuzhiyun return blocking_notifier_chain_unregister(&ubi_notifiers, nb);
862*4882a593Smuzhiyun }
863*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(ubi_unregister_volume_notifier);
864*4882a593Smuzhiyun #endif
865