Btrfs: fix double range unlock of hole region when reading page
[firefly-linux-kernel-4.4.55.git] / fs / btrfs / extent_io.c
index ecb1204468c3f2cef32af8b0190e3c9f691ebfa9..6e6df34d74f051df17e9a3b6079cadf2af49d8bb 100644 (file)
@@ -3070,8 +3070,12 @@ static int __do_readpage(struct extent_io_tree *tree,
 
                        set_extent_uptodate(tree, cur, cur + iosize - 1,
                                            &cached, GFP_NOFS);
-                       unlock_extent_cached(tree, cur, cur + iosize - 1,
-                                            &cached, GFP_NOFS);
+                       if (parent_locked)
+                               free_extent_state(cached);
+                       else
+                               unlock_extent_cached(tree, cur,
+                                                    cur + iosize - 1,
+                                                    &cached, GFP_NOFS);
                        cur = cur + iosize;
                        pg_offset += iosize;
                        continue;