summaryrefslogtreecommitdiffstats
path: root/fs/btrfs/ioctl.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2008-08-01 11:27:23 -0400
committerChris Mason <chris.mason@oracle.com>2008-09-25 11:04:06 -0400
commitf87f057b49ee52cf5c627ab27a706e3252767c9f (patch)
tree4f8cc04e91ae836f4dd1b2151f47cbd1bd1b9367 /fs/btrfs/ioctl.c
parent492bb6deee3416ad792dcd8584ebd95c463af1a6 (diff)
downloadlinux-stable-f87f057b49ee52cf5c627ab27a706e3252767c9f.tar.gz
linux-stable-f87f057b49ee52cf5c627ab27a706e3252767c9f.tar.bz2
linux-stable-f87f057b49ee52cf5c627ab27a706e3252767c9f.zip
Btrfs: Improve and cleanup locking done by walk_down_tree
While dropping snapshots, walk_down_tree does most of the work of checking reference counts and limiting tree traversal to just the blocks that we are freeing. It dropped and held the allocation mutex in strange and confusing ways, this commit changes it to only hold the mutex while actually freeing a block. The rest of the checks around reference counts should be safe without the lock because we only allow one process in btrfs_drop_snapshot at a time. Other processes dropping reference counts should not drop it to 1 because their tree roots already have an extra ref on the block. Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/ioctl.c')
-rw-r--r--fs/btrfs/ioctl.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 5e627746c4e8..224da287b3ed 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -268,6 +268,12 @@ again:
}
set_page_extent_mapped(page);
+ /*
+ * this makes sure page_mkwrite is called on the
+ * page if it is dirtied again later
+ */
+ clear_page_dirty_for_io(page);
+
set_extent_delalloc(io_tree, page_start,
page_end, GFP_NOFS);