• C
    storage: Check for invalid storage mode before opening · 4a1abb3f
    Cole Robinson 提交于
    If a directory pool contains pipes or sockets, a pool start can fail or hang:
    
    https://bugzilla.redhat.com/show_bug.cgi?id=589577
    
    We already try to avoid these special files, but only attempt after
    opening the path, which is where the problems lie. Unify volume opening
    into helper functions, which use the proper open() flags to avoid error,
    followed by fstat to validate storage mode.
    
    Previously, virStorageBackendUpdateVolTargetInfoFD attempted to enforce the
    storage mode check, but allowed callers to detect this case and silently
    continue. In practice, only the FS backend was using this feature, the rest
    were treating unknown mode as an error condition. Unfortunately the InfoFD
    function wasn't raising an error message here, so error reporting was
    busted.
    
    This patch adds 2 functions: virStorageBackendVolOpen, and
    virStorageBackendVolOpenModeSkip. The latter retains the original opt out
    semantics, the former now throws an explicit error.
    
    This patch maintains the previous volume mode checks: allowing specific
    modes for specific pool types requires a bit of surgery, since VolOpen
    is called through several different helper functions.
    
    v2: Use ATTRIBUTE_NONNULL. Drop stat check, just open with
        O_NONBLOCK|O_NOCTTY.
    
    v3: Move mode check logic back to VolOpen. Use 2 VolOpen functions with
        different error semantics.
    
    v4: Make second VolOpen function more extensible. Didn't opt to change
        FS backend defaults, this can just be to fix the original bug.
    
    v5: Prefix default flags with VIR_, use ATTRIBUTE_RETURN_CHECK
    4a1abb3f
storage_backend_scsi.c 16.5 KB