my $dev = $param->{device};
my $node = $param->{node};
my $type = $param->{filesystem} // 'ext4';
+ my $path = "/mnt/pve/$name";
+ my $mountunitname = PVE::Systemd::escape_unit($path, 1) . ".mount";
+ my $mountunitpath = "/etc/systemd/system/$mountunitname";
$dev = PVE::Diskmanage::verify_blockdev_path($dev);
PVE::Diskmanage::assert_disk_unused($dev);
PVE::Storage::assert_sid_unused($name) if $param->{add_storage};
- my $worker = sub {
- my $path = "/mnt/pve/$name";
- my $mountunitname = PVE::Systemd::escape_unit($path, 1) . ".mount";
- my $mountunitpath = "/etc/systemd/system/$mountunitname";
+ my $mounted = PVE::Diskmanage::mounted_paths();
+ die "the path for '${name}' is already mounted: ${path} ($mounted->{$path})\n"
+ if $mounted->{$path};
+ die "a systemd mount unit already exists: ${mountunitpath}\n" if -e $mountunitpath;
+ my $worker = sub {
PVE::Diskmanage::locked_disk_action(sub {
PVE::Diskmanage::assert_disk_unused($dev);
my $ZPOOL = '/sbin/zpool';
my $ZFS = '/sbin/zfs';
+sub get_pool_data {
+ if (!-f $ZPOOL) {
+ die "zfsutils-linux not installed\n";
+ }
+
+ my $propnames = [qw(name size alloc free frag dedup health)];
+ my $numbers = {
+ size => 1,
+ alloc => 1,
+ free => 1,
+ frag => 1,
+ dedup => 1,
+ };
+
+ my $cmd = [$ZPOOL,'list', '-HpPLo', join(',', @$propnames)];
+
+ my $pools = [];
+
+ run_command($cmd, outfunc => sub {
+ my ($line) = @_;
+
+ my @props = split('\s+', trim($line));
+ my $pool = {};
+ for (my $i = 0; $i < scalar(@$propnames); $i++) {
+ if ($numbers->{$propnames->[$i]}) {
+ $pool->{$propnames->[$i]} = $props[$i] + 0;
+ } else {
+ $pool->{$propnames->[$i]} = $props[$i];
+ }
+ }
+
+ push @$pools, $pool;
+ });
+
+ return $pools;
+}
+
__PACKAGE__->register_method ({
name => 'index',
path => '',
code => sub {
my ($param) = @_;
- if (!-f $ZPOOL) {
- die "zfsutils-linux not installed\n";
- }
-
- my $propnames = [qw(name size alloc free frag dedup health)];
- my $numbers = {
- size => 1,
- alloc => 1,
- free => 1,
- frag => 1,
- dedup => 1,
- };
-
- my $cmd = [$ZPOOL,'list', '-HpPLo', join(',', @$propnames)];
-
- my $pools = [];
-
- run_command($cmd, outfunc => sub {
- my ($line) = @_;
-
- my @props = split('\s+', trim($line));
- my $pool = {};
- for (my $i = 0; $i < scalar(@$propnames); $i++) {
- if ($numbers->{$propnames->[$i]}) {
- $pool->{$propnames->[$i]} = $props[$i] + 0;
- } else {
- $pool->{$propnames->[$i]} = $props[$i];
- }
- }
-
- push @$pools, $pool;
- });
-
- return $pools;
+ return get_pool_data();
}});
sub preparetree {
my $user = $rpcenv->get_user();
my $name = $param->{name};
+ my $node = $param->{node};
my $devs = [PVE::Tools::split_list($param->{devices})];
my $raidlevel = $param->{raidlevel};
my $compression = $param->{compression} // 'on';
}
PVE::Storage::assert_sid_unused($name) if $param->{add_storage};
+ my $pools = get_pool_data();
+ die "pool '${name}' already exists on node '${node}'\n"
+ if grep { $_->{name} eq $name } @{$pools};
+
my $numdisks = scalar(@$devs);
my $mindisks = {
single => 1,
pool => $name,
storage => $name,
content => 'rootdir,images',
- nodes => $param->{node},
+ nodes => $node,
};
PVE::API2::Storage::Config->create($storage_params);