Ticket #828: msdos_misc.patch

File msdos_misc.patch, 6.8 KB (added by snob, on 12/03/06 at 13:31:12)

msdos_misc.patch

  • msdos_misc.

    old new  
    690690    rtems_boolean                        *ret_val
    691691    )
    692692{
     693    rtems_status_code sc = RTEMS_SUCCESSFUL;
    693694    ssize_t          ret = 0;
    694695    msdos_fs_info_t *fs_info = mt_entry->fs_info;
    695696    uint32_t         j = 0, i = 0;
     
    697698    /* dir is not empty */
    698699    *ret_val = FALSE;
    699700
     701    sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
     702                                MSDOS_VOLUME_SEMAPHORE_TIMEOUT);
     703    if (sc != RTEMS_SUCCESSFUL)
     704      set_errno_and_return_minus_one( EIO );
     705
    700706    while ((ret = fat_file_read(mt_entry, fat_fd, j * fs_info->fat.vol.bps,
    701707                                  fs_info->fat.vol.bps,
    702708                                  fs_info->cl_buf)) != FAT_EOF)
    703709    {
    704710        if (ret < MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
     711        {
     712            rtems_semaphore_release(fs_info->vol_sema);
    705713            return -1;
     714        }
    706715
    707716        assert(ret == fs_info->fat.vol.bps);
    708717
     
    723732            if ((*MSDOS_DIR_NAME(fs_info->cl_buf + i)) ==
    724733                MSDOS_THIS_DIR_ENTRY_AND_REST_EMPTY)
    725734            {
     735                rtems_semaphore_release(fs_info->vol_sema);
    726736                *ret_val = TRUE;
    727737                return RC_OK;
    728738            }
     739            rtems_semaphore_release(fs_info->vol_sema);
    729740            return RC_OK;
    730741        }
    731742        j++;
    732743    }
    733744    *ret_val = TRUE;
     745    rtems_semaphore_release(fs_info->vol_sema);
    734746    return RC_OK;
    735747}
    736748
     
    771783    char                                 *name_dir_entry
    772784    )
    773785{
     786    rtems_status_code sc = RTEMS_SUCCESSFUL;
    774787    msdos_status_t   rc = RC_OK;
    775788    ssize_t          ret = 0;
    776789    msdos_fs_info_t *fs_info = mt_entry->fs_info;
     
    783796    else
    784797        bts2rd = fs_info->fat.vol.bpc;
    785798
     799    sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
     800                                MSDOS_VOLUME_SEMAPHORE_TIMEOUT);
     801    if (sc != RTEMS_SUCCESSFUL)
     802      set_errno_and_return_minus_one( EIO );
     803
    786804    while ((ret = fat_file_read(mt_entry, fat_fd, (j * bts2rd), bts2rd,
    787805                                fs_info->cl_buf)) != FAT_EOF)
    788806    {
    789807        if (ret < MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
     808        {
     809            rtems_semaphore_release(fs_info->vol_sema);
    790810            set_errno_and_return_minus_one(EIO);
     811        }
    791812
    792813        assert(ret == bts2rd);
    793814
     
    807828                    rc = fat_file_ioctl(mt_entry, fat_fd, F_CLU_NUM,
    808829                                        j * bts2rd, &paux->cln);
    809830                    if (rc != RC_OK)
     831                    {
     832                        rtems_semaphore_release(fs_info->vol_sema);
    810833                        return rc;
     834                    }
    811835
    812836                    /* offset is computed in bytes */
    813837                    paux->ofs = i;
     
    817841                                         MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE,
    818842                                         (uint8_t *)name_dir_entry);
    819843                    if (ret != MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
     844                    {
     845                        rtems_semaphore_release(fs_info->vol_sema);
    820846                        return -1;
     847                    }
    821848
    822849                    /*
    823850                     * we don't update fat_file_size here - it should not
    824851                     * increase
    825852                     */
     853                    rtems_semaphore_release(fs_info->vol_sema);
    826854                    return RC_OK;
    827855                }
    828856
     
    832860                 */
    833861                if (((*MSDOS_DIR_NAME(fs_info->cl_buf + i)) ==
    834862                     MSDOS_THIS_DIR_ENTRY_AND_REST_EMPTY))
     863                {
     864                    rtems_semaphore_release(fs_info->vol_sema);
    835865                    return MSDOS_NAME_NOT_FOUND_ERR;
    836866            }
     867            }
    837868            else
    838869            {
    839870                /* entry not empty and name != NULL -> compare names */
     
    849880                        rc = fat_file_ioctl(mt_entry, fat_fd, F_CLU_NUM,
    850881                                            j * bts2rd, &paux->cln);
    851882                        if (rc != RC_OK)
     883                        {
     884                            rtems_semaphore_release(fs_info->vol_sema);
    852885                            return rc;
     886                        }
    853887
    854888                        /* offset is computed in bytes */
    855889                        paux->ofs = i;
    856890                        memcpy(name_dir_entry,(fs_info->cl_buf + i),
    857891                               MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
     892                        rtems_semaphore_release(fs_info->vol_sema);
    858893                        return RC_OK;
    859894                    }
    860895                }
     
    862897        }
    863898        j++;
    864899    }
     900    rtems_semaphore_release(fs_info->vol_sema);
    865901    return MSDOS_NAME_NOT_FOUND_ERR;
    866902}
    867903
     
    889925    char                                 *dir_entry
    890926    )
    891927{
     928    rtems_status_code sc = RTEMS_SUCCESSFUL;
    892929    msdos_status_t   rc = RC_OK;
    893930    ssize_t          ret = 0;
    894931    msdos_fs_info_t *fs_info = mt_entry->fs_info;
     
    901938    else
    902939        bts2rd = fs_info->fat.vol.bpc;
    903940
     941    sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
     942                                MSDOS_VOLUME_SEMAPHORE_TIMEOUT);
     943    if (sc != RTEMS_SUCCESSFUL)
     944      set_errno_and_return_minus_one( EIO );
     945
    904946    while ((ret = fat_file_read(mt_entry, fat_fd, j * bts2rd, bts2rd,
    905947                                  fs_info->cl_buf)) != FAT_EOF)
    906948    {
    907949        if ( ret < MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE )
     950        {
     951            rtems_semaphore_release(fs_info->vol_sema);
    908952            set_errno_and_return_minus_one( EIO );
     953        }
    909954
    910955        assert(ret == bts2rd);
    911956
     
    914959            /* if this and all rest entries are empty - return not-found */
    915960            if ((*MSDOS_DIR_NAME(fs_info->cl_buf + i)) ==
    916961                MSDOS_THIS_DIR_ENTRY_AND_REST_EMPTY)
     962            {
     963                rtems_semaphore_release(fs_info->vol_sema);
    917964                return MSDOS_NAME_NOT_FOUND_ERR;
     965            }
    918966
    919967            /* have to look at the DIR_NAME as "raw" 8-bit data */
    920968            /* if this entry is empty - skip it */
     
    929977                rc = fat_file_ioctl(mt_entry, fat_fd, F_CLU_NUM, j * bts2rd,
    930978                                    &paux->cln);
    931979                if (rc != RC_OK)
     980                {
     981                    rtems_semaphore_release(fs_info->vol_sema);
    932982                    return rc;
     983                }
    933984
    934985                paux->ofs = i;
    935986                memcpy(dir_entry, fs_info->cl_buf + i,
    936987                       MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
     988                rtems_semaphore_release(fs_info->vol_sema);
    937989                return RC_OK;
    938990            }
    939991        }
    940992        j++;
    941993    }
     994    rtems_semaphore_release(fs_info->vol_sema);
    942995    return MSDOS_NAME_NOT_FOUND_ERR;
    943996}