Changeset c38f1fcf in rtems


Ignore:
Timestamp:
Mar 13, 2017, 2:20:20 PM (2 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
4.11
Children:
201f3797
Parents:
21d7154b
git-author:
Sebastian Huber <sebastian.huber@…> (03/13/17 14:20:20)
git-committer:
Sebastian Huber <sebastian.huber@…> (03/21/17 15:14:44)
Message:

dosfs: Fix fat_file_write()

Remove forced overwrite which leads to file data corruption. The logic
to determine a forced overwrite was fundamentally broken. For simplity,
disable this feature.

Close #2622.

Files:
4 added
6 edited

Legend:

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

    r21d7154b rc38f1fcf  
    201201
    202202static ssize_t
    203  fat_block_write(
     203fat_block_write(
    204204    fat_fs_info_t                        *fs_info,
    205205    const uint32_t                        start_blk,
    206206    const uint32_t                        offset,
    207207    const uint32_t                        count,
    208     const void                           *buf,
    209     const bool                            overwrite_block)
     208    const void                           *buf)
    210209{
    211210    int                 rc             = RC_OK;
     
    216215    if (0 < bytes_to_write)
    217216    {
    218         if (   overwrite_block
    219             || (bytes_to_write == fs_info->vol.bytes_per_block))
     217        if (bytes_to_write == fs_info->vol.bytes_per_block)
    220218        {
    221219            rc = fat_buf_access(fs_info, sec_num, FAT_OP_TYPE_GET, &blk_buf);
     
    400398 *     count              - count of bytes to write
    401399 *     buff               - buffer provided by user
    402  *     overwrite_cluster  - true if cluster can get overwritten, false if cluster content must be kept
    403400 *
    404401 * RETURNS:
     
    412409    const uint32_t                        offset,
    413410    const uint32_t                        count,
    414     const void                           *buff,
    415     const bool                            overwrite_cluster)
     411    const void                           *buff)
    416412{
    417413    ssize_t             rc               = RC_OK;
     
    437433          ofs_blk,
    438434          c,
    439           &buffer[bytes_written],
    440           overwrite_cluster);
     435          &buffer[bytes_written]);
    441436      if (c != ret)
    442437        rc = -1;
  • cpukit/libfs/src/dosfs/fat.h

    r21d7154b rc38f1fcf  
    512512                    uint32_t                          offset,
    513513                    uint32_t                          count,
    514                     const void                       *buff,
    515                     bool                              overwrite_cluster);
     514                    const void                       *buff);
    516515
    517516ssize_t
  • cpukit/libfs/src/dosfs/fat_file.c

    r21d7154b rc38f1fcf  
    404404 *     count            - count
    405405 *     buf              - buffer provided by user
    406  *     file_cln_initial - initial current cluster number of the file
    407406 *
    408407 * RETURNS:
     
    411410 */
    412411static ssize_t
    413  fat_file_write_fat32_or_non_root_dir(
     412fat_file_write_fat32_or_non_root_dir(
    414413     fat_fs_info_t                        *fs_info,
    415414     fat_file_fd_t                        *fat_fd,
    416415     const uint32_t                        start,
    417416     const uint32_t                        count,
    418      const uint8_t                        *buf,
    419      const uint32_t                        file_cln_initial)
     417     const uint8_t                        *buf)
    420418{
    421419    int            rc = RC_OK;
     
    427425    uint32_t       ofs_cln_save = ofs_cln;
    428426    uint32_t       bytes_to_write = count;
    429     uint32_t       file_cln_cnt;
    430427    ssize_t        ret;
    431428    uint32_t       c;
    432     bool           overwrite_cluster = false;
    433429
    434430    rc = fat_file_lseek(fs_info, fat_fd, start_cln, &cur_cln);
    435431    if (RC_OK == rc)
    436432    {
    437         file_cln_cnt = cur_cln - fat_fd->cln;
    438433        while (   (RC_OK == rc)
    439434               && (bytes_to_write > 0))
    440435        {
    441436            c = MIN(bytes_to_write, (fs_info->vol.bpc - ofs_cln));
    442 
    443             if (file_cln_initial < file_cln_cnt)
    444                 overwrite_cluster = true;
    445437
    446438            ret = fat_cluster_write(fs_info,
     
    448440                                      ofs_cln,
    449441                                      c,
    450                                       &buf[cmpltd],
    451                                       overwrite_cluster);
     442                                      &buf[cmpltd]);
    452443            if (0 > ret)
    453444              rc = -1;
     
    455446            if (RC_OK == rc)
    456447            {
    457                 ++file_cln_cnt;
    458448                bytes_to_write -= ret;
    459449                cmpltd += ret;
     
    510500    uint32_t       c = 0;
    511501    bool           zero_fill = start > fat_fd->fat_file_size;
    512     uint32_t       file_cln_initial = fat_fd->map.file_cln;
    513502    uint32_t       cln;
    514503
     
    544533                                      byte,
    545534                                      count,
    546                                       buf,
    547                                       false);
     535                                      buf);
    548536            if (0 > ret)
    549537              rc = -1;
     
    557545                                                       start,
    558546                                                       count,
    559                                                        buf,
    560                                                        file_cln_initial);
     547                                                       buf);
    561548            if (0 > ret)
    562549              rc = -1;
  • testsuites/fstests/Makefile.am

    r21d7154b rc38f1fcf  
    66_SUBDIRS += fsimfsconfig01
    77_SUBDIRS += fsdosfsname01
     8_SUBDIRS += fsdosfsname02
    89_SUBDIRS += fsdosfswrite01
    910_SUBDIRS += fsdosfsformat01
  • testsuites/fstests/configure.ac

    r21d7154b rc38f1fcf  
    8282fsimfsconfig01/Makefile
    8383fsdosfsname01/Makefile
     84fsdosfsname02/Makefile
    8485fsdosfswrite01/Makefile
    8586fsdosfsformat01/Makefile
  • testsuites/fstests/fsdosfswrite01/init.c

    r21d7154b rc38f1fcf  
    126126  const char *file_name )
    127127{
    128   static const rtems_blkdev_stats complete_block_stats = {
     128  static const rtems_blkdev_stats complete_existing_block_stats = {
    129129    .read_hits            = 0,
    130130    .read_misses          = 0,
     
    136136    .write_errors         = 0
    137137  };
    138   static const rtems_blkdev_stats new_block_stats = {
    139     .read_hits            = 8,
     138  static const rtems_blkdev_stats complete_new_block_stats = {
     139    .read_hits            = 3,
    140140    .read_misses          = 2,
    141141    .read_ahead_transfers = 0,
     
    143143    .read_errors          = 0,
    144144    .write_transfers      = 1,
    145     .write_blocks         = 4,
     145    .write_blocks         = 3,
     146    .write_errors         = 0
     147  };
     148  static const rtems_blkdev_stats partial_new_block_stats = {
     149    .read_hits            = 3,
     150    .read_misses          = 3,
     151    .read_ahead_transfers = 0,
     152    .read_blocks          = 3,
     153    .read_errors          = 0,
     154    .write_transfers      = 1,
     155    .write_blocks         = 3,
    146156    .write_errors         = 0
    147157  };
     
    175185  rtems_test_assert( (ssize_t) cluster_size == num_bytes );
    176186
    177   check_block_stats( dev_name, mount_dir, &complete_block_stats );
     187  check_block_stats( dev_name, mount_dir, &complete_existing_block_stats );
    178188  reset_block_stats( dev_name, mount_dir );
    179189
     190  /* Write a complete cluster into a new file space */
    180191  num_bytes = write( fd, cluster_buf, cluster_size );
    181192  rtems_test_assert( (ssize_t) cluster_size == num_bytes );
     193
     194  check_block_stats( dev_name, mount_dir, &complete_new_block_stats );
     195  reset_block_stats( dev_name, mount_dir );
    182196
    183197  /* Write a new partial cluster into a new file space */
     
    185199  rtems_test_assert( num_bytes == 1 );
    186200
    187   check_block_stats( dev_name, mount_dir, &new_block_stats );
     201  check_block_stats( dev_name, mount_dir, &partial_new_block_stats );
    188202
    189203  rv = close( fd );
Note: See TracChangeset for help on using the changeset viewer.