Separate the mount process related to the exFAT specification in ffsMountVol() and move it to exfat_mount.c. - Rename exfat_mount() to read_boot_sector(). - Separate exFAT-mount core process and move to exfat_mount.c as NEW exfat_mount(). - Move free_upcase_table()/free_alloc_bitmap() to exfat_mount.c as exfat_umount(). - Change some functions to static. This also fixes the exfat_bdev_close() leak. :-) Reviewed-by: Takahiro Mori <Mori.Takahiro@xxxxxxxxxxxxxxxxxxxxxxxxxxx> Signed-off-by: Tetsuhiro Kohada <Kohada.Tetsuhiro@xxxxxxxxxxxxxxxxxxxxxxxxxxx> --- drivers/staging/exfat/exfat.h | 11 +--- drivers/staging/exfat/exfat_core.c | 82 +++++++++++++++++++++++++++-- drivers/staging/exfat/exfat_super.c | 66 ++--------------------- 3 files changed, 83 insertions(+), 76 deletions(-) diff --git a/drivers/staging/exfat/exfat.h b/drivers/staging/exfat/exfat.h index 0f730090cb30..95c2a6ef0e71 100644 --- a/drivers/staging/exfat/exfat.h +++ b/drivers/staging/exfat/exfat.h @@ -581,14 +581,6 @@ void fs_error(struct super_block *sb); s32 count_num_clusters(struct super_block *sb, struct chain_t *dir); void exfat_chain_cont_cluster(struct super_block *sb, u32 chain, s32 len); -/* allocation bitmap management functions */ -s32 load_alloc_bitmap(struct super_block *sb); -void free_alloc_bitmap(struct super_block *sb); - -/* upcase table management functions */ -s32 load_upcase_table(struct super_block *sb); -void free_upcase_table(struct super_block *sb); - /* dir entry management functions */ struct timestamp_t *tm_current(struct timestamp_t *tm); @@ -616,7 +608,8 @@ 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 boot_sector_t *p_boot); +s32 exfat_mount(struct super_block *sb); +void exfat_umount(struct super_block *sb); 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 ca1039b7977c..2d88ce85217c 100644 --- a/drivers/staging/exfat/exfat_core.c +++ b/drivers/staging/exfat/exfat_core.c @@ -472,7 +472,7 @@ void exfat_chain_cont_cluster(struct super_block *sb, u32 chain, s32 len) * Allocation Bitmap Management Functions */ -s32 load_alloc_bitmap(struct super_block *sb) +static s32 load_alloc_bitmap(struct super_block *sb) { int i, j, ret; u32 map_size; @@ -544,7 +544,7 @@ s32 load_alloc_bitmap(struct super_block *sb) return -EFSCORRUPTED; } -void free_alloc_bitmap(struct super_block *sb) +static void free_alloc_bitmap(struct super_block *sb) { int i; struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); @@ -561,6 +561,8 @@ void free_alloc_bitmap(struct super_block *sb) /* * Upcase table Management Functions */ +static void free_upcase_table(struct super_block *sb); + static s32 __load_upcase_table(struct super_block *sb, sector_t sector, u32 num_sectors, u32 utbl_checksum) { @@ -706,7 +708,7 @@ static s32 __load_default_upcase_table(struct super_block *sb) return ret; } -s32 load_upcase_table(struct super_block *sb) +static s32 load_upcase_table(struct super_block *sb) { int i; u32 tbl_clu, tbl_size; @@ -754,7 +756,7 @@ s32 load_upcase_table(struct super_block *sb) return __load_default_upcase_table(sb); } -void free_upcase_table(struct super_block *sb) +static void free_upcase_table(struct super_block *sb) { u32 i; struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); @@ -2060,7 +2062,8 @@ s32 resolve_path(struct inode *inode, char *path, struct chain_t *p_dir, return 0; } -s32 exfat_mount(struct super_block *sb, struct boot_sector_t *p_boot) +static s32 read_boot_sector(struct super_block *sb, + struct boot_sector_t *p_boot) { struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); @@ -2104,6 +2107,75 @@ s32 exfat_mount(struct super_block *sb, struct boot_sector_t *p_boot) return 0; } +s32 exfat_mount(struct super_block *sb) +{ + int i, ret; + struct boot_sector_t *p_boot; + struct buffer_head *tmp_bh = NULL; + struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); + + /* read Sector 0 */ + if (sector_read(sb, 0, &tmp_bh, 1) != 0) { + ret = -EIO; + goto out; + } + + p_boot = (struct boot_sector_t *)tmp_bh->b_data; + + /* check the validity of BOOT sector */ + if (le16_to_cpu(p_boot->boot_signature) != BOOT_SIGNATURE) { + brelse(tmp_bh); + ret = -EFSCORRUPTED; + goto out; + } + + /* fill fs_struct */ + for (i = 0; i < 53; i++) + if (p_boot->must_be_zero[i]) + break; + + if (i < 53) { + /* Not sure how we'd get here, but complain if it does */ + ret = -EINVAL; + pr_info("EXFAT: Attempted to mount VFAT filesystem\n"); + goto out; + } else { + ret = read_boot_sector(sb, p_boot); + } + + brelse(tmp_bh); + + if (ret) + goto out; + + ret = load_alloc_bitmap(sb); + if (ret) + goto out; + + ret = load_upcase_table(sb); + if (ret) { + free_alloc_bitmap(sb); + goto out; + } + + if (p_fs->dev_ejected) { + free_upcase_table(sb); + free_alloc_bitmap(sb); + ret = -EIO; + goto out; + } + + pr_info("[EXFAT] mounted successfully\n"); +out: + return ret; +} + +void exfat_umount(struct super_block *sb) +{ + free_upcase_table(sb); + free_alloc_bitmap(sb); +} + s32 create_dir(struct inode *inode, struct chain_t *p_dir, struct uni_name_t *p_uniname, struct file_id_t *fid) { diff --git a/drivers/staging/exfat/exfat_super.c b/drivers/staging/exfat/exfat_super.c index bd257d401f7b..978e1d5172ee 100644 --- a/drivers/staging/exfat/exfat_super.c +++ b/drivers/staging/exfat/exfat_super.c @@ -343,9 +343,7 @@ static inline void exfat_save_attr(struct inode *inode, u32 attr) static int ffsMountVol(struct super_block *sb) { - int i, ret; - struct boot_sector_t *p_boot; - struct buffer_head *tmp_bh = NULL; + int ret; struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); @@ -370,66 +368,11 @@ static int ffsMountVol(struct super_block *sb) if (p_bd->sector_size > sb->s_blocksize) sb_set_blocksize(sb, p_bd->sector_size); - /* read Sector 0 */ - if (sector_read(sb, 0, &tmp_bh, 1) != 0) { - ret = -EIO; - goto out; - } - - p_boot = (struct boot_sector_t *)tmp_bh->b_data; - - /* 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; - goto out; - } - - /* fill fs_struct */ - for (i = 0; i < 53; i++) - if (p_boot->must_be_zero[i]) - break; - - if (i < 53) { - /* Not sure how we'd get here, but complain if it does */ - ret = -EINVAL; - pr_info("EXFAT: Attempted to mount VFAT filesystem\n"); - goto out; - } else { - ret = exfat_mount(sb, p_boot); - } - - brelse(tmp_bh); - - if (ret) { - exfat_bdev_close(sb); - goto out; - } - - ret = load_alloc_bitmap(sb); - if (ret) { - exfat_bdev_close(sb); - goto out; - } - ret = load_upcase_table(sb); + ret = exfat_mount(sb); +out: if (ret) { - free_alloc_bitmap(sb); exfat_bdev_close(sb); - goto out; } - - if (p_fs->dev_ejected) { - free_upcase_table(sb); - free_alloc_bitmap(sb); - exfat_bdev_close(sb); - ret = -EIO; - goto out; - } - - pr_info("[EXFAT] mounted successfully\n"); - -out: mutex_unlock(&z_mutex); return ret; @@ -450,8 +393,7 @@ static int ffsUmountVol(struct super_block *sb) fs_sync(sb, true); fs_set_vol_flags(sb, VOL_CLEAN); - free_upcase_table(sb); - free_alloc_bitmap(sb); + exfat_umount(sb); exfat_fat_release_all(sb); exfat_buf_release_all(sb); -- 2.25.1