Omar Sandoval
5ca64f45e9
btrfs: fix race on ENOMEM in alloc_extent_buffer
...
Consider the following interleaving of overlapping calls to
alloc_extent_buffer:
Call 1:
- Successfully allocates a few pages with find_or_create_page
- find_or_create_page fails, goto free_eb
- Unlocks the allocated pages
Call 2:
- Calls find_or_create_page and gets a page in call 1's extent_buffer
- Finds that the page is already associated with an extent_buffer
- Grabs a reference to the half-written extent_buffer and calls
mark_extent_buffer_accessed on it
mark_extent_buffer_accessed will then try to call mark_page_accessed on
a null page and panic.
The fix is to decrement the reference count on the half-written
extent_buffer before unlocking the pages so call 2 won't use it. We
should also set exists = NULL in the case that we don't use exists to
avoid accidentally returning a freed extent_buffer in an error case.
Signed-off-by: Omar Sandoval <osandov@osandov.com>
Reviewed-by: David Sterba <dsterba@suse.cz>
Reviewed-by: Liu Bo <bo.li.liu@oracle.com>
Signed-off-by: Chris Mason <clm@fb.com>
2015-04-26 06:27:00 -07:00
..
2015-02-22 11:38:41 -05:00
2014-08-08 15:57:24 -07:00
2015-02-17 14:34:53 -08:00
2015-02-12 13:50:21 -08:00
2015-02-22 11:43:34 -05:00
2015-02-17 14:34:50 -08:00
2014-08-08 15:57:24 -07:00
2015-04-26 06:27:00 -07:00
2015-02-22 11:38:41 -05:00
2015-02-22 17:42:14 -08:00
2015-02-16 14:32:03 -05:00
2015-02-22 11:38:41 -05:00
2015-02-20 04:56:43 -05:00
2014-08-08 15:57:25 -07:00
2015-02-22 11:38:43 -05:00
2014-06-06 16:08:14 -07:00
2015-01-18 01:03:45 -05:00
2015-03-03 02:03:56 -06:00
2015-01-29 19:16:40 +01:00
2014-08-08 15:57:18 -07:00
2015-02-16 17:56:03 -08:00
2015-02-22 11:38:41 -05:00
2015-02-16 17:56:04 -08:00
2015-01-05 11:13:55 +01:00
2015-02-22 18:05:13 -08:00
2015-02-12 19:28:50 -08:00
2015-02-17 14:34:51 -08:00
2014-10-13 17:52:21 +01:00
2015-03-19 15:29:22 +01:00
2015-02-22 11:38:41 -05:00
2014-12-10 17:41:16 -08:00
2015-02-22 11:38:41 -05:00
2014-08-07 14:40:09 -04:00
2014-08-08 15:57:22 -07:00
2015-02-22 11:38:41 -05:00
2015-01-20 14:03:05 -07:00
2015-01-07 09:51:49 +01:00
2014-11-18 10:15:29 +01:00
2015-01-19 15:59:58 -05:00
2015-02-22 17:42:14 -08:00
2015-02-17 16:12:34 -08:00
2015-03-16 21:51:20 +01:00
2015-02-12 10:39:41 -08:00
2014-08-06 18:01:12 -07:00
2014-08-08 15:57:20 -07:00
2015-02-17 14:56:45 -08:00
2015-03-03 21:52:30 -05:00
2014-09-17 16:33:11 -04:00
2015-03-19 15:49:27 -04:00
2015-03-12 18:46:08 -07:00
2015-03-12 18:46:08 -07:00
2015-01-20 14:03:04 -07:00
2015-03-12 18:46:07 -07:00
2014-10-14 02:18:22 +02:00
2015-03-18 10:29:48 +01:00
2015-03-17 09:31:30 -07:00
2015-01-16 16:01:29 -08:00
2014-08-08 15:57:26 -07:00
2015-02-10 15:52:38 -08:00
2015-01-20 14:03:05 -07:00
2015-02-22 11:38:41 -05:00
2015-01-20 14:03:05 -07:00
2014-11-27 18:48:44 +00:00
2015-02-15 11:11:47 -08:00
2015-02-15 10:11:39 -08:00
2015-02-05 16:34:25 +01:00
2015-02-17 14:34:51 -08:00
2015-02-24 10:15:18 +11:00
2015-02-20 04:56:44 -05:00
2014-06-10 13:57:22 -07:00
2015-02-20 04:03:58 -05:00
2014-11-19 13:01:20 -05:00
2014-10-09 02:39:00 -04:00
2015-02-19 12:21:36 +01:00
2014-12-13 12:42:51 -08:00
2014-06-04 16:54:21 -07:00
2014-12-17 08:27:14 -05:00
2014-12-13 12:42:51 -08:00
2015-02-12 14:13:23 -08:00
2014-10-21 13:55:11 -06:00
2015-01-20 14:02:58 -07:00
2014-07-11 13:53:04 +03:00
2014-10-31 17:48:54 -04:00
2015-02-20 04:56:44 -05:00
2015-02-16 17:56:04 -08:00
2015-02-22 11:38:38 -05:00
2014-09-26 21:16:51 -04:00
2015-02-12 18:54:09 -08:00
2015-02-17 14:34:52 -08:00
2015-02-13 21:21:40 -08:00
2015-01-23 00:22:20 -05:00
2015-01-08 15:10:52 -08:00
2014-10-13 11:28:42 +02:00
2014-12-10 17:41:10 -08:00
2015-01-25 23:17:29 -05:00
2015-02-22 11:38:42 -05:00
2015-02-17 16:12:34 -08:00
2015-02-22 11:38:42 -05:00
2015-02-10 14:30:30 -08:00
2015-02-16 17:56:04 -08:00
2015-02-17 16:29:36 +01:00
2015-02-22 11:38:41 -05:00
2015-03-14 09:45:35 -04:00
2015-02-17 14:25:58 -08:00
2014-06-25 22:08:29 -04:00
2015-01-25 23:17:29 -05:00
2014-10-09 22:25:53 -04:00
2015-02-22 11:38:41 -05:00
2015-02-22 11:38:41 -05:00
2014-12-10 21:30:20 -05:00
2015-02-17 15:27:47 -08:00
2014-05-06 17:39:42 -04:00
2014-12-02 10:46:50 -06:00
2015-02-22 11:38:41 -05:00
2015-02-05 02:45:00 -05:00
2015-02-17 15:48:33 -08:00
2014-10-31 17:48:54 -04:00
2015-02-12 18:54:12 -08:00
2015-02-13 21:21:39 -08:00
2014-11-05 14:13:23 -05:00
2015-01-29 00:13:13 -05:00
2014-08-26 09:35:56 +02:00
2015-02-22 11:38:42 -05:00
2015-02-05 02:45:00 -05:00
2014-11-05 14:13:23 -05:00
2014-11-19 13:01:26 -05:00