#pragma once // FAT12, FAT16 and FAT32, with VFAT long names: the filesystem every other // operating system can read, which is the whole reason to have it. A USB // stick, an EFI system partition, an SD card. See kernel/fs/fat/fat.c. // // Mounted the way Linux mounts it -- `mount -t vfat /dev/usb0p1 /mnt` -- and // "msdos" and "fat" are accepted as the same thing. // Filesystem device numbers for mounted FAT volumes. Like SCHFS_DEV, runtime // identities for the inode cache that nothing on disk records. #define FAT_VOL_SLOTS 4 #define FAT_DEV 104 #define FAT_IS_DEV(d) ((d) >= FAT_DEV && (d) < FAT_DEV + FAT_VOL_SLOTS) // The root directory's inode number on every FAT volume. #define FAT_ROOT_INO 1 // Mount the FAT volume on block device `bdev`. Returns its filesystem device // number, or a negative errno: -ENODEV for no FAT there, -EBUSY for no free // slot or already mounted. int fat_kmount(uint bdev, int readonly); // Flush it, mark it cleanly unmounted, and let it go. int fat_kumount(uint dev); int fat_readonly(uint dev); // Write out everything dirty on every mounted volume. `final` also marks each // one clean, for a shutdown that will not get to unmount them. void fat_ksync_all(int final); // Cluster size, clusters and free clusters, for statfs. -1 if not FAT. int fat_kstatfs(uint dev, uint64 *bsize, uint64 *total, uint64 *freec);