|
@@ -2359,35 +2359,28 @@ read_block_for_search(struct btrfs_trans_handle *trans,
|
|
|
tmp = btrfs_find_tree_block(root, blocknr, blocksize);
|
|
|
if (tmp) {
|
|
|
/* first we do an atomic uptodate check */
|
|
|
- if (btrfs_buffer_uptodate(tmp, 0, 1) > 0) {
|
|
|
- if (btrfs_buffer_uptodate(tmp, gen, 1) > 0) {
|
|
|
- /*
|
|
|
- * we found an up to date block without
|
|
|
- * sleeping, return
|
|
|
- * right away
|
|
|
- */
|
|
|
- *eb_ret = tmp;
|
|
|
- return 0;
|
|
|
- }
|
|
|
- /* the pages were up to date, but we failed
|
|
|
- * the generation number check. Do a full
|
|
|
- * read for the generation number that is correct.
|
|
|
- * We must do this without dropping locks so
|
|
|
- * we can trust our generation number
|
|
|
- */
|
|
|
- free_extent_buffer(tmp);
|
|
|
- btrfs_set_path_blocking(p);
|
|
|
+ if (btrfs_buffer_uptodate(tmp, gen, 1) > 0) {
|
|
|
+ *eb_ret = tmp;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
|
|
|
- /* now we're allowed to do a blocking uptodate check */
|
|
|
- tmp = read_tree_block(root, blocknr, blocksize, gen);
|
|
|
- if (tmp && btrfs_buffer_uptodate(tmp, gen, 0) > 0) {
|
|
|
- *eb_ret = tmp;
|
|
|
- return 0;
|
|
|
- }
|
|
|
- free_extent_buffer(tmp);
|
|
|
- btrfs_release_path(p);
|
|
|
- return -EIO;
|
|
|
+ /* the pages were up to date, but we failed
|
|
|
+ * the generation number check. Do a full
|
|
|
+ * read for the generation number that is correct.
|
|
|
+ * We must do this without dropping locks so
|
|
|
+ * we can trust our generation number
|
|
|
+ */
|
|
|
+ btrfs_set_path_blocking(p);
|
|
|
+
|
|
|
+ /* now we're allowed to do a blocking uptodate check */
|
|
|
+ ret = btrfs_read_buffer(tmp, gen);
|
|
|
+ if (!ret) {
|
|
|
+ *eb_ret = tmp;
|
|
|
+ return 0;
|
|
|
}
|
|
|
+ free_extent_buffer(tmp);
|
|
|
+ btrfs_release_path(p);
|
|
|
+ return -EIO;
|
|
|
}
|
|
|
|
|
|
/*
|