Changeset d4880509 in rtems


Ignore:
Timestamp:
Sep 30, 2019, 6:01:24 AM (3 weeks ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
master
Children:
1ea7e3a7
Parents:
c1eb577
git-author:
Sebastian Huber <sebastian.huber@…> (09/30/19 06:01:24)
git-committer:
Sebastian Huber <sebastian.huber@…> (10/01/19 07:55:07)
Message:

dosfs: Fix format with media block sizes > 512

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpukit/libfs/src/dosfs/msdos_format.c

    rc1eb577 rd4880509  
    6666  uint32_t vol_id;
    6767  bool     skip_alignment;
     68  char    *sec;
    6869}  msdos_format_param_t;
    6970
     
    181182| Input Parameters:                                                         |
    182183\*-------------------------------------------------------------------------*/
     184 msdos_format_param_t *fmt_params,
    183185 const msdos_format_request_param_t *rqdata,
    184186 int         fd,                       /* file descriptor index            */
    185187 uint32_t    start_sector,             /* sector number to fill to         */
    186188 uint32_t    sector_cnt,               /* number of sectors to fill to     */
    187  uint32_t    sector_size,              /* size of sector                   */
    188189 const char  fill_byte                 /* byte to fill into sectors        */
    189190 )
     
    194195{
    195196  int ret_val = 0;
    196   char *fill_buffer = NULL;
    197197  uint32_t total_sectors = sector_cnt;
    198198  int last_percent = -1;
    199199
    200200  /*
    201    * allocate and fill buffer
    202    */
    203   if (ret_val == 0) {
    204     fill_buffer = malloc(sector_size);
    205     if (fill_buffer == NULL) {
    206       errno = ENOMEM;
    207       ret_val = -1;
    208     }
    209     else {
    210       memset(fill_buffer,fill_byte,sector_size);
    211     }
     201   * fill buffer
     202   */
     203  if (ret_val == 0) {
     204    memset(fmt_params->sec,fill_byte,fmt_params->bytes_per_sector);
    212205  }
    213206
     
    225218      last_percent = percent;
    226219    }
    227     ret_val = msdos_format_write_sec(fd,start_sector,sector_size,fill_buffer);
     220    ret_val = msdos_format_write_sec(fd,start_sector,
     221                                     fmt_params->bytes_per_sector,
     222                                     fmt_params->sec);
    228223    start_sector++;
    229224    sector_cnt--;
     
    236231                         "filling error on sector: %d\n", start_sector);
    237232
    238   /*
    239    * cleanup
    240    */
    241   if (fill_buffer != NULL) {
    242     free(fill_buffer);
    243     fill_buffer = NULL;
    244   }
    245233  return ret_val;
    246234}
     
    10171005\*=========================================================================*/
    10181006{
    1019   char                 tmp_sec[FAT_TOTAL_MBR_SIZE];
    10201007  struct stat          stat_buf;
    10211008  int                  ret_val   = 0;
     
    10231010  int                  i;
    10241011  msdos_format_param_t fmt_params;
     1012
     1013  memset(&fmt_params, 0, sizeof(fmt_params));
    10251014
    10261015  /*
     
    10561045    ret_val = msdos_format_determine_fmt_params(fd,rqdata,&fmt_params);
    10571046  }
     1047
     1048  if (ret_val == 0) {
     1049    fmt_params.sec = malloc(fmt_params.bytes_per_sector);
     1050    if (fmt_params.sec == NULL) {
     1051      ret_val = -1;
     1052    }
     1053  }
     1054
    10581055  /*
    10591056   * if requested, write whole disk/partition with 0xe5
     
    10631060      !(rqdata->quick_format)) {
    10641061    ret_val = msdos_format_fill_sectors
    1065       (rqdata,
     1062      (&fmt_params,
     1063       rqdata,
    10661064       fd,
    10671065       0,                            /* start sector */
    10681066       fmt_params.totl_sector_cnt,   /* sector count */
    1069        fmt_params.bytes_per_sector,
    10701067       0xe5);
    10711068  }
     
    10831080                                    0,
    10841081                                    fmt_params.bytes_per_sector,
    1085                                     tmp_sec);
     1082                                    fmt_params.sec);
    10861083    if (ret_val == 0) {
    10871084      msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL,
    10881085                           "generate MRB sector\n");
    1089       ret_val = msdos_format_gen_mbr(tmp_sec,&fmt_params);
     1086      ret_val = msdos_format_gen_mbr(fmt_params.sec,&fmt_params);
    10901087    }
    10911088
     
    11001097                                       0,
    11011098                                       fmt_params.bytes_per_sector,
    1102                                        tmp_sec);
     1099                                       fmt_params.sec);
    11031100    }
    11041101    if ((ret_val == 0) &&
     
    11121109                                       fmt_params.mbr_copy_sec ,
    11131110                                       fmt_params.bytes_per_sector,
    1114                                        tmp_sec);
     1111                                       fmt_params.sec);
    11151112    }
    11161113  }
     
    11201117  if ((ret_val == 0) &&
    11211118      (fmt_params.fsinfo_sec != 0)) {
    1122       ret_val = msdos_format_gen_fsinfo(tmp_sec);
     1119      ret_val = msdos_format_gen_fsinfo(fmt_params.sec);
    11231120  }
    11241121  /*
     
    11301127                                     fmt_params.fsinfo_sec,
    11311128                                     fmt_params.bytes_per_sector,
    1132                                      tmp_sec);
     1129                                     fmt_params.sec);
    11331130  }
    11341131  /*
     
    11381135  if (ret_val == 0) {
    11391136    ret_val = msdos_format_fill_sectors
    1140       (rqdata,
     1137      (&fmt_params,
     1138       rqdata,
    11411139       fd,
    11421140       fmt_params.rsvd_sector_cnt,                   /* start sector */
    11431141       fmt_params.fat_num*fmt_params.sectors_per_fat,/* sector count */
    1144        fmt_params.bytes_per_sector,
    11451142       0x00);
    11461143  }
     
    11511148  if (ret_val == 0) {
    11521149    ret_val = msdos_format_fill_sectors
    1153       (rqdata,
     1150      (&fmt_params,
     1151       rqdata,
    11541152       fd,
    11551153       fmt_params.root_dir_start_sec,        /* start sector */
    11561154       fmt_params.root_dir_fmt_sec_cnt,      /* sector count */
    1157        fmt_params.bytes_per_sector,
    11581155       0x00);
    11591156  }
     
    11621159   */
    11631160  if ((ret_val == 0) && fmt_params.VolLabel_present) {
    1164     memset(tmp_sec,0,sizeof(tmp_sec));
    1165     memcpy(MSDOS_DIR_NAME(tmp_sec),fmt_params.VolLabel,MSDOS_SHORT_NAME_LEN);
    1166     *MSDOS_DIR_ATTR(tmp_sec) = MSDOS_ATTR_VOLUME_ID;
     1161    memset(fmt_params.sec,0,fmt_params.bytes_per_sector);
     1162    memcpy(MSDOS_DIR_NAME(fmt_params.sec),fmt_params.VolLabel,MSDOS_SHORT_NAME_LEN);
     1163    *MSDOS_DIR_ATTR(fmt_params.sec) = MSDOS_ATTR_VOLUME_ID;
    11671164    ret_val = msdos_format_write_sec
    11681165      (fd,
    11691166       fmt_params.root_dir_start_sec,
    11701167       fmt_params.bytes_per_sector,
    1171        tmp_sec);
     1168       fmt_params.sec);
    11721169  }
    11731170  /*
     
    11821179     * empty sector: all clusters are free/do not link further on
    11831180     */
    1184     memset(tmp_sec,0,sizeof(tmp_sec));
     1181    memset(fmt_params.sec,0,fmt_params.bytes_per_sector);
    11851182
    11861183    switch(fmt_params.fattype) {
    11871184    case FAT_FAT12:
    11881185      /* LSBits of FAT entry 0: media_type */
    1189       FAT_SET_VAL8(tmp_sec,0,(fmt_params.media_code));
     1186      FAT_SET_VAL8(fmt_params.sec,0,(fmt_params.media_code));
    11901187      /* MSBits of FAT entry 0:0xf, LSBits of FAT entry 1: LSB of EOC */
    1191       FAT_SET_VAL8(tmp_sec,1,(0x0f | (FAT_FAT12_EOC << 4)));
     1188      FAT_SET_VAL8(fmt_params.sec,1,(0x0f | (FAT_FAT12_EOC << 4)));
    11921189      /* MSBits of FAT entry 1: MSBits of EOC */
    1193       FAT_SET_VAL8(tmp_sec,2,(FAT_FAT12_EOC >> 4));
     1190      FAT_SET_VAL8(fmt_params.sec,2,(FAT_FAT12_EOC >> 4));
    11941191      break;
    11951192
    11961193    case FAT_FAT16:
    11971194      /* FAT entry 0: 0xff00|media_type */
    1198       FAT_SET_VAL8(tmp_sec,0,fmt_params.media_code);
    1199       FAT_SET_VAL8(tmp_sec,1,0xff);
     1195      FAT_SET_VAL8(fmt_params.sec,0,fmt_params.media_code);
     1196      FAT_SET_VAL8(fmt_params.sec,1,0xff);
    12001197      /* FAT entry 1: EOC */
    1201       FAT_SET_VAL16(tmp_sec,2,FAT_FAT16_EOC);
     1198      FAT_SET_VAL16(fmt_params.sec,2,FAT_FAT16_EOC);
    12021199      break;
    12031200
    12041201    case FAT_FAT32:
    12051202      /* FAT entry 0: 0xffffff00|media_type */
    1206       FAT_SET_VAL32(tmp_sec,0,0xffffff00|fmt_params.media_code);
     1203      FAT_SET_VAL32(fmt_params.sec,0,0xffffff00|fmt_params.media_code);
    12071204      /* FAT entry 1: Not dirty, no IO error, EOC */
    1208       FAT_SET_VAL32(tmp_sec,4,0xc0000000|FAT_FAT32_EOC);
     1205      FAT_SET_VAL32(fmt_params.sec,4,0xc0000000|FAT_FAT32_EOC);
    12091206      break;
    12101207
     
    12191216       * mark this in every copy of the FAT
    12201217       */
    1221       FAT_SET_VAL32(tmp_sec,8,FAT_FAT32_EOC);
     1218      FAT_SET_VAL32(fmt_params.sec,8,FAT_FAT32_EOC);
    12221219    }
    12231220
     
    12331230         + (i * fmt_params.sectors_per_fat),
    12341231         fmt_params.bytes_per_sector,
    1235          tmp_sec);
     1232         fmt_params.sec);
    12361233    }
    12371234  }
     
    12501247  }
    12511248
     1249  free(fmt_params.sec);
     1250
    12521251  return ret_val;
    12531252}
Note: See TracChangeset for help on using the changeset viewer.