瀏覽代碼

logfs: Free areas before calling generic_shutdown_super()

Or hit an assertion in map_invalidatepage() instead.

Signed-off-by: Joern Engel <joern@logfs.org>
Joern Engel 14 年之前
父節點
當前提交
1bcceaff8c
共有 3 個文件被更改,包括 12 次插入4 次删除
  1. 1 0
      fs/logfs/logfs.h
  2. 10 4
      fs/logfs/segment.c
  3. 1 0
      fs/logfs/super.c

+ 1 - 0
fs/logfs/logfs.h

@@ -596,6 +596,7 @@ int logfs_init_mapping(struct super_block *sb);
 void logfs_sync_area(struct logfs_area *area);
 void logfs_sync_area(struct logfs_area *area);
 void logfs_sync_segments(struct super_block *sb);
 void logfs_sync_segments(struct super_block *sb);
 void freeseg(struct super_block *sb, u32 segno);
 void freeseg(struct super_block *sb, u32 segno);
+void free_areas(struct super_block *sb);
 
 
 /* area handling */
 /* area handling */
 int logfs_init_areas(struct super_block *sb);
 int logfs_init_areas(struct super_block *sb);

+ 10 - 4
fs/logfs/segment.c

@@ -862,6 +862,16 @@ static void free_area(struct logfs_area *area)
 	kfree(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)
 static struct logfs_area *alloc_area(struct super_block *sb)
 {
 {
 	struct logfs_area *area;
 	struct logfs_area *area;
@@ -944,10 +954,6 @@ err:
 void logfs_cleanup_areas(struct super_block *sb)
 void logfs_cleanup_areas(struct super_block *sb)
 {
 {
 	struct logfs_super *super = logfs_super(sb);
 	struct logfs_super *super = logfs_super(sb);
-	int i;
 
 
 	btree_grim_visitor128(&super->s_object_alias_tree, 0, kill_alias);
 	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);
 }
 }

+ 1 - 0
fs/logfs/super.c

@@ -486,6 +486,7 @@ static void logfs_kill_sb(struct super_block *sb)
 	/* Alias entries slow down mount, so evict as many as possible */
 	/* Alias entries slow down mount, so evict as many as possible */
 	sync_filesystem(sb);
 	sync_filesystem(sb);
 	logfs_write_anchor(sb);
 	logfs_write_anchor(sb);
+	free_areas(sb);
 
 
 	/*
 	/*
 	 * From this point on alias entries are simply dropped - and any
 	 * From this point on alias entries are simply dropped - and any