Rev 3521 | Rev 3550 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3521 | Rev 3542 | ||
|---|---|---|---|
| Line 93... | Line 93... | ||
| 93 | ssa = rscnt + fatcnt * sf + rds; |
93 | ssa = rscnt + fatcnt * sf + rds; |
| 94 | 94 | ||
| 95 | if (firstc == FAT_CLST_ROOT) { |
95 | if (firstc == FAT_CLST_ROOT) { |
| 96 | /* root directory special case */ |
96 | /* root directory special case */ |
| 97 | assert(offset < rds); |
97 | assert(offset < rds); |
| 98 | b = block_get(dev_handle, rscnt + fatcnt * sf + offset, bps); |
98 | b = block_get(dev_handle, rscnt + fatcnt * sf + offset); |
| 99 | return b; |
99 | return b; |
| 100 | } |
100 | } |
| 101 | 101 | ||
| 102 | clusters = offset / spc; |
102 | clusters = offset / spc; |
| 103 | for (i = 0; i < clusters; i++) { |
103 | for (i = 0; i < clusters; i++) { |
| Line 106... | Line 106... | ||
| 106 | 106 | ||
| 107 | assert(clst >= FAT_CLST_FIRST && clst < FAT_CLST_BAD); |
107 | assert(clst >= FAT_CLST_FIRST && clst < FAT_CLST_BAD); |
| 108 | fsec = (clst * sizeof(fat_cluster_t)) / bps; |
108 | fsec = (clst * sizeof(fat_cluster_t)) / bps; |
| 109 | fidx = clst % (bps / sizeof(fat_cluster_t)); |
109 | fidx = clst % (bps / sizeof(fat_cluster_t)); |
| 110 | /* read FAT1 */ |
110 | /* read FAT1 */ |
| 111 | b = block_get(dev_handle, rscnt + fsec, bps); |
111 | b = block_get(dev_handle, rscnt + fsec); |
| 112 | clst = uint16_t_le2host(((fat_cluster_t *)b->data)[fidx]); |
112 | clst = uint16_t_le2host(((fat_cluster_t *)b->data)[fidx]); |
| 113 | assert(clst != FAT_CLST_BAD); |
113 | assert(clst != FAT_CLST_BAD); |
| 114 | assert(clst < FAT_CLST_LAST1); |
114 | assert(clst < FAT_CLST_LAST1); |
| 115 | block_put(b); |
115 | block_put(b); |
| 116 | } |
116 | } |
| 117 | 117 | ||
| 118 | b = block_get(dev_handle, ssa + (clst - FAT_CLST_FIRST) * spc + |
118 | b = block_get(dev_handle, ssa + (clst - FAT_CLST_FIRST) * spc + |
| 119 | offset % spc, bps); |
119 | offset % spc); |
| 120 | 120 | ||
| 121 | return b; |
121 | return b; |
| 122 | } |
122 | } |
| 123 | 123 | ||
| 124 | /** Return number of blocks allocated to a file. |
124 | /** Return number of blocks allocated to a file. |
| Line 161... | Line 161... | ||
| 161 | if (lastc) |
161 | if (lastc) |
| 162 | *lastc = clst; /* remember the last cluster */ |
162 | *lastc = clst; /* remember the last cluster */ |
| 163 | fsec = (clst * sizeof(fat_cluster_t)) / bps; |
163 | fsec = (clst * sizeof(fat_cluster_t)) / bps; |
| 164 | fidx = clst % (bps / sizeof(fat_cluster_t)); |
164 | fidx = clst % (bps / sizeof(fat_cluster_t)); |
| 165 | /* read FAT1 */ |
165 | /* read FAT1 */ |
| 166 | b = block_get(dev_handle, rscnt + fsec, bps); |
166 | b = block_get(dev_handle, rscnt + fsec); |
| 167 | clst = uint16_t_le2host(((fat_cluster_t *)b->data)[fidx]); |
167 | clst = uint16_t_le2host(((fat_cluster_t *)b->data)[fidx]); |
| 168 | assert(clst != FAT_CLST_BAD); |
168 | assert(clst != FAT_CLST_BAD); |
| 169 | block_put(b); |
169 | block_put(b); |
| 170 | clusters++; |
170 | clusters++; |
| 171 | } |
171 | } |
| Line 241... | Line 241... | ||
| 241 | rscnt = uint16_t_le2host(bs->rscnt); |
241 | rscnt = uint16_t_le2host(bs->rscnt); |
| 242 | sf = uint16_t_le2host(bs->sec_per_fat); |
242 | sf = uint16_t_le2host(bs->sec_per_fat); |
| 243 | 243 | ||
| 244 | assert(fatno < bs->fatcnt); |
244 | assert(fatno < bs->fatcnt); |
| 245 | b = block_get(dev_handle, rscnt + sf * fatno + |
245 | b = block_get(dev_handle, rscnt + sf * fatno + |
| 246 | (clst * sizeof(fat_cluster_t)) / bps, bps); |
246 | (clst * sizeof(fat_cluster_t)) / bps); |
| 247 | cp = (fat_cluster_t *)b->data + clst % (bps / sizeof(fat_cluster_t)); |
247 | cp = (fat_cluster_t *)b->data + clst % (bps / sizeof(fat_cluster_t)); |
| 248 | *cp = host2uint16_t_le(value); |
248 | *cp = host2uint16_t_le(value); |
| 249 | b->dirty = true; /* need to sync block */ |
249 | b->dirty = true; /* need to sync block */ |
| 250 | block_put(b); |
250 | block_put(b); |
| 251 | } |
251 | } |
| Line 311... | Line 311... | ||
| 311 | /* |
311 | /* |
| 312 | * Search FAT1 for unused clusters. |
312 | * Search FAT1 for unused clusters. |
| 313 | */ |
313 | */ |
| 314 | futex_down(&fat_alloc_lock); |
314 | futex_down(&fat_alloc_lock); |
| 315 | for (b = 0, cl = 0; b < sf; blk++) { |
315 | for (b = 0, cl = 0; b < sf; blk++) { |
| 316 | blk = block_get(dev_handle, rscnt + b, bps); |
316 | blk = block_get(dev_handle, rscnt + b); |
| 317 | for (c = 0; c < bps / sizeof(fat_cluster_t); c++, cl++) { |
317 | for (c = 0; c < bps / sizeof(fat_cluster_t); c++, cl++) { |
| 318 | fat_cluster_t *clst = (fat_cluster_t *)blk->data + c; |
318 | fat_cluster_t *clst = (fat_cluster_t *)blk->data + c; |
| 319 | if (uint16_t_le2host(*clst) == FAT_CLST_RES0) { |
319 | if (uint16_t_le2host(*clst) == FAT_CLST_RES0) { |
| 320 | /* |
320 | /* |
| 321 | * The cluster is free. Put it into our stack |
321 | * The cluster is free. Put it into our stack |