2002-02-12 19:31:31 +03:00
/*
* Copyright ( C ) 2002 Sistina Software ( UK ) Limited .
*
* This file is released under the LGPL .
*/
# include "log.h"
# include "metadata.h"
# include "toolcontext.h"
2002-02-20 22:04:55 +03:00
int lv_is_origin ( struct logical_volume * lv )
2002-02-12 19:31:31 +03:00
{
struct list * slh ;
struct snapshot * s ;
2002-02-20 22:04:55 +03:00
list_iterate ( slh , & lv - > vg - > snapshots ) {
2002-02-12 19:31:31 +03:00
s = list_item ( slh , struct snapshot_list ) - > snapshot ;
if ( s - > origin = = lv )
return 1 ;
}
return 0 ;
}
2002-02-20 22:04:55 +03:00
int lv_is_cow ( struct logical_volume * lv )
2002-02-12 19:31:31 +03:00
{
struct list * slh ;
struct snapshot * s ;
2002-02-20 22:04:55 +03:00
list_iterate ( slh , & lv - > vg - > snapshots ) {
2002-02-12 19:31:31 +03:00
s = list_item ( slh , struct snapshot_list ) - > snapshot ;
if ( s - > cow = = lv )
return 1 ;
}
return 0 ;
}
2002-02-25 14:55:39 +03:00
struct snapshot * find_cow ( struct logical_volume * lv )
2002-02-21 13:16:33 +03:00
{
struct list * slh ;
struct snapshot * s ;
2002-02-25 14:55:39 +03:00
list_iterate ( slh , & lv - > vg - > snapshots ) {
2002-02-21 13:16:33 +03:00
s = list_item ( slh , struct snapshot_list ) - > snapshot ;
if ( s - > cow = = lv )
return s ;
}
return NULL ;
}
2002-02-21 21:31:48 +03:00
int vg_add_snapshot ( struct logical_volume * origin ,
2002-02-12 19:31:31 +03:00
struct logical_volume * cow ,
int persistent ,
uint32_t chunk_size )
{
struct snapshot * s ;
struct snapshot_list * sl ;
2002-02-21 21:31:48 +03:00
struct pool * mem = origin - > vg - > cmd - > mem ;
2002-02-12 19:31:31 +03:00
/*
* Is the cow device already being used ?
*/
2002-02-20 22:04:55 +03:00
if ( lv_is_cow ( cow ) ) {
2002-02-12 19:31:31 +03:00
log_err ( " '%s' is already in use as a snapshot. " , cow - > name ) ;
return 0 ;
}
if ( ! ( s = pool_alloc ( mem , sizeof ( * s ) ) ) ) {
stack ;
return 0 ;
}
s - > persistent = persistent ;
s - > chunk_size = chunk_size ;
s - > origin = origin ;
s - > cow = cow ;
if ( ! ( sl = pool_alloc ( mem , sizeof ( * sl ) ) ) ) {
stack ;
pool_free ( mem , s ) ;
return 0 ;
}
sl - > snapshot = s ;
2002-02-21 21:31:48 +03:00
list_add ( & origin - > vg - > snapshots , & sl - > list ) ;
2002-02-12 19:31:31 +03:00
return 1 ;
}
int vg_remove_snapshot ( struct volume_group * vg , struct logical_volume * cow )
{
struct list * slh ;
struct snapshot_list * sl ;
list_iterate ( slh , & vg - > snapshots ) {
sl = list_item ( slh , struct snapshot_list ) ;
if ( sl - > snapshot - > cow = = cow ) {
list_del ( slh ) ;
return 1 ;
}
}
/* fail */
2002-02-13 14:43:29 +03:00
log_err ( " Asked to remove an unknown snapshot. " ) ;
2002-02-12 19:31:31 +03:00
return 0 ;
}