From: Tetsuhiro Kohada <Kohada.Tetsuhiro@dc.MitsubishiElectric.co.jp> To: Kohada.Tetsuhiro@dc.MitsubishiElectric.co.jp Cc: Mori.Takahiro@ab.MitsubishiElectric.co.jp, motai.hirotaka@aj.mitsubishielectric.co.jp, Valdis Kletnieks <valdis.kletnieks@vt.edu>, Greg Kroah-Hartman <gregkh@linuxfoundation.org>, linux-fsdevel@vger.kernel.org, devel@driverdev.osuosl.org, linux-kernel@vger.kernel.org Subject: [PATCH 1/5] staging: exfat: conform 'pbr_sector_t' definition to exFAT specification Date: Wed, 11 Mar 2020 19:52:41 +0900 [thread overview] Message-ID: <20200311105245.125564-1-Kohada.Tetsuhiro@dc.MitsubishiElectric.co.jp> (raw) Redefine 'pbr_sector_t' as 'boot_sector_t' to comply with exFAT specification. - Redefine 'pbr_sector_t' as 'boot_sector_t'. - Rename variable names including 'pbr'. - Replace GET**()/SET**() macro with cpu_to_le**()/le**_ to_cpu(). - Remove fs_info_t.PBR_sector (always 0). - Remove unused definitions. Reviewed-by: Takahiro Mori <Mori.Takahiro@ab.MitsubishiElectric.co.jp> Signed-off-by: Tetsuhiro Kohada <Kohada.Tetsuhiro@dc.MitsubishiElectric.co.jp> --- drivers/staging/exfat/exfat.h | 139 +++++++--------------------- drivers/staging/exfat/exfat_core.c | 62 ++++++------- drivers/staging/exfat/exfat_super.c | 14 ++- 3 files changed, 65 insertions(+), 150 deletions(-) diff --git a/drivers/staging/exfat/exfat.h b/drivers/staging/exfat/exfat.h index c863d7566b57..0f730090cb30 100644 --- a/drivers/staging/exfat/exfat.h +++ b/drivers/staging/exfat/exfat.h @@ -35,17 +35,12 @@ #define DENTRY_SIZE 32 /* dir entry size */ #define DENTRY_SIZE_BITS 5 -/* PBR entries */ -#define PBR_SIGNATURE 0xAA55 -#define EXT_SIGNATURE 0xAA550000 -#define VOL_LABEL "NO NAME " /* size should be 11 */ -#define OEM_NAME "MSWIN4.1" /* size should be 8 */ -#define STR_FAT12 "FAT12 " /* size should be 8 */ -#define STR_FAT16 "FAT16 " /* size should be 8 */ -#define STR_FAT32 "FAT32 " /* size should be 8 */ -#define STR_EXFAT "EXFAT " /* size should be 8 */ -#define VOL_CLEAN 0x0000 -#define VOL_DIRTY 0x0002 +/* exFAT: 3 Main and Backup Boot Regions */ +#define BOOT_SIGNATURE 0xAA55 +#define EXBOOT_SIGNATURE 0xAA550000 +#define STR_EXFAT "EXFAT " /* size should be 8 */ +#define VOL_CLEAN 0x0000 +#define VOL_DIRTY 0x0002 /* max number of clusters */ #define FAT12_THRESHOLD 4087 /* 2^12 - 1 + 2 (clu 0 & 1) */ @@ -81,7 +76,7 @@ /* checksum types */ #define CS_DIR_ENTRY 0 -#define CS_PBR_SECTOR 1 +#define CS_BOOT_SECTOR 1 #define CS_DEFAULT 2 #define CLUSTER_16(x) ((u16)(x)) @@ -267,98 +262,29 @@ struct timestamp_t { u16 year; /* 0 ~ 127 (since 1980) */ }; -/* MS_DOS FAT partition boot record (512 bytes) */ -struct pbr_sector_t { - u8 jmp_boot[3]; - u8 oem_name[8]; - u8 bpb[109]; - u8 boot_code[390]; - u8 signature[2]; -}; - -/* MS-DOS FAT12/16 BIOS parameter block (51 bytes) */ -struct bpb16_t { - u8 sector_size[2]; - u8 sectors_per_clu; - u8 num_reserved[2]; - u8 num_fats; - u8 num_root_entries[2]; - u8 num_sectors[2]; - u8 media_type; - u8 num_fat_sectors[2]; - u8 sectors_in_track[2]; - u8 num_heads[2]; - u8 num_hid_sectors[4]; - u8 num_huge_sectors[4]; - - u8 phy_drv_no; - u8 reserved; - u8 ext_signature; - u8 vol_serial[4]; - u8 vol_label[11]; - u8 vol_type[8]; -}; - -/* MS-DOS FAT32 BIOS parameter block (79 bytes) */ -struct bpb32_t { - u8 sector_size[2]; - u8 sectors_per_clu; - u8 num_reserved[2]; - u8 num_fats; - u8 num_root_entries[2]; - u8 num_sectors[2]; - u8 media_type; - u8 num_fat_sectors[2]; - u8 sectors_in_track[2]; - u8 num_heads[2]; - u8 num_hid_sectors[4]; - u8 num_huge_sectors[4]; - u8 num_fat32_sectors[4]; - u8 ext_flags[2]; - u8 fs_version[2]; - u8 root_cluster[4]; - u8 fsinfo_sector[2]; - u8 backup_sector[2]; - u8 reserved[12]; - - u8 phy_drv_no; - u8 ext_reserved; - u8 ext_signature; - u8 vol_serial[4]; - u8 vol_label[11]; - u8 vol_type[8]; -}; - -/* MS-DOS EXFAT BIOS parameter block (109 bytes) */ -struct bpbex_t { - u8 reserved1[53]; - u8 vol_offset[8]; - u8 vol_length[8]; - u8 fat_offset[4]; - u8 fat_length[4]; - u8 clu_offset[4]; - u8 clu_count[4]; - u8 root_cluster[4]; - u8 vol_serial[4]; - u8 fs_version[2]; - u8 vol_flags[2]; - u8 sector_size_bits; - u8 sectors_per_clu_bits; - u8 num_fats; - u8 phy_drv_no; - u8 perc_in_use; - u8 reserved2[7]; -}; - -/* MS-DOS FAT file system information sector (512 bytes) */ -struct fsi_sector_t { - u8 signature1[4]; - u8 reserved1[480]; - u8 signature2[4]; - u8 free_cluster[4]; - u8 next_cluster[4]; - u8 reserved2[14]; - u8 signature3[2]; +/* exFAT: 3.1 Main and Backup Boot Sector (512 bytes) */ +struct boot_sector_t { + __u8 jmp_boot[3]; + __u8 fs_name[8]; + __u8 must_be_zero[53]; + __le64 partition_offset; + __le64 vol_length; + __le32 fat_offset; + __le32 fat_length; + __le32 clu_offset; + __le32 clu_count; + __le32 root_cluster; + __le32 vol_serial; + __le16 fs_revision; + __le16 vol_flags; + __u8 bytes_per_sector_shift; + __u8 sectors_per_clu_shift; + __u8 num_fats; + __u8 drv_sel; + __u8 percent_in_use; + __u8 reserved[7]; + __u8 boot_code[390]; + __le16 boot_signature; }; /* MS-DOS FAT directory entry (32 bytes) */ @@ -469,7 +395,6 @@ struct fs_info_t { u32 sectors_per_clu; /* cluster size in sectors */ u32 sectors_per_clu_bits; - u32 PBR_sector; /* PBR sector */ u32 FAT1_start_sector; /* FAT1 start sector */ u32 FAT2_start_sector; /* FAT2 start sector */ u32 root_start_sector; /* root dir start sector */ @@ -481,7 +406,7 @@ struct fs_info_t { u32 dentries_per_clu; /* num of dentries per cluster */ u32 vol_flag; /* volume dirty flag */ - struct buffer_head *pbr_bh; /* PBR sector */ + struct buffer_head *boot_bh; /* BOOT sector */ u32 map_clu; /* allocation bitmap start cluster */ u32 map_sectors; /* num of allocation bitmap sectors */ @@ -691,7 +616,7 @@ s32 resolve_path(struct inode *inode, char *path, struct chain_t *p_dir, struct uni_name_t *p_uniname); /* file operation functions */ -s32 exfat_mount(struct super_block *sb, struct pbr_sector_t *p_pbr); +s32 exfat_mount(struct super_block *sb, struct boot_sector_t *p_boot); s32 create_dir(struct inode *inode, struct chain_t *p_dir, struct uni_name_t *p_uniname, struct file_id_t *fid); s32 create_file(struct inode *inode, struct chain_t *p_dir, diff --git a/drivers/staging/exfat/exfat_core.c b/drivers/staging/exfat/exfat_core.c index 374a4fe183f5..ca1039b7977c 100644 --- a/drivers/staging/exfat/exfat_core.c +++ b/drivers/staging/exfat/exfat_core.c @@ -81,8 +81,7 @@ static inline void exfat_bitmap_clear(u8 *bitmap, int i) void fs_set_vol_flags(struct super_block *sb, u32 new_flag) { - struct pbr_sector_t *p_pbr; - struct bpbex_t *p_bpb; + struct boot_sector_t *p_boot; struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); if (p_fs->vol_flag == new_flag) @@ -90,23 +89,21 @@ void fs_set_vol_flags(struct super_block *sb, u32 new_flag) p_fs->vol_flag = new_flag; - if (!p_fs->pbr_bh) { - if (sector_read(sb, p_fs->PBR_sector, - &p_fs->pbr_bh, 1) != 0) + if (!p_fs->boot_bh) { + if (sector_read(sb, 0, &p_fs->boot_bh, 1) != 0) return; } - p_pbr = (struct pbr_sector_t *)p_fs->pbr_bh->b_data; - p_bpb = (struct bpbex_t *)p_pbr->bpb; - SET16(p_bpb->vol_flags, (u16)new_flag); + p_boot = (struct boot_sector_t *)p_fs->boot_bh->b_data; + p_boot->vol_flags = cpu_to_le16(new_flag); /* XXX duyoung * what can we do here? (cuz fs_set_vol_flags() is void) */ - if ((new_flag == VOL_DIRTY) && (!buffer_dirty(p_fs->pbr_bh))) - sector_write(sb, p_fs->PBR_sector, p_fs->pbr_bh, 1); + if ((new_flag == VOL_DIRTY) && (!buffer_dirty(p_fs->boot_bh))) + sector_write(sb, 0, p_fs->boot_bh, 1); else - sector_write(sb, p_fs->PBR_sector, p_fs->pbr_bh, 0); + sector_write(sb, 0, p_fs->boot_bh, 0); } void fs_error(struct super_block *sb) @@ -535,7 +532,7 @@ s32 load_alloc_bitmap(struct super_block *sb) } } - p_fs->pbr_bh = NULL; + p_fs->boot_bh = NULL; return 0; } } @@ -552,7 +549,7 @@ void free_alloc_bitmap(struct super_block *sb) int i; struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); - brelse(p_fs->pbr_bh); + brelse(p_fs->boot_bh); for (i = 0; i < p_fs->map_sectors; i++) __brelse(p_fs->vol_amap[i]); @@ -2063,45 +2060,44 @@ s32 resolve_path(struct inode *inode, char *path, struct chain_t *p_dir, return 0; } -s32 exfat_mount(struct super_block *sb, struct pbr_sector_t *p_pbr) +s32 exfat_mount(struct super_block *sb, struct boot_sector_t *p_boot) { - struct bpbex_t *p_bpb = (struct bpbex_t *)p_pbr->bpb; struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); - if (p_bpb->num_fats == 0) + if (p_boot->num_fats == 0) return -EFSCORRUPTED; - p_fs->sectors_per_clu = 1 << p_bpb->sectors_per_clu_bits; - p_fs->sectors_per_clu_bits = p_bpb->sectors_per_clu_bits; + p_fs->sectors_per_clu = 1 << p_boot->sectors_per_clu_shift; + p_fs->sectors_per_clu_bits = p_boot->sectors_per_clu_shift; p_fs->cluster_size_bits = p_fs->sectors_per_clu_bits + p_bd->sector_size_bits; p_fs->cluster_size = 1 << p_fs->cluster_size_bits; - p_fs->num_FAT_sectors = GET32(p_bpb->fat_length); + p_fs->num_FAT_sectors = le32_to_cpu(p_boot->fat_length); - p_fs->FAT1_start_sector = p_fs->PBR_sector + GET32(p_bpb->fat_offset); - if (p_bpb->num_fats == 1) + p_fs->FAT1_start_sector = le32_to_cpu(p_boot->fat_offset); + if (p_boot->num_fats == 1) p_fs->FAT2_start_sector = p_fs->FAT1_start_sector; else p_fs->FAT2_start_sector = p_fs->FAT1_start_sector + p_fs->num_FAT_sectors; - p_fs->root_start_sector = p_fs->PBR_sector + GET32(p_bpb->clu_offset); + p_fs->root_start_sector = le32_to_cpu(p_boot->clu_offset); p_fs->data_start_sector = p_fs->root_start_sector; - p_fs->num_sectors = GET64(p_bpb->vol_length); - p_fs->num_clusters = GET32(p_bpb->clu_count) + 2; + p_fs->num_sectors = le64_to_cpu(p_boot->vol_length); + p_fs->num_clusters = le32_to_cpu(p_boot->clu_count) + 2; /* because the cluster index starts with 2 */ - p_fs->vol_id = GET32(p_bpb->vol_serial); + p_fs->vol_id = le32_to_cpu(p_boot->vol_serial); - p_fs->root_dir = GET32(p_bpb->root_cluster); + p_fs->root_dir = le32_to_cpu(p_boot->root_cluster); p_fs->dentries_in_root = 0; p_fs->dentries_per_clu = 1 << (p_fs->cluster_size_bits - DENTRY_SIZE_BITS); - p_fs->vol_flag = (u32)GET16(p_bpb->vol_flags); + p_fs->vol_flag = (u32)le16_to_cpu(p_boot->vol_flags); p_fs->clu_srch_ptr = 2; p_fs->used_clusters = UINT_MAX; @@ -2431,8 +2427,7 @@ int sector_read(struct super_block *sb, sector_t sec, struct buffer_head **bh, s32 ret = -EIO; struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); - if ((sec >= (p_fs->PBR_sector + p_fs->num_sectors)) && - (p_fs->num_sectors > 0)) { + if ((sec >= p_fs->num_sectors) && (p_fs->num_sectors > 0)) { pr_err("[EXFAT] %s: out of range error! (sec = %llu)\n", __func__, (unsigned long long)sec); fs_error(sb); @@ -2454,8 +2449,7 @@ int sector_write(struct super_block *sb, sector_t sec, struct buffer_head *bh, s32 ret = -EIO; struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); - if (sec >= (p_fs->PBR_sector + p_fs->num_sectors) && - (p_fs->num_sectors > 0)) { + if (sec >= p_fs->num_sectors && (p_fs->num_sectors > 0)) { pr_err("[EXFAT] %s: out of range error! (sec = %llu)\n", __func__, (unsigned long long)sec); fs_error(sb); @@ -2483,8 +2477,7 @@ int multi_sector_read(struct super_block *sb, sector_t sec, s32 ret = -EIO; struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); - if (((sec + num_secs) > (p_fs->PBR_sector + p_fs->num_sectors)) && - (p_fs->num_sectors > 0)) { + if (((sec + num_secs) > p_fs->num_sectors) && (p_fs->num_sectors > 0)) { pr_err("[EXFAT] %s: out of range error! (sec = %llu, num_secs = %d)\n", __func__, (unsigned long long)sec, num_secs); fs_error(sb); @@ -2506,8 +2499,7 @@ int multi_sector_write(struct super_block *sb, sector_t sec, s32 ret = -EIO; struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); - if ((sec + num_secs) > (p_fs->PBR_sector + p_fs->num_sectors) && - (p_fs->num_sectors > 0)) { + if ((sec + num_secs) > p_fs->num_sectors && (p_fs->num_sectors > 0)) { pr_err("[EXFAT] %s: out of range error! (sec = %llu, num_secs = %d)\n", __func__, (unsigned long long)sec, num_secs); fs_error(sb); diff --git a/drivers/staging/exfat/exfat_super.c b/drivers/staging/exfat/exfat_super.c index 75813d0fe7a7..bd257d401f7b 100644 --- a/drivers/staging/exfat/exfat_super.c +++ b/drivers/staging/exfat/exfat_super.c @@ -344,7 +344,7 @@ static inline void exfat_save_attr(struct inode *inode, u32 attr) static int ffsMountVol(struct super_block *sb) { int i, ret; - struct pbr_sector_t *p_pbr; + struct boot_sector_t *p_boot; struct buffer_head *tmp_bh = NULL; struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); @@ -376,12 +376,10 @@ static int ffsMountVol(struct super_block *sb) goto out; } - p_fs->PBR_sector = 0; + p_boot = (struct boot_sector_t *)tmp_bh->b_data; - p_pbr = (struct pbr_sector_t *)tmp_bh->b_data; - - /* check the validity of PBR */ - if (GET16_A(p_pbr->signature) != PBR_SIGNATURE) { + /* check the validity of BOOT sector */ + if (le16_to_cpu(p_boot->boot_signature) != BOOT_SIGNATURE) { brelse(tmp_bh); exfat_bdev_close(sb); ret = -EFSCORRUPTED; @@ -390,7 +388,7 @@ static int ffsMountVol(struct super_block *sb) /* fill fs_struct */ for (i = 0; i < 53; i++) - if (p_pbr->bpb[i]) + if (p_boot->must_be_zero[i]) break; if (i < 53) { @@ -399,7 +397,7 @@ static int ffsMountVol(struct super_block *sb) pr_info("EXFAT: Attempted to mount VFAT filesystem\n"); goto out; } else { - ret = exfat_mount(sb, p_pbr); + ret = exfat_mount(sb, p_boot); } brelse(tmp_bh); -- 2.25.1
WARNING: multiple messages have this Message-ID (diff)
From: Tetsuhiro Kohada <Kohada.Tetsuhiro@dc.MitsubishiElectric.co.jp> To: Kohada.Tetsuhiro@dc.MitsubishiElectric.co.jp Cc: devel@driverdev.osuosl.org, Valdis Kletnieks <valdis.kletnieks@vt.edu>, Greg Kroah-Hartman <gregkh@linuxfoundation.org>, motai.hirotaka@aj.mitsubishielectric.co.jp, linux-kernel@vger.kernel.org, Mori.Takahiro@ab.MitsubishiElectric.co.jp, linux-fsdevel@vger.kernel.org Subject: [PATCH 1/5] staging: exfat: conform 'pbr_sector_t' definition to exFAT specification Date: Wed, 11 Mar 2020 19:52:41 +0900 [thread overview] Message-ID: <20200311105245.125564-1-Kohada.Tetsuhiro@dc.MitsubishiElectric.co.jp> (raw) Redefine 'pbr_sector_t' as 'boot_sector_t' to comply with exFAT specification. - Redefine 'pbr_sector_t' as 'boot_sector_t'. - Rename variable names including 'pbr'. - Replace GET**()/SET**() macro with cpu_to_le**()/le**_ to_cpu(). - Remove fs_info_t.PBR_sector (always 0). - Remove unused definitions. Reviewed-by: Takahiro Mori <Mori.Takahiro@ab.MitsubishiElectric.co.jp> Signed-off-by: Tetsuhiro Kohada <Kohada.Tetsuhiro@dc.MitsubishiElectric.co.jp> --- drivers/staging/exfat/exfat.h | 139 +++++++--------------------- drivers/staging/exfat/exfat_core.c | 62 ++++++------- drivers/staging/exfat/exfat_super.c | 14 ++- 3 files changed, 65 insertions(+), 150 deletions(-) diff --git a/drivers/staging/exfat/exfat.h b/drivers/staging/exfat/exfat.h index c863d7566b57..0f730090cb30 100644 --- a/drivers/staging/exfat/exfat.h +++ b/drivers/staging/exfat/exfat.h @@ -35,17 +35,12 @@ #define DENTRY_SIZE 32 /* dir entry size */ #define DENTRY_SIZE_BITS 5 -/* PBR entries */ -#define PBR_SIGNATURE 0xAA55 -#define EXT_SIGNATURE 0xAA550000 -#define VOL_LABEL "NO NAME " /* size should be 11 */ -#define OEM_NAME "MSWIN4.1" /* size should be 8 */ -#define STR_FAT12 "FAT12 " /* size should be 8 */ -#define STR_FAT16 "FAT16 " /* size should be 8 */ -#define STR_FAT32 "FAT32 " /* size should be 8 */ -#define STR_EXFAT "EXFAT " /* size should be 8 */ -#define VOL_CLEAN 0x0000 -#define VOL_DIRTY 0x0002 +/* exFAT: 3 Main and Backup Boot Regions */ +#define BOOT_SIGNATURE 0xAA55 +#define EXBOOT_SIGNATURE 0xAA550000 +#define STR_EXFAT "EXFAT " /* size should be 8 */ +#define VOL_CLEAN 0x0000 +#define VOL_DIRTY 0x0002 /* max number of clusters */ #define FAT12_THRESHOLD 4087 /* 2^12 - 1 + 2 (clu 0 & 1) */ @@ -81,7 +76,7 @@ /* checksum types */ #define CS_DIR_ENTRY 0 -#define CS_PBR_SECTOR 1 +#define CS_BOOT_SECTOR 1 #define CS_DEFAULT 2 #define CLUSTER_16(x) ((u16)(x)) @@ -267,98 +262,29 @@ struct timestamp_t { u16 year; /* 0 ~ 127 (since 1980) */ }; -/* MS_DOS FAT partition boot record (512 bytes) */ -struct pbr_sector_t { - u8 jmp_boot[3]; - u8 oem_name[8]; - u8 bpb[109]; - u8 boot_code[390]; - u8 signature[2]; -}; - -/* MS-DOS FAT12/16 BIOS parameter block (51 bytes) */ -struct bpb16_t { - u8 sector_size[2]; - u8 sectors_per_clu; - u8 num_reserved[2]; - u8 num_fats; - u8 num_root_entries[2]; - u8 num_sectors[2]; - u8 media_type; - u8 num_fat_sectors[2]; - u8 sectors_in_track[2]; - u8 num_heads[2]; - u8 num_hid_sectors[4]; - u8 num_huge_sectors[4]; - - u8 phy_drv_no; - u8 reserved; - u8 ext_signature; - u8 vol_serial[4]; - u8 vol_label[11]; - u8 vol_type[8]; -}; - -/* MS-DOS FAT32 BIOS parameter block (79 bytes) */ -struct bpb32_t { - u8 sector_size[2]; - u8 sectors_per_clu; - u8 num_reserved[2]; - u8 num_fats; - u8 num_root_entries[2]; - u8 num_sectors[2]; - u8 media_type; - u8 num_fat_sectors[2]; - u8 sectors_in_track[2]; - u8 num_heads[2]; - u8 num_hid_sectors[4]; - u8 num_huge_sectors[4]; - u8 num_fat32_sectors[4]; - u8 ext_flags[2]; - u8 fs_version[2]; - u8 root_cluster[4]; - u8 fsinfo_sector[2]; - u8 backup_sector[2]; - u8 reserved[12]; - - u8 phy_drv_no; - u8 ext_reserved; - u8 ext_signature; - u8 vol_serial[4]; - u8 vol_label[11]; - u8 vol_type[8]; -}; - -/* MS-DOS EXFAT BIOS parameter block (109 bytes) */ -struct bpbex_t { - u8 reserved1[53]; - u8 vol_offset[8]; - u8 vol_length[8]; - u8 fat_offset[4]; - u8 fat_length[4]; - u8 clu_offset[4]; - u8 clu_count[4]; - u8 root_cluster[4]; - u8 vol_serial[4]; - u8 fs_version[2]; - u8 vol_flags[2]; - u8 sector_size_bits; - u8 sectors_per_clu_bits; - u8 num_fats; - u8 phy_drv_no; - u8 perc_in_use; - u8 reserved2[7]; -}; - -/* MS-DOS FAT file system information sector (512 bytes) */ -struct fsi_sector_t { - u8 signature1[4]; - u8 reserved1[480]; - u8 signature2[4]; - u8 free_cluster[4]; - u8 next_cluster[4]; - u8 reserved2[14]; - u8 signature3[2]; +/* exFAT: 3.1 Main and Backup Boot Sector (512 bytes) */ +struct boot_sector_t { + __u8 jmp_boot[3]; + __u8 fs_name[8]; + __u8 must_be_zero[53]; + __le64 partition_offset; + __le64 vol_length; + __le32 fat_offset; + __le32 fat_length; + __le32 clu_offset; + __le32 clu_count; + __le32 root_cluster; + __le32 vol_serial; + __le16 fs_revision; + __le16 vol_flags; + __u8 bytes_per_sector_shift; + __u8 sectors_per_clu_shift; + __u8 num_fats; + __u8 drv_sel; + __u8 percent_in_use; + __u8 reserved[7]; + __u8 boot_code[390]; + __le16 boot_signature; }; /* MS-DOS FAT directory entry (32 bytes) */ @@ -469,7 +395,6 @@ struct fs_info_t { u32 sectors_per_clu; /* cluster size in sectors */ u32 sectors_per_clu_bits; - u32 PBR_sector; /* PBR sector */ u32 FAT1_start_sector; /* FAT1 start sector */ u32 FAT2_start_sector; /* FAT2 start sector */ u32 root_start_sector; /* root dir start sector */ @@ -481,7 +406,7 @@ struct fs_info_t { u32 dentries_per_clu; /* num of dentries per cluster */ u32 vol_flag; /* volume dirty flag */ - struct buffer_head *pbr_bh; /* PBR sector */ + struct buffer_head *boot_bh; /* BOOT sector */ u32 map_clu; /* allocation bitmap start cluster */ u32 map_sectors; /* num of allocation bitmap sectors */ @@ -691,7 +616,7 @@ s32 resolve_path(struct inode *inode, char *path, struct chain_t *p_dir, struct uni_name_t *p_uniname); /* file operation functions */ -s32 exfat_mount(struct super_block *sb, struct pbr_sector_t *p_pbr); +s32 exfat_mount(struct super_block *sb, struct boot_sector_t *p_boot); s32 create_dir(struct inode *inode, struct chain_t *p_dir, struct uni_name_t *p_uniname, struct file_id_t *fid); s32 create_file(struct inode *inode, struct chain_t *p_dir, diff --git a/drivers/staging/exfat/exfat_core.c b/drivers/staging/exfat/exfat_core.c index 374a4fe183f5..ca1039b7977c 100644 --- a/drivers/staging/exfat/exfat_core.c +++ b/drivers/staging/exfat/exfat_core.c @@ -81,8 +81,7 @@ static inline void exfat_bitmap_clear(u8 *bitmap, int i) void fs_set_vol_flags(struct super_block *sb, u32 new_flag) { - struct pbr_sector_t *p_pbr; - struct bpbex_t *p_bpb; + struct boot_sector_t *p_boot; struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); if (p_fs->vol_flag == new_flag) @@ -90,23 +89,21 @@ void fs_set_vol_flags(struct super_block *sb, u32 new_flag) p_fs->vol_flag = new_flag; - if (!p_fs->pbr_bh) { - if (sector_read(sb, p_fs->PBR_sector, - &p_fs->pbr_bh, 1) != 0) + if (!p_fs->boot_bh) { + if (sector_read(sb, 0, &p_fs->boot_bh, 1) != 0) return; } - p_pbr = (struct pbr_sector_t *)p_fs->pbr_bh->b_data; - p_bpb = (struct bpbex_t *)p_pbr->bpb; - SET16(p_bpb->vol_flags, (u16)new_flag); + p_boot = (struct boot_sector_t *)p_fs->boot_bh->b_data; + p_boot->vol_flags = cpu_to_le16(new_flag); /* XXX duyoung * what can we do here? (cuz fs_set_vol_flags() is void) */ - if ((new_flag == VOL_DIRTY) && (!buffer_dirty(p_fs->pbr_bh))) - sector_write(sb, p_fs->PBR_sector, p_fs->pbr_bh, 1); + if ((new_flag == VOL_DIRTY) && (!buffer_dirty(p_fs->boot_bh))) + sector_write(sb, 0, p_fs->boot_bh, 1); else - sector_write(sb, p_fs->PBR_sector, p_fs->pbr_bh, 0); + sector_write(sb, 0, p_fs->boot_bh, 0); } void fs_error(struct super_block *sb) @@ -535,7 +532,7 @@ s32 load_alloc_bitmap(struct super_block *sb) } } - p_fs->pbr_bh = NULL; + p_fs->boot_bh = NULL; return 0; } } @@ -552,7 +549,7 @@ void free_alloc_bitmap(struct super_block *sb) int i; struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); - brelse(p_fs->pbr_bh); + brelse(p_fs->boot_bh); for (i = 0; i < p_fs->map_sectors; i++) __brelse(p_fs->vol_amap[i]); @@ -2063,45 +2060,44 @@ s32 resolve_path(struct inode *inode, char *path, struct chain_t *p_dir, return 0; } -s32 exfat_mount(struct super_block *sb, struct pbr_sector_t *p_pbr) +s32 exfat_mount(struct super_block *sb, struct boot_sector_t *p_boot) { - struct bpbex_t *p_bpb = (struct bpbex_t *)p_pbr->bpb; struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); - if (p_bpb->num_fats == 0) + if (p_boot->num_fats == 0) return -EFSCORRUPTED; - p_fs->sectors_per_clu = 1 << p_bpb->sectors_per_clu_bits; - p_fs->sectors_per_clu_bits = p_bpb->sectors_per_clu_bits; + p_fs->sectors_per_clu = 1 << p_boot->sectors_per_clu_shift; + p_fs->sectors_per_clu_bits = p_boot->sectors_per_clu_shift; p_fs->cluster_size_bits = p_fs->sectors_per_clu_bits + p_bd->sector_size_bits; p_fs->cluster_size = 1 << p_fs->cluster_size_bits; - p_fs->num_FAT_sectors = GET32(p_bpb->fat_length); + p_fs->num_FAT_sectors = le32_to_cpu(p_boot->fat_length); - p_fs->FAT1_start_sector = p_fs->PBR_sector + GET32(p_bpb->fat_offset); - if (p_bpb->num_fats == 1) + p_fs->FAT1_start_sector = le32_to_cpu(p_boot->fat_offset); + if (p_boot->num_fats == 1) p_fs->FAT2_start_sector = p_fs->FAT1_start_sector; else p_fs->FAT2_start_sector = p_fs->FAT1_start_sector + p_fs->num_FAT_sectors; - p_fs->root_start_sector = p_fs->PBR_sector + GET32(p_bpb->clu_offset); + p_fs->root_start_sector = le32_to_cpu(p_boot->clu_offset); p_fs->data_start_sector = p_fs->root_start_sector; - p_fs->num_sectors = GET64(p_bpb->vol_length); - p_fs->num_clusters = GET32(p_bpb->clu_count) + 2; + p_fs->num_sectors = le64_to_cpu(p_boot->vol_length); + p_fs->num_clusters = le32_to_cpu(p_boot->clu_count) + 2; /* because the cluster index starts with 2 */ - p_fs->vol_id = GET32(p_bpb->vol_serial); + p_fs->vol_id = le32_to_cpu(p_boot->vol_serial); - p_fs->root_dir = GET32(p_bpb->root_cluster); + p_fs->root_dir = le32_to_cpu(p_boot->root_cluster); p_fs->dentries_in_root = 0; p_fs->dentries_per_clu = 1 << (p_fs->cluster_size_bits - DENTRY_SIZE_BITS); - p_fs->vol_flag = (u32)GET16(p_bpb->vol_flags); + p_fs->vol_flag = (u32)le16_to_cpu(p_boot->vol_flags); p_fs->clu_srch_ptr = 2; p_fs->used_clusters = UINT_MAX; @@ -2431,8 +2427,7 @@ int sector_read(struct super_block *sb, sector_t sec, struct buffer_head **bh, s32 ret = -EIO; struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); - if ((sec >= (p_fs->PBR_sector + p_fs->num_sectors)) && - (p_fs->num_sectors > 0)) { + if ((sec >= p_fs->num_sectors) && (p_fs->num_sectors > 0)) { pr_err("[EXFAT] %s: out of range error! (sec = %llu)\n", __func__, (unsigned long long)sec); fs_error(sb); @@ -2454,8 +2449,7 @@ int sector_write(struct super_block *sb, sector_t sec, struct buffer_head *bh, s32 ret = -EIO; struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); - if (sec >= (p_fs->PBR_sector + p_fs->num_sectors) && - (p_fs->num_sectors > 0)) { + if (sec >= p_fs->num_sectors && (p_fs->num_sectors > 0)) { pr_err("[EXFAT] %s: out of range error! (sec = %llu)\n", __func__, (unsigned long long)sec); fs_error(sb); @@ -2483,8 +2477,7 @@ int multi_sector_read(struct super_block *sb, sector_t sec, s32 ret = -EIO; struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); - if (((sec + num_secs) > (p_fs->PBR_sector + p_fs->num_sectors)) && - (p_fs->num_sectors > 0)) { + if (((sec + num_secs) > p_fs->num_sectors) && (p_fs->num_sectors > 0)) { pr_err("[EXFAT] %s: out of range error! (sec = %llu, num_secs = %d)\n", __func__, (unsigned long long)sec, num_secs); fs_error(sb); @@ -2506,8 +2499,7 @@ int multi_sector_write(struct super_block *sb, sector_t sec, s32 ret = -EIO; struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); - if ((sec + num_secs) > (p_fs->PBR_sector + p_fs->num_sectors) && - (p_fs->num_sectors > 0)) { + if ((sec + num_secs) > p_fs->num_sectors && (p_fs->num_sectors > 0)) { pr_err("[EXFAT] %s: out of range error! (sec = %llu, num_secs = %d)\n", __func__, (unsigned long long)sec, num_secs); fs_error(sb); diff --git a/drivers/staging/exfat/exfat_super.c b/drivers/staging/exfat/exfat_super.c index 75813d0fe7a7..bd257d401f7b 100644 --- a/drivers/staging/exfat/exfat_super.c +++ b/drivers/staging/exfat/exfat_super.c @@ -344,7 +344,7 @@ static inline void exfat_save_attr(struct inode *inode, u32 attr) static int ffsMountVol(struct super_block *sb) { int i, ret; - struct pbr_sector_t *p_pbr; + struct boot_sector_t *p_boot; struct buffer_head *tmp_bh = NULL; struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); @@ -376,12 +376,10 @@ static int ffsMountVol(struct super_block *sb) goto out; } - p_fs->PBR_sector = 0; + p_boot = (struct boot_sector_t *)tmp_bh->b_data; - p_pbr = (struct pbr_sector_t *)tmp_bh->b_data; - - /* check the validity of PBR */ - if (GET16_A(p_pbr->signature) != PBR_SIGNATURE) { + /* check the validity of BOOT sector */ + if (le16_to_cpu(p_boot->boot_signature) != BOOT_SIGNATURE) { brelse(tmp_bh); exfat_bdev_close(sb); ret = -EFSCORRUPTED; @@ -390,7 +388,7 @@ static int ffsMountVol(struct super_block *sb) /* fill fs_struct */ for (i = 0; i < 53; i++) - if (p_pbr->bpb[i]) + if (p_boot->must_be_zero[i]) break; if (i < 53) { @@ -399,7 +397,7 @@ static int ffsMountVol(struct super_block *sb) pr_info("EXFAT: Attempted to mount VFAT filesystem\n"); goto out; } else { - ret = exfat_mount(sb, p_pbr); + ret = exfat_mount(sb, p_boot); } brelse(tmp_bh); -- 2.25.1 _______________________________________________ devel mailing list devel@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
next reply other threads:[~2020-03-11 10:53 UTC|newest] Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-03-11 10:52 Tetsuhiro Kohada [this message] 2020-03-11 10:52 ` [PATCH 1/5] staging: exfat: conform 'pbr_sector_t' definition to exFAT specification Tetsuhiro Kohada 2020-03-11 10:52 ` [PATCH 2/5] staging: exfat: separate and move exFAT-mount core processing Tetsuhiro Kohada 2020-03-11 10:52 ` Tetsuhiro Kohada 2020-03-11 10:52 ` [PATCH 3/5] staging: exfat: consolidate boot sector analysis Tetsuhiro Kohada 2020-03-11 10:52 ` Tetsuhiro Kohada 2020-03-11 10:52 ` [PATCH 4/5] staging: exfat: add boot region verification Tetsuhiro Kohada 2020-03-11 10:52 ` Tetsuhiro Kohada 2020-03-11 10:52 ` [PATCH 5/5] staging: exfat: standardize checksum calculation Tetsuhiro Kohada 2020-03-11 10:52 ` Tetsuhiro Kohada 2020-03-11 12:05 ` [PATCH 1/5] staging: exfat: conform 'pbr_sector_t' definition to exFAT specification Greg Kroah-Hartman 2020-03-11 12:05 ` Greg Kroah-Hartman
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200311105245.125564-1-Kohada.Tetsuhiro@dc.MitsubishiElectric.co.jp \ --to=kohada.tetsuhiro@dc.mitsubishielectric.co.jp \ --cc=Mori.Takahiro@ab.MitsubishiElectric.co.jp \ --cc=devel@driverdev.osuosl.org \ --cc=gregkh@linuxfoundation.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=motai.hirotaka@aj.mitsubishielectric.co.jp \ --cc=valdis.kletnieks@vt.edu \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.