]> Pileus Git - ~andy/linux/blobdiff - fs/fat/fatent.c
Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab...
[~andy/linux] / fs / fat / fatent.c
index e49d27463b671997739b7963ccb3068e1e77a416..31f08ab62c562d1926a75183c802793642cd390c 100644 (file)
@@ -310,7 +310,12 @@ void fat_ent_access_init(struct super_block *sb)
 
 static void mark_fsinfo_dirty(struct super_block *sb)
 {
-       sb->s_dirt = 1;
+       struct msdos_sb_info *sbi = MSDOS_SB(sb);
+
+       if (sb->s_flags & MS_RDONLY || sbi->fat_bits != 32)
+               return;
+
+       __mark_inode_dirty(sbi->fsinfo_inode, I_DIRTY_SYNC);
 }
 
 static inline int fat_ent_update_ptr(struct super_block *sb,
@@ -503,7 +508,6 @@ int fat_alloc_clusters(struct inode *inode, int *cluster, int nr_cluster)
                                sbi->prev_free = entry;
                                if (sbi->free_clusters != -1)
                                        sbi->free_clusters--;
-                               mark_fsinfo_dirty(sb);
 
                                cluster[idx_clus] = entry;
                                idx_clus++;
@@ -525,11 +529,11 @@ int fat_alloc_clusters(struct inode *inode, int *cluster, int nr_cluster)
        /* Couldn't allocate the free entries */
        sbi->free_clusters = 0;
        sbi->free_clus_valid = 1;
-       mark_fsinfo_dirty(sb);
        err = -ENOSPC;
 
 out:
        unlock_fat(sbi);
+       mark_fsinfo_dirty(sb);
        fatent_brelse(&fatent);
        if (!err) {
                if (inode_needs_sync(inode))
@@ -554,7 +558,7 @@ int fat_free_clusters(struct inode *inode, int cluster)
        struct fat_entry fatent;
        struct buffer_head *bhs[MAX_BUF_PER_PAGE];
        int i, err, nr_bhs;
-       int first_cl = cluster;
+       int first_cl = cluster, dirty_fsinfo = 0;
 
        nr_bhs = 0;
        fatent_init(&fatent);
@@ -592,7 +596,7 @@ int fat_free_clusters(struct inode *inode, int cluster)
                ops->ent_put(&fatent, FAT_ENT_FREE);
                if (sbi->free_clusters != -1) {
                        sbi->free_clusters++;
-                       mark_fsinfo_dirty(sb);
+                       dirty_fsinfo = 1;
                }
 
                if (nr_bhs + fatent.nr_bhs > MAX_BUF_PER_PAGE) {
@@ -622,6 +626,8 @@ error:
        for (i = 0; i < nr_bhs; i++)
                brelse(bhs[i]);
        unlock_fat(sbi);
+       if (dirty_fsinfo)
+               mark_fsinfo_dirty(sb);
 
        return err;
 }