/*
* Copyright (C) 2001 Sistina Software (UK) Limited.
+ * Copyright (C) 2004 Red Hat, Inc. All rights reserved.
*
* This file is released under the GPL.
*/
/*
* Similar to ceiling(log_size(n))
*/
-static unsigned int int_log(unsigned long n, unsigned long base)
+static unsigned int int_log(unsigned int n, unsigned int base)
{
int result = 0;
/*
* Destructively splits up the argument list to pass to ctr.
*/
-static int split_args(int *argc, char ***argvp, char *input)
+int dm_split_args(int *argc, char ***argvp, char *input)
{
char *start, *end = input, *out, **argv = NULL;
unsigned array_size = 0;
if (!len) {
tgt->error = "zero-length target";
- DMERR(": %s\n", tgt->error);
+ DMERR("%s", tgt->error);
return -EINVAL;
}
tgt->type = dm_get_target_type(type);
if (!tgt->type) {
tgt->error = "unknown target type";
- DMERR(": %s\n", tgt->error);
+ DMERR("%s", tgt->error);
return -EINVAL;
}
goto bad;
}
- r = split_args(&argc, &argv, params);
+ r = dm_split_args(&argc, &argv, params);
if (r) {
tgt->error = "couldn't split parameters (insufficient memory)";
goto bad;
return 0;
bad:
- DMERR(": %s\n", tgt->error);
+ DMERR("%s", tgt->error);
dm_put_target_type(tgt->type);
return r;
}
return t->mode;
}
-void dm_table_suspend_targets(struct dm_table *t)
+static void suspend_targets(struct dm_table *t, unsigned postsuspend)
{
- int i;
+ int i = t->num_targets;
+ struct dm_target *ti = t->targets;
- for (i = 0; i < t->num_targets; i++) {
- struct dm_target *ti = t->targets + i;
+ while (i--) {
+ if (postsuspend) {
+ if (ti->type->postsuspend)
+ ti->type->postsuspend(ti);
+ } else if (ti->type->presuspend)
+ ti->type->presuspend(ti);
- if (ti->type->suspend)
- ti->type->suspend(ti);
+ ti++;
}
}
+void dm_table_presuspend_targets(struct dm_table *t)
+{
+ return suspend_targets(t, 0);
+}
+
+void dm_table_postsuspend_targets(struct dm_table *t)
+{
+ return suspend_targets(t, 1);
+}
+
void dm_table_resume_targets(struct dm_table *t)
{
int i;