Blame src/lib/plugin_apis/mpath.c

Packit Service 158247
GQuark  bd_mpath_error_quark (void) {
Packit Service 158247
        return g_quark_from_static_string ("g-bd-mpath-error-quark");
Packit Service 158247
}
Packit Service 158247
Packit Service 158247
static gboolean  bd_mpath_is_tech_avail_stub (BDMpathTech tech, guint64 mode, GError **error) {
Packit Service 158247
    g_critical ("The function 'bd_mpath_is_tech_avail' called, but not implemented!");
Packit Service 158247
    g_set_error (error, BD_INIT_ERROR, BD_INIT_ERROR_NOT_IMPLEMENTED,
Packit Service 158247
                "The function 'bd_mpath_is_tech_avail' called, but not implemented!");
Packit Service 158247
    return FALSE;
Packit Service 158247
}
Packit Service 158247
Packit Service 158247
static gboolean  (*_bd_mpath_is_tech_avail) (BDMpathTech tech, guint64 mode, GError **error) = bd_mpath_is_tech_avail_stub;
Packit Service 158247
Packit Service 158247
/**
Packit Service 158247
 * bd_mpath_is_tech_avail:
Packit Service 158247
 * @tech: the queried tech
Packit Service 158247
 * @mode: a bit mask of queried modes of operation for @tech
Packit Service 158247
 * @error: (out): place to store error (details about why the @tech-@mode combination is not available)
Packit Service 158247
 *
Packit Service 158247
 * Returns: whether the @tech-@mode combination is avaible -- supported by the
Packit Service 158247
 *          plugin implementation and having all the runtime dependencies available
Packit Service 158247
 */
Packit Service 158247
gboolean  bd_mpath_is_tech_avail (BDMpathTech tech, guint64 mode, GError **error) {
Packit Service 158247
    return _bd_mpath_is_tech_avail (tech, mode, error);
Packit Service 158247
}
Packit Service 158247
Packit Service 158247
Packit Service 158247
static gboolean  bd_mpath_flush_mpaths_stub (GError **error) {
Packit Service 158247
    g_critical ("The function 'bd_mpath_flush_mpaths' called, but not implemented!");
Packit Service 158247
    g_set_error (error, BD_INIT_ERROR, BD_INIT_ERROR_NOT_IMPLEMENTED,
Packit Service 158247
                "The function 'bd_mpath_flush_mpaths' called, but not implemented!");
Packit Service 158247
    return FALSE;
Packit Service 158247
}
Packit Service 158247
Packit Service 158247
static gboolean  (*_bd_mpath_flush_mpaths) (GError **error) = bd_mpath_flush_mpaths_stub;
Packit Service 158247
Packit Service 158247
/**
Packit Service 158247
 * bd_mpath_flush_mpaths:
Packit Service 158247
 * @error: (out): place to store error (if any)
Packit Service 158247
 *
Packit Service 158247
 * Returns: whether multipath device maps were successfully flushed or not
Packit Service 158247
 *
Packit Service 158247
 * Flushes all unused multipath device maps.
Packit Service 158247
 *
Packit Service 158247
 * Tech category: %BD_MPATH_TECH_BASE-%BD_MPATH_TECH_MODE_MODIFY
Packit Service 158247
 */
Packit Service 158247
gboolean  bd_mpath_flush_mpaths (GError **error) {
Packit Service 158247
    return _bd_mpath_flush_mpaths (error);
Packit Service 158247
}
Packit Service 158247
Packit Service 158247
Packit Service 158247
static gboolean  bd_mpath_is_mpath_member_stub (const gchar *device, GError **error) {
Packit Service 158247
    g_critical ("The function 'bd_mpath_is_mpath_member' called, but not implemented!");
Packit Service 158247
    g_set_error (error, BD_INIT_ERROR, BD_INIT_ERROR_NOT_IMPLEMENTED,
Packit Service 158247
                "The function 'bd_mpath_is_mpath_member' called, but not implemented!");
Packit Service 158247
    return FALSE;
Packit Service 158247
}
Packit Service 158247
Packit Service 158247
static gboolean  (*_bd_mpath_is_mpath_member) (const gchar *device, GError **error) = bd_mpath_is_mpath_member_stub;
Packit Service 158247
Packit Service 158247
/**
Packit Service 158247
 * bd_mpath_is_mpath_member:
Packit Service 158247
 * @device: device to test
Packit Service 158247
 * @error: (out): place to store error (if any)
Packit Service 158247
 *
Packit Service 158247
 * Returns: %TRUE if the device is a multipath member, %FALSE if not or an error
Packit Service 158247
 * appeared when queried (@error is set in those cases)
Packit Service 158247
 *
Packit Service 158247
 * Tech category: %BD_MPATH_TECH_BASE-%BD_MPATH_TECH_MODE_QUERY
Packit Service 158247
 */
Packit Service 158247
gboolean  bd_mpath_is_mpath_member (const gchar *device, GError **error) {
Packit Service 158247
    return _bd_mpath_is_mpath_member (device, error);
Packit Service 158247
}
Packit Service 158247
Packit Service 158247
Packit Service 158247
static gchar** bd_mpath_get_mpath_members_stub (GError **error) {
Packit Service 158247
    g_critical ("The function 'bd_mpath_get_mpath_members' called, but not implemented!");
Packit Service 158247
    g_set_error (error, BD_INIT_ERROR, BD_INIT_ERROR_NOT_IMPLEMENTED,
Packit Service 158247
                "The function 'bd_mpath_get_mpath_members' called, but not implemented!");
Packit Service 158247
    return NULL;
Packit Service 158247
}
Packit Service 158247
Packit Service 158247
static gchar** (*_bd_mpath_get_mpath_members) (GError **error) = bd_mpath_get_mpath_members_stub;
Packit Service 158247
Packit Service 158247
/**
Packit Service 158247
 * bd_mpath_get_mpath_members:
Packit Service 158247
 * @error: (out): place to store error (if any)
Packit Service 158247
 *
Packit Service 158247
 * Returns: (transfer full) (array zero-terminated=1): list of names of all devices that are
Packit Service 158247
 *                                                     members of the mpath mappings (or %NULL
Packit Service 158247
 *                                                     in case of error)
Packit Service 158247
 *
Packit Service 158247
 * Tech category: %BD_MPATH_TECH_BASE-%BD_MPATH_TECH_MODE_QUERY
Packit Service 158247
 */
Packit Service 158247
gchar** bd_mpath_get_mpath_members (GError **error) {
Packit Service 158247
    return _bd_mpath_get_mpath_members (error);
Packit Service 158247
}
Packit Service 158247
Packit Service 158247
Packit Service 158247
static gboolean  bd_mpath_set_friendly_names_stub (gboolean enabled, GError **error) {
Packit Service 158247
    g_critical ("The function 'bd_mpath_set_friendly_names' called, but not implemented!");
Packit Service 158247
    g_set_error (error, BD_INIT_ERROR, BD_INIT_ERROR_NOT_IMPLEMENTED,
Packit Service 158247
                "The function 'bd_mpath_set_friendly_names' called, but not implemented!");
Packit Service 158247
    return FALSE;
Packit Service 158247
}
Packit Service 158247
Packit Service 158247
static gboolean  (*_bd_mpath_set_friendly_names) (gboolean enabled, GError **error) = bd_mpath_set_friendly_names_stub;
Packit Service 158247
Packit Service 158247
/**
Packit Service 158247
 * bd_mpath_set_friendly_names:
Packit Service 158247
 * @enabled: whether friendly names should be enabled or not
Packit Service 158247
 * @error: (out): place to store error (if any)
Packit Service 158247
 *
Packit Service 158247
 * Returns: if successfully set or not
Packit Service 158247
 *
Packit Service 158247
 * Tech category: %BD_MPATH_TECH_FRIENDLY_NAMES-%BD_MPATH_TECH_MODE_MODIFY
Packit Service 158247
 */
Packit Service 158247
gboolean  bd_mpath_set_friendly_names (gboolean enabled, GError **error) {
Packit Service 158247
    return _bd_mpath_set_friendly_names (enabled, error);
Packit Service 158247
}
Packit Service 158247
Packit Service 158247
Packit Service 158247
static gpointer load_mpath_from_plugin(const gchar *so_name) {
Packit Service 158247
    void *handle = NULL;
Packit Service 158247
    char *error = NULL;
Packit Service 158247
    gboolean (*check_fn) (void) = NULL;
Packit Service 158247
    gboolean (*init_fn) (void) = NULL;
Packit Service 158247
Packit Service 158247
    handle = dlopen(so_name, RTLD_LAZY);
Packit Service 158247
    if (!handle) {
Packit Service 158247
        g_warning("failed to load module mpath: %s", dlerror());
Packit Service 158247
        return NULL;
Packit Service 158247
    }
Packit Service 158247
Packit Service 158247
    dlerror();
Packit Service 158247
    * (void**) (&check_fn) = dlsym(handle, "bd_mpath_check_deps");
Packit Service 158247
    if ((error = dlerror()) != NULL)
Packit Service 158247
        g_debug("failed to load the check() function for mpath: %s", error);
Packit Service 158247
    /* coverity[dead_error_condition] */
Packit Service 158247
    if (!g_getenv ("LIBBLOCKDEV_SKIP_DEP_CHECKS") && check_fn && !check_fn()) {
Packit Service 158247
        dlclose(handle);
Packit Service 158247
        return NULL;
Packit Service 158247
    }
Packit Service 158247
    check_fn = NULL;
Packit Service 158247
Packit Service 158247
    dlerror();
Packit Service 158247
    * (void**) (&init_fn) = dlsym(handle, "bd_mpath_init");
Packit Service 158247
    if ((error = dlerror()) != NULL)
Packit Service 158247
        g_debug("failed to load the init() function for mpath: %s", error);
Packit Service 158247
    /* coverity[dead_error_condition] */
Packit Service 158247
    if (init_fn && !init_fn()) {
Packit Service 158247
        dlclose(handle);
Packit Service 158247
        return NULL;
Packit Service 158247
    }
Packit Service 158247
    init_fn = NULL;
Packit Service 158247
Packit Service 158247
    dlerror();
Packit Service 158247
    * (void**) (&_bd_mpath_is_tech_avail) = dlsym(handle, "bd_mpath_is_tech_avail");
Packit Service 158247
    if ((error = dlerror()) != NULL)
Packit Service 158247
        g_warning("failed to load bd_mpath_is_tech_avail: %s", error);
Packit Service 158247
Packit Service 158247
    dlerror();
Packit Service 158247
    * (void**) (&_bd_mpath_flush_mpaths) = dlsym(handle, "bd_mpath_flush_mpaths");
Packit Service 158247
    if ((error = dlerror()) != NULL)
Packit Service 158247
        g_warning("failed to load bd_mpath_flush_mpaths: %s", error);
Packit Service 158247
Packit Service 158247
    dlerror();
Packit Service 158247
    * (void**) (&_bd_mpath_is_mpath_member) = dlsym(handle, "bd_mpath_is_mpath_member");
Packit Service 158247
    if ((error = dlerror()) != NULL)
Packit Service 158247
        g_warning("failed to load bd_mpath_is_mpath_member: %s", error);
Packit Service 158247
Packit Service 158247
    dlerror();
Packit Service 158247
    * (void**) (&_bd_mpath_get_mpath_members) = dlsym(handle, "bd_mpath_get_mpath_members");
Packit Service 158247
    if ((error = dlerror()) != NULL)
Packit Service 158247
        g_warning("failed to load bd_mpath_get_mpath_members: %s", error);
Packit Service 158247
Packit Service 158247
    dlerror();
Packit Service 158247
    * (void**) (&_bd_mpath_set_friendly_names) = dlsym(handle, "bd_mpath_set_friendly_names");
Packit Service 158247
    if ((error = dlerror()) != NULL)
Packit Service 158247
        g_warning("failed to load bd_mpath_set_friendly_names: %s", error);
Packit Service 158247
Packit Service 158247
    return handle;
Packit Service 158247
}
Packit Service 158247
Packit Service 158247
static gboolean unload_mpath (gpointer handle) {
Packit Service 158247
    char *error = NULL;
Packit Service 158247
    gboolean (*close_fn) (void) = NULL;
Packit Service 158247
Packit Service 158247
    _bd_mpath_is_tech_avail = bd_mpath_is_tech_avail_stub;
Packit Service 158247
    _bd_mpath_flush_mpaths = bd_mpath_flush_mpaths_stub;
Packit Service 158247
    _bd_mpath_is_mpath_member = bd_mpath_is_mpath_member_stub;
Packit Service 158247
    _bd_mpath_get_mpath_members = bd_mpath_get_mpath_members_stub;
Packit Service 158247
    _bd_mpath_set_friendly_names = bd_mpath_set_friendly_names_stub;
Packit Service 158247
Packit Service 158247
    dlerror();
Packit Service 158247
    * (void**) (&close_fn) = dlsym(handle, "bd_mpath_close");
Packit Service 158247
    if (((error = dlerror()) != NULL) || !close_fn)
Packit Service 158247
        g_debug("failed to load the close_plugin() function for mpath: %s", error);
Packit Service 158247
    /* coverity[dead_error_condition] */
Packit Service 158247
    if (close_fn) {
Packit Service 158247
        close_fn();
Packit Service 158247
    }
Packit Service 158247
Packit Service 158247
    return dlclose(handle) == 0;
Packit Service 158247
}
Packit Service 158247