3 File Allocation Table creation code.
5 Copyright (C) 2009, 2010 Andrew Nayenko
7 This program is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
29 off_t fat_alignment(void)
31 return (off_t) le32_to_cpu(sb.fat_sector_start) * SECTOR_SIZE(sb);
36 return (off_t) le32_to_cpu(sb.fat_sector_count) * SECTOR_SIZE(sb);
39 static cluster_t fat_write_entry(struct exfat_dev* dev, cluster_t cluster,
42 le32_t fat_entry = cpu_to_le32(value);
43 if (exfat_write(dev, &fat_entry, sizeof(fat_entry)) < 0)
48 static cluster_t fat_write_entries(struct exfat_dev* dev, cluster_t cluster,
51 cluster_t end = cluster + DIV_ROUND_UP(length, CLUSTER_SIZE(sb));
53 while (cluster < end - 1)
55 cluster = fat_write_entry(dev, cluster, cluster + 1);
59 return fat_write_entry(dev, cluster, EXFAT_CLUSTER_END);
62 int fat_write(struct exfat_dev* dev, off_t base)
66 if (base != le32_to_cpu(sb.fat_sector_start) * SECTOR_SIZE(sb))
67 exfat_bug("unexpected FAT location: %"PRIu64" (expected %u)",
68 base, le32_to_cpu(sb.fat_sector_start) * SECTOR_SIZE(sb));
70 if (!(c = fat_write_entry(dev, c, 0xfffffff8))) /* media type */
72 if (!(c = fat_write_entry(dev, c, 0xffffffff))) /* some weird constant */
74 if (!(c = fat_write_entries(dev, c, cbm_size())))
76 if (!(c = fat_write_entries(dev, c, uct_size())))
78 if (!(c = fat_write_entries(dev, c, rootdir_size())))