+
+ ef->uid = get_int_option(options, "uid", 10, geteuid());
+ ef->gid = get_int_option(options, "gid", 10, getegid());
+
+ ef->noatime = match_option(options, "noatime");
+}
+
+static int verify_vbr_checksum(struct exfat_dev* dev, void* sector,
+ off_t sector_size)
+{
+ uint32_t vbr_checksum;
+ int i;
+
+ exfat_pread(dev, sector, sector_size, 0);
+ vbr_checksum = exfat_vbr_start_checksum(sector, sector_size);
+ for (i = 1; i < 11; i++)
+ {
+ exfat_pread(dev, sector, sector_size, i * sector_size);
+ vbr_checksum = exfat_vbr_add_checksum(sector, sector_size,
+ vbr_checksum);
+ }
+ exfat_pread(dev, sector, sector_size, i * sector_size);
+ for (i = 0; i < sector_size / sizeof(vbr_checksum); i++)
+ if (le32_to_cpu(((const le32_t*) sector)[i]) != vbr_checksum)
+ {
+ exfat_error("invalid VBR checksum 0x%x (expected 0x%x)",
+ le32_to_cpu(((const le32_t*) sector)[i]), vbr_checksum);
+ return 1;
+ }
+ return 0;
+}
+
+static int commit_super_block(const struct exfat* ef)
+{
+ exfat_pwrite(ef->dev, ef->sb, sizeof(struct exfat_super_block), 0);
+ return exfat_fsync(ef->dev);
+}
+
+static int prepare_super_block(const struct exfat* ef)
+{
+ if (le16_to_cpu(ef->sb->volume_state) & EXFAT_STATE_MOUNTED)
+ exfat_warn("volume was not unmounted cleanly");
+
+ if (ef->ro)
+ return 0;
+
+ ef->sb->volume_state = cpu_to_le16(
+ le16_to_cpu(ef->sb->volume_state) | EXFAT_STATE_MOUNTED);
+ return commit_super_block(ef);