diff options
-rw-r--r-- | fs/btrfs/free-space-cache.c | 159 |
1 files changed, 93 insertions, 66 deletions
diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index 372b05ff1943..a852e15173e5 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c | |||
@@ -274,18 +274,32 @@ struct io_ctl { | |||
274 | }; | 274 | }; |
275 | 275 | ||
276 | static int io_ctl_init(struct io_ctl *io_ctl, struct inode *inode, | 276 | static int io_ctl_init(struct io_ctl *io_ctl, struct inode *inode, |
277 | struct btrfs_root *root) | 277 | struct btrfs_root *root, int write) |
278 | { | 278 | { |
279 | int num_pages; | ||
280 | int check_crcs = 0; | ||
281 | |||
282 | num_pages = (i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> | ||
283 | PAGE_CACHE_SHIFT; | ||
284 | |||
285 | if (btrfs_ino(inode) != BTRFS_FREE_INO_OBJECTID) | ||
286 | check_crcs = 1; | ||
287 | |||
288 | /* Make sure we can fit our crcs into the first page */ | ||
289 | if (write && check_crcs && | ||
290 | (num_pages * sizeof(u32)) >= PAGE_CACHE_SIZE) | ||
291 | return -ENOSPC; | ||
292 | |||
279 | memset(io_ctl, 0, sizeof(struct io_ctl)); | 293 | memset(io_ctl, 0, sizeof(struct io_ctl)); |
280 | io_ctl->num_pages = (i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> | 294 | |
281 | PAGE_CACHE_SHIFT; | 295 | io_ctl->pages = kzalloc(sizeof(struct page *) * num_pages, GFP_NOFS); |
282 | io_ctl->pages = kzalloc(sizeof(struct page *) * io_ctl->num_pages, | ||
283 | GFP_NOFS); | ||
284 | if (!io_ctl->pages) | 296 | if (!io_ctl->pages) |
285 | return -ENOMEM; | 297 | return -ENOMEM; |
298 | |||
299 | io_ctl->num_pages = num_pages; | ||
286 | io_ctl->root = root; | 300 | io_ctl->root = root; |
287 | if (btrfs_ino(inode) != BTRFS_FREE_INO_OBJECTID) | 301 | io_ctl->check_crcs = check_crcs; |
288 | io_ctl->check_crcs = 1; | 302 | |
289 | return 0; | 303 | return 0; |
290 | } | 304 | } |
291 | 305 | ||
@@ -677,7 +691,7 @@ static int __load_free_space_cache(struct btrfs_root *root, struct inode *inode, | |||
677 | if (!num_entries) | 691 | if (!num_entries) |
678 | return 0; | 692 | return 0; |
679 | 693 | ||
680 | ret = io_ctl_init(&io_ctl, inode, root); | 694 | ret = io_ctl_init(&io_ctl, inode, root, 0); |
681 | if (ret) | 695 | if (ret) |
682 | return ret; | 696 | return ret; |
683 | 697 | ||
@@ -957,19 +971,18 @@ fail: | |||
957 | } | 971 | } |
958 | 972 | ||
959 | static noinline_for_stack int | 973 | static noinline_for_stack int |
960 | add_ioctl_entries(struct btrfs_root *root, | 974 | write_pinned_extent_entries(struct btrfs_root *root, |
961 | struct inode *inode, | 975 | struct btrfs_block_group_cache *block_group, |
962 | struct btrfs_block_group_cache *block_group, | 976 | struct io_ctl *io_ctl, |
963 | struct io_ctl *io_ctl, | 977 | int *entries) |
964 | struct extent_state **cached_state, | ||
965 | struct list_head *bitmap_list, | ||
966 | int *entries) | ||
967 | { | 978 | { |
968 | u64 start, extent_start, extent_end, len; | 979 | u64 start, extent_start, extent_end, len; |
969 | struct list_head *pos, *n; | ||
970 | struct extent_io_tree *unpin = NULL; | 980 | struct extent_io_tree *unpin = NULL; |
971 | int ret; | 981 | int ret; |
972 | 982 | ||
983 | if (!block_group) | ||
984 | return 0; | ||
985 | |||
973 | /* | 986 | /* |
974 | * We want to add any pinned extents to our free space cache | 987 | * We want to add any pinned extents to our free space cache |
975 | * so we don't leak the space | 988 | * so we don't leak the space |
@@ -979,23 +992,19 @@ add_ioctl_entries(struct btrfs_root *root, | |||
979 | */ | 992 | */ |
980 | unpin = root->fs_info->pinned_extents; | 993 | unpin = root->fs_info->pinned_extents; |
981 | 994 | ||
982 | if (block_group) | 995 | start = block_group->key.objectid; |
983 | start = block_group->key.objectid; | ||
984 | 996 | ||
985 | while (block_group && (start < block_group->key.objectid + | 997 | while (start < block_group->key.objectid + block_group->key.offset) { |
986 | block_group->key.offset)) { | ||
987 | ret = find_first_extent_bit(unpin, start, | 998 | ret = find_first_extent_bit(unpin, start, |
988 | &extent_start, &extent_end, | 999 | &extent_start, &extent_end, |
989 | EXTENT_DIRTY, NULL); | 1000 | EXTENT_DIRTY, NULL); |
990 | if (ret) { | 1001 | if (ret) |
991 | ret = 0; | 1002 | return 0; |
992 | break; | ||
993 | } | ||
994 | 1003 | ||
995 | /* This pinned extent is out of our range */ | 1004 | /* This pinned extent is out of our range */ |
996 | if (extent_start >= block_group->key.objectid + | 1005 | if (extent_start >= block_group->key.objectid + |
997 | block_group->key.offset) | 1006 | block_group->key.offset) |
998 | break; | 1007 | return 0; |
999 | 1008 | ||
1000 | extent_start = max(extent_start, start); | 1009 | extent_start = max(extent_start, start); |
1001 | extent_end = min(block_group->key.objectid + | 1010 | extent_end = min(block_group->key.objectid + |
@@ -1005,11 +1014,20 @@ add_ioctl_entries(struct btrfs_root *root, | |||
1005 | *entries += 1; | 1014 | *entries += 1; |
1006 | ret = io_ctl_add_entry(io_ctl, extent_start, len, NULL); | 1015 | ret = io_ctl_add_entry(io_ctl, extent_start, len, NULL); |
1007 | if (ret) | 1016 | if (ret) |
1008 | goto out_nospc; | 1017 | return -ENOSPC; |
1009 | 1018 | ||
1010 | start = extent_end; | 1019 | start = extent_end; |
1011 | } | 1020 | } |
1012 | 1021 | ||
1022 | return 0; | ||
1023 | } | ||
1024 | |||
1025 | static noinline_for_stack int | ||
1026 | write_bitmap_entries(struct io_ctl *io_ctl, struct list_head *bitmap_list) | ||
1027 | { | ||
1028 | struct list_head *pos, *n; | ||
1029 | int ret; | ||
1030 | |||
1013 | /* Write out the bitmaps */ | 1031 | /* Write out the bitmaps */ |
1014 | list_for_each_safe(pos, n, bitmap_list) { | 1032 | list_for_each_safe(pos, n, bitmap_list) { |
1015 | struct btrfs_free_space *entry = | 1033 | struct btrfs_free_space *entry = |
@@ -1017,36 +1035,24 @@ add_ioctl_entries(struct btrfs_root *root, | |||
1017 | 1035 | ||
1018 | ret = io_ctl_add_bitmap(io_ctl, entry->bitmap); | 1036 | ret = io_ctl_add_bitmap(io_ctl, entry->bitmap); |
1019 | if (ret) | 1037 | if (ret) |
1020 | goto out_nospc; | 1038 | return -ENOSPC; |
1021 | list_del_init(&entry->list); | 1039 | list_del_init(&entry->list); |
1022 | } | 1040 | } |
1023 | 1041 | ||
1024 | /* Zero out the rest of the pages just to make sure */ | 1042 | return 0; |
1025 | io_ctl_zero_remaining_pages(io_ctl); | 1043 | } |
1026 | |||
1027 | ret = btrfs_dirty_pages(root, inode, io_ctl->pages, io_ctl->num_pages, | ||
1028 | 0, i_size_read(inode), cached_state); | ||
1029 | io_ctl_drop_pages(io_ctl); | ||
1030 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, 0, | ||
1031 | i_size_read(inode) - 1, cached_state, GFP_NOFS); | ||
1032 | 1044 | ||
1033 | if (ret) | 1045 | static int flush_dirty_cache(struct inode *inode) |
1034 | goto fail; | 1046 | { |
1047 | int ret; | ||
1035 | 1048 | ||
1036 | ret = btrfs_wait_ordered_range(inode, 0, (u64)-1); | 1049 | ret = btrfs_wait_ordered_range(inode, 0, (u64)-1); |
1037 | if (ret) { | 1050 | if (ret) |
1038 | clear_extent_bit(&BTRFS_I(inode)->io_tree, 0, inode->i_size - 1, | 1051 | clear_extent_bit(&BTRFS_I(inode)->io_tree, 0, inode->i_size - 1, |
1039 | EXTENT_DIRTY | EXTENT_DELALLOC, 0, 0, NULL, | 1052 | EXTENT_DIRTY | EXTENT_DELALLOC, 0, 0, NULL, |
1040 | GFP_NOFS); | 1053 | GFP_NOFS); |
1041 | goto fail; | ||
1042 | } | ||
1043 | return 0; | ||
1044 | 1054 | ||
1045 | fail: | 1055 | return ret; |
1046 | return -1; | ||
1047 | |||
1048 | out_nospc: | ||
1049 | return -ENOSPC; | ||
1050 | } | 1056 | } |
1051 | 1057 | ||
1052 | static void noinline_for_stack | 1058 | static void noinline_for_stack |
@@ -1056,6 +1062,7 @@ cleanup_write_cache_enospc(struct inode *inode, | |||
1056 | struct list_head *bitmap_list) | 1062 | struct list_head *bitmap_list) |
1057 | { | 1063 | { |
1058 | struct list_head *pos, *n; | 1064 | struct list_head *pos, *n; |
1065 | |||
1059 | list_for_each_safe(pos, n, bitmap_list) { | 1066 | list_for_each_safe(pos, n, bitmap_list) { |
1060 | struct btrfs_free_space *entry = | 1067 | struct btrfs_free_space *entry = |
1061 | list_entry(pos, struct btrfs_free_space, list); | 1068 | list_entry(pos, struct btrfs_free_space, list); |
@@ -1088,18 +1095,15 @@ static int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode, | |||
1088 | { | 1095 | { |
1089 | struct extent_state *cached_state = NULL; | 1096 | struct extent_state *cached_state = NULL; |
1090 | struct io_ctl io_ctl; | 1097 | struct io_ctl io_ctl; |
1091 | struct list_head bitmap_list; | 1098 | LIST_HEAD(bitmap_list); |
1092 | int entries = 0; | 1099 | int entries = 0; |
1093 | int bitmaps = 0; | 1100 | int bitmaps = 0; |
1094 | int ret; | 1101 | int ret; |
1095 | int err = -1; | ||
1096 | |||
1097 | INIT_LIST_HEAD(&bitmap_list); | ||
1098 | 1102 | ||
1099 | if (!i_size_read(inode)) | 1103 | if (!i_size_read(inode)) |
1100 | return -1; | 1104 | return -1; |
1101 | 1105 | ||
1102 | ret = io_ctl_init(&io_ctl, inode, root); | 1106 | ret = io_ctl_init(&io_ctl, inode, root, 1); |
1103 | if (ret) | 1107 | if (ret) |
1104 | return -1; | 1108 | return -1; |
1105 | 1109 | ||
@@ -1109,42 +1113,65 @@ static int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode, | |||
1109 | lock_extent_bits(&BTRFS_I(inode)->io_tree, 0, i_size_read(inode) - 1, | 1113 | lock_extent_bits(&BTRFS_I(inode)->io_tree, 0, i_size_read(inode) - 1, |
1110 | 0, &cached_state); | 1114 | 0, &cached_state); |
1111 | 1115 | ||
1112 | |||
1113 | /* Make sure we can fit our crcs into the first page */ | ||
1114 | if (io_ctl.check_crcs && | ||
1115 | (io_ctl.num_pages * sizeof(u32)) >= PAGE_CACHE_SIZE) | ||
1116 | goto out_nospc; | ||
1117 | |||
1118 | io_ctl_set_generation(&io_ctl, trans->transid); | 1116 | io_ctl_set_generation(&io_ctl, trans->transid); |
1119 | 1117 | ||
1118 | /* Write out the extent entries in the free space cache */ | ||
1120 | ret = write_cache_extent_entries(&io_ctl, ctl, | 1119 | ret = write_cache_extent_entries(&io_ctl, ctl, |
1121 | block_group, &entries, &bitmaps, | 1120 | block_group, &entries, &bitmaps, |
1122 | &bitmap_list); | 1121 | &bitmap_list); |
1123 | if (ret) | 1122 | if (ret) |
1124 | goto out_nospc; | 1123 | goto out_nospc; |
1125 | 1124 | ||
1126 | ret = add_ioctl_entries(root, inode, block_group, &io_ctl, | 1125 | /* |
1127 | &cached_state, &bitmap_list, &entries); | 1126 | * Some spaces that are freed in the current transaction are pinned, |
1127 | * they will be added into free space cache after the transaction is | ||
1128 | * committed, we shouldn't lose them. | ||
1129 | */ | ||
1130 | ret = write_pinned_extent_entries(root, block_group, &io_ctl, &entries); | ||
1131 | if (ret) | ||
1132 | goto out_nospc; | ||
1133 | |||
1134 | /* At last, we write out all the bitmaps. */ | ||
1135 | ret = write_bitmap_entries(&io_ctl, &bitmap_list); | ||
1136 | if (ret) | ||
1137 | goto out_nospc; | ||
1128 | 1138 | ||
1129 | if (ret == -ENOSPC) | 1139 | /* Zero out the rest of the pages just to make sure */ |
1140 | io_ctl_zero_remaining_pages(&io_ctl); | ||
1141 | |||
1142 | /* Everything is written out, now we dirty the pages in the file. */ | ||
1143 | ret = btrfs_dirty_pages(root, inode, io_ctl.pages, io_ctl.num_pages, | ||
1144 | 0, i_size_read(inode), &cached_state); | ||
1145 | if (ret) | ||
1130 | goto out_nospc; | 1146 | goto out_nospc; |
1131 | else if (ret) | 1147 | |
1148 | /* | ||
1149 | * Release the pages and unlock the extent, we will flush | ||
1150 | * them out later | ||
1151 | */ | ||
1152 | io_ctl_drop_pages(&io_ctl); | ||
1153 | |||
1154 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, 0, | ||
1155 | i_size_read(inode) - 1, &cached_state, GFP_NOFS); | ||
1156 | |||
1157 | /* Flush the dirty pages in the cache file. */ | ||
1158 | ret = flush_dirty_cache(inode); | ||
1159 | if (ret) | ||
1132 | goto out; | 1160 | goto out; |
1133 | 1161 | ||
1134 | err = update_cache_item(trans, root, inode, path, offset, | 1162 | /* Update the cache item to tell everyone this cache file is valid. */ |
1163 | ret = update_cache_item(trans, root, inode, path, offset, | ||
1135 | entries, bitmaps); | 1164 | entries, bitmaps); |
1136 | |||
1137 | out: | 1165 | out: |
1138 | io_ctl_free(&io_ctl); | 1166 | io_ctl_free(&io_ctl); |
1139 | if (err) { | 1167 | if (ret) { |
1140 | invalidate_inode_pages2(inode->i_mapping); | 1168 | invalidate_inode_pages2(inode->i_mapping); |
1141 | BTRFS_I(inode)->generation = 0; | 1169 | BTRFS_I(inode)->generation = 0; |
1142 | } | 1170 | } |
1143 | btrfs_update_inode(trans, root, inode); | 1171 | btrfs_update_inode(trans, root, inode); |
1144 | return err; | 1172 | return ret; |
1145 | 1173 | ||
1146 | out_nospc: | 1174 | out_nospc: |
1147 | |||
1148 | cleanup_write_cache_enospc(inode, &io_ctl, &cached_state, &bitmap_list); | 1175 | cleanup_write_cache_enospc(inode, &io_ctl, &cached_state, &bitmap_list); |
1149 | goto out; | 1176 | goto out; |
1150 | } | 1177 | } |