/* * First find all IDE/SCSI/SATA disks, then put them in standby mode. * This has the side-effect of flushing the writecache, * which is exactly what we want on poweroff. */ int hddown(void) { const char *disks[MAX_DISKS]; int fds[MAX_DISKS]; int count = 0; int result1, result2; result1 = find_idedisks(disks, MAX_DISKS, &count); result2 = find_scsidisks(disks, MAX_DISKS, &count); open_disks(disks, fds, count); do_standby_disks(fds, count); return (result1 ? result1 : result2); }
static int do_paxos_action(int action, struct task *task, struct sanlk_resource *res, int max_hosts, int num_hosts, uint64_t local_host_id, uint64_t local_host_generation, struct leader_record *leader_ret) { struct token *token; struct leader_record leader; int disks_len, token_len; int j, rv = 0; disks_len = res->num_disks * sizeof(struct sync_disk); token_len = sizeof(struct token) + disks_len; token = malloc(token_len); if (!token) return -ENOMEM; memset(token, 0, token_len); token->disks = (struct sync_disk *)&token->r.disks[0]; token->r.num_disks = res->num_disks; memcpy(token->r.lockspace_name, res->lockspace_name, SANLK_NAME_LEN); memcpy(token->r.name, res->name, SANLK_NAME_LEN); /* WARNING sync_disk == sanlk_disk */ memcpy(token->disks, &res->disks, disks_len); for (j = 0; j < token->r.num_disks; j++) { token->disks[j].sector_size = 0; token->disks[j].fd = -1; } rv = open_disks(token->disks, token->r.num_disks); if (rv < 0) { free(token); return rv; } switch (action) { case ACT_DIRECT_INIT: rv = paxos_lease_init(task, token, num_hosts, max_hosts); break; case ACT_ACQUIRE: token->host_id = local_host_id; token->host_generation = local_host_generation; rv = paxos_lease_acquire(task, token, 0, leader_ret, 0, num_hosts); break; case ACT_RELEASE: rv = paxos_lease_leader_read(task, token, &leader, "direct_release"); if (rv < 0) break; rv = paxos_lease_release(task, token, &leader, leader_ret); break; case ACT_READ_LEADER: rv = paxos_lease_leader_read(task, token, &leader, "direct_read_leader"); break; } close_disks(token->disks, token->r.num_disks); free(token); if (rv == SANLK_OK) rv = 0; if (leader_ret) memcpy(leader_ret, &leader, sizeof(struct leader_record)); return rv; }