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