fat_cluster_flush() fixes (2/11)
OGAWA Hirofumi
maintainerPATCH 1/1 fat_cluster_flush() fixes (2/11)
This adds forgotten check of MS_RDONLY flag to fat_put_super(), and adds sanity check of ->free_clusters and ->prev_free to fat_cluster_flush().
fs/fat/inode.c | 4 +++- fs/fat/misc.c | 15 ++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-)
fs/fat/inode.c renamed from fs/fat/inode.c~fat_clusters_flush-fix +3 -1
@@ -159,7 +159,9 @@ void fat_put_super(struct super_block *s {struct msdos_sb_info *sbi =MSDOS_SB (sb); -fat_clusters_flush (sb); +if (!(sb->s_flags &MS_RDONLY )) +fat_clusters_flush (sb); +if (sbi->nls_disk) {unload_nls (sbi->nls_disk); sbi->nls_disk =NULL ;
fs/fat/misc.c renamed from fs/fat/misc.c~fat_clusters_flush-fix +8 -7
@@ -50,15 +50,14 @@ void unlock_fat(struct super_block *sb)/* XXX: Need to write one per FSINFO block. Currently only writes 1 */ void fat_clusters_flush (struct super_block *sb) { +struct msdos_sb_info *sbi =MSDOS_SB (sb);struct buffer_head *bh;struct fat_boot_fsinfo *fsinfo; -if (MSDOS_SB (sb)->fat_bits !=32 ) -return ; -if (MSDOS_SB (sb)->free_clusters ==-1 ) +if (sbi->fat_bits !=32 )return ; - bh =sb_bread (sb,MSDOS_SB (sb)->fsinfo_sector); + bh =sb_bread (sb, sbi->fsinfo_sector);if (bh ==NULL ) {printk (KERN_ERR "FAT bread failed in fat_clusters_flush\n" );return ;
@@ -71,10 +70,12 @@ void fat_clusters_flush(struct super_blo" Found signature1 0x%08x signature2 0x%08x" " (sector = %lu)\n" ,CF_LE_L (fsinfo->signature1),CF_LE_L (fsinfo->signature2), - MSDOS_SB(sb)->fsinfo_sector); + sbi->fsinfo_sector); }else { - fsinfo->free_clusters =CF_LE_L (MSDOS_SB (sb)->free_clusters); - fsinfo->next_cluster =CF_LE_L (MSDOS_SB (sb)->prev_free); +if (sbi->free_clusters !=-1 ) + fsinfo->free_clusters =CF_LE_L (sbi->free_clusters); +if (sbi->prev_free) + fsinfo->next_cluster =CF_LE_L (sbi->prev_free);mark_buffer_dirty (bh); }brelse (bh);
_
Signature · 1 line
OGAWA Hirofumi <[email protected]>