|
@@ -1987,7 +1987,13 @@ cleanup:
|
|
|
kfree(pointers);
|
|
|
|
|
|
cleanup_io:
|
|
|
- if (rbio->operation == BTRFS_RBIO_READ_REBUILD) {
|
|
|
+ /*
|
|
|
+ * Similar to READ_REBUILD, REBUILD_MISSING at this point also has a
|
|
|
+ * valid rbio which is consistent with ondisk content, thus such a
|
|
|
+ * valid rbio can be cached to avoid further disk reads.
|
|
|
+ */
|
|
|
+ if (rbio->operation == BTRFS_RBIO_READ_REBUILD ||
|
|
|
+ rbio->operation == BTRFS_RBIO_REBUILD_MISSING) {
|
|
|
/*
|
|
|
* - In case of two failures, where rbio->failb != -1:
|
|
|
*
|
|
@@ -2008,8 +2014,6 @@ cleanup_io:
|
|
|
else
|
|
|
clear_bit(RBIO_CACHE_READY_BIT, &rbio->flags);
|
|
|
|
|
|
- rbio_orig_end_io(rbio, err);
|
|
|
- } else if (rbio->operation == BTRFS_RBIO_REBUILD_MISSING) {
|
|
|
rbio_orig_end_io(rbio, err);
|
|
|
} else if (err == BLK_STS_OK) {
|
|
|
rbio->faila = -1;
|