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