|
@@ -5009,8 +5009,11 @@ struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info,
|
|
|
uptodate = 0;
|
|
|
|
|
|
/*
|
|
|
- * see below about how we avoid a nasty race with release page
|
|
|
- * and why we unlock later
|
|
|
+ * We can't unlock the pages just yet since the extent buffer
|
|
|
+ * hasn't been properly inserted in the radix tree, this
|
|
|
+ * opens a race with btree_releasepage which can free a page
|
|
|
+ * while we are still filling in all pages for the buffer and
|
|
|
+ * we could crash.
|
|
|
*/
|
|
|
}
|
|
|
if (uptodate)
|
|
@@ -5039,13 +5042,9 @@ again:
|
|
|
set_bit(EXTENT_BUFFER_IN_TREE, &eb->bflags);
|
|
|
|
|
|
/*
|
|
|
- * there is a race where release page may have
|
|
|
- * tried to find this extent buffer in the radix
|
|
|
- * but failed. It will tell the VM it is safe to
|
|
|
- * reclaim the, and it will clear the page private bit.
|
|
|
- * We must make sure to set the page private bit properly
|
|
|
- * after the extent buffer is in the radix tree so
|
|
|
- * it doesn't get lost
|
|
|
+ * Now it's safe to unlock the pages because any calls to
|
|
|
+ * btree_releasepage will correctly detect that a page belongs to a
|
|
|
+ * live buffer and won't free them prematurely.
|
|
|
*/
|
|
|
for (i = 0; i < num_pages; i++)
|
|
|
unlock_page(eb->pages[i]);
|