Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 08637024 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull btrfs fixes from Chris Mason:
 "Eric's rcu barrier patch fixes a long standing problem with our
  unmount code hanging on to devices in workqueue helpers.  Liu Bo
  nailed down a difficult assertion for in-memory extent mappings."

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs:
  Btrfs: fix warning of free_extent_map
  Btrfs: fix warning when creating snapshots
  Btrfs: return as soon as possible when edquot happens
  Btrfs: return EIO if we have extent tree corruption
  btrfs: use rcu_barrier() to wait for bdev puts at unmount
  Btrfs: remove btrfs_try_spin_lock
  Btrfs: get better concurrency for snapshot-aware defrag work
parents e2043785 3b277594
Loading
Loading
Loading
Loading
+4 −1
Original line number Original line Diff line number Diff line
@@ -1467,8 +1467,11 @@ int lookup_inline_extent_backref(struct btrfs_trans_handle *trans,
	if (ret && !insert) {
	if (ret && !insert) {
		err = -ENOENT;
		err = -ENOENT;
		goto out;
		goto out;
	} else if (ret) {
		err = -EIO;
		WARN_ON(1);
		goto out;
	}
	}
	BUG_ON(ret); /* Corruption */


	leaf = path->nodes[0];
	leaf = path->nodes[0];
	item_size = btrfs_item_size_nr(leaf, path->slots[0]);
	item_size = btrfs_item_size_nr(leaf, path->slots[0]);
+1 −0
Original line number Original line Diff line number Diff line
@@ -591,6 +591,7 @@ void btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end,
		}
		}
		compressed = test_bit(EXTENT_FLAG_COMPRESSED, &em->flags);
		compressed = test_bit(EXTENT_FLAG_COMPRESSED, &em->flags);
		clear_bit(EXTENT_FLAG_PINNED, &em->flags);
		clear_bit(EXTENT_FLAG_PINNED, &em->flags);
		clear_bit(EXTENT_FLAG_LOGGING, &flags);
		remove_extent_mapping(em_tree, em);
		remove_extent_mapping(em_tree, em);
		if (no_splits)
		if (no_splits)
			goto next;
			goto next;
+3 −0
Original line number Original line Diff line number Diff line
@@ -2312,6 +2312,7 @@ static noinline int relink_extent_backref(struct btrfs_path *path,
	key.type = BTRFS_EXTENT_DATA_KEY;
	key.type = BTRFS_EXTENT_DATA_KEY;
	key.offset = start;
	key.offset = start;


	path->leave_spinning = 1;
	if (merge) {
	if (merge) {
		struct btrfs_file_extent_item *fi;
		struct btrfs_file_extent_item *fi;
		u64 extent_len;
		u64 extent_len;
@@ -2368,6 +2369,7 @@ static noinline int relink_extent_backref(struct btrfs_path *path,


	btrfs_mark_buffer_dirty(leaf);
	btrfs_mark_buffer_dirty(leaf);
	inode_add_bytes(inode, len);
	inode_add_bytes(inode, len);
	btrfs_release_path(path);


	ret = btrfs_inc_extent_ref(trans, root, new->bytenr,
	ret = btrfs_inc_extent_ref(trans, root, new->bytenr,
			new->disk_len, 0,
			new->disk_len, 0,
@@ -2381,6 +2383,7 @@ static noinline int relink_extent_backref(struct btrfs_path *path,
	ret = 1;
	ret = 1;
out_free_path:
out_free_path:
	btrfs_release_path(path);
	btrfs_release_path(path);
	path->leave_spinning = 0;
	btrfs_end_transaction(trans, root);
	btrfs_end_transaction(trans, root);
out_unlock:
out_unlock:
	unlock_extent_cached(&BTRFS_I(inode)->io_tree, lock_start, lock_end,
	unlock_extent_cached(&BTRFS_I(inode)->io_tree, lock_start, lock_end,
+0 −1
Original line number Original line Diff line number Diff line
@@ -26,7 +26,6 @@


void btrfs_tree_lock(struct extent_buffer *eb);
void btrfs_tree_lock(struct extent_buffer *eb);
void btrfs_tree_unlock(struct extent_buffer *eb);
void btrfs_tree_unlock(struct extent_buffer *eb);
int btrfs_try_spin_lock(struct extent_buffer *eb);


void btrfs_tree_read_lock(struct extent_buffer *eb);
void btrfs_tree_read_lock(struct extent_buffer *eb);
void btrfs_tree_read_unlock(struct extent_buffer *eb);
void btrfs_tree_read_unlock(struct extent_buffer *eb);
+6 −4
Original line number Original line Diff line number Diff line
@@ -1525,21 +1525,23 @@ int btrfs_qgroup_reserve(struct btrfs_root *root, u64 num_bytes)


		if ((qg->lim_flags & BTRFS_QGROUP_LIMIT_MAX_RFER) &&
		if ((qg->lim_flags & BTRFS_QGROUP_LIMIT_MAX_RFER) &&
		    qg->reserved + qg->rfer + num_bytes >
		    qg->reserved + qg->rfer + num_bytes >
		    qg->max_rfer)
		    qg->max_rfer) {
			ret = -EDQUOT;
			ret = -EDQUOT;
			goto out;
		}


		if ((qg->lim_flags & BTRFS_QGROUP_LIMIT_MAX_EXCL) &&
		if ((qg->lim_flags & BTRFS_QGROUP_LIMIT_MAX_EXCL) &&
		    qg->reserved + qg->excl + num_bytes >
		    qg->reserved + qg->excl + num_bytes >
		    qg->max_excl)
		    qg->max_excl) {
			ret = -EDQUOT;
			ret = -EDQUOT;
			goto out;
		}


		list_for_each_entry(glist, &qg->groups, next_group) {
		list_for_each_entry(glist, &qg->groups, next_group) {
			ulist_add(ulist, glist->group->qgroupid,
			ulist_add(ulist, glist->group->qgroupid,
				  (uintptr_t)glist->group, GFP_ATOMIC);
				  (uintptr_t)glist->group, GFP_ATOMIC);
		}
		}
	}
	}
	if (ret)
		goto out;


	/*
	/*
	 * no limits exceeded, now record the reservation into all qgroups
	 * no limits exceeded, now record the reservation into all qgroups
Loading