HomeFreeBSD

Linux 5.13 compat: retry zvol_open() when contended

Description

Linux 5.13 compat: retry zvol_open() when contended

Due to a possible lock inversion the zvol open call path on Linux
needs to be able to retry in the case where the spa_namespace_lock
cannot be acquired.

For Linux 5.12 an older kernel this was accomplished by returning
-ERESTARTSYS from zvol_open() to request that blkdev_get() drop
the bdev->bd_mutex lock, reaquire it, then call the open callback
again. However, as of the 5.13 kernel this behavior was removed.

Therefore, for 5.12 and older kernels we preserved the existing
retry logic, but for 5.13 and newer kernels we retry internally in
zvol_open(). This should always succeed except in the case where
a pool's vdev are layed on zvols, in which case it may fail. To
handle this case vdev_disk_open() has been updated to retry when
opening a device when -ERESTARTSYS is returned.

Reviewed-by: Tony Hutter <hutter2@llnl.gov>
Reviewed-by: Tony Nguyen <tony.nguyen@delphix.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #12301
Closes #12759

Details

Provenance
Brian Behlendorf <behlendorf1@llnl.gov>Authored on Dec 2 2021, 12:07 AM
GitHub <noreply@github.com>Committed on Dec 2 2021, 12:07 AM
Parents
rG31d2f42b2a55: Temporarily remove tests from sanity runfile
Branches
Unknown
Tags
Unknown

Event Timeline

GitHub <noreply@github.com> committed rG77e2756de08c: Linux 5.13 compat: retry zvol_open() when contended (authored by Brian Behlendorf <behlendorf1@llnl.gov>).Dec 2 2021, 12:07 AM