vol->vol_id);
ubi_assert(!vol->changing_leb);
vol->updating = 0;
- vfree(vol->upd_buf);
+ kfree(vol->upd_buf);
} else if (vol->changing_leb) {
dbg_gen("only %lld of %lld bytes received for atomic LEB change for volume %d:%d, cancel",
vol->upd_received, vol->upd_bytes, vol->ubi->ubi_num,
vol->vol_id);
vol->changing_leb = 0;
- vfree(vol->upd_buf);
+ kfree(vol->upd_buf);
}
ubi_close_volume(desc);
tbuf_size = vol->usable_leb_size;
if (count < tbuf_size)
tbuf_size = ALIGN(count, ubi->min_io_size);
- tbuf = vmalloc(tbuf_size);
+ tbuf = kmalloc(tbuf_size, GFP_KERNEL);
if (!tbuf)
return -ENOMEM;
len = count > tbuf_size ? tbuf_size : count;
} while (count);
- vfree(tbuf);
+ kfree(tbuf);
return err ? err : count_save - count;
}
tbuf_size = vol->usable_leb_size;
if (count < tbuf_size)
tbuf_size = ALIGN(count, ubi->min_io_size);
- tbuf = vmalloc(tbuf_size);
+ tbuf = kmalloc(tbuf_size, GFP_KERNEL);
if (!tbuf)
return -ENOMEM;
len = count > tbuf_size ? tbuf_size : count;
}
- vfree(tbuf);
+ kfree(tbuf);
return err ? err : count_save - count;
}
struct ubi_volume_desc *desc = file->private_data;
struct ubi_volume *vol = desc->vol;
struct ubi_device *ubi = vol->ubi;
+
void __user *argp = (void __user *)arg;
switch (cmd) {
case UBI_IOCVOLUP:
{
int64_t bytes, rsvd_bytes;
-
+ #if CONFIG_BLB
+ struct ubi_volume *backup_vol = ubi->volumes[vol_id2idx(ubi, UBI_BACKUP_VOLUME_ID)];
+ #endif
if (!capable(CAP_SYS_RESOURCE)) {
err = -EPERM;
break;
err = ubi_start_update(ubi, vol, bytes);
if (bytes == 0)
revoke_exclusive(desc, UBI_READWRITE);
+ #if CONFIG_BLB
+ ubi_eba_unmap_leb(ubi, backup_vol, 0);
+ ubi_eba_unmap_leb(ubi, backup_vol, 1);
+ #endif
break;
}
/* Validate the request */
err = -EINVAL;
if (req.lnum < 0 || req.lnum >= vol->reserved_pebs ||
- req.bytes < 0 || req.lnum >= vol->usable_leb_size)
+ req.bytes < 0 || req.bytes > vol->usable_leb_size)
break;
err = get_exclusive(desc);
err = -EFAULT;
break;
}
+#ifdef MTK_IPOH_SUPPORT
+ ubi->ipoh_ops = 1;
+#endif
err = ubi_leb_unmap(desc, lnum);
+#ifdef MTK_IPOH_SUPPORT
+ ubi->ipoh_ops = 0;
+#endif
break;
}
}
break;
}
-
+ case UBI_IOCLBMAP:
+ {
+ int LEB[2];
+ err = copy_from_user(LEB, argp, sizeof(int)*2);
+ if (err) {
+ err = -EFAULT;
+ break;
+ }
+ LEB[1] = desc->vol->eba_tbl[LEB[0]];
+ err = copy_to_user(argp, LEB, sizeof(int)*2);
+ if (err) {
+ err = -EFAULT;
+ break;
+ }
+ break;
+ }
default:
err = -ENOTTY;
break;