ext4: let the block device know when unused blocks can be discarded
authorTheodore Ts'o <tytso@mit.edu>
Thu, 16 Oct 2008 14:06:27 +0000 (10:06 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 16 Oct 2008 14:06:27 +0000 (10:06 -0400)
Let the block device know when unused blocks can be discarded, using
the new sb_issue_discard() interface.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
fs/ext4/mballoc.c
fs/ext4/mballoc.h

index bd9b011941a21e8d62ea766a3b5d599240dcbdc6..815a22ea60784521fff85b1cf0f3dc70cd9d5387 100644 (file)
@@ -2653,6 +2653,7 @@ ext4_mb_free_committed_blocks(struct super_block *sb)
        struct ext4_sb_info *sbi = EXT4_SB(sb);
        int err, count = 0, count2 = 0;
        struct ext4_free_data *entry;
+       ext4_fsblk_t discard_block;
 
        if (list_empty(&sbi->s_committed_transaction))
                return;
@@ -2696,6 +2697,12 @@ ext4_mb_free_committed_blocks(struct super_block *sb)
                        page_cache_release(e4b.bd_bitmap_page);
                }
                ext4_unlock_group(sb, entry->group);
+               discard_block = (ext4_fsblk_t) entry->group * EXT4_BLOCKS_PER_GROUP(sb)
+                       + entry->start_blk
+                       + le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block);
+               trace_mark(ext4_discard_blocks, "dev %s blk %llu count %u", sb->s_id,
+                          (unsigned long long) discard_block, entry->count);
+               sb_issue_discard(sb, discard_block, entry->count);
 
                kmem_cache_free(ext4_free_ext_cachep, entry);
                ext4_mb_release_desc(&e4b);
index 9e815c4e37df8b32eaffd3c466abce69321fa352..94cb7b9fe3eec7321cb33e706aa57c24ba275ad4 100644 (file)
@@ -18,6 +18,8 @@
 #include <linux/pagemap.h>
 #include <linux/seq_file.h>
 #include <linux/version.h>
+#include <linux/blkdev.h>
+#include <linux/marker.h>
 #include "ext4_jbd2.h"
 #include "ext4.h"
 #include "group.h"