Page MenuHomeFreeBSD

stand: evict zfs_alloc/zfs_free
Needs ReviewPublic

Authored by kevans on May 31 2019, 6:59 PM.

Details

Summary

zfs_alloc/zfs_free were meant to be for temporary allocations, but they were occasionally used for more long-lasting allocations (e.g. vdev_raidz_map_alloc). This has problems, as one must carefully free() memory in the exact opposite order that it was allocated (size-wise) due to the error checking done by zfs_free (freed_ptr == zfs_temp_ptr - sz, i.e. removing sz bytes from our block of memory better put us back at the address we're freeing).

Rectify this by removing them and just replacing uses with malloc/free. We weren't gaining much from the panic anyways, and it's error-prone.

Diff Detail

Repository
rS FreeBSD src repository
Lint
Lint Skipped
Unit
Unit Tests Skipped
Build Status
Buildable 24632

Event Timeline

kevans created this revision.May 31 2019, 6:59 PM

There is problem now. The zfs_alloc was "always" succeeding but malloc can fail, therefore we can not just replace here, but we also need to add checks.

kevans updated this revision to Diff 58125.May 31 2019, 8:19 PM

Take two, a little better... some of the raidz verification stuff needs a small API revamp or reconsideration if we want to try and recover from those, and we may want to improve diagnostics a little bit in other areas.