From 5827f7a6526b46bc8ae58be729eb30fbd5d2280e Mon Sep 17 00:00:00 2001 From: resver Date: Sat, 2 Apr 2011 08:28:48 +0000 Subject: [PATCH] Take structures alignment into consideraion while erasing the device. git-svn-id: http://exfat.googlecode.com/svn/trunk@220 60bc1c72-a15a-11de-b98f-4500b42dc123 --- mkfs/main.c | 22 +++++++++++++++------- mkfs/rootdir.c | 7 ++----- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/mkfs/main.c b/mkfs/main.c index 782aa8a..bba8019 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -103,15 +103,23 @@ static int init_sb(off_t volume_size, int sector_bits, int spc_bits, static int erase_device(int fd) { - uint64_t erase_sectors = (uint64_t) - le32_to_cpu(sb.fat_sector_start) + - le32_to_cpu(sb.fat_sector_count) + - DIV_ROUND_UP(cbm_size(), 1 << sb.sector_bits) + - DIV_ROUND_UP(uct_size(), 1 << sb.sector_bits) + - DIV_ROUND_UP(rootdir_size(), 1 << sb.sector_bits); - uint64_t i; + off_t erase_size; + off_t erase_sectors; + off_t i; void* sector; + erase_size = ((uint64_t) + le32_to_cpu(sb.fat_sector_start) + + le32_to_cpu(sb.fat_sector_count)) * SECTOR_SIZE(sb); + erase_size = ROUND_UP(erase_size, cbm_alignment()); + erase_size += cbm_size(); + erase_size = ROUND_UP(erase_size, uct_alignment()); + erase_size += uct_size(); + erase_size = ROUND_UP(erase_size, rootdir_alignment()); + erase_size += rootdir_size(); + + erase_sectors = erase_size / SECTOR_SIZE(sb); + if (lseek(fd, 0, SEEK_SET) == (off_t) -1) { exfat_error("seek failed"); diff --git a/mkfs/rootdir.c b/mkfs/rootdir.c index 28554f6..4a1a361 100644 --- a/mkfs/rootdir.c +++ b/mkfs/rootdir.c @@ -34,17 +34,14 @@ off_t rootdir_size(void) int rootdir_write(off_t base, int fd) { - const struct exfat_entry eod_entry = {EXFAT_ENTRY_EOD}; - if (write(fd, &label_entry, sizeof(struct exfat_entry)) == -1) return 1; if (write(fd, &bitmap_entry, sizeof(struct exfat_entry)) == -1) return 1; if (write(fd, &upcase_entry, sizeof(struct exfat_entry)) == -1) return 1; - if (write(fd, &eod_entry, sizeof(struct exfat_entry)) == -1) - return 1; - + /* No need to write EOD entry because the whole rootdir cluster was + erased by erase_device(). */ sb.rootdir_cluster = cpu_to_le32(OFFSET_TO_CLUSTER(base)); return 0; } -- 2.11.0