xref: /openbmc/u-boot/drivers/mtd/ubi/upd.c (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2c91a719dSKyungmin Park /*
3c91a719dSKyungmin Park  * Copyright (c) International Business Machines Corp., 2006
4c91a719dSKyungmin Park  * Copyright (c) Nokia Corporation, 2006
5c91a719dSKyungmin Park  *
6c91a719dSKyungmin Park  * Author: Artem Bityutskiy (Битюцкий Артём)
7c91a719dSKyungmin Park  *
8c91a719dSKyungmin Park  * Jan 2007: Alexander Schmidt, hacked per-volume update.
9c91a719dSKyungmin Park  */
10c91a719dSKyungmin Park 
11c91a719dSKyungmin Park /*
12c91a719dSKyungmin Park  * This file contains implementation of the volume update and atomic LEB change
13c91a719dSKyungmin Park  * functionality.
14c91a719dSKyungmin Park  *
15c91a719dSKyungmin Park  * The update operation is based on the per-volume update marker which is
16c91a719dSKyungmin Park  * stored in the volume table. The update marker is set before the update
17c91a719dSKyungmin Park  * starts, and removed after the update has been finished. So if the update was
18c91a719dSKyungmin Park  * interrupted by an unclean re-boot or due to some other reasons, the update
19c91a719dSKyungmin Park  * marker stays on the flash media and UBI finds it when it attaches the MTD
20c91a719dSKyungmin Park  * device next time. If the update marker is set for a volume, the volume is
21c91a719dSKyungmin Park  * treated as damaged and most I/O operations are prohibited. Only a new update
22c91a719dSKyungmin Park  * operation is allowed.
23c91a719dSKyungmin Park  *
24c91a719dSKyungmin Park  * Note, in general it is possible to implement the update operation as a
25c91a719dSKyungmin Park  * transaction with a roll-back capability.
26c91a719dSKyungmin Park  */
27c91a719dSKyungmin Park 
28ff94bc40SHeiko Schocher #ifndef __UBOOT__
29ff94bc40SHeiko Schocher #include <linux/uaccess.h>
30ff94bc40SHeiko Schocher #else
31ff94bc40SHeiko Schocher #include <div64.h>
32c91a719dSKyungmin Park #include <ubi_uboot.h>
33ff94bc40SHeiko Schocher #endif
34ff94bc40SHeiko Schocher #include <linux/err.h>
35ff94bc40SHeiko Schocher #include <linux/math64.h>
36ff94bc40SHeiko Schocher 
37c91a719dSKyungmin Park #include "ubi.h"
38c91a719dSKyungmin Park 
39c91a719dSKyungmin Park /**
40c91a719dSKyungmin Park  * set_update_marker - set update marker.
41c91a719dSKyungmin Park  * @ubi: UBI device description object
42c91a719dSKyungmin Park  * @vol: volume description object
43c91a719dSKyungmin Park  *
44c91a719dSKyungmin Park  * This function sets the update marker flag for volume @vol. Returns zero
45c91a719dSKyungmin Park  * in case of success and a negative error code in case of failure.
46c91a719dSKyungmin Park  */
set_update_marker(struct ubi_device * ubi,struct ubi_volume * vol)47c91a719dSKyungmin Park static int set_update_marker(struct ubi_device *ubi, struct ubi_volume *vol)
48c91a719dSKyungmin Park {
49c91a719dSKyungmin Park 	int err;
50c91a719dSKyungmin Park 	struct ubi_vtbl_record vtbl_rec;
51c91a719dSKyungmin Park 
52ff94bc40SHeiko Schocher 	dbg_gen("set update marker for volume %d", vol->vol_id);
53c91a719dSKyungmin Park 
54c91a719dSKyungmin Park 	if (vol->upd_marker) {
55c91a719dSKyungmin Park 		ubi_assert(ubi->vtbl[vol->vol_id].upd_marker);
56ff94bc40SHeiko Schocher 		dbg_gen("already set");
57c91a719dSKyungmin Park 		return 0;
58c91a719dSKyungmin Park 	}
59c91a719dSKyungmin Park 
60ff94bc40SHeiko Schocher 	vtbl_rec = ubi->vtbl[vol->vol_id];
61c91a719dSKyungmin Park 	vtbl_rec.upd_marker = 1;
62c91a719dSKyungmin Park 
63ff94bc40SHeiko Schocher 	mutex_lock(&ubi->device_mutex);
64c91a719dSKyungmin Park 	err = ubi_change_vtbl_record(ubi, vol->vol_id, &vtbl_rec);
65c91a719dSKyungmin Park 	vol->upd_marker = 1;
66ff94bc40SHeiko Schocher 	mutex_unlock(&ubi->device_mutex);
67c91a719dSKyungmin Park 	return err;
68c91a719dSKyungmin Park }
69c91a719dSKyungmin Park 
70c91a719dSKyungmin Park /**
71c91a719dSKyungmin Park  * clear_update_marker - clear update marker.
72c91a719dSKyungmin Park  * @ubi: UBI device description object
73c91a719dSKyungmin Park  * @vol: volume description object
74c91a719dSKyungmin Park  * @bytes: new data size in bytes
75c91a719dSKyungmin Park  *
76c91a719dSKyungmin Park  * This function clears the update marker for volume @vol, sets new volume
77c91a719dSKyungmin Park  * data size and clears the "corrupted" flag (static volumes only). Returns
78c91a719dSKyungmin Park  * zero in case of success and a negative error code in case of failure.
79c91a719dSKyungmin Park  */
clear_update_marker(struct ubi_device * ubi,struct ubi_volume * vol,long long bytes)80c91a719dSKyungmin Park static int clear_update_marker(struct ubi_device *ubi, struct ubi_volume *vol,
81c91a719dSKyungmin Park 			       long long bytes)
82c91a719dSKyungmin Park {
83c91a719dSKyungmin Park 	int err;
84c91a719dSKyungmin Park 	struct ubi_vtbl_record vtbl_rec;
85c91a719dSKyungmin Park 
86ff94bc40SHeiko Schocher 	dbg_gen("clear update marker for volume %d", vol->vol_id);
87c91a719dSKyungmin Park 
88ff94bc40SHeiko Schocher 	vtbl_rec = ubi->vtbl[vol->vol_id];
89c91a719dSKyungmin Park 	ubi_assert(vol->upd_marker && vtbl_rec.upd_marker);
90c91a719dSKyungmin Park 	vtbl_rec.upd_marker = 0;
91c91a719dSKyungmin Park 
92c91a719dSKyungmin Park 	if (vol->vol_type == UBI_STATIC_VOLUME) {
93c91a719dSKyungmin Park 		vol->corrupted = 0;
94ff94bc40SHeiko Schocher 		vol->used_bytes = bytes;
95ff94bc40SHeiko Schocher 		vol->used_ebs = div_u64_rem(bytes, vol->usable_leb_size,
96ff94bc40SHeiko Schocher 					    &vol->last_eb_bytes);
97c91a719dSKyungmin Park 		if (vol->last_eb_bytes)
98c91a719dSKyungmin Park 			vol->used_ebs += 1;
99c91a719dSKyungmin Park 		else
100c91a719dSKyungmin Park 			vol->last_eb_bytes = vol->usable_leb_size;
101c91a719dSKyungmin Park 	}
102c91a719dSKyungmin Park 
103ff94bc40SHeiko Schocher 	mutex_lock(&ubi->device_mutex);
104c91a719dSKyungmin Park 	err = ubi_change_vtbl_record(ubi, vol->vol_id, &vtbl_rec);
105c91a719dSKyungmin Park 	vol->upd_marker = 0;
106ff94bc40SHeiko Schocher 	mutex_unlock(&ubi->device_mutex);
107c91a719dSKyungmin Park 	return err;
108c91a719dSKyungmin Park }
109c91a719dSKyungmin Park 
110c91a719dSKyungmin Park /**
111c91a719dSKyungmin Park  * ubi_start_update - start volume update.
112c91a719dSKyungmin Park  * @ubi: UBI device description object
113c91a719dSKyungmin Park  * @vol: volume description object
114c91a719dSKyungmin Park  * @bytes: update bytes
115c91a719dSKyungmin Park  *
116c91a719dSKyungmin Park  * This function starts volume update operation. If @bytes is zero, the volume
117c91a719dSKyungmin Park  * is just wiped out. Returns zero in case of success and a negative error code
118c91a719dSKyungmin Park  * in case of failure.
119c91a719dSKyungmin Park  */
ubi_start_update(struct ubi_device * ubi,struct ubi_volume * vol,long long bytes)120c91a719dSKyungmin Park int ubi_start_update(struct ubi_device *ubi, struct ubi_volume *vol,
121c91a719dSKyungmin Park 		     long long bytes)
122c91a719dSKyungmin Park {
123c91a719dSKyungmin Park 	int i, err;
124c91a719dSKyungmin Park 
125ff94bc40SHeiko Schocher 	dbg_gen("start update of volume %d, %llu bytes", vol->vol_id, bytes);
126c91a719dSKyungmin Park 	ubi_assert(!vol->updating && !vol->changing_leb);
127c91a719dSKyungmin Park 	vol->updating = 1;
128c91a719dSKyungmin Park 
1290195a7bbSHeiko Schocher 	vol->upd_buf = vmalloc(ubi->leb_size);
1300195a7bbSHeiko Schocher 	if (!vol->upd_buf)
1310195a7bbSHeiko Schocher 		return -ENOMEM;
1320195a7bbSHeiko Schocher 
133c91a719dSKyungmin Park 	err = set_update_marker(ubi, vol);
134c91a719dSKyungmin Park 	if (err)
135c91a719dSKyungmin Park 		return err;
136c91a719dSKyungmin Park 
137c91a719dSKyungmin Park 	/* Before updating - wipe out the volume */
138c91a719dSKyungmin Park 	for (i = 0; i < vol->reserved_pebs; i++) {
139c91a719dSKyungmin Park 		err = ubi_eba_unmap_leb(ubi, vol, i);
140c91a719dSKyungmin Park 		if (err)
141c91a719dSKyungmin Park 			return err;
142c91a719dSKyungmin Park 	}
143c91a719dSKyungmin Park 
144c91a719dSKyungmin Park 	if (bytes == 0) {
145ff94bc40SHeiko Schocher 		err = ubi_wl_flush(ubi, UBI_ALL, UBI_ALL);
146ff94bc40SHeiko Schocher 		if (err)
147ff94bc40SHeiko Schocher 			return err;
148ff94bc40SHeiko Schocher 
149c91a719dSKyungmin Park 		err = clear_update_marker(ubi, vol, 0);
150c91a719dSKyungmin Park 		if (err)
151c91a719dSKyungmin Park 			return err;
1520195a7bbSHeiko Schocher 
1530195a7bbSHeiko Schocher 		vfree(vol->upd_buf);
154c91a719dSKyungmin Park 		vol->updating = 0;
155ff94bc40SHeiko Schocher 		return 0;
156c91a719dSKyungmin Park 	}
157c91a719dSKyungmin Park 
158ff94bc40SHeiko Schocher 	vol->upd_ebs = div_u64(bytes + vol->usable_leb_size - 1,
159ff94bc40SHeiko Schocher 			       vol->usable_leb_size);
160c91a719dSKyungmin Park 	vol->upd_bytes = bytes;
161c91a719dSKyungmin Park 	vol->upd_received = 0;
162c91a719dSKyungmin Park 	return 0;
163c91a719dSKyungmin Park }
164c91a719dSKyungmin Park 
165c91a719dSKyungmin Park /**
166c91a719dSKyungmin Park  * ubi_start_leb_change - start atomic LEB change.
167c91a719dSKyungmin Park  * @ubi: UBI device description object
168c91a719dSKyungmin Park  * @vol: volume description object
169c91a719dSKyungmin Park  * @req: operation request
170c91a719dSKyungmin Park  *
171c91a719dSKyungmin Park  * This function starts atomic LEB change operation. Returns zero in case of
172c91a719dSKyungmin Park  * success and a negative error code in case of failure.
173c91a719dSKyungmin Park  */
ubi_start_leb_change(struct ubi_device * ubi,struct ubi_volume * vol,const struct ubi_leb_change_req * req)174c91a719dSKyungmin Park int ubi_start_leb_change(struct ubi_device *ubi, struct ubi_volume *vol,
175c91a719dSKyungmin Park 			 const struct ubi_leb_change_req *req)
176c91a719dSKyungmin Park {
177c91a719dSKyungmin Park 	ubi_assert(!vol->updating && !vol->changing_leb);
178c91a719dSKyungmin Park 
179ff94bc40SHeiko Schocher 	dbg_gen("start changing LEB %d:%d, %u bytes",
180c91a719dSKyungmin Park 		vol->vol_id, req->lnum, req->bytes);
181c91a719dSKyungmin Park 	if (req->bytes == 0)
182ff94bc40SHeiko Schocher 		return ubi_eba_atomic_leb_change(ubi, vol, req->lnum, NULL, 0);
183c91a719dSKyungmin Park 
184c91a719dSKyungmin Park 	vol->upd_bytes = req->bytes;
185c91a719dSKyungmin Park 	vol->upd_received = 0;
186c91a719dSKyungmin Park 	vol->changing_leb = 1;
187c91a719dSKyungmin Park 	vol->ch_lnum = req->lnum;
188c91a719dSKyungmin Park 
189c91a719dSKyungmin Park 	vol->upd_buf = vmalloc(req->bytes);
190c91a719dSKyungmin Park 	if (!vol->upd_buf)
191c91a719dSKyungmin Park 		return -ENOMEM;
192c91a719dSKyungmin Park 
193c91a719dSKyungmin Park 	return 0;
194c91a719dSKyungmin Park }
195c91a719dSKyungmin Park 
196c91a719dSKyungmin Park /**
197c91a719dSKyungmin Park  * write_leb - write update data.
198c91a719dSKyungmin Park  * @ubi: UBI device description object
199c91a719dSKyungmin Park  * @vol: volume description object
200c91a719dSKyungmin Park  * @lnum: logical eraseblock number
201c91a719dSKyungmin Park  * @buf: data to write
202c91a719dSKyungmin Park  * @len: data size
203c91a719dSKyungmin Park  * @used_ebs: how many logical eraseblocks will this volume contain (static
204c91a719dSKyungmin Park  * volumes only)
205c91a719dSKyungmin Park  *
206c91a719dSKyungmin Park  * This function writes update data to corresponding logical eraseblock. In
207c91a719dSKyungmin Park  * case of dynamic volume, this function checks if the data contains 0xFF bytes
208c91a719dSKyungmin Park  * at the end. If yes, the 0xFF bytes are cut and not written. So if the whole
209c91a719dSKyungmin Park  * buffer contains only 0xFF bytes, the LEB is left unmapped.
210c91a719dSKyungmin Park  *
211c91a719dSKyungmin Park  * The reason why we skip the trailing 0xFF bytes in case of dynamic volume is
212c91a719dSKyungmin Park  * that we want to make sure that more data may be appended to the logical
213c91a719dSKyungmin Park  * eraseblock in future. Indeed, writing 0xFF bytes may have side effects and
214c91a719dSKyungmin Park  * this PEB won't be writable anymore. So if one writes the file-system image
215c91a719dSKyungmin Park  * to the UBI volume where 0xFFs mean free space - UBI makes sure this free
216c91a719dSKyungmin Park  * space is writable after the update.
217c91a719dSKyungmin Park  *
218c91a719dSKyungmin Park  * We do not do this for static volumes because they are read-only. But this
219c91a719dSKyungmin Park  * also cannot be done because we have to store per-LEB CRC and the correct
220c91a719dSKyungmin Park  * data length.
221c91a719dSKyungmin Park  *
222c91a719dSKyungmin Park  * This function returns zero in case of success and a negative error code in
223c91a719dSKyungmin Park  * case of failure.
224c91a719dSKyungmin Park  */
write_leb(struct ubi_device * ubi,struct ubi_volume * vol,int lnum,void * buf,int len,int used_ebs)225c91a719dSKyungmin Park static int write_leb(struct ubi_device *ubi, struct ubi_volume *vol, int lnum,
226c91a719dSKyungmin Park 		     void *buf, int len, int used_ebs)
227c91a719dSKyungmin Park {
228c91a719dSKyungmin Park 	int err;
229c91a719dSKyungmin Park 
230c91a719dSKyungmin Park 	if (vol->vol_type == UBI_DYNAMIC_VOLUME) {
231c91a719dSKyungmin Park 		int l = ALIGN(len, ubi->min_io_size);
232c91a719dSKyungmin Park 
233c91a719dSKyungmin Park 		memset(buf + len, 0xFF, l - len);
234c91a719dSKyungmin Park 		len = ubi_calc_data_len(ubi, buf, l);
235c91a719dSKyungmin Park 		if (len == 0) {
236ff94bc40SHeiko Schocher 			dbg_gen("all %d bytes contain 0xFF - skip", len);
237c91a719dSKyungmin Park 			return 0;
238c91a719dSKyungmin Park 		}
239c91a719dSKyungmin Park 
240ff94bc40SHeiko Schocher 		err = ubi_eba_write_leb(ubi, vol, lnum, buf, 0, len);
241c91a719dSKyungmin Park 	} else {
242c91a719dSKyungmin Park 		/*
243c91a719dSKyungmin Park 		 * When writing static volume, and this is the last logical
244c91a719dSKyungmin Park 		 * eraseblock, the length (@len) does not have to be aligned to
245c91a719dSKyungmin Park 		 * the minimal flash I/O unit. The 'ubi_eba_write_leb_st()'
246c91a719dSKyungmin Park 		 * function accepts exact (unaligned) length and stores it in
247c91a719dSKyungmin Park 		 * the VID header. And it takes care of proper alignment by
248c91a719dSKyungmin Park 		 * padding the buffer. Here we just make sure the padding will
249c91a719dSKyungmin Park 		 * contain zeros, not random trash.
250c91a719dSKyungmin Park 		 */
251c91a719dSKyungmin Park 		memset(buf + len, 0, vol->usable_leb_size - len);
252ff94bc40SHeiko Schocher 		err = ubi_eba_write_leb_st(ubi, vol, lnum, buf, len, used_ebs);
253c91a719dSKyungmin Park 	}
254c91a719dSKyungmin Park 
255c91a719dSKyungmin Park 	return err;
256c91a719dSKyungmin Park }
257c91a719dSKyungmin Park 
258c91a719dSKyungmin Park /**
259c91a719dSKyungmin Park  * ubi_more_update_data - write more update data.
260ff94bc40SHeiko Schocher  * @ubi: UBI device description object
261c91a719dSKyungmin Park  * @vol: volume description object
262c91a719dSKyungmin Park  * @buf: write data (user-space memory buffer)
263c91a719dSKyungmin Park  * @count: how much bytes to write
264c91a719dSKyungmin Park  *
265c91a719dSKyungmin Park  * This function writes more data to the volume which is being updated. It may
266c91a719dSKyungmin Park  * be called arbitrary number of times until all the update data arriveis. This
267c91a719dSKyungmin Park  * function returns %0 in case of success, number of bytes written during the
268c91a719dSKyungmin Park  * last call if the whole volume update has been successfully finished, and a
269c91a719dSKyungmin Park  * negative error code in case of failure.
270c91a719dSKyungmin Park  */
ubi_more_update_data(struct ubi_device * ubi,struct ubi_volume * vol,const void __user * buf,int count)271c91a719dSKyungmin Park int ubi_more_update_data(struct ubi_device *ubi, struct ubi_volume *vol,
272c91a719dSKyungmin Park 			 const void __user *buf, int count)
273c91a719dSKyungmin Park {
274ff94bc40SHeiko Schocher #ifndef __UBOOT__
275c91a719dSKyungmin Park 	int lnum, offs, err = 0, len, to_write = count;
276ff94bc40SHeiko Schocher #else
277ff94bc40SHeiko Schocher 	int lnum, err = 0, len, to_write = count;
278ff94bc40SHeiko Schocher 	u32 offs;
279ff94bc40SHeiko Schocher #endif
280c91a719dSKyungmin Park 
281ff94bc40SHeiko Schocher 	dbg_gen("write %d of %lld bytes, %lld already passed",
282c91a719dSKyungmin Park 		count, vol->upd_bytes, vol->upd_received);
283c91a719dSKyungmin Park 
284c91a719dSKyungmin Park 	if (ubi->ro_mode)
285c91a719dSKyungmin Park 		return -EROFS;
286c91a719dSKyungmin Park 
287ff94bc40SHeiko Schocher 	lnum = div_u64_rem(vol->upd_received,  vol->usable_leb_size, &offs);
288c91a719dSKyungmin Park 	if (vol->upd_received + count > vol->upd_bytes)
289c91a719dSKyungmin Park 		to_write = count = vol->upd_bytes - vol->upd_received;
290c91a719dSKyungmin Park 
291c91a719dSKyungmin Park 	/*
292c91a719dSKyungmin Park 	 * When updating volumes, we accumulate whole logical eraseblock of
293c91a719dSKyungmin Park 	 * data and write it at once.
294c91a719dSKyungmin Park 	 */
295c91a719dSKyungmin Park 	if (offs != 0) {
296c91a719dSKyungmin Park 		/*
297c91a719dSKyungmin Park 		 * This is a write to the middle of the logical eraseblock. We
298c91a719dSKyungmin Park 		 * copy the data to our update buffer and wait for more data or
299c91a719dSKyungmin Park 		 * flush it if the whole eraseblock is written or the update
300c91a719dSKyungmin Park 		 * is finished.
301c91a719dSKyungmin Park 		 */
302c91a719dSKyungmin Park 
303c91a719dSKyungmin Park 		len = vol->usable_leb_size - offs;
304c91a719dSKyungmin Park 		if (len > count)
305c91a719dSKyungmin Park 			len = count;
306c91a719dSKyungmin Park 
307c91a719dSKyungmin Park 		err = copy_from_user(vol->upd_buf + offs, buf, len);
308c91a719dSKyungmin Park 		if (err)
309c91a719dSKyungmin Park 			return -EFAULT;
310c91a719dSKyungmin Park 
311c91a719dSKyungmin Park 		if (offs + len == vol->usable_leb_size ||
312c91a719dSKyungmin Park 		    vol->upd_received + len == vol->upd_bytes) {
313c91a719dSKyungmin Park 			int flush_len = offs + len;
314c91a719dSKyungmin Park 
315c91a719dSKyungmin Park 			/*
316c91a719dSKyungmin Park 			 * OK, we gathered either the whole eraseblock or this
317c91a719dSKyungmin Park 			 * is the last chunk, it's time to flush the buffer.
318c91a719dSKyungmin Park 			 */
319c91a719dSKyungmin Park 			ubi_assert(flush_len <= vol->usable_leb_size);
320c91a719dSKyungmin Park 			err = write_leb(ubi, vol, lnum, vol->upd_buf, flush_len,
321c91a719dSKyungmin Park 					vol->upd_ebs);
322c91a719dSKyungmin Park 			if (err)
323c91a719dSKyungmin Park 				return err;
324c91a719dSKyungmin Park 		}
325c91a719dSKyungmin Park 
326c91a719dSKyungmin Park 		vol->upd_received += len;
327c91a719dSKyungmin Park 		count -= len;
328c91a719dSKyungmin Park 		buf += len;
329c91a719dSKyungmin Park 		lnum += 1;
330c91a719dSKyungmin Park 	}
331c91a719dSKyungmin Park 
332c91a719dSKyungmin Park 	/*
333c91a719dSKyungmin Park 	 * If we've got more to write, let's continue. At this point we know we
334c91a719dSKyungmin Park 	 * are starting from the beginning of an eraseblock.
335c91a719dSKyungmin Park 	 */
336c91a719dSKyungmin Park 	while (count) {
337c91a719dSKyungmin Park 		if (count > vol->usable_leb_size)
338c91a719dSKyungmin Park 			len = vol->usable_leb_size;
339c91a719dSKyungmin Park 		else
340c91a719dSKyungmin Park 			len = count;
341c91a719dSKyungmin Park 
342c91a719dSKyungmin Park 		err = copy_from_user(vol->upd_buf, buf, len);
343c91a719dSKyungmin Park 		if (err)
344c91a719dSKyungmin Park 			return -EFAULT;
345c91a719dSKyungmin Park 
346c91a719dSKyungmin Park 		if (len == vol->usable_leb_size ||
347c91a719dSKyungmin Park 		    vol->upd_received + len == vol->upd_bytes) {
348c91a719dSKyungmin Park 			err = write_leb(ubi, vol, lnum, vol->upd_buf,
349c91a719dSKyungmin Park 					len, vol->upd_ebs);
350c91a719dSKyungmin Park 			if (err)
351c91a719dSKyungmin Park 				break;
352c91a719dSKyungmin Park 		}
353c91a719dSKyungmin Park 
354c91a719dSKyungmin Park 		vol->upd_received += len;
355c91a719dSKyungmin Park 		count -= len;
356c91a719dSKyungmin Park 		lnum += 1;
357c91a719dSKyungmin Park 		buf += len;
358c91a719dSKyungmin Park 	}
359c91a719dSKyungmin Park 
360c91a719dSKyungmin Park 	ubi_assert(vol->upd_received <= vol->upd_bytes);
361c91a719dSKyungmin Park 	if (vol->upd_received == vol->upd_bytes) {
362ff94bc40SHeiko Schocher 		err = ubi_wl_flush(ubi, UBI_ALL, UBI_ALL);
363ff94bc40SHeiko Schocher 		if (err)
364ff94bc40SHeiko Schocher 			return err;
365c91a719dSKyungmin Park 		/* The update is finished, clear the update marker */
366c91a719dSKyungmin Park 		err = clear_update_marker(ubi, vol, vol->upd_bytes);
367c91a719dSKyungmin Park 		if (err)
368c91a719dSKyungmin Park 			return err;
369c91a719dSKyungmin Park 		vol->updating = 0;
370c91a719dSKyungmin Park 		err = to_write;
371c91a719dSKyungmin Park 		vfree(vol->upd_buf);
372c91a719dSKyungmin Park 	}
373c91a719dSKyungmin Park 
374c91a719dSKyungmin Park 	return err;
375c91a719dSKyungmin Park }
376c91a719dSKyungmin Park 
377c91a719dSKyungmin Park /**
378c91a719dSKyungmin Park  * ubi_more_leb_change_data - accept more data for atomic LEB change.
379ff94bc40SHeiko Schocher  * @ubi: UBI device description object
380c91a719dSKyungmin Park  * @vol: volume description object
381c91a719dSKyungmin Park  * @buf: write data (user-space memory buffer)
382c91a719dSKyungmin Park  * @count: how much bytes to write
383c91a719dSKyungmin Park  *
384c91a719dSKyungmin Park  * This function accepts more data to the volume which is being under the
385c91a719dSKyungmin Park  * "atomic LEB change" operation. It may be called arbitrary number of times
386c91a719dSKyungmin Park  * until all data arrives. This function returns %0 in case of success, number
387c91a719dSKyungmin Park  * of bytes written during the last call if the whole "atomic LEB change"
388c91a719dSKyungmin Park  * operation has been successfully finished, and a negative error code in case
389c91a719dSKyungmin Park  * of failure.
390c91a719dSKyungmin Park  */
ubi_more_leb_change_data(struct ubi_device * ubi,struct ubi_volume * vol,const void __user * buf,int count)391c91a719dSKyungmin Park int ubi_more_leb_change_data(struct ubi_device *ubi, struct ubi_volume *vol,
392c91a719dSKyungmin Park 			     const void __user *buf, int count)
393c91a719dSKyungmin Park {
394c91a719dSKyungmin Park 	int err;
395c91a719dSKyungmin Park 
396ff94bc40SHeiko Schocher 	dbg_gen("write %d of %lld bytes, %lld already passed",
397c91a719dSKyungmin Park 		count, vol->upd_bytes, vol->upd_received);
398c91a719dSKyungmin Park 
399c91a719dSKyungmin Park 	if (ubi->ro_mode)
400c91a719dSKyungmin Park 		return -EROFS;
401c91a719dSKyungmin Park 
402c91a719dSKyungmin Park 	if (vol->upd_received + count > vol->upd_bytes)
403c91a719dSKyungmin Park 		count = vol->upd_bytes - vol->upd_received;
404c91a719dSKyungmin Park 
405c91a719dSKyungmin Park 	err = copy_from_user(vol->upd_buf + vol->upd_received, buf, count);
406c91a719dSKyungmin Park 	if (err)
407c91a719dSKyungmin Park 		return -EFAULT;
408c91a719dSKyungmin Park 
409c91a719dSKyungmin Park 	vol->upd_received += count;
410c91a719dSKyungmin Park 
411c91a719dSKyungmin Park 	if (vol->upd_received == vol->upd_bytes) {
412c91a719dSKyungmin Park 		int len = ALIGN((int)vol->upd_bytes, ubi->min_io_size);
413c91a719dSKyungmin Park 
414ff94bc40SHeiko Schocher 		memset(vol->upd_buf + vol->upd_bytes, 0xFF,
415ff94bc40SHeiko Schocher 		       len - vol->upd_bytes);
416c91a719dSKyungmin Park 		len = ubi_calc_data_len(ubi, vol->upd_buf, len);
417c91a719dSKyungmin Park 		err = ubi_eba_atomic_leb_change(ubi, vol, vol->ch_lnum,
418ff94bc40SHeiko Schocher 						vol->upd_buf, len);
419c91a719dSKyungmin Park 		if (err)
420c91a719dSKyungmin Park 			return err;
421c91a719dSKyungmin Park 	}
422c91a719dSKyungmin Park 
423c91a719dSKyungmin Park 	ubi_assert(vol->upd_received <= vol->upd_bytes);
424c91a719dSKyungmin Park 	if (vol->upd_received == vol->upd_bytes) {
425c91a719dSKyungmin Park 		vol->changing_leb = 0;
426c91a719dSKyungmin Park 		err = count;
427c91a719dSKyungmin Park 		vfree(vol->upd_buf);
428c91a719dSKyungmin Park 	}
429c91a719dSKyungmin Park 
430c91a719dSKyungmin Park 	return err;
431c91a719dSKyungmin Park }
432