Support snapshots-of-snapshots Signed-off-by: Mikulas Patocka --- lib/activate/activate.c | 6 +++--- lib/activate/activate.h | 3 ++- lib/activate/dev_manager.c | 10 ++++++++-- lib/activate/dev_manager.h | 1 + lib/metadata/lv_manip.c | 9 +++++++-- 5 files changed, 21 insertions(+), 8 deletions(-) Index: LVM2.2.02.60/lib/metadata/lv_manip.c =================================================================== --- LVM2.2.02.60.orig/lib/metadata/lv_manip.c 2010-02-10 22:43:15.000000000 +0100 +++ LVM2.2.02.60/lib/metadata/lv_manip.c 2010-02-10 22:44:59.000000000 +0100 @@ -2912,6 +2912,7 @@ int lv_create_single(struct volume_group struct logical_volume *lv, *org = NULL; int origin_active = 0; const char *lv_name; + const char *origin_snapid = NULL; struct lvinfo info; again: @@ -2996,12 +2997,16 @@ again: lp->origin); return 0; } + if (lv_is_multisnap_cow(org)) { + origin_snapid = first_seg(org)->snapid; + org = first_seg(org)->origin; + } if (lv_is_virtual_origin(org)) { log_error("Can't share virtual origins. " "Use --virtualsize."); return 0; } - if (lv_is_cow(org) || lv_is_multisnap_cow(org)) { + if (lv_is_cow(org)) { log_error("Snapshots of snapshots are not " "supported yet."); return 0; @@ -3184,7 +3189,7 @@ again: } } - if (!lv_multisnap_prepare_create(cmd, org, &snapid)) { + if (!lv_multisnap_prepare_create(cmd, org, origin_snapid, &snapid)) { log_error("Couldn't make new snapshot for origin LV %s", org->name); multisnapshot_error: Index: LVM2.2.02.60/lib/activate/activate.c =================================================================== --- LVM2.2.02.60.orig/lib/activate/activate.c 2010-02-10 22:42:49.000000000 +0100 +++ LVM2.2.02.60/lib/activate/activate.c 2010-02-10 22:44:59.000000000 +0100 @@ -213,7 +213,7 @@ int lv_activate_with_filter(struct cmd_c return 1; } -int lv_multisnap_prepare_create(struct cmd_context *cmd, struct logical_volume *lv, char **snapid) +int lv_multisnap_prepare_create(struct cmd_context *cmd, struct logical_volume *lv, const char *origin_snapid, char **snapid) { return 0; } @@ -1190,7 +1190,7 @@ int lv_activate_with_filter(struct cmd_c return 1; } -int lv_multisnap_prepare_create(struct cmd_context *cmd, struct logical_volume *lv, char **snapid) +int lv_multisnap_prepare_create(struct cmd_context *cmd, struct logical_volume *lv, const char *origin_snapid, char **snapid) { struct dev_manager *dm; int r; @@ -1201,7 +1201,7 @@ int lv_multisnap_prepare_create(struct c if (!(dm = dev_manager_create(cmd, lv->vg->name))) return_0; - r = dev_manager_multisnap_prepare_create(dm, lv, snapid); + r = dev_manager_multisnap_prepare_create(dm, lv, origin_snapid, snapid); dev_manager_destroy(dm); Index: LVM2.2.02.60/lib/activate/activate.h =================================================================== --- LVM2.2.02.60.orig/lib/activate/activate.h 2010-02-10 22:42:49.000000000 +0100 +++ LVM2.2.02.60/lib/activate/activate.h 2010-02-10 22:44:59.000000000 +0100 @@ -63,7 +63,8 @@ int lv_activate_with_filter(struct cmd_c int lv_deactivate(struct cmd_context *cmd, const char *lvid_s); int lv_multisnap_prepare_create(struct cmd_context *cmd, - struct logical_volume *lv, char **snapid); + struct logical_volume *lv, + const char *origin_snapid, char **snapid); int lv_multisnap_delete(struct cmd_context *cmd, struct logical_volume *lv, const char *snapid); Index: LVM2.2.02.60/lib/activate/dev_manager.c =================================================================== --- LVM2.2.02.60.orig/lib/activate/dev_manager.c 2010-02-10 22:44:54.000000000 +0100 +++ LVM2.2.02.60/lib/activate/dev_manager.c 2010-02-10 22:45:07.000000000 +0100 @@ -769,6 +769,7 @@ static int _multisnapshot_status(struct int dev_manager_multisnap_prepare_create(struct dev_manager *dm, struct logical_volume *lv, + const char *origin_snapid, char **snapid) { const char *dlid; @@ -781,8 +782,13 @@ int dev_manager_multisnap_prepare_create log_debug("Getting new snapshot id for %s", lv->name); - if (!_multisnap_message(dm, dlid, "create")) - return 0; + if (!origin_snapid) { + if (!_multisnap_message(dm, dlid, "create")) + return 0; + } else { + if (!_multisnap_message(dm, dlid, "create_subsnap %s", origin_snapid)) + return 0; + } if (!_multisnapshot_status(dm, dlid, &err, snapid, NULL, NULL, NULL)) return 0; Index: LVM2.2.02.60/lib/activate/dev_manager.h =================================================================== --- LVM2.2.02.60.orig/lib/activate/dev_manager.h 2010-02-10 22:42:49.000000000 +0100 +++ LVM2.2.02.60/lib/activate/dev_manager.h 2010-02-10 22:44:59.000000000 +0100 @@ -61,6 +61,7 @@ int dev_manager_deactivate(struct dev_ma int dev_manager_multisnap_prepare_create(struct dev_manager *dm, struct logical_volume *lv, + const char *origin_snapid, char **snapid); int dev_manager_multisnap_delete(struct dev_manager *dm, struct logical_volume *lv,