static void virtballoon_remove(struct virtio_device *vdev) { struct virtio_balloon *vb = vdev->priv; if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_DEFLATE_ON_OOM)) virtio_balloon_unregister_shrinker(vb); spin_lock_irq(&vb->stop_update_lock); vb->stop_update = true; spin_unlock_irq(&vb->stop_update_lock); cancel_work_sync(&vb->update_balloon_size_work); cancel_work_sync(&vb->update_balloon_stats_work); if (virtio_has_feature(vdev, VIRTIO_BALLOON_F_FREE_PAGE_HINT)) { cancel_work_sync(&vb->report_free_page_work); destroy_workqueue(vb->balloon_wq); } remove_common(vb); #ifdef CONFIG_BALLOON_COMPACTION if (vb->vb_dev_info.inode) iput(vb->vb_dev_info.inode); kern_unmount(balloon_mnt); #endif kfree(vb); }
static void virtballoon_remove(struct virtio_device *vdev) { struct virtio_balloon *vb = vdev->priv; unregister_oom_notifier(&vb->nb); kthread_stop(vb->thread); remove_common(vb); kfree(vb); }
static void virtballoon_remove(struct virtio_device *vdev) { struct virtio_balloon *vb = vdev->priv; kthread_stop(vb->thread); remove_common(vb); balloon_mapping_free(vb->vb_dev_info->mapping); balloon_devinfo_free(vb->vb_dev_info); kfree(vb); }
static int virtballoon_freeze(struct virtio_device *vdev) { struct virtio_balloon *vb = vdev->priv; /* * The workqueue is already frozen by the PM core before this * function is called. */ remove_common(vb); return 0; }
static void virtballoon_remove(struct virtio_device *vdev) { struct virtio_balloon *vb = vdev->priv; unregister_oom_notifier(&vb->nb); spin_lock_irq(&vb->stop_update_lock); vb->stop_update = true; spin_unlock_irq(&vb->stop_update_lock); cancel_work_sync(&vb->update_balloon_size_work); cancel_work_sync(&vb->update_balloon_stats_work); remove_common(vb); #ifdef CONFIG_BALLOON_COMPACTION if (vb->vb_dev_info.inode) iput(vb->vb_dev_info.inode); kern_unmount(balloon_mnt); #endif kfree(vb); }
extern List as_mysql_remove_accts(mysql_conn_t *mysql_conn, uint32_t uid, slurmdb_account_cond_t *acct_cond) { ListIterator itr = NULL; List ret_list = NULL; List coord_list = NULL; int rc = SLURM_SUCCESS; char *object = NULL; char *extra = NULL, *query = NULL, *name_char = NULL, *assoc_char = NULL; time_t now = time(NULL); char *user_name = NULL; int set = 0; MYSQL_RES *result = NULL; MYSQL_ROW row; bool jobs_running = 0; if (!acct_cond) { error("we need something to change"); return NULL; } if (check_connection(mysql_conn) != SLURM_SUCCESS) return NULL; xstrcat(extra, "where deleted=0"); if (acct_cond->assoc_cond && acct_cond->assoc_cond->acct_list && list_count(acct_cond->assoc_cond->acct_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(acct_cond->assoc_cond->acct_list); while ((object = list_next(itr))) { if (!object[0]) continue; if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "name='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (acct_cond->description_list && list_count(acct_cond->description_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(acct_cond->description_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "description='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (acct_cond->organization_list && list_count(acct_cond->organization_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(acct_cond->organization_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "organization='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (!extra) { error("Nothing to remove"); return NULL; } query = xstrdup_printf("select name from %s %s;", acct_table, extra); xfree(extra); if (!(result = mysql_db_query_ret( mysql_conn, query, 0))) { xfree(query); return NULL; } rc = 0; ret_list = list_create(slurm_destroy_char); while ((row = mysql_fetch_row(result))) { char *object = xstrdup(row[0]); list_append(ret_list, object); if (!rc) { xstrfmtcat(name_char, "name='%s'", object); xstrfmtcat(assoc_char, "t2.acct='%s'", object); rc = 1; } else { xstrfmtcat(name_char, " || name='%s'", object); xstrfmtcat(assoc_char, " || t2.acct='%s'", object); } } mysql_free_result(result); if (!list_count(ret_list)) { errno = SLURM_NO_CHANGE_IN_DATA; if (debug_flags & DEBUG_FLAG_DB_ASSOC) DB_DEBUG(mysql_conn->conn, "didn't effect anything\n%s", query); xfree(query); return ret_list; } xfree(query); /* We need to remove these accounts from the coord's that have it */ coord_list = as_mysql_remove_coord( mysql_conn, uid, ret_list, NULL); if (coord_list) list_destroy(coord_list); user_name = uid_to_string((uid_t) uid); slurm_mutex_lock(&as_mysql_cluster_list_lock); itr = list_iterator_create(as_mysql_cluster_list); while ((object = list_next(itr))) { if ((rc = remove_common(mysql_conn, DBD_REMOVE_ACCOUNTS, now, user_name, acct_table, name_char, assoc_char, object, ret_list, &jobs_running)) != SLURM_SUCCESS) break; } list_iterator_destroy(itr); slurm_mutex_unlock(&as_mysql_cluster_list_lock); xfree(user_name); xfree(name_char); xfree(assoc_char); if (rc == SLURM_ERROR) { list_destroy(ret_list); return NULL; } if (jobs_running) errno = ESLURM_JOBS_RUNNING_ON_ASSOC; else errno = SLURM_SUCCESS; return ret_list; }
extern List as_mysql_remove_clusters(mysql_conn_t *mysql_conn, uint32_t uid, slurmdb_cluster_cond_t *cluster_cond) { ListIterator itr = NULL; List ret_list = NULL; List tmp_list = NULL; int rc = SLURM_SUCCESS; char *object = NULL; char *extra = NULL, *query = NULL, *cluster_name = NULL, *name_char = NULL, *assoc_char = NULL; time_t now = time(NULL); char *user_name = NULL; slurmdb_wckey_cond_t wckey_cond; MYSQL_RES *result = NULL; MYSQL_ROW row; bool jobs_running = 0; if (!cluster_cond) { error("we need something to change"); return NULL; } if (check_connection(mysql_conn) != SLURM_SUCCESS) return NULL; if (!is_user_min_admin_level( mysql_conn, uid, SLURMDB_ADMIN_SUPER_USER)) { errno = ESLURM_ACCESS_DENIED; return NULL; } /* force to only do non-deleted clusters */ cluster_cond->with_deleted = 0; _setup_cluster_cond_limits(cluster_cond, &extra); if (!extra) { error("Nothing to remove"); return NULL; } query = xstrdup_printf("select name from %s%s;", cluster_table, extra); xfree(extra); if (!(result = mysql_db_query_ret( mysql_conn, query, 0))) { xfree(query); return NULL; } rc = 0; ret_list = list_create(slurm_destroy_char); if (!mysql_num_rows(result)) { mysql_free_result(result); errno = SLURM_NO_CHANGE_IN_DATA; if (debug_flags & DEBUG_FLAG_DB_ASSOC) DB_DEBUG(mysql_conn->conn, "didn't effect anything\n%s", query); xfree(query); return ret_list; } xfree(query); assoc_char = xstrdup_printf("t2.acct='root'"); user_name = uid_to_string((uid_t) uid); while ((row = mysql_fetch_row(result))) { char *object = xstrdup(row[0]); if (!jobs_running) list_append(ret_list, object); xfree(name_char); xstrfmtcat(name_char, "name='%s'", object); if (jobs_running) xfree(object); /* We should not need to delete any cluster usage just set it * to deleted */ xstrfmtcat(query, "update \"%s_%s\" set time_end=%ld where time_end=0;" "update \"%s_%s\" set mod_time=%ld, deleted=1;" "update \"%s_%s\" set mod_time=%ld, deleted=1;" "update \"%s_%s\" set mod_time=%ld, deleted=1;", object, event_table, now, object, cluster_day_table, now, object, cluster_hour_table, now, object, cluster_month_table, now); if ((rc = remove_common(mysql_conn, DBD_REMOVE_CLUSTERS, now, user_name, cluster_table, name_char, assoc_char, object, ret_list, &jobs_running)) != SLURM_SUCCESS) break; } mysql_free_result(result); xfree(user_name); xfree(name_char); xfree(assoc_char); if (rc != SLURM_SUCCESS) { FREE_NULL_LIST(ret_list); return NULL; } if (!jobs_running) { if (debug_flags & DEBUG_FLAG_DB_ASSOC) DB_DEBUG(mysql_conn->conn, "query\n%s", query); rc = mysql_db_query(mysql_conn, query); xfree(query); if (rc != SLURM_SUCCESS) { reset_mysql_conn(mysql_conn); FREE_NULL_LIST(ret_list); return NULL; } /* We need to remove these clusters from the wckey table */ memset(&wckey_cond, 0, sizeof(slurmdb_wckey_cond_t)); wckey_cond.cluster_list = ret_list; tmp_list = as_mysql_remove_wckeys(mysql_conn, uid, &wckey_cond); FREE_NULL_LIST(tmp_list); itr = list_iterator_create(ret_list); while ((object = list_next(itr))) { if ((rc = remove_cluster_tables(mysql_conn, object)) != SLURM_SUCCESS) break; cluster_name = xstrdup(object); if (addto_update_list(mysql_conn->update_list, SLURMDB_REMOVE_CLUSTER, cluster_name) != SLURM_SUCCESS) xfree(cluster_name); } list_iterator_destroy(itr); if (rc != SLURM_SUCCESS) { reset_mysql_conn(mysql_conn); FREE_NULL_LIST(ret_list); errno = rc; return NULL; } errno = SLURM_SUCCESS; } else errno = ESLURM_JOBS_RUNNING_ON_ASSOC; return ret_list; }
extern List as_mysql_remove_coord(mysql_conn_t *mysql_conn, uint32_t uid, List acct_list, slurmdb_user_cond_t *user_cond) { char *query = NULL, *object = NULL, *extra = NULL, *last_user = NULL; char *user_name = NULL; time_t now = time(NULL); int set = 0, is_admin=0, rc = SLURM_SUCCESS; ListIterator itr = NULL; slurmdb_user_rec_t *user_rec = NULL; List ret_list = NULL; List user_list = NULL; MYSQL_RES *result = NULL; MYSQL_ROW row; slurmdb_user_rec_t user; if (!user_cond && !acct_list) { error("we need something to remove"); return NULL; } else if (user_cond && user_cond->assoc_cond) user_list = user_cond->assoc_cond->user_list; if (check_connection(mysql_conn) != SLURM_SUCCESS) return NULL; memset(&user, 0, sizeof(slurmdb_user_rec_t)); user.uid = uid; if (!(is_admin = is_user_min_admin_level( mysql_conn, uid, SLURMDB_ADMIN_OPERATOR))) { if (!is_user_any_coord(mysql_conn, &user)) { error("Only admins/coordinators can " "remove coordinators"); errno = ESLURM_ACCESS_DENIED; return NULL; } } /* Leave it this way since we are using extra below */ if (user_list && list_count(user_list)) { set = 0; if (extra) xstrcat(extra, " && ("); else xstrcat(extra, "("); itr = list_iterator_create(user_list); while ((object = list_next(itr))) { if (!object[0]) continue; if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "user='******'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (acct_list && list_count(acct_list)) { set = 0; if (extra) xstrcat(extra, " && ("); else xstrcat(extra, "("); itr = list_iterator_create(acct_list); while ((object = list_next(itr))) { if (!object[0]) continue; if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "acct='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (!extra) { errno = SLURM_ERROR; debug3("No conditions given"); return NULL; } query = xstrdup_printf( "select user, acct from %s where deleted=0 && %s order by user", acct_coord_table, extra); debug3("%d(%s:%d) query\n%s", mysql_conn->conn, THIS_FILE, __LINE__, query); if (!(result = mysql_db_query_ret(mysql_conn, query, 0))) { xfree(query); xfree(extra); errno = SLURM_ERROR; return NULL; } xfree(query); ret_list = list_create(slurm_destroy_char); user_list = list_create(slurm_destroy_char); while ((row = mysql_fetch_row(result))) { if (!is_admin) { slurmdb_coord_rec_t *coord = NULL; if (!user.coord_accts) { // This should never // happen error("We are here with no coord accts"); errno = ESLURM_ACCESS_DENIED; list_destroy(ret_list); list_destroy(user_list); xfree(extra); mysql_free_result(result); return NULL; } itr = list_iterator_create(user.coord_accts); while ((coord = list_next(itr))) { if (!strcasecmp(coord->name, row[1])) break; } list_iterator_destroy(itr); if (!coord) { error("User %s(%d) does not have the " "ability to change this account (%s)", user.name, user.uid, row[1]); errno = ESLURM_ACCESS_DENIED; list_destroy(ret_list); list_destroy(user_list); xfree(extra); mysql_free_result(result); return NULL; } } if (!last_user || strcasecmp(last_user, row[0])) { list_append(user_list, xstrdup(row[0])); last_user = row[0]; } list_append(ret_list, xstrdup_printf("U = %-9s A = %-10s", row[0], row[1])); } mysql_free_result(result); user_name = uid_to_string((uid_t) uid); rc = remove_common(mysql_conn, DBD_REMOVE_ACCOUNT_COORDS, now, user_name, acct_coord_table, extra, NULL, NULL, NULL, NULL); xfree(user_name); xfree(extra); if (rc == SLURM_ERROR) { list_destroy(ret_list); list_destroy(user_list); errno = SLURM_ERROR; return NULL; } /* get the update list set */ itr = list_iterator_create(user_list); while ((last_user = list_next(itr))) { user_rec = xmalloc(sizeof(slurmdb_user_rec_t)); user_rec->name = xstrdup(last_user); _get_user_coords(mysql_conn, user_rec); if (addto_update_list(mysql_conn->update_list, SLURMDB_REMOVE_COORD, user_rec) != SLURM_SUCCESS) slurmdb_destroy_user_rec(user_rec); } list_iterator_destroy(itr); list_destroy(user_list); return ret_list; }
extern List as_mysql_remove_users(mysql_conn_t *mysql_conn, uint32_t uid, slurmdb_user_cond_t *user_cond) { ListIterator itr = NULL; List ret_list = NULL; List coord_list = NULL; int rc = SLURM_SUCCESS; char *object = NULL; char *extra = NULL, *query = NULL, *name_char = NULL, *assoc_char = NULL; time_t now = time(NULL); char *user_name = NULL; int set = 0; MYSQL_RES *result = NULL; MYSQL_ROW row; slurmdb_user_cond_t user_coord_cond; slurmdb_association_cond_t assoc_cond; slurmdb_wckey_cond_t wckey_cond; bool jobs_running = 0; if (!user_cond) { error("we need something to remove"); return NULL; } if (check_connection(mysql_conn) != SLURM_SUCCESS) return NULL; if (user_cond->assoc_cond && user_cond->assoc_cond->user_list && list_count(user_cond->assoc_cond->user_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(user_cond->assoc_cond->user_list); while ((object = list_next(itr))) { if (!object[0]) continue; if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "name='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } ret_list = _get_other_user_names_to_mod(mysql_conn, uid, user_cond); if (user_cond->admin_level != SLURMDB_ADMIN_NOTSET) { xstrfmtcat(extra, " && admin_level=%u", user_cond->admin_level); } if (!extra && !ret_list) { error("Nothing to remove"); return NULL; } else if (!extra) { /* means we got a ret_list and don't need to look at the user_table. */ goto no_user_table; } /* Only handle this if we need to actually query the user_table. If a request comes in stating they want to remove all users with default account of whatever then that doesn't deal with the user_table. */ query = xstrdup_printf("select name from %s where deleted=0 %s;", user_table, extra); xfree(extra); if (!(result = mysql_db_query_ret(mysql_conn, query, 0))) { xfree(query); return NULL; } if (!ret_list) ret_list = list_create(slurm_destroy_char); while ((row = mysql_fetch_row(result))) slurm_addto_char_list(ret_list, row[0]); mysql_free_result(result); no_user_table: if (!list_count(ret_list)) { errno = SLURM_NO_CHANGE_IN_DATA; debug3("didn't effect anything\n%s", query); xfree(query); return ret_list; } xfree(query); memset(&user_coord_cond, 0, sizeof(slurmdb_user_cond_t)); memset(&assoc_cond, 0, sizeof(slurmdb_association_cond_t)); /* we do not need to free the objects we put in here since they are also placed in a list that will be freed */ assoc_cond.user_list = list_create(NULL); user_coord_cond.assoc_cond = &assoc_cond; itr = list_iterator_create(ret_list); while ((object = list_next(itr))) { slurmdb_user_rec_t *user_rec = xmalloc(sizeof(slurmdb_user_rec_t)); list_append(assoc_cond.user_list, object); if (name_char) { xstrfmtcat(name_char, " || name='%s'", object); xstrfmtcat(assoc_char, " || t2.user='******'", object); } else { xstrfmtcat(name_char, "name='%s'", object); xstrfmtcat(assoc_char, "t2.user='******'", object); } user_rec->name = xstrdup(object); if (addto_update_list(mysql_conn->update_list, SLURMDB_REMOVE_USER, user_rec) != SLURM_SUCCESS) slurmdb_destroy_user_rec(user_rec); } list_iterator_destroy(itr); /* We need to remove these accounts from the coord's that have it */ coord_list = as_mysql_remove_coord( mysql_conn, uid, NULL, &user_coord_cond); if (coord_list) list_destroy(coord_list); /* We need to remove these users from the wckey table */ memset(&wckey_cond, 0, sizeof(slurmdb_wckey_cond_t)); wckey_cond.user_list = assoc_cond.user_list; coord_list = as_mysql_remove_wckeys(mysql_conn, uid, &wckey_cond); if (coord_list) list_destroy(coord_list); list_destroy(assoc_cond.user_list); user_name = uid_to_string((uid_t) uid); slurm_mutex_lock(&as_mysql_cluster_list_lock); itr = list_iterator_create(as_mysql_cluster_list); while ((object = list_next(itr))) { if ((rc = remove_common(mysql_conn, DBD_REMOVE_USERS, now, user_name, user_table, name_char, assoc_char, object, ret_list, &jobs_running)) != SLURM_SUCCESS) break; } list_iterator_destroy(itr); slurm_mutex_unlock(&as_mysql_cluster_list_lock); xfree(user_name); xfree(name_char); if (rc == SLURM_ERROR) { list_destroy(ret_list); xfree(assoc_char); return NULL; } query = xstrdup_printf( "update %s as t2 set deleted=1, mod_time=%ld where %s", acct_coord_table, (long)now, assoc_char); xfree(assoc_char); rc = mysql_db_query(mysql_conn, query); xfree(query); if (rc != SLURM_SUCCESS) { error("Couldn't remove user coordinators"); list_destroy(ret_list); return NULL; } if (jobs_running) errno = ESLURM_JOBS_RUNNING_ON_ASSOC; else errno = SLURM_SUCCESS; return ret_list; }
static int probe_common(struct virtio_device *vdev) { int err, index; struct virtrng_info *vi = NULL; vi = kzalloc(sizeof(struct virtrng_info), GFP_KERNEL); if (!vi) return -ENOMEM; vi->index = index = ida_simple_get(&rng_index_ida, 0, 0, GFP_KERNEL); if (index < 0) { err = index; goto err_ida; } sprintf(vi->name, "virtio_rng.%d", index); init_completion(&vi->have_data); vi->hwrng = (struct hwrng) { .read = virtio_read, .cleanup = virtio_cleanup, .priv = (unsigned long)vi, .name = vi->name, .quality = 1000, }; vdev->priv = vi; /* We expect a single virtqueue. */ vi->vq = virtio_find_single_vq(vdev, random_recv_done, "input"); if (IS_ERR(vi->vq)) { err = PTR_ERR(vi->vq); goto err_find; } return 0; err_find: ida_simple_remove(&rng_index_ida, index); err_ida: kfree(vi); return err; } static void remove_common(struct virtio_device *vdev) { struct virtrng_info *vi = vdev->priv; vi->hwrng_removed = true; vi->data_avail = 0; complete(&vi->have_data); vdev->config->reset(vdev); vi->busy = false; if (vi->hwrng_register_done) hwrng_unregister(&vi->hwrng); vdev->config->del_vqs(vdev); ida_simple_remove(&rng_index_ida, vi->index); kfree(vi); } static int virtrng_probe(struct virtio_device *vdev) { return probe_common(vdev); } static void virtrng_remove(struct virtio_device *vdev) { remove_common(vdev); }
static int virtrng_freeze(struct virtio_device *vdev) { remove_common(vdev); return 0; }
static void virtrng_remove(struct virtio_device *vdev) { remove_common(vdev); }
extern List as_mysql_remove_qos(mysql_conn_t *mysql_conn, uint32_t uid, slurmdb_qos_cond_t *qos_cond) { ListIterator itr = NULL; List ret_list = NULL; int rc = SLURM_SUCCESS; char *object = NULL; char *extra = NULL, *query = NULL, *name_char = NULL, *assoc_char = NULL; time_t now = time(NULL); char *user_name = NULL; int set = 0; MYSQL_RES *result = NULL; MYSQL_ROW row; if (!qos_cond) { error("we need something to change"); return NULL; } if (check_connection(mysql_conn) != SLURM_SUCCESS) return NULL; xstrcat(extra, "where deleted=0"); if (qos_cond->description_list && list_count(qos_cond->description_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(qos_cond->description_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "description='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (qos_cond->id_list && list_count(qos_cond->id_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(qos_cond->id_list); while ((object = list_next(itr))) { if (!object[0]) continue; if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "id='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (qos_cond->name_list && list_count(qos_cond->name_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(qos_cond->name_list); while ((object = list_next(itr))) { if (!object[0]) continue; if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "name='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (!extra) { error("Nothing to remove"); return NULL; } query = xstrdup_printf("select id, name from %s %s;", qos_table, extra); xfree(extra); if (!(result = mysql_db_query_ret( mysql_conn, query, 0))) { xfree(query); return NULL; } name_char = NULL; ret_list = list_create(slurm_destroy_char); while ((row = mysql_fetch_row(result))) { slurmdb_qos_rec_t *qos_rec = NULL; list_append(ret_list, xstrdup(row[1])); if (!name_char) xstrfmtcat(name_char, "id='%s'", row[0]); else xstrfmtcat(name_char, " || id='%s'", row[0]); if (!assoc_char) xstrfmtcat(assoc_char, "id_qos='%s'", row[0]); else xstrfmtcat(assoc_char, " || id_qos='%s'", row[0]); xstrfmtcat(extra, ", qos=replace(qos, ',%s', '')" ", delta_qos=replace(delta_qos, ',+%s', '')" ", delta_qos=replace(delta_qos, ',-%s', '')", row[0], row[0], row[0]); qos_rec = xmalloc(sizeof(slurmdb_qos_rec_t)); /* we only need id when removing no real need to init */ qos_rec->id = slurm_atoul(row[0]); if (addto_update_list(mysql_conn->update_list, SLURMDB_REMOVE_QOS, qos_rec) != SLURM_SUCCESS) slurmdb_destroy_qos_rec(qos_rec); } mysql_free_result(result); if (!list_count(ret_list)) { errno = SLURM_NO_CHANGE_IN_DATA; debug3("didn't effect anything\n%s", query); xfree(query); return ret_list; } xfree(query); /* remove this qos from all the users/accts that have it */ query = xstrdup_printf("update %s set mod_time=%ld %s where deleted=0;", assoc_table, now, extra); xfree(extra); debug3("%d(%s:%d) query\n%s", mysql_conn->conn, THIS_FILE, __LINE__, query); rc = mysql_db_query(mysql_conn, query); xfree(query); if (rc != SLURM_SUCCESS) { reset_mysql_conn(mysql_conn); list_destroy(ret_list); return NULL; } user_name = uid_to_string((uid_t) uid); slurm_mutex_lock(&as_mysql_cluster_list_lock); itr = list_iterator_create(as_mysql_cluster_list); while ((object = list_next(itr))) { if ((rc = remove_common(mysql_conn, DBD_REMOVE_QOS, now, user_name, qos_table, name_char, assoc_char, object, NULL, NULL)) != SLURM_SUCCESS) break; } list_iterator_destroy(itr); slurm_mutex_unlock(&as_mysql_cluster_list_lock); xfree(assoc_char); xfree(name_char); xfree(user_name); if (rc == SLURM_ERROR) { list_destroy(ret_list); return NULL; } return ret_list; }
static int _cluster_remove_wckeys(mysql_conn_t *mysql_conn, char *extra, char *cluster_name, char *user_name, List ret_list) { int rc = SLURM_SUCCESS; MYSQL_RES *result = NULL; MYSQL_ROW row; char *assoc_char = NULL; time_t now = time(NULL); char *query = xstrdup_printf("select t1.id_wckey, t1.wckey_name " "from \"%s_%s\" as t1%s;", cluster_name, wckey_table, extra); if (!(result = mysql_db_query_ret(mysql_conn, query, 0))) { xfree(query); return SLURM_ERROR; } if (!mysql_num_rows(result)) { mysql_free_result(result); xfree(query); return SLURM_SUCCESS; } while ((row = mysql_fetch_row(result))) { slurmdb_wckey_rec_t *wckey_rec = NULL; list_append(ret_list, xstrdup(row[1])); if (!assoc_char) xstrfmtcat(assoc_char, "id_wckey='%s'", row[0]); else xstrfmtcat(assoc_char, " || id_wckey='%s'", row[0]); wckey_rec = xmalloc(sizeof(slurmdb_wckey_rec_t)); /* we only need id and cluster when removing no real need to init */ wckey_rec->id = slurm_atoul(row[0]); wckey_rec->cluster = xstrdup(cluster_name); if (addto_update_list(mysql_conn->update_list, SLURMDB_REMOVE_WCKEY, wckey_rec) != SLURM_SUCCESS) slurmdb_destroy_wckey_rec(wckey_rec); } mysql_free_result(result); if (!list_count(ret_list)) { errno = SLURM_NO_CHANGE_IN_DATA; if (debug_flags & DEBUG_FLAG_DB_WCKEY) DB_DEBUG(mysql_conn->conn, "didn't effect anything\n%s", query); xfree(query); xfree(assoc_char); return SLURM_SUCCESS; } xfree(query); rc = remove_common(mysql_conn, DBD_REMOVE_WCKEYS, now, user_name, wckey_table, assoc_char, assoc_char, cluster_name, NULL, NULL); xfree(assoc_char); if (rc == SLURM_ERROR) { list_destroy(ret_list); return SLURM_ERROR; } return SLURM_SUCCESS; }
extern List as_mysql_remove_federations(mysql_conn_t *mysql_conn, uint32_t uid, slurmdb_federation_cond_t *fed_cond) { List ret_list = NULL; int rc = SLURM_SUCCESS; char *extra = NULL, *query = NULL, *name_char = NULL; time_t now = time(NULL); char *user_name = NULL; MYSQL_RES *result = NULL; MYSQL_ROW row; if (!fed_cond) { error("we need something to change"); return NULL; } if (check_connection(mysql_conn) != SLURM_SUCCESS) return NULL; if (!is_user_min_admin_level( mysql_conn, uid, SLURMDB_ADMIN_SUPER_USER)) { errno = ESLURM_ACCESS_DENIED; return NULL; } /* force to only do non-deleted federations */ fed_cond->with_deleted = 0; _setup_federation_cond_limits(fed_cond, &extra); if (!extra) { error("Nothing to remove"); return NULL; } query = xstrdup_printf("select name from %s as t1 %s;", federation_table, extra); xfree(extra); if (!(result = mysql_db_query_ret( mysql_conn, query, 0))) { xfree(query); return NULL; } rc = 0; ret_list = list_create(slurm_destroy_char); if (!mysql_num_rows(result)) { mysql_free_result(result); errno = SLURM_NO_CHANGE_IN_DATA; if (debug_flags & DEBUG_FLAG_FEDR) DB_DEBUG(mysql_conn->conn, "didn't effect anything\n%s", query); xfree(query); return ret_list; } xfree(query); user_name = uid_to_string((uid_t) uid); while ((row = mysql_fetch_row(result))) { char *object = xstrdup(row[0]); list_append(ret_list, object); if ((rc = _remove_all_clusters_from_fed(mysql_conn, object, NULL))) break; xfree(name_char); xstrfmtcat(name_char, "name='%s'", object); if ((rc = remove_common(mysql_conn, DBD_REMOVE_FEDERATIONS, now, user_name, federation_table, name_char, NULL, NULL, ret_list, NULL))) break; } mysql_free_result(result); xfree(user_name); xfree(name_char); if (rc != SLURM_SUCCESS) { FREE_NULL_LIST(ret_list); return NULL; } else as_mysql_add_feds_to_update_list(mysql_conn); return ret_list; }