Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix null ptr deref when renaming a zvol with snaps and snapdev=visible #16316

Merged
merged 1 commit into from
Aug 15, 2024

Commits on Jul 14, 2024

  1. Fix null ptr deref when renaming a zvol with snaps and snapdev=visible

    If a zvol is renamed, and it has one or more snapshots, and
    snapdev=visible is true for the zvol, then the rename causes a kernel
    null pointer dereference error. This has the effect (on Linux, anyway)
    of killing the z_zvol taskq kthread, with locks still held; which in
    turn causes a variety of zvol-related operations afterward to hang
    indefinitely (such as udev workers, among other things).
    
    The problem occurs because of an oversight in openzfs#15486
    (e36ff84). As documented in
    dataset_kstats_create, some datasets may not actually have kstats
    allocated for them; and at least at the present time, this is true for
    snapshots. In practical terms, this means that for snapshots,
    dk->dk_kstats will be NULL. The dataset_kstats_rename function
    introduced in the patch above does not first check whether dk->dk_kstats
    is NULL before proceeding, unlike e.g. the nearby
    dataset_kstats_update_* functions.
    
    In the very particular circumstance in which a zvol is renamed, AND that
    zvol has one or more snapshots, AND that zvol also has snapdev=visible,
    zvol_rename_minors_impl will loop over not just the zvol dataset itself,
    but each of the zvol's snapshots as well, so that their device nodes
    will be renamed as well. This results in dataset_kstats_create being
    called for snapshots, where, as we've established, dk->dk_kstats is
    NULL.
    
    Fix this by simply adding a NULL check before doing anything in
    dataset_kstats_rename.
    
    This still allows the dataset_name kstat value for the zvol to be
    updated (as was the intent of the original patch), and merely blocks
    attempts by the code to act upon the zvol's non-kstat-having snapshots.
    If at some future time, kstats are added for snapshots, then things
    should work as intended in that case as well.
    
    Signed-off-by: Justin Gottula <justin@jgottula.com>
    jgottula committed Jul 14, 2024
    Configuration menu
    Copy the full SHA
    0282434 View commit details
    Browse the repository at this point in the history