@@ -722,8 +722,13 @@ static unsigned persistent_status(struct dm_exception_store *store,
case STATUSTYPE_INFO:
break;
case STATUSTYPE_TABLE:
- DMEMIT(" %s P %llu", store->cow->name,
- (unsigned long long)store->chunk_size);
+ if (!strcmp("P", store->type->name))
+ DMEMIT(" %s P %llu", store->cow->name,
+ (unsigned long long)store->chunk_size);
+ else
+ DMEMIT(" %s 2 %s %llu", store->type->name,
+ store->cow->name,
+ (unsigned long long)store->chunk_size);
}
return sz;
@@ -91,8 +91,13 @@ static unsigned transient_status(struct dm_exception_store *store,
case STATUSTYPE_INFO:
break;
case STATUSTYPE_TABLE:
- DMEMIT(" %s N %llu", store->cow->name,
- (unsigned long long)store->chunk_size);
+ if (!strcmp("N", store->type->name))
+ DMEMIT(" %s N %llu", store->cow->name,
+ (unsigned long long)store->chunk_size);
+ else
+ DMEMIT(" %s 2 %s %llu", store->type->name,
+ store->cow->name,
+ (unsigned long long)store->chunk_size);
}
return sz;
@@ -587,7 +587,10 @@ static int init_hash_tables(struct dm_snapshot *s)
* @store: contains newly allocated dm_exception_store
*
* Possible formats for argv::
+ * Backwards compatibility mode:
* <COW-dev> p/n <chunk-size>
+ * Current format:
+ * <store type> <arg count> <COW> <chunk-size> [other args]
*
* Returns: 0 on success, -Exxx on error
*/
@@ -595,12 +598,14 @@ static int create_exception_store(struct dm_target *ti, unsigned argc,
char **argv, unsigned *args_used,
struct dm_exception_store **store)
{
+ unsigned param_count;
char *tmp_argv[2];
char old_type_name[2];
*store = NULL;
- if (1 /* less change patch to patch */) {
+ /* Detect old-style table line with type as second arg. */
+ if (!isdigit(*argv[1])) {
if (argc < 3) {
ti->error = "Insufficient exception store arguments";
return -EINVAL;
@@ -616,10 +621,29 @@ static int create_exception_store(struct dm_target *ti, unsigned argc,
return dm_exception_store_create(old_type_name, ti, 2,
tmp_argv, store);
}
+
+ if (sscanf(argv[1], "%u", ¶m_count) != 1) {
+ ti->error = "Invalid exception store argument count";
+ return -EINVAL;
+ }
+
+ *args_used = 2 + param_count;
+
+ if (argc < *args_used) {
+ ti->error = "Insufficient exception store arguments";
+ return -EINVAL;
+ }
+
+ return dm_exception_store_create(argv[0], ti, param_count,
+ argv + 2, store);
}
/*
- * Construct a snapshot mapping: <origin_dev> <COW-dev> <p/n> <chunk-size>
+ * Construct a snapshot mapping. Possible mapping tables include:
+ * <origin_dev> <exception store args> <feature args>
+ * See 'create_exception_store' for format of <exception store args>.
+ *
+ * Returns: 0 on success, -XXX on error
*/
static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv)
{
@@ -630,10 +654,9 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv)
struct dm_exception_store *store;
unsigned args_used;
- if (argc != 4) {
- ti->error = "requires exactly 4 arguments";
- r = -EINVAL;
- goto bad_args;
+ if (argc < 4) {
+ ti->error = "too few arguments";
+ return -EINVAL;
}
origin_path = argv[0];
@@ -755,7 +778,6 @@ bad_origin:
bad_snap:
dm_exception_store_destroy(store);
-bad_args:
return r;
}