$cfg->{ids}->{$storeid} = $opts;
+ $plugin->on_add_hook($storeid, $opts, password => $password);
+
my $cred_file = undef;
if ($type eq 'lvm' && $opts->{base}) {
}
};
if(my $err = $@) {
+ eval { $plugin->on_delete_hook($storeid, $opts) };
+ warn "$@\n" if $@;
unlink $cred_file if defined($cred_file);
die $err;
}
die "can't remove storage - storage is used as base of another storage\n"
if PVE::Storage::storage_is_used($cfg, $storeid);
+ my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
+
+ $plugin->on_delete_hook($storeid, $scfg);
+
if ($scfg->{type} eq 'cifs') {
my $cred_file = PVE::Storage::CIFSPlugin::cifs_cred_file_name($storeid);
if (-f $cred_file) {
# Storage implementation
+# called during addition of storage (before the new storage config got written)
+# die to abort additon if there are (grave) problems
+# NOTE: runs in a storage config *locked* context
+sub on_add_hook {
+ my ($class, $storeid, $scfg, %param) = @_;
+
+ # do nothing by default
+}
+
+# called during deletion of storage (before the new storage config got written)
+# and if the activate check on addition fails, to cleanup all storage traces
+# which on_add_hook may have created.
+# die to abort deletion if there are (very grave) problems
+# NOTE: runs in a storage config *locked* context
+sub on_delete_hook {
+ my ($class, $storeid, $scfg) = @_;
+
+ # do nothing by default
+}
+
sub cluster_lock_storage {
my ($class, $storeid, $shared, $timeout, $func, @param) = @_;