Example #1
0
int Update_subarray(char *dev, char *subarray, char *update, struct mddev_ident *ident, int quiet)
{
	struct supertype supertype, *st = &supertype;
	int fd, rv = 2;

	memset(st, 0, sizeof(*st));

	fd = open_subarray(dev, subarray, st, quiet);
	if (fd < 0)
		return 2;

	if (!st->ss->update_subarray) {
		if (!quiet)
			fprintf(stderr,
				Name ": Operation not supported for %s metadata\n",
				st->ss->name);
		goto free_super;
	}

	if (mdmon_running(st->devnum))
		st->update_tail = &st->updates;

	rv = st->ss->update_subarray(st, subarray, update, ident);

	if (rv) {
		if (!quiet)
			fprintf(stderr, Name ": Failed to update %s of subarray-%s in %s\n",
				update, subarray, dev);
	} else if (st->update_tail)
		flush_metadata_updates(st);
	else
		st->ss->sync_metadata(st);

	if (rv == 0 && strcmp(update, "name") == 0 && !quiet)
		fprintf(stderr,
			Name ": Updated subarray-%s name from %s, UUIDs may have changed\n",
			subarray, dev);

 free_super:
	st->ss->free_super(st);
	close(fd);

	return rv;
}
Example #2
0
int Kill_subarray(char *dev, char *subarray, int verbose)
{
	/* Delete a subarray out of a container, the subarry must be
	 * inactive.  The subarray string must be a subarray index
	 * number.
	 *
	 * 0 = successfully deleted subarray from all container members
	 * 1 = failed to sync metadata to one or more devices
	 * 2 = failed to find the container, subarray, or other resource
	 *     issue
	 */
	struct supertype supertype, *st = &supertype;
	int fd, rv = 2;

	memset(st, 0, sizeof(*st));

	fd = open_subarray(dev, subarray, st, verbose < 0);
	if (fd < 0)
		return 2;

	if (!st->ss->kill_subarray) {
		if (verbose >= 0)
			pr_err("Operation not supported for %s metadata\n",
			       st->ss->name);
		goto free_super;
	}

	if (is_subarray_active(subarray, st->devname)) {
		if (verbose >= 0)
			pr_err("Subarray-%s still active, aborting\n",
			       subarray);
		goto free_super;
	}

	if (mdmon_running(st->devnum))
		st->update_tail = &st->updates;

	/* ok we've found our victim, drop the axe */
	rv = st->ss->kill_subarray(st);
	if (rv) {
		if (verbose >= 0)
			pr_err("Failed to delete subarray-%s from %s\n",
			       subarray, dev);
		goto free_super;
	}

	/* FIXME these routines do not report success/failure */
	if (st->update_tail)
		flush_metadata_updates(st);
	else
		st->ss->sync_metadata(st);

	if (verbose >= 0)
		pr_err("Deleted subarray-%s from %s, UUIDs may have changed\n",
		       subarray, dev);

	rv = 0;

 free_super:
	st->ss->free_super(st);
	close(fd);

	return rv;
}