ext4: move handling of list of shrinkable inodes into extent status code
authorJan Kara <jack@suse.cz>
Tue, 25 Nov 2014 16:49:25 +0000 (11:49 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 25 Nov 2014 16:49:25 +0000 (11:49 -0500)
Currently callers adding extents to extent status tree were responsible
for adding the inode to the list of inodes with freeable extents. This
is error prone and puts list handling in unnecessarily many places.

Just add inode to the list automatically when the first non-delay extent
is added to the tree and remove inode from the list when the last
non-delay extent is removed.

Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/extents.c
fs/ext4/extents_status.c
fs/ext4/extents_status.h
fs/ext4/inode.c
fs/ext4/ioctl.c
fs/ext4/super.c

index e406f66a903f8cd78c1d4743136d854f681dcaad..e2424bafd6fe5f495b64666ad8370d56918c0c9d 100644 (file)
@@ -4632,7 +4632,6 @@ out2:
 
        trace_ext4_ext_map_blocks_exit(inode, flags, map,
                                       err ? err : allocated);
-       ext4_es_list_add(inode);
        return err ? err : allocated;
 }
 
@@ -5191,7 +5190,6 @@ int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
                error = ext4_fill_fiemap_extents(inode, start_blk,
                                                 len_blks, fieinfo);
        }
-       ext4_es_list_add(inode);
        return error;
 }
 
index 0193ca107396b9796ce85b735c0204e2210ed7ea..de2d9d8bf22f30467fa211f8588c75641c8232a5 100644 (file)
@@ -298,7 +298,7 @@ out:
        trace_ext4_es_find_delayed_extent_range_exit(inode, es);
 }
 
-void ext4_es_list_add(struct inode *inode)
+static void ext4_es_list_add(struct inode *inode)
 {
        struct ext4_inode_info *ei = EXT4_I(inode);
        struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
@@ -314,7 +314,7 @@ void ext4_es_list_add(struct inode *inode)
        spin_unlock(&sbi->s_es_lock);
 }
 
-void ext4_es_list_del(struct inode *inode)
+static void ext4_es_list_del(struct inode *inode)
 {
        struct ext4_inode_info *ei = EXT4_I(inode);
        struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
@@ -344,7 +344,8 @@ ext4_es_alloc_extent(struct inode *inode, ext4_lblk_t lblk, ext4_lblk_t len,
         * We don't count delayed extent because we never try to reclaim them
         */
        if (!ext4_es_is_delayed(es)) {
-               EXT4_I(inode)->i_es_shk_nr++;
+               if (!EXT4_I(inode)->i_es_shk_nr++)
+                       ext4_es_list_add(inode);
                percpu_counter_inc(&EXT4_SB(inode->i_sb)->
                                        s_es_stats.es_stats_shk_cnt);
        }
@@ -363,7 +364,8 @@ static void ext4_es_free_extent(struct inode *inode, struct extent_status *es)
        /* Decrease the shrink counter when this es is not delayed */
        if (!ext4_es_is_delayed(es)) {
                BUG_ON(EXT4_I(inode)->i_es_shk_nr == 0);
-               EXT4_I(inode)->i_es_shk_nr--;
+               if (!--EXT4_I(inode)->i_es_shk_nr)
+                       ext4_es_list_del(inode);
                percpu_counter_dec(&EXT4_SB(inode->i_sb)->
                                        s_es_stats.es_stats_shk_cnt);
        }
index 0e6a33e81e5fd8aa299f53528a939585d9aa680b..b0b78b95f4814cf79df179cf13d44349eb4c72aa 100644 (file)
@@ -150,7 +150,5 @@ static inline void ext4_es_store_pblock_status(struct extent_status *es,
 
 extern int ext4_es_register_shrinker(struct ext4_sb_info *sbi);
 extern void ext4_es_unregister_shrinker(struct ext4_sb_info *sbi);
-extern void ext4_es_list_add(struct inode *inode);
-extern void ext4_es_list_del(struct inode *inode);
 
 #endif /* _EXT4_EXTENTS_STATUS_H */
index 540b0b0481a58bebe4c382d9bff67e5f36d9097a..b416b461fa500bbfb4822c5d3852478c7512923d 100644 (file)
@@ -486,7 +486,6 @@ int ext4_map_blocks(handle_t *handle, struct inode *inode,
 
        /* Lookup extent status tree firstly */
        if (ext4_es_lookup_extent(inode, map->m_lblk, &es)) {
-               ext4_es_list_add(inode);
                if (ext4_es_is_written(&es) || ext4_es_is_unwritten(&es)) {
                        map->m_pblk = ext4_es_pblock(&es) +
                                        map->m_lblk - es.es_lblk;
@@ -1388,7 +1387,6 @@ static int ext4_da_map_blocks(struct inode *inode, sector_t iblock,
 
        /* Lookup extent status tree firstly */
        if (ext4_es_lookup_extent(inode, iblock, &es)) {
-               ext4_es_list_add(inode);
                if (ext4_es_is_hole(&es)) {
                        retval = 0;
                        down_read(&EXT4_I(inode)->i_data_sem);
index 7b377c41dd81f3a308c6790b01390b9c876358a7..f58a0d106726100262aad4557fc91dd46f76ddf4 100644 (file)
@@ -78,8 +78,6 @@ static void swap_inode_data(struct inode *inode1, struct inode *inode2)
        memswap(&ei1->i_disksize, &ei2->i_disksize, sizeof(ei1->i_disksize));
        ext4_es_remove_extent(inode1, 0, EXT_MAX_BLOCKS);
        ext4_es_remove_extent(inode2, 0, EXT_MAX_BLOCKS);
-       ext4_es_list_del(inode1);
-       ext4_es_list_del(inode2);
 
        isize = i_size_read(inode1);
        i_size_write(inode1, i_size_read(inode2));
index 32df08e99ca903f9ec7ea21f6d2efa649a5b34f1..e2a17f8b7adc00b9e35f9be27f803899a0399c9e 100644 (file)
@@ -962,7 +962,6 @@ void ext4_clear_inode(struct inode *inode)
        dquot_drop(inode);
        ext4_discard_preallocations(inode);
        ext4_es_remove_extent(inode, 0, EXT_MAX_BLOCKS);
-       ext4_es_list_del(inode);
        if (EXT4_I(inode)->jinode) {
                jbd2_journal_release_jbd_inode(EXT4_JOURNAL(inode),
                                               EXT4_I(inode)->jinode);