diff options
author | Mauro Carvalho Chehab <mchehab@redhat.com> | 2013-01-11 10:28:19 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2013-01-11 10:28:19 -0500 |
commit | 734d1ece37fbf3d2ddfc71bc6c69e0fe35f02542 (patch) | |
tree | c4805dd7e746b1feb9e09e9849f3245d0b2c0c6b /fs/btrfs/extent_map.c | |
parent | 216c82c6aba63eeb49d7654b448e0d47bea255bb (diff) | |
parent | 9931faca02c604c22335f5a935a501bb2ace6e20 (diff) |
Merge tag 'v3.8-rc3' into v4l_for_linus
Linux 3.8-rc3
* tag 'v3.8-rc3': (11110 commits)
Linux 3.8-rc3
mm: reinstante dropped pmd_trans_splitting() check
cred: Remove tgcred pointer from struct cred
drm/ttm: fix fence locking in ttm_buffer_object_transfer
ARM: clps711x: Fix bad merge of clockevents setup
ARM: highbank: save and restore L2 cache and GIC on suspend
ARM: highbank: add a power request clear
ARM: highbank: fix secondary boot and hotplug
ARM: highbank: fix typos with hignbank in power request functions
ARM: dts: fix highbank cpu mpidr values
ARM: dts: add device_type prop to cpu nodes on Calxeda platforms
drm/prime: drop reference on imported dma-buf come from gem
xen/netfront: improve truesize tracking
ARM: mx5: Fix MX53 flexcan2 clock
ARM: OMAP2+: am33xx-hwmod: Fix wrongly terminated am33xx_usbss_mpu_irqs array
sctp: fix Kconfig bug in default cookie hmac selection
EDAC: Cleanup device deregistering path
EDAC: Fix EDAC Kconfig menu
EDAC: Fix kernel panic on module unloading
ALSA: hda - add mute LED for HP Pavilion 17 (Realtek codec)
...
Diffstat (limited to 'fs/btrfs/extent_map.c')
-rw-r--r-- | fs/btrfs/extent_map.c | 27 |
1 files changed, 11 insertions, 16 deletions
diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c index b8cbc8d5c7f7..f169d6b11d7f 100644 --- a/fs/btrfs/extent_map.c +++ b/fs/btrfs/extent_map.c | |||
@@ -49,7 +49,7 @@ void extent_map_tree_init(struct extent_map_tree *tree) | |||
49 | struct extent_map *alloc_extent_map(void) | 49 | struct extent_map *alloc_extent_map(void) |
50 | { | 50 | { |
51 | struct extent_map *em; | 51 | struct extent_map *em; |
52 | em = kmem_cache_alloc(extent_map_cache, GFP_NOFS); | 52 | em = kmem_cache_zalloc(extent_map_cache, GFP_NOFS); |
53 | if (!em) | 53 | if (!em) |
54 | return NULL; | 54 | return NULL; |
55 | em->in_tree = 0; | 55 | em->in_tree = 0; |
@@ -198,16 +198,15 @@ static void try_merge_map(struct extent_map_tree *tree, struct extent_map *em) | |||
198 | merge = rb_entry(rb, struct extent_map, rb_node); | 198 | merge = rb_entry(rb, struct extent_map, rb_node); |
199 | if (rb && mergable_maps(merge, em)) { | 199 | if (rb && mergable_maps(merge, em)) { |
200 | em->start = merge->start; | 200 | em->start = merge->start; |
201 | em->orig_start = merge->orig_start; | ||
201 | em->len += merge->len; | 202 | em->len += merge->len; |
202 | em->block_len += merge->block_len; | 203 | em->block_len += merge->block_len; |
203 | em->block_start = merge->block_start; | 204 | em->block_start = merge->block_start; |
204 | merge->in_tree = 0; | 205 | merge->in_tree = 0; |
205 | if (merge->generation > em->generation) { | 206 | em->mod_len = (em->mod_len + em->mod_start) - merge->mod_start; |
206 | em->mod_start = em->start; | 207 | em->mod_start = merge->mod_start; |
207 | em->mod_len = em->len; | 208 | em->generation = max(em->generation, merge->generation); |
208 | em->generation = merge->generation; | 209 | list_move(&em->list, &tree->modified_extents); |
209 | list_move(&em->list, &tree->modified_extents); | ||
210 | } | ||
211 | 210 | ||
212 | list_del_init(&merge->list); | 211 | list_del_init(&merge->list); |
213 | rb_erase(&merge->rb_node, &tree->map); | 212 | rb_erase(&merge->rb_node, &tree->map); |
@@ -223,23 +222,19 @@ static void try_merge_map(struct extent_map_tree *tree, struct extent_map *em) | |||
223 | em->block_len += merge->len; | 222 | em->block_len += merge->len; |
224 | rb_erase(&merge->rb_node, &tree->map); | 223 | rb_erase(&merge->rb_node, &tree->map); |
225 | merge->in_tree = 0; | 224 | merge->in_tree = 0; |
226 | if (merge->generation > em->generation) { | 225 | em->mod_len = (merge->mod_start + merge->mod_len) - em->mod_start; |
227 | em->mod_len = em->len; | 226 | em->generation = max(em->generation, merge->generation); |
228 | em->generation = merge->generation; | ||
229 | list_move(&em->list, &tree->modified_extents); | ||
230 | } | ||
231 | list_del_init(&merge->list); | 227 | list_del_init(&merge->list); |
232 | free_extent_map(merge); | 228 | free_extent_map(merge); |
233 | } | 229 | } |
234 | } | 230 | } |
235 | 231 | ||
236 | /** | 232 | /** |
237 | * unpint_extent_cache - unpin an extent from the cache | 233 | * unpin_extent_cache - unpin an extent from the cache |
238 | * @tree: tree to unpin the extent in | 234 | * @tree: tree to unpin the extent in |
239 | * @start: logical offset in the file | 235 | * @start: logical offset in the file |
240 | * @len: length of the extent | 236 | * @len: length of the extent |
241 | * @gen: generation that this extent has been modified in | 237 | * @gen: generation that this extent has been modified in |
242 | * @prealloc: if this is set we need to clear the prealloc flag | ||
243 | * | 238 | * |
244 | * Called after an extent has been written to disk properly. Set the generation | 239 | * Called after an extent has been written to disk properly. Set the generation |
245 | * to the generation that actually added the file item to the inode so we know | 240 | * to the generation that actually added the file item to the inode so we know |
@@ -266,9 +261,9 @@ int unpin_extent_cache(struct extent_map_tree *tree, u64 start, u64 len, | |||
266 | em->mod_start = em->start; | 261 | em->mod_start = em->start; |
267 | em->mod_len = em->len; | 262 | em->mod_len = em->len; |
268 | 263 | ||
269 | if (test_bit(EXTENT_FLAG_PREALLOC, &em->flags)) { | 264 | if (test_bit(EXTENT_FLAG_FILLING, &em->flags)) { |
270 | prealloc = true; | 265 | prealloc = true; |
271 | clear_bit(EXTENT_FLAG_PREALLOC, &em->flags); | 266 | clear_bit(EXTENT_FLAG_FILLING, &em->flags); |
272 | } | 267 | } |
273 | 268 | ||
274 | try_merge_map(tree, em); | 269 | try_merge_map(tree, em); |