From 577fe5d3672d6bb037684be947f1c801be168677 Mon Sep 17 00:00:00 2001 From: Josef Bacik Date: Thu, 30 Aug 2012 20:06:49 -0400 Subject: [PATCH] --- yaml --- r: 332535 b: refs/heads/master c: 7014cdb49305eda0767d2ae6136f8c191ea8fd81 h: refs/heads/master i: 332533: c49d9ec1654592e5d289ff07540a8c3eadbd3706 332531: b54ec4756c31f0b36058af504b3c06230a861e47 332527: e63a77be845dd21a9c9bd53d949881cd0a94efe6 v: v3 --- [refs] | 2 +- trunk/fs/btrfs/ctree.h | 4 ++-- trunk/fs/btrfs/file.c | 13 +++++++++---- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index a5d2f180f402..cf8bab06d371 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: ac14aed66558d686b1f95dac1f07ecfe11d8c30e +refs/heads/master: 7014cdb49305eda0767d2ae6136f8c191ea8fd81 diff --git a/trunk/fs/btrfs/ctree.h b/trunk/fs/btrfs/ctree.h index 88adfe638409..b7cd3adb5a58 100644 --- a/trunk/fs/btrfs/ctree.h +++ b/trunk/fs/btrfs/ctree.h @@ -3316,8 +3316,8 @@ int btrfs_add_inode_defrag(struct btrfs_trans_handle *trans, struct inode *inode); int btrfs_run_defrag_inodes(struct btrfs_fs_info *fs_info); int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync); -int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, - int skip_pinned); +void btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, + int skip_pinned); int btrfs_replace_extent_cache(struct inode *inode, struct extent_map *replace, u64 start, u64 end, int skip_pinned, int modified); diff --git a/trunk/fs/btrfs/file.c b/trunk/fs/btrfs/file.c index 57026a6e9c94..a50e98733e28 100644 --- a/trunk/fs/btrfs/file.c +++ b/trunk/fs/btrfs/file.c @@ -459,8 +459,8 @@ int btrfs_dirty_pages(struct btrfs_root *root, struct inode *inode, * this drops all the extents in the cache that intersect the range * [start, end]. Existing extents are split as required. */ -int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, - int skip_pinned) +void btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, + int skip_pinned) { struct extent_map *em; struct extent_map *split = NULL; @@ -479,11 +479,14 @@ int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, testend = 0; } while (1) { + int no_splits = 0; + if (!split) split = alloc_extent_map(); if (!split2) split2 = alloc_extent_map(); - BUG_ON(!split || !split2); /* -ENOMEM */ + if (!split || !split2) + no_splits = 1; write_lock(&em_tree->lock); em = lookup_extent_mapping(em_tree, start, len); @@ -509,6 +512,8 @@ int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, compressed = test_bit(EXTENT_FLAG_COMPRESSED, &em->flags); clear_bit(EXTENT_FLAG_PINNED, &em->flags); remove_extent_mapping(em_tree, em); + if (no_splits) + goto next; if (em->block_start < EXTENT_MAP_LAST_BYTE && em->start < start) { @@ -559,6 +564,7 @@ int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, free_extent_map(split); split = NULL; } +next: write_unlock(&em_tree->lock); /* once for us */ @@ -570,7 +576,6 @@ int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, free_extent_map(split); if (split2) free_extent_map(split2); - return 0; } /*