Changes in uspace/srv/fs/fat/fat_fat.c [7efc517:3a8faba] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/fat/fat_fat.c
r7efc517 r3a8faba 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 … … 247 247 */ 248 248 int 249 fat_get_cluster(fat_bs_t *bs, dev_handle_t dev_handle, unsigned fatno,250 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) 251 251 { 252 252 block_t *b; 253 253 uint16_t bps; 254 254 uint16_t rscnt; 255 uint16_t sf;256 255 fat_cluster_t *cp; 257 256 int rc; … … 259 258 bps = uint16_t_le2host(bs->bps); 260 259 rscnt = uint16_t_le2host(bs->rscnt); 261 sf = uint16_t_le2host(bs->sec_per_fat); 262 263 rc = block_get(&b, dev_handle, rscnt + sf * fatno + 260 261 rc = block_get(&b, dev_handle, rscnt + 264 262 (clst * sizeof(fat_cluster_t)) / bps, BLOCK_FLAGS_NONE); 265 263 if (rc != EOK) … … 400 398 * from the size of the file allocation table. 401 399 */ 402 if ((cl >= 2) && ((cl - 2) * bs->spc + ssa >= ts)) {400 if ((cl - 2) * bs->spc + ssa >= ts) { 403 401 rc = block_put(blk); 404 402 if (rc != EOK) … … 482 480 while (firstc < FAT_CLST_LAST1) { 483 481 assert(firstc >= FAT_CLST_FIRST && firstc < FAT_CLST_BAD); 484 rc = fat_get_cluster(bs, dev_handle, FAT1,firstc, &nextc);482 rc = fat_get_cluster(bs, dev_handle, firstc, &nextc); 485 483 if (rc != EOK) 486 484 return rc; … … 562 560 unsigned fatno; 563 561 564 rc = fat_get_cluster(bs, dev_handle, FAT1,lastc, &nextc);562 rc = fat_get_cluster(bs, dev_handle, lastc, &nextc); 565 563 if (rc != EOK) 566 564 return rc; … … 608 606 } 609 607 610 /** Perform basic sanity checks on the file system.611 *612 * Verify if values of boot sector fields are sane. Also verify media613 * descriptor. This is used to rule out cases when a device obviously614 * does not contain a fat file system.615 */616 int fat_sanity_check(fat_bs_t *bs, dev_handle_t dev_handle)617 {618 fat_cluster_t e0, e1;619 unsigned fat_no;620 int rc;621 622 /* Check number of FATs. */623 if (bs->fatcnt == 0)624 return ENOTSUP;625 626 /* Check total number of sectors. */627 628 if (bs->totsec16 == 0 && bs->totsec32 == 0)629 return ENOTSUP;630 631 if (bs->totsec16 != 0 && bs->totsec32 != 0 &&632 bs->totsec16 != bs->totsec32)633 return ENOTSUP;634 635 /* Check media descriptor. Must be between 0xf0 and 0xff. */636 if ((bs->mdesc & 0xf0) != 0xf0)637 return ENOTSUP;638 639 /* Check number of sectors per FAT. */640 if (bs->sec_per_fat == 0)641 return ENOTSUP;642 643 /*644 * Check that the root directory entries take up whole blocks.645 * This check is rather strict, but it allows us to treat the root646 * directory and non-root directories uniformly in some places.647 * It can be removed provided that functions such as fat_read() are648 * sanitized to support file systems with this property.649 */650 if ((uint16_t_le2host(bs->root_ent_max) * sizeof(fat_dentry_t)) %651 uint16_t_le2host(bs->bps) != 0)652 return ENOTSUP;653 654 /* Check signature of each FAT. */655 656 for (fat_no = 0; fat_no < bs->fatcnt; fat_no++) {657 rc = fat_get_cluster(bs, dev_handle, fat_no, 0, &e0);658 if (rc != EOK)659 return EIO;660 661 rc = fat_get_cluster(bs, dev_handle, fat_no, 1, &e1);662 if (rc != EOK)663 return EIO;664 665 /* Check that first byte of FAT contains the media descriptor. */666 if ((e0 & 0xff) != bs->mdesc)667 return ENOTSUP;668 669 /*670 * Check that remaining bits of the first two entries are671 * set to one.672 */673 if ((e0 >> 8) != 0xff || e1 != 0xffff)674 return ENOTSUP;675 }676 677 return EOK;678 }679 680 608 /** 681 609 * @}
Note:
See TracChangeset
for help on using the changeset viewer.