最近客户反馈,编译32位的android系统,在recovery中执行恢复出厂设置的时候失败了,失败的打印提升信息如下。
Formatting /data...
[ 2.191404] E:get_file_size: invalid size -1289764864 for /dev/block/data
[ 2.207430] Data wipe failed.
根据打印提示,意识是说获取data分区的size是无效的。我们来看看这个函数get_file_size bootable/recovery/roots.cpp
static ssize_t get_file_size(int fd, uint64_t reserve_len) {
struct stat buf;
int ret = fstat(fd, &buf);
if (ret) return 0; ssize_t computed_size;
if (S_ISREG(buf.st_mode)) {
computed_size = buf.st_size - reserve_len;
} else if (S_ISBLK(buf.st_mode)) {
computed_size = get_block_device_size(fd) - reserve_len;
} else {
computed_size = 0;
} return computed_size;
}
这个ssize_t是跟系统的位数相关的,当时32位的系统时,ssize_t的大小为U32, 那么此时能够表示的最大的长度为2^32-1=4294967295=4095.99M=4G 也就是说,当时32位的系统时,ssize_t能够保存的最大值为4G,当data分区的大小超过4G的时候, ssize_t就无法正常保存的获取的data分区的大小,那么也就会出错了。
 
而实际项目上面给data分区的大小为11G+, 那么自然就会出错了,我们把使用ssize_t的地方换成uint64_t即可 patch如下:
diff --git a/roots.cpp b/roots.cpp
index 25d9d7e..5197ccb 100644
--- a/roots.cpp
+++ b/roots.cpp
@@ -182,12 +182,12 @@ static int exec_cmd(const char* path, char* const argv[]) {
return WEXITSTATUS(status);
} -static ssize_t get_file_size(int fd, uint64_t reserve_len) {
+static uint64_t get_file_size(int fd, uint64_t reserve_len) {
struct stat buf;
int ret = fstat(fd, &buf);
if (ret) return 0; - ssize_t computed_size;
+ uint64_t computed_size;
if (S_ISREG(buf.st_mode)) {
computed_size = buf.st_size - reserve_len;
} else if (S_ISBLK(buf.st_mode)) {
@@ -234,7 +234,7 @@ int format_volume(const char* volume, const char* directory) {
close(fd);
} - ssize_t length = 0;
+ uint64_t length = 0;
if (v->length != 0) {
length = v->length;
} else if (v->key_loc != NULL && strcmp(v->key_loc, "footer") == 0) {

到此,问题解决。

recovery 恢复出厂设置失败Data wipe failed的更多相关文章

  1. recovery 强制执行恢复出厂设置(Rescue Party)

    有时候我们在系统正常运行的时候,突然跑到recovery里面了,并且停在了如下界面:   Can't load Android system. Your data may be corrupt. If ...

  2. Android恢复出厂设置流程分析【Android源码解析十】

    最近看恢复出厂的一个问题,以前也查过这方面的流程,所以这里整理一些AP+framework层的流程: 在setting-->备份与重置--->恢复出厂设置--->重置手机---> ...

  3. OpenWRT 恢复出厂设置命令

    如果通过无线或者有线口无法连接到router,可以用恢复某些设置重新设置路由器. 1. 开机,等着一个工作灯亮的时候立即按下rest键2秒,然后就开始拼命闪烁,很好现在进入failsafe模式了. 2 ...

  4. U8800 手机恢复出厂设置出现轻触Android开始页面 处理办法

    U8800 恢复出厂设置出现轻触Android开始页面处理办法 问题现象 Huawei 手机U8800刷机后,点击恢复出厂默认设置后,出现了一个一直停留在“欢迎使用Android 轻触 Android ...

  5. [置顶] 不刷机让越狱后的iphone恢复出厂设置

    iphone越狱后,设置里的清除所有内容和设置选项是不生效的,选上之后菊花转个不停,只能强制退出,还有白苹果的危险. 若想恢复出厂设置有两个办法: 一.刷机 最直接的办法,我觉得itunes配合ito ...

  6. 苹果电脑(Mac mini或Macbook或iMac)恢复出厂设置

    苹果电脑(Mac mini或Macbook或iMac)恢复出厂设置,首先要做好如下的准备: 第一:数据的备份:第二:保证正常的wifi连接:第三:有线的鼠标键盘连接: 具体恢复操作步骤: 步骤一:电脑 ...

  7. HTC 328T 如何恢复出厂设置

    设置-存储-恢复出厂设置(在存储的最下面,往下拉)

  8. HILLSTONE sg6000 g5150 怎么恢复出厂设置

    hillstone恢复出厂设置的方法(忘记密码的情况) 口令丢失情况下的处理 如果口令丢失,用户无法登录安全路由器进行配置,请在安全路由器刚启动时按住 CLR 按键大约 5 秒,使设备恢复到出厂配置. ...

  9. H3C交换机恢复出厂设置

    reset saved-configuration reboot 恢复出厂设置后查看当前配置: ..............................

随机推荐

  1. zuul熔断代码

    package com.sun.fallback; import java.io.ByteArrayInputStream; import java.io.IOException; import ja ...

  2. Tools - 浏览器Chrome

    Chrome HomePage:https://www.google.com/chrome/ Chrome应用商店:https://chrome.google.com/webstore/categor ...

  3. 关于Ubuntu拒绝root用户ssh远程登录

    #sudo vim /etc/ssh/sshd_config 找到并用#注释掉这行:PermitRootLogin prohibit-password 新建一行 添加:PermitRootLogin ...

  4. android底部菜单栏的编写

    开发工具android stdio,组件Radio Button 1.新建空项目DDDD 2.将事先准备好的图标复制到对应的文件夹中(如图),这五个文件夹都要拷进去,图标文件http://pan.ba ...

  5. Android中内容提供者ContentProvider的详解

    1.什么是ContentProvider 首先,ContentProvider(内容提供者)是android中的四大组件之一,但是在一般的开发中,可能使用的比较少. ContentProvider为不 ...

  6. 交换路由中期测验20181226(动态路由配置与重分发、NAT转换、ACL访问控制列表)

    测试拓扑: 接口配置信息 HostName 接口 IP地址 网关 Server 0 Fa0 172.16.15.1/24 172.16.15.254 Server 1 Fa0 100.2.15.200 ...

  7. 深入JAVA注解(Annotation):自定义注解 (转)

    原文出自:http://blog.csdn.net/yjclsx/article/details/52101922 一.基础知识:元注解 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义 ...

  8. Python机器学习笔记:使用Keras进行回归预测

    Keras是一个深度学习库,包含高效的数字库Theano和TensorFlow.是一个高度模块化的神经网络库,支持CPU和GPU. 本文学习的目的是学习如何加载CSV文件并使其可供Keras使用,如何 ...

  9. Angular2入门:TypeScript的函数 - 剩余参数和箭头函数

  10. Spring-IOC实现【02-其他实现方式】

    接上文Spring-IOC实现[01-XML配置方式] Java配置方式 SpringBoot流行之后,Java 配置开始被广泛使用. Java配置本质上,就是使用一个Java类去代替xml配置,这种 ...