Files
mirror_zfs/module/zfs
Brian Behlendorf 751941e248 Fix dnode allocation race
When performing concurrent object allocations using the new
multi-threaded allocator and large dnodes it's possible to
allocate overlapping large dnodes.

This case should have been handled by detecting an error
returned by dnode_hold_impl().  But that logic only checked
the returned dnp was not-NULL, and the dnp variable was not
reset to NULL when retrying.  Resolve this issue by properly
checking the return value of dnode_hold_impl().

Additionally, it was possible that dnode_hold_impl() would
misreport a dnode as free when it was in fact in use.  This
could occurs for two reasons:

* The per-slot zrl_lock must be held over the entire critical
  section which includes the alloc/free until the new dnode
  is assigned to children_dnodes.  Additionally, all of the
  zrl_lock's in the range must be held to protect moving
  dnodes.

* The dn->dn_ot_type cannot be solely relied upon to check
  the type.  When allocating a new dnode its type will be
  DMU_OT_NONE after dnode_create().  Only latter when
  dnode_allocate() is called will it transition to the new
  type.  This means there's a window when allocating where
  it can mistaken for a free dnode.

Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
Reviewed-by: Ned Bass <bass6@llnl.gov>
Reviewed-by: Tony Hutter <hutter2@llnl.gov>
Reviewed-by: Olaf Faaland <faaland1@llnl.gov>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #6414
Closes #6439
2017-08-08 10:17:33 -07:00
..
2017-05-02 10:06:18 -07:00
2015-01-16 14:41:26 -08:00
2017-05-26 11:42:10 -07:00
2017-06-26 14:36:49 -07:00
2015-01-16 14:41:26 -08:00
2017-08-08 10:17:33 -07:00
2016-11-02 12:14:45 -07:00
2017-08-08 10:17:33 -07:00
2017-08-08 10:17:33 -07:00
2017-07-13 13:54:00 -04:00
2016-12-12 10:46:26 -08:00
2015-01-16 14:41:26 -08:00
2017-07-13 13:54:00 -04:00
2017-07-25 13:22:20 -04:00
2016-04-21 09:49:25 -07:00
2017-01-03 11:31:18 -06:00
2010-08-31 13:41:58 -07:00
2017-07-13 13:54:00 -04:00
2017-07-13 13:54:00 -04:00
2017-07-13 13:54:00 -04:00
2017-07-25 13:22:28 -04:00
2017-07-13 13:54:00 -04:00
2017-07-13 13:54:00 -04:00
2017-06-27 10:09:16 -07:00
2016-11-29 14:34:33 -08:00
2017-08-08 10:17:33 -07:00
2017-05-04 19:26:28 -04:00
2017-03-10 09:51:33 -08:00
2010-08-31 13:41:58 -07:00
2017-03-10 09:51:33 -08:00
2017-03-10 09:51:33 -08:00
2017-03-10 09:51:33 -08:00
2017-01-03 11:31:18 -06:00
2017-03-10 09:51:33 -08:00
2017-08-08 10:17:33 -07:00
2017-03-29 12:24:51 -07:00
2017-03-10 09:51:33 -08:00
2017-03-10 09:51:41 -08:00
2017-01-23 10:35:58 -08:00