zoukankan      html  css  js  c++  java
  • recovery 恢复出厂设置失败Data wipe failed

    最近客户反馈,编译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) {

    到此,问题解决。

  • 相关阅读:
    Eclipse中创建标准web工程以及标准目录结构说明
    log4j配置说明
    常用的Eclilpse插件列表以及安装方式总结
    Eclipse插件安装总结
    eclipse中加放js文件报js语法错误解决办法
    如何在Eclipse中配置Tomcat服务器
    webpack的单vue组件(.vue)加载sass配置
    总结自己常用的几种居中方式
    两个正则坑
    CSS拾遗(二)
  • 原文地址:https://www.cnblogs.com/codeking100/p/10339195.html
Copyright © 2011-2022 走看看