keep a cache to avoid calling readlink() repeatedly

This commit is contained in:
speed47 2015-09-20 15:48:45 +02:00
parent 8fdf223f6f
commit da916191ae

View file

@ -77,6 +77,23 @@ sub run_cmd
return ( $child_exit_status, \@stdout, \@stderr );
}
my %readlinkcache = ();
sub link2real
{
my $dev = shift;
if (defined $readlinkcache{$dev})
{
return $readlinkcache{$dev};
}
my @cmd = run_cmd( { can_fail => 1 }, qw{ readlink -f }, $dev );
if (defined $cmd[1][0])
{
$readlinkcache{$dev} = $cmd[1][0];
return $readlinkcache{$dev};
}
return $dev;
}
sub raw2human
{
@ -143,11 +160,7 @@ foreach (@{ $cmd[1] })
#READLINK
if (-l $dev)
{
my @subcmd = run_cmd( { can_fail => 0 }, qw{ readlink -f }, $dev );
if (defined $subcmd[1][0])
{
$dev = $subcmd[1][0];
}
$dev = link2real($dev);
}
push @{ $filesystems{$fuuid}{'devices'} }, $dev;
}
@ -168,11 +181,7 @@ while (<MP>)
$mountpoints{$dev} = $mp;
if (-l $dev)
{
my @subcmd = run_cmd( { can_fail => 0 }, qw{ readlink -f }, $dev );
if (defined $subcmd[1][0])
{
$mountpoints{$subcmd[1][0]} = $mp;
}
$mountpoints{ link2real($dev) } = $mp;
}
}
}