Changeset 0b9ac3c in mainline for uspace/srv/fs/fat/fat_fat.c
- Timestamp:
- 2010-02-23T19:03:28Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c62d2e1
- Parents:
- 1ccafee (diff), 5e50394 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/fat/fat_fat.c
r1ccafee r0b9ac3c 93 93 94 94 while (clst < FAT_CLST_LAST1 && clusters < max_clusters) { 95 bn_t fsec; /* sector offset relative to FAT1 */95 aoff64_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, bn_t bn, int flags)137 fat_cluster_t firstc, aoff64_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 150 156 bps = uint16_t_le2host(bs->bps); 151 157 rscnt = uint16_t_le2host(bs->rscnt); … … 190 196 * @return EOK on success or a negative error code. 191 197 */ 192 int fat_fill_gap(fat_bs_t *bs, fat_node_t *nodep, fat_cluster_t mcl, off_t pos)198 int fat_fill_gap(fat_bs_t *bs, fat_node_t *nodep, fat_cluster_t mcl, aoff64_t pos) 193 199 { 194 200 uint16_t bps; 195 201 unsigned spc; 196 202 block_t *b; 197 off_t o, boundary;203 aoff64_t o, boundary; 198 204 int rc; 199 205 … … 361 367 uint16_t rscnt; 362 368 uint16_t sf; 363 uint 16_t ts;369 uint32_t ts; 364 370 unsigned rde; 365 371 unsigned rds; … … 379 385 sf = uint16_t_le2host(bs->sec_per_fat); 380 386 rde = uint16_t_le2host(bs->root_ent_max); 381 ts = uint16_t_le2host(bs->totsec16); 387 ts = (uint32_t) uint16_t_le2host(bs->totsec16); 388 if (ts == 0) 389 ts = uint32_t_le2host(bs->totsec32); 382 390 383 391 rds = (sizeof(fat_dentry_t) * rde) / bps; … … 608 616 } 609 617 618 /** Perform basic sanity checks on the file system. 619 * 620 * Verify if values of boot sector fields are sane. Also verify media 621 * descriptor. This is used to rule out cases when a device obviously 622 * 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 root 654 * directory and non-root directories uniformly in some places. 655 * It can be removed provided that functions such as fat_read() are 656 * 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 are 679 * set to one. 680 */ 681 if ((e0 >> 8) != 0xff || e1 != 0xffff) 682 return ENOTSUP; 683 } 684 685 return EOK; 686 } 687 610 688 /** 611 689 * @}
Note:
See TracChangeset
for help on using the changeset viewer.