1c68de748SJulio Merino 2c68de748SJulio Merinouse strict; 3c68de748SJulio Merinouse warnings; 45b347b28SEnji Cooperuse POSIX; 5c68de748SJulio Merinouse Test::More tests => 19; 6c68de748SJulio Merinouse Fcntl qw(:DEFAULT :seek); 7c68de748SJulio Merino 8c68de748SJulio Merinouse constant BLK => 512; 9c68de748SJulio Merinouse constant BLKS_PER_MB => 2048; 10c68de748SJulio Merino 11c68de748SJulio Merinomy $unit; 12c68de748SJulio MerinoEND { system "mdconfig -du$unit" if defined $unit }; 13c68de748SJulio Merino 145b347b28SEnji Coopersub fsck_md { 155b347b28SEnji Cooper my ($is_clean, $md); 165b347b28SEnji Cooper 175b347b28SEnji Cooper $md = shift; 185b347b28SEnji Cooper 195b347b28SEnji Cooper chomp(my @fsck_output = `fsck_ffs -Ffy ${md}a`); 205b347b28SEnji Cooper $is_clean = WIFEXITED($?) && 215b347b28SEnji Cooper (WEXITSTATUS($?) == 0 || WEXITSTATUS($?) == 7); 225b347b28SEnji Cooper ok($is_clean, "checking ${md}a's filesystem"); 235b347b28SEnji Cooper if ($is_clean) { 245b347b28SEnji Cooper diag "filesystem reported clean"; 255b347b28SEnji Cooper } else { 265b347b28SEnji Cooper diag "filesystem not reported clean: " . join("\n", @fsck_output); 275b347b28SEnji Cooper } 285b347b28SEnji Cooper} 295b347b28SEnji Cooper 30c68de748SJulio Merinosub setsize { 31c68de748SJulio Merino my ($partszMB, $unitszMB) = @_; 32c68de748SJulio Merino 335b1b1405SRuslan Bukin open my $fd, "|-", "bsdlabel -R md$unit /dev/stdin" or die; 34c68de748SJulio Merino print $fd "a: ", ($partszMB * BLKS_PER_MB), " 0 4.2BSD 1024 8192\n"; 35c68de748SJulio Merino print $fd "c: ", ($unitszMB * BLKS_PER_MB), " 0 unused 0 0\n"; 36c68de748SJulio Merino close $fd; 37c68de748SJulio Merino} 38c68de748SJulio Merino 39c68de748SJulio Merinosub fill { 40c68de748SJulio Merino my ($start, $size, $content) = @_; 41c68de748SJulio Merino 42c68de748SJulio Merino my $content512 = $content x (int(512 / length $content) + 1); 43c68de748SJulio Merino substr($content512, 512) = ""; 44c68de748SJulio Merino sysopen my $fd, "/dev/md$unit", O_RDWR or die "/dev/md$unit: $!"; 45c68de748SJulio Merino seek($fd, $start * BLK, SEEK_SET); 46c68de748SJulio Merino while ($size) { 47c68de748SJulio Merino syswrite($fd, $content512) == 512 or die "write: $!"; 48c68de748SJulio Merino $size--; 49c68de748SJulio Merino } 50c68de748SJulio Merino} 51c68de748SJulio Merino 52c68de748SJulio MerinoSKIP: { 53c68de748SJulio Merino skip "Cannot test without UID 0", 19 if $<; 54c68de748SJulio Merino 55c68de748SJulio Merino chomp(my $md = `mdconfig -s40m`); 56c68de748SJulio Merino like($md, qr/^md\d+$/, "Created $md with size 40m") or die; 57c68de748SJulio Merino $unit = substr $md, 2; 58c68de748SJulio Merino 59c68de748SJulio Merino for my $type (1..2) { 60c68de748SJulio Merino 61c68de748SJulio Merino initialise: { 62c68de748SJulio Merino ok(setsize(10, 40), "Sized ${md}a to 10m"); 63c68de748SJulio Merino system "newfs -O $type -U ${md}a >/dev/null"; 64c68de748SJulio Merino is($?, 0, "Initialised the filesystem on ${md}a as UFS$type"); 655b347b28SEnji Cooper 665b347b28SEnji Cooper fsck_md($md); 67c68de748SJulio Merino } 68c68de748SJulio Merino 69c68de748SJulio Merino extend20_zeroed: { 70c68de748SJulio Merino ok(setsize(20, 40), "Sized ${md}a to 20m"); 71c68de748SJulio Merino diag "Filling the extent with zeros"; 72c68de748SJulio Merino fill(10 * BLKS_PER_MB, 10 * BLKS_PER_MB, chr(0)); 73c68de748SJulio Merino my $out = `growfs -y ${md}a`; 74c68de748SJulio Merino is($?, 0, "Extended the filesystem on ${md}a") or print $out; 75c68de748SJulio Merino 76c68de748SJulio Merino my ($unallocated) = $out =~ m{\d+ sectors cannot be allocated}; 77c68de748SJulio Merino fill(30 * BLKS_PER_MB - $unallocated, $unallocated, chr(0)) 78c68de748SJulio Merino if $unallocated; 79c68de748SJulio Merino 805b347b28SEnji Cooper fsck_md($md); 81c68de748SJulio Merino } 82c68de748SJulio Merino 83c68de748SJulio Merino extend30_garbaged: { 84c68de748SJulio Merino ok(setsize(30, 40), "Sized ${md}a to 30m"); 85c68de748SJulio Merino diag "Filling the extent with garbage"; 86c68de748SJulio Merino fill(20 * BLKS_PER_MB, 10 * BLKS_PER_MB, chr(0xaa) . chr(0x55)); 87c68de748SJulio Merino my $out = `growfs -y ${md}a`; 88c68de748SJulio Merino is($?, 0, "Extended the filesystem on ${md}a") or print $out; 89c68de748SJulio Merino 90c68de748SJulio Merino my ($unallocated) = $out =~ m{\d+ sectors cannot be allocated}; 91c68de748SJulio Merino fill(30 * BLKS_PER_MB - $unallocated, $unallocated, chr(0)) 92c68de748SJulio Merino if $unallocated; 93c68de748SJulio Merino 945b347b28SEnji Cooper fsck_md($md); 95c68de748SJulio Merino } 96c68de748SJulio Merino } 97c68de748SJulio Merino 98c68de748SJulio Merino system "mdconfig -du$unit"; 99c68de748SJulio Merino undef $unit; 100c68de748SJulio Merino} 101