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