/*FUNCTION*------------------------------------------------------------------- * * Function Name : MFS_Read_data_sector * Returned Value : error_code * Comments : * Readsone sector into the DATA_SECTOR buffer *END*---------------------------------------------------------------------*/ _mfs_error MFS_Read_data_sector ( MFS_DRIVE_STRUCT_PTR drive_ptr, MFS_HANDLE_PTR handle, /*[IN] handle of the file for which we are doing the read/write */ uint_32 sector_number, /*[IN] sector number to read/write from/to file system medium */ boolean hw_read /*[IN] if read of a sector is needed or just validation of a new one */ ) { _mfs_error error; error = MFS_NO_ERROR; if ( sector_number != drive_ptr->DATA_SECTOR_NUMBER ) { MFS_Flush_data_sector_buffer(drive_ptr); MFS_Invalidate_data_sector(drive_ptr); if (hw_read) { error = MFS_Read_device_sector(drive_ptr,sector_number,drive_ptr->DATA_SECTOR_PTR); } else { error = MFS_NO_ERROR; } if ( error == MFS_NO_ERROR ) { drive_ptr->DATA_SECTOR_NUMBER = sector_number; } } return(error); }
_mfs_error MFS_Release_chain ( MFS_DRIVE_STRUCT_PTR drive_ptr, /*[IN] the drive on which to operate */ uint_32 cluster_number /*[IN] first cluster number to release */ ) { uint_32 next_cluster,first_sector_in_cluster,last_sector_in_cluster; _mfs_error error_code; #if MFSCFG_READ_ONLY_CHECK if (MFS_is_read_only (NULL, drive_ptr)) { return MFS_DISK_IS_WRITE_PROTECTED; } #endif if ( (cluster_number >= CLUSTER_MIN_GOOD) && (cluster_number <= drive_ptr->LAST_CLUSTER) ) { do { error_code = MFS_get_cluster_from_fat(drive_ptr,cluster_number,&next_cluster); if ( error_code != MFS_NO_ERROR ) { break; } else if ( ((next_cluster > drive_ptr->LAST_CLUSTER) || (next_cluster < CLUSTER_MIN_GOOD)) && (next_cluster != CLUSTER_EOF) ) { error_code = MFS_LOST_CHAIN; break; } first_sector_in_cluster = CLUSTER_TO_SECTOR(cluster_number); last_sector_in_cluster = first_sector_in_cluster+ drive_ptr->BPB.SECTORS_PER_CLUSTER -1; // Check to see if the currently cached data sector is being deleted. if ( (drive_ptr->DATA_SECTOR_NUMBER >= first_sector_in_cluster) && (drive_ptr->DATA_SECTOR_NUMBER <= last_sector_in_cluster) ) { error_code = MFS_Invalidate_data_sector(drive_ptr); if ( error_code != MFS_NO_ERROR ) { return error_code; } } error_code = MFS_Put_fat(drive_ptr,cluster_number, CLUSTER_UNUSED); if ( error_code ) { break; } cluster_number = next_cluster; } while ( cluster_number != CLUSTER_EOF ); error_code = MFS_Write_back_fat(drive_ptr); } else { error_code = MFS_NO_ERROR; } return(error_code); }