static int dump_full(const char* spec, bool used_sectors) { struct exfat ef; uint32_t free_clusters; uint64_t free_sectors; if (exfat_mount(&ef, spec, "ro") != 0) return 1; free_clusters = exfat_count_free_clusters(&ef); free_sectors = (uint64_t) free_clusters << ef.sb->spc_bits; printf("Volume label %15s\n", exfat_get_label(&ef)); print_generic_info(ef.sb); print_sector_info(ef.sb); printf("Free sectors %10"PRIu64"\n", free_sectors); print_cluster_info(ef.sb); printf("Free clusters %10u\n", free_clusters); print_other_info(ef.sb); if (used_sectors) dump_sectors(&ef); exfat_unmount(&ef); return 0; }
static int fuse_exfat_statfs(const char* path, struct statvfs* sfs) { exfat_debug("[%s]", __func__); sfs->f_bsize = CLUSTER_SIZE(*ef.sb); sfs->f_frsize = CLUSTER_SIZE(*ef.sb); sfs->f_blocks = le64_to_cpu(ef.sb->sector_count) >> ef.sb->spc_bits; sfs->f_bavail = exfat_count_free_clusters(&ef); sfs->f_bfree = sfs->f_bavail; sfs->f_namemax = EXFAT_NAME_MAX; /* Below are fake values because in exFAT there is a) no simple way to count files; b) no such thing as inode; So here we assume that inode = cluster. */ sfs->f_files = le32_to_cpu(ef.sb->cluster_count); sfs->f_favail = sfs->f_bfree >> ef.sb->spc_bits; sfs->f_ffree = sfs->f_bavail; #if defined(__AROS__) || defined(AMIGA) /* flags */ sfs->f_flag = 0; if (ef.ro) sfs->f_flag |= ST_RDONLY; #endif return 0; }
void read_super_blocks(char* device, file_system_info* fs_info) { struct exfat_super_block* sb; uint64_t free_sectors, free_clusters; fs_open(device); free_clusters = exfat_count_free_clusters(&ef); free_sectors = (uint64_t) free_clusters << ef.sb->spc_bits; sb = ef.sb; strncpy(fs_info->fs, exfat_MAGIC, FS_MAGIC_SIZE); fs_info->block_size = EXFAT_SECTOR_SIZE(*sb); fs_info->totalblock = le64_to_cpu(sb->sector_count); fs_info->usedblocks = le64_to_cpu(sb->sector_count) - free_sectors; fs_info->device_size = fs_info->totalblock * fs_info->block_size; fs_close(); }
static void finalize_super_block(struct exfat* ef) { if (ef->ro) return; ef->sb->volume_state = cpu_to_le16( le16_to_cpu(ef->sb->volume_state) & ~EXFAT_STATE_MOUNTED); /* Some implementations set the percentage of allocated space to 0xff on FS creation and never update it. In this case leave it as is. */ if (ef->sb->allocated_percent != 0xff) { uint32_t free, total; free = exfat_count_free_clusters(ef); total = le32_to_cpu(ef->sb->cluster_count); ef->sb->allocated_percent = ((total - free) * 100 + total / 2) / total; } commit_super_block(ef); /* ignore return code */ }
static int fuse_exfat_statfs(const char* path, struct statvfs* sfs) { exfat_debug("[%s]", __func__); sfs->f_bsize = CLUSTER_SIZE(*ef.sb); sfs->f_frsize = CLUSTER_SIZE(*ef.sb); sfs->f_blocks = le64_to_cpu(ef.sb->sector_count) >> ef.sb->spc_bits; sfs->f_bavail = exfat_count_free_clusters(&ef); sfs->f_bfree = sfs->f_bavail; sfs->f_namemax = EXFAT_NAME_MAX; /* Below are fake values because in exFAT there is a) no simple way to count files; b) no such thing as inode; So here we assume that inode = cluster. */ sfs->f_files = (sfs->f_blocks - sfs->f_bfree) >> ef.sb->spc_bits; sfs->f_favail = sfs->f_bfree >> ef.sb->spc_bits; sfs->f_ffree = sfs->f_bavail; return 0; }
static void fsck(struct exfat* ef) { exfat_print_info(ef->sb, exfat_count_free_clusters(ef)); dirck(ef, ""); }