]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
logfs: Free areas before calling generic_shutdown_super()
authorJoern Engel <joern@logfs.org>
Fri, 5 Aug 2011 09:18:19 +0000 (11:18 +0200)
committerJoern Engel <joern@logfs.org>
Fri, 5 Aug 2011 09:18:19 +0000 (11:18 +0200)
Or hit an assertion in map_invalidatepage() instead.

Signed-off-by: Joern Engel <joern@logfs.org>
fs/logfs/logfs.h
fs/logfs/segment.c
fs/logfs/super.c

index 57afd4a6fabbb992b0b08ea9bb5399071ea576c2..9e749025d8717d3526764132d7cbff756061f471 100644 (file)
@@ -594,6 +594,7 @@ int logfs_init_mapping(struct super_block *sb);
 void logfs_sync_area(struct logfs_area *area);
 void logfs_sync_segments(struct super_block *sb);
 void freeseg(struct super_block *sb, u32 segno);
+void free_areas(struct super_block *sb);
 
 /* area handling */
 int logfs_init_areas(struct super_block *sb);
index 9d5187353255ddf630a44afcb5e7d020dc8dd25c..ee7d4aa4a5b74bcb125137c6c9fdbdac471ee6bf 100644 (file)
@@ -841,6 +841,16 @@ static void free_area(struct logfs_area *area)
        kfree(area);
 }
 
+void free_areas(struct super_block *sb)
+{
+       struct logfs_super *super = logfs_super(sb);
+       int i;
+
+       for_each_area(i)
+               free_area(super->s_area[i]);
+       free_area(super->s_journal_area);
+}
+
 static struct logfs_area *alloc_area(struct super_block *sb)
 {
        struct logfs_area *area;
@@ -923,10 +933,6 @@ err:
 void logfs_cleanup_areas(struct super_block *sb)
 {
        struct logfs_super *super = logfs_super(sb);
-       int i;
 
        btree_grim_visitor128(&super->s_object_alias_tree, 0, kill_alias);
-       for_each_area(i)
-               free_area(super->s_area[i]);
-       free_area(super->s_journal_area);
 }
index ce03a182c771c42e39e90c0f7b3737b897d02215..6506e9e392eb8a4f19c5bfe51c2aaa6e58a67ee2 100644 (file)
@@ -507,6 +507,7 @@ static void logfs_kill_sb(struct super_block *sb)
        /* Alias entries slow down mount, so evict as many as possible */
        sync_filesystem(sb);
        logfs_write_anchor(sb);
+       free_areas(sb);
 
        /*
         * From this point on alias entries are simply dropped - and any