diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-05-21 20:49:22 +0300 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-05-21 20:49:22 +0300 | 
| commit | 07be1337b9e8bfcd855c6e9175b5066a30ac609b (patch) | |
| tree | e40ad01dc89f6eb17d461939b809fea3387fc2a5 /fs/btrfs/ordered-data.c | |
| parent | 63d222b9d277c4d7bf08afd1631a7f8e327a825c (diff) | |
| parent | c315ef8d9db7f1a0ebd023a395ebdfde1c68057e (diff) | |
| download | linux-07be1337b9e8bfcd855c6e9175b5066a30ac609b.tar.xz | |
Merge branch 'for-linus-4.7' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs
Pull btrfs updates from Chris Mason:
 "This has our merge window series of cleanups and fixes.  These target
  a wide range of issues, but do include some important fixes for
  qgroups, O_DIRECT, and fsync handling.  Jeff Mahoney moved around a
  few definitions to make them easier for userland to consume.
  Also whiteout support is included now that issues with overlayfs have
  been cleared up.
  I have one more fix pending for page faults during btrfs_copy_from_user,
  but I wanted to get this bulk out the door first"
* 'for-linus-4.7' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs: (90 commits)
  btrfs: fix memory leak during RAID 5/6 device replacement
  Btrfs: add semaphore to synchronize direct IO writes with fsync
  Btrfs: fix race between block group relocation and nocow writes
  Btrfs: fix race between fsync and direct IO writes for prealloc extents
  Btrfs: fix number of transaction units for renames with whiteout
  Btrfs: pin logs earlier when doing a rename exchange operation
  Btrfs: unpin logs if rename exchange operation fails
  Btrfs: fix inode leak on failure to setup whiteout inode in rename
  btrfs: add support for RENAME_EXCHANGE and RENAME_WHITEOUT
  Btrfs: pin log earlier when renaming
  Btrfs: unpin log if rename operation fails
  Btrfs: don't do unnecessary delalloc flushes when relocating
  Btrfs: don't wait for unrelated IO to finish before relocation
  Btrfs: fix empty symlink after creating symlink and fsync parent dir
  Btrfs: fix for incorrect directory entries after fsync log replay
  btrfs: build fixup for qgroup_account_snapshot
  btrfs: qgroup: Fix qgroup accounting when creating snapshot
  Btrfs: fix fspath error deallocation
  btrfs: make find_workspace warn if there are no workspaces
  btrfs: make find_workspace always succeed
  ...
Diffstat (limited to 'fs/btrfs/ordered-data.c')
| -rw-r--r-- | fs/btrfs/ordered-data.c | 26 | 
1 files changed, 19 insertions, 7 deletions
diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c index 0de7da5a610d..559170464d7c 100644 --- a/fs/btrfs/ordered-data.c +++ b/fs/btrfs/ordered-data.c @@ -661,14 +661,15 @@ static void btrfs_run_ordered_extent_work(struct btrfs_work *work)   * wait for all the ordered extents in a root.  This is done when balancing   * space between drives.   */ -int btrfs_wait_ordered_extents(struct btrfs_root *root, int nr) +int btrfs_wait_ordered_extents(struct btrfs_root *root, int nr, +			       const u64 range_start, const u64 range_len)  { -	struct list_head splice, works; +	LIST_HEAD(splice); +	LIST_HEAD(skipped); +	LIST_HEAD(works);  	struct btrfs_ordered_extent *ordered, *next;  	int count = 0; - -	INIT_LIST_HEAD(&splice); -	INIT_LIST_HEAD(&works); +	const u64 range_end = range_start + range_len;  	mutex_lock(&root->ordered_extent_mutex);  	spin_lock(&root->ordered_extent_lock); @@ -676,6 +677,14 @@ int btrfs_wait_ordered_extents(struct btrfs_root *root, int nr)  	while (!list_empty(&splice) && nr) {  		ordered = list_first_entry(&splice, struct btrfs_ordered_extent,  					   root_extent_list); + +		if (range_end <= ordered->start || +		    ordered->start + ordered->disk_len <= range_start) { +			list_move_tail(&ordered->root_extent_list, &skipped); +			cond_resched_lock(&root->ordered_extent_lock); +			continue; +		} +  		list_move_tail(&ordered->root_extent_list,  			       &root->ordered_extents);  		atomic_inc(&ordered->refs); @@ -694,6 +703,7 @@ int btrfs_wait_ordered_extents(struct btrfs_root *root, int nr)  			nr--;  		count++;  	} +	list_splice_tail(&skipped, &root->ordered_extents);  	list_splice_tail(&splice, &root->ordered_extents);  	spin_unlock(&root->ordered_extent_lock); @@ -708,7 +718,8 @@ int btrfs_wait_ordered_extents(struct btrfs_root *root, int nr)  	return count;  } -void btrfs_wait_ordered_roots(struct btrfs_fs_info *fs_info, int nr) +void btrfs_wait_ordered_roots(struct btrfs_fs_info *fs_info, int nr, +			      const u64 range_start, const u64 range_len)  {  	struct btrfs_root *root;  	struct list_head splice; @@ -728,7 +739,8 @@ void btrfs_wait_ordered_roots(struct btrfs_fs_info *fs_info, int nr)  			       &fs_info->ordered_roots);  		spin_unlock(&fs_info->ordered_root_lock); -		done = btrfs_wait_ordered_extents(root, nr); +		done = btrfs_wait_ordered_extents(root, nr, +						  range_start, range_len);  		btrfs_put_fs_root(root);  		spin_lock(&fs_info->ordered_root_lock);  | 
