Changes in uspace/srv/fs/fat/fat_fat.c [ed903174:50f9c3a] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/fat/fat_fat.c
red903174 r50f9c3a 46 46 #include <align.h> 47 47 #include <assert.h> 48 #include <fibril_sync h.h>48 #include <fibril_sync.h> 49 49 #include <mem.h> 50 50 … … 93 93 94 94 while (clst < FAT_CLST_LAST1 && clusters < max_clusters) { 95 aoff64_t fsec; /* sector offset relative to FAT1 */95 bn_t fsec; /* sector offset relative to FAT1 */ 96 96 unsigned fidx; /* FAT1 entry index */ 97 97 … … 135 135 int 136 136 _fat_block_get(block_t **block, fat_bs_t *bs, dev_handle_t dev_handle, 137 fat_cluster_t firstc, aoff64_t bn, int flags)137 fat_cluster_t firstc, bn_t bn, int flags) 138 138 { 139 139 unsigned bps; … … 148 148 int rc; 149 149 150 /*151 * This function can only operate on non-zero length files.152 */153 if (firstc == FAT_CLST_RES0)154 return ELIMIT;155 156 150 bps = uint16_t_le2host(bs->bps); 157 151 rscnt = uint16_t_le2host(bs->rscnt); … … 196 190 * @return EOK on success or a negative error code. 197 191 */ 198 int fat_fill_gap(fat_bs_t *bs, fat_node_t *nodep, fat_cluster_t mcl, aoff64_t pos)192 int fat_fill_gap(fat_bs_t *bs, fat_node_t *nodep, fat_cluster_t mcl, off_t pos) 199 193 { 200 194 uint16_t bps; 201 195 unsigned spc; 202 196 block_t *b; 203 aoff64_t o, boundary;197 off_t o, boundary; 204 198 int rc; 205 199 … … 253 247 */ 254 248 int 255 fat_get_cluster(fat_bs_t *bs, dev_handle_t dev_handle, unsigned fatno,256 fat_cluster_t clst, fat_cluster_t*value)249 fat_get_cluster(fat_bs_t *bs, dev_handle_t dev_handle, fat_cluster_t clst, 250 fat_cluster_t *value) 257 251 { 258 252 block_t *b; 259 253 uint16_t bps; 260 254 uint16_t rscnt; 261 uint16_t sf;262 255 fat_cluster_t *cp; 263 256 int rc; … … 265 258 bps = uint16_t_le2host(bs->bps); 266 259 rscnt = uint16_t_le2host(bs->rscnt); 267 sf = uint16_t_le2host(bs->sec_per_fat); 268 269 rc = block_get(&b, dev_handle, rscnt + sf * fatno + 260 261 rc = block_get(&b, dev_handle, rscnt + 270 262 (clst * sizeof(fat_cluster_t)) / bps, BLOCK_FLAGS_NONE); 271 263 if (rc != EOK) … … 367 359 uint16_t rscnt; 368 360 uint16_t sf; 369 uint 32_t ts;361 uint16_t ts; 370 362 unsigned rde; 371 363 unsigned rds; … … 385 377 sf = uint16_t_le2host(bs->sec_per_fat); 386 378 rde = uint16_t_le2host(bs->root_ent_max); 387 ts = (uint32_t) uint16_t_le2host(bs->totsec16); 388 if (ts == 0) 389 ts = uint32_t_le2host(bs->totsec32); 379 ts = uint16_t_le2host(bs->totsec16); 390 380 391 381 rds = (sizeof(fat_dentry_t) * rde) / bps; … … 490 480 while (firstc < FAT_CLST_LAST1) { 491 481 assert(firstc >= FAT_CLST_FIRST && firstc < FAT_CLST_BAD); 492 rc = fat_get_cluster(bs, dev_handle, FAT1,firstc, &nextc);482 rc = fat_get_cluster(bs, dev_handle, firstc, &nextc); 493 483 if (rc != EOK) 494 484 return rc; … … 570 560 unsigned fatno; 571 561 572 rc = fat_get_cluster(bs, dev_handle, FAT1,lastc, &nextc);562 rc = fat_get_cluster(bs, dev_handle, lastc, &nextc); 573 563 if (rc != EOK) 574 564 return rc; … … 616 606 } 617 607 618 /** Perform basic sanity checks on the file system.619 *620 * Verify if values of boot sector fields are sane. Also verify media621 * descriptor. This is used to rule out cases when a device obviously622 * does not contain a fat file system.623 */624 int fat_sanity_check(fat_bs_t *bs, dev_handle_t dev_handle)625 {626 fat_cluster_t e0, e1;627 unsigned fat_no;628 int rc;629 630 /* Check number of FATs. */631 if (bs->fatcnt == 0)632 return ENOTSUP;633 634 /* Check total number of sectors. */635 636 if (bs->totsec16 == 0 && bs->totsec32 == 0)637 return ENOTSUP;638 639 if (bs->totsec16 != 0 && bs->totsec32 != 0 &&640 bs->totsec16 != bs->totsec32)641 return ENOTSUP;642 643 /* Check media descriptor. Must be between 0xf0 and 0xff. */644 if ((bs->mdesc & 0xf0) != 0xf0)645 return ENOTSUP;646 647 /* Check number of sectors per FAT. */648 if (bs->sec_per_fat == 0)649 return ENOTSUP;650 651 /*652 * Check that the root directory entries take up whole blocks.653 * This check is rather strict, but it allows us to treat the root654 * directory and non-root directories uniformly in some places.655 * It can be removed provided that functions such as fat_read() are656 * sanitized to support file systems with this property.657 */658 if ((uint16_t_le2host(bs->root_ent_max) * sizeof(fat_dentry_t)) %659 uint16_t_le2host(bs->bps) != 0)660 return ENOTSUP;661 662 /* Check signature of each FAT. */663 664 for (fat_no = 0; fat_no < bs->fatcnt; fat_no++) {665 rc = fat_get_cluster(bs, dev_handle, fat_no, 0, &e0);666 if (rc != EOK)667 return EIO;668 669 rc = fat_get_cluster(bs, dev_handle, fat_no, 1, &e1);670 if (rc != EOK)671 return EIO;672 673 /* Check that first byte of FAT contains the media descriptor. */674 if ((e0 & 0xff) != bs->mdesc)675 return ENOTSUP;676 677 /*678 * Check that remaining bits of the first two entries are679 * set to one.680 */681 if ((e0 >> 8) != 0xff || e1 != 0xffff)682 return ENOTSUP;683 }684 685 return EOK;686 }687 688 608 /** 689 609 * @}
Note:
See TracChangeset
for help on using the changeset viewer.