@ @ requires \valid(disk_car); @ requires valid_disk(disk_car); @ requires \valid_read(partition); @ requires valid_partition(partition); @ requires \valid(list_search_space); @ requires \separated(disk_car, partition, list_search_space); @ decreases 0; @*/
| 105 | @ decreases 0; |
| 106 | @*/ |
| 107 | static void fat16_remove_used_space(disk_t *disk_car,const partition_t *partition, alloc_data_t *list_search_space, const unsigned int fat_offset, const unsigned int no_of_cluster, const unsigned int start_data, const unsigned int cluster_size, const unsigned int sector_size) |
| 108 | { |
| 109 | unsigned char *buffer; |
| 110 | const uint16_t *p16; |
| 111 | unsigned int prev_cluster; |
| 112 | uint64_t hd_offset=partition->part_offset+(uint64_t)fat_offset*sector_size; |
| 113 | uint64_t start_free=0; |
| 114 | uint64_t end_free=0; |
| 115 | log_trace("fat16_remove_used_space\n"); |
| 116 | buffer=(unsigned char *)MALLOC(sector_size); |
| 117 | p16=(const uint16_t*)buffer; |
| 118 | del_search_space(list_search_space, partition->part_offset, |
| 119 | partition->part_offset + (uint64_t)start_data * sector_size - 1); |
| 120 | for(prev_cluster=2;prev_cluster<=no_of_cluster+1;prev_cluster++) |
| 121 | { |
| 122 | unsigned int offset_o; |
| 123 | offset_o=prev_cluster%(sector_size/2); |
| 124 | if((offset_o==0)||(prev_cluster==2)) |
| 125 | { |
| 126 | if((unsigned)disk_car->pread(disk_car, buffer, sector_size, hd_offset) != sector_size) |
| 127 | { |
| 128 | /* Consider these FAT sectors points to free clusters */ |
| 129 | } |
| 130 | hd_offset+=sector_size; |
| 131 | } |
| 132 | if(le16(p16[offset_o])!=0) |
| 133 | { |
| 134 | /* Not free */ |
| 135 | if(end_free+1==partition->part_offset+(start_data+(uint64_t)(prev_cluster-2)*cluster_size)*sector_size) |
| 136 | end_free+=cluster_size*sector_size; |
| 137 | else |
| 138 | { |
| 139 | if(start_free != end_free) |
| 140 | del_search_space(list_search_space, start_free, end_free); |
| 141 | start_free=partition->part_offset+(start_data+(uint64_t)(prev_cluster-2)*cluster_size)*sector_size; |
| 142 | end_free=start_free+(uint64_t)cluster_size*sector_size-1; |
| 143 | } |
| 144 | } |
| 145 | } |
| 146 | free(buffer); |
| 147 | if(start_free != end_free) |
| 148 | del_search_space(list_search_space, start_free, end_free); |
| 149 | } |
| 150 | |
| 151 | /*@ |
| 152 | @ requires \valid(disk_car); |
no test coverage detected