diff options
-rw-r--r-- | fs/btrfs/ctree.h | 2 | ||||
-rw-r--r-- | fs/btrfs/file.c | 28 | ||||
-rw-r--r-- | fs/btrfs/super.c | 9 |
3 files changed, 34 insertions, 5 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 91ff078e85df..389c05715eaa 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
@@ -3505,6 +3505,8 @@ void btrfs_get_block_group_info(struct list_head *groups_list, | |||
3505 | struct btrfs_ioctl_space_info *space); | 3505 | struct btrfs_ioctl_space_info *space); |
3506 | 3506 | ||
3507 | /* file.c */ | 3507 | /* file.c */ |
3508 | int btrfs_auto_defrag_init(void); | ||
3509 | void btrfs_auto_defrag_exit(void); | ||
3508 | int btrfs_add_inode_defrag(struct btrfs_trans_handle *trans, | 3510 | int btrfs_add_inode_defrag(struct btrfs_trans_handle *trans, |
3509 | struct inode *inode); | 3511 | struct inode *inode); |
3510 | int btrfs_run_defrag_inodes(struct btrfs_fs_info *fs_info); | 3512 | int btrfs_run_defrag_inodes(struct btrfs_fs_info *fs_info); |
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index bd7f1b01e051..15117eae85c4 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include "compat.h" | 41 | #include "compat.h" |
42 | #include "volumes.h" | 42 | #include "volumes.h" |
43 | 43 | ||
44 | static struct kmem_cache *btrfs_inode_defrag_cachep; | ||
44 | /* | 45 | /* |
45 | * when auto defrag is enabled we | 46 | * when auto defrag is enabled we |
46 | * queue up these defrag structs to remember which | 47 | * queue up these defrag structs to remember which |
@@ -127,7 +128,7 @@ static void __btrfs_add_inode_defrag(struct inode *inode, | |||
127 | return; | 128 | return; |
128 | 129 | ||
129 | exists: | 130 | exists: |
130 | kfree(defrag); | 131 | kmem_cache_free(btrfs_inode_defrag_cachep, defrag); |
131 | return; | 132 | return; |
132 | 133 | ||
133 | } | 134 | } |
@@ -157,7 +158,7 @@ int btrfs_add_inode_defrag(struct btrfs_trans_handle *trans, | |||
157 | else | 158 | else |
158 | transid = BTRFS_I(inode)->root->last_trans; | 159 | transid = BTRFS_I(inode)->root->last_trans; |
159 | 160 | ||
160 | defrag = kzalloc(sizeof(*defrag), GFP_NOFS); | 161 | defrag = kmem_cache_zalloc(btrfs_inode_defrag_cachep, GFP_NOFS); |
161 | if (!defrag) | 162 | if (!defrag) |
162 | return -ENOMEM; | 163 | return -ENOMEM; |
163 | 164 | ||
@@ -169,7 +170,7 @@ int btrfs_add_inode_defrag(struct btrfs_trans_handle *trans, | |||
169 | if (!test_bit(BTRFS_INODE_IN_DEFRAG, &BTRFS_I(inode)->runtime_flags)) | 170 | if (!test_bit(BTRFS_INODE_IN_DEFRAG, &BTRFS_I(inode)->runtime_flags)) |
170 | __btrfs_add_inode_defrag(inode, defrag); | 171 | __btrfs_add_inode_defrag(inode, defrag); |
171 | else | 172 | else |
172 | kfree(defrag); | 173 | kmem_cache_free(btrfs_inode_defrag_cachep, defrag); |
173 | spin_unlock(&root->fs_info->defrag_inodes_lock); | 174 | spin_unlock(&root->fs_info->defrag_inodes_lock); |
174 | return 0; | 175 | return 0; |
175 | } | 176 | } |
@@ -315,7 +316,8 @@ int btrfs_run_defrag_inodes(struct btrfs_fs_info *fs_info) | |||
315 | next: | 316 | next: |
316 | spin_lock(&fs_info->defrag_inodes_lock); | 317 | spin_lock(&fs_info->defrag_inodes_lock); |
317 | next_free: | 318 | next_free: |
318 | kfree(defrag); | 319 | if (defrag) |
320 | kmem_cache_free(btrfs_inode_defrag_cachep, defrag); | ||
319 | } | 321 | } |
320 | spin_unlock(&fs_info->defrag_inodes_lock); | 322 | spin_unlock(&fs_info->defrag_inodes_lock); |
321 | 323 | ||
@@ -2293,3 +2295,21 @@ const struct file_operations btrfs_file_operations = { | |||
2293 | .compat_ioctl = btrfs_ioctl, | 2295 | .compat_ioctl = btrfs_ioctl, |
2294 | #endif | 2296 | #endif |
2295 | }; | 2297 | }; |
2298 | |||
2299 | void btrfs_auto_defrag_exit(void) | ||
2300 | { | ||
2301 | if (btrfs_inode_defrag_cachep) | ||
2302 | kmem_cache_destroy(btrfs_inode_defrag_cachep); | ||
2303 | } | ||
2304 | |||
2305 | int btrfs_auto_defrag_init(void) | ||
2306 | { | ||
2307 | btrfs_inode_defrag_cachep = kmem_cache_create("btrfs_inode_defrag", | ||
2308 | sizeof(struct inode_defrag), 0, | ||
2309 | SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, | ||
2310 | NULL); | ||
2311 | if (!btrfs_inode_defrag_cachep) | ||
2312 | return -ENOMEM; | ||
2313 | |||
2314 | return 0; | ||
2315 | } | ||
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index def4f24b58df..99545df1b86c 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
@@ -1680,10 +1680,14 @@ static int __init init_btrfs_fs(void) | |||
1680 | if (err) | 1680 | if (err) |
1681 | goto free_ordered_data; | 1681 | goto free_ordered_data; |
1682 | 1682 | ||
1683 | err = btrfs_interface_init(); | 1683 | err = btrfs_auto_defrag_init(); |
1684 | if (err) | 1684 | if (err) |
1685 | goto free_delayed_inode; | 1685 | goto free_delayed_inode; |
1686 | 1686 | ||
1687 | err = btrfs_interface_init(); | ||
1688 | if (err) | ||
1689 | goto free_auto_defrag; | ||
1690 | |||
1687 | err = register_filesystem(&btrfs_fs_type); | 1691 | err = register_filesystem(&btrfs_fs_type); |
1688 | if (err) | 1692 | if (err) |
1689 | goto unregister_ioctl; | 1693 | goto unregister_ioctl; |
@@ -1695,6 +1699,8 @@ static int __init init_btrfs_fs(void) | |||
1695 | 1699 | ||
1696 | unregister_ioctl: | 1700 | unregister_ioctl: |
1697 | btrfs_interface_exit(); | 1701 | btrfs_interface_exit(); |
1702 | free_auto_defrag: | ||
1703 | btrfs_auto_defrag_exit(); | ||
1698 | free_delayed_inode: | 1704 | free_delayed_inode: |
1699 | btrfs_delayed_inode_exit(); | 1705 | btrfs_delayed_inode_exit(); |
1700 | free_ordered_data: | 1706 | free_ordered_data: |
@@ -1714,6 +1720,7 @@ free_compress: | |||
1714 | static void __exit exit_btrfs_fs(void) | 1720 | static void __exit exit_btrfs_fs(void) |
1715 | { | 1721 | { |
1716 | btrfs_destroy_cachep(); | 1722 | btrfs_destroy_cachep(); |
1723 | btrfs_auto_defrag_exit(); | ||
1717 | btrfs_delayed_inode_exit(); | 1724 | btrfs_delayed_inode_exit(); |
1718 | ordered_data_exit(); | 1725 | ordered_data_exit(); |
1719 | extent_map_exit(); | 1726 | extent_map_exit(); |