Btrfs: replace: cache rbio when rebuild data on missing device
authorLiu Bo <bo.liu@linux.alibaba.com>
Thu, 22 Mar 2018 01:20:11 +0000 (09:20 +0800)
committerDavid Sterba <dsterba@suse.com>
Fri, 30 Mar 2018 23:41:12 +0000 (01:41 +0200)
Rebuild on missing device is as same as recover, after it's done, rbio
has data which is consistent with on-disk data, so it can be cached to
avoid further reads.

Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
Signed-off-by: Liu Bo <bo.liu@linux.alibaba.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/raid56.c

index 002bddc..c3a2bc8 100644 (file)
@@ -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:
                 *
@@ -2009,8 +2015,6 @@ cleanup_io:
                        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;
                rbio->failb = -1;